Adan

Adan

快速优化深度学习模型的新方法

Adan是一种新型优化算法,结合适应性学习率和Nesterov动量,旨在加速深度学习模型训练。它在计算机视觉、自然语言处理和大规模语言模型等多个领域表现优异。相比Adam和AdamW,Adan通常能使用更大的学习率,训练速度提升5-10倍,同时保持或提高模型精度。目前,Adan已被NVIDIA NeMo、Meta AI D-Adaptation等多个知名深度学习框架和项目采用。

Adan优化器深度学习梯度下降PyTorchGithub开源项目

Adan: 自适应 Nesterov 动量算法,用于更快地优化深度模型

这是 Adan 的官方 PyTorch 实现。论文可以在这里查看。如果您发现我们的 adan 对您的项目有帮助或启发,请引用这篇论文并为这个仓库点星。谢谢!

@article{xie2024adan, title={Adan: 自适应 Nesterov 动量算法,用于更快地优化深度模型}, author={Xie, Xingyu and Zhou, Pan and Li, Huan and Lin, Zhouchen and Yan, Shuicheng}, journal={IEEE 模式分析与机器智能汇刊}, year={2024}, publisher={IEEE} }

支持的项目

新闻

  • :fire::fire::fire: 在大型语言模型(如 MoE 和 GPT2)上的结果已发布。
  • 内存占用更少的 FusedAdan 已发布。

安装

python3 -m pip install git+https://github.com/sail-sg/Adan.git

默认安装 FusedAdan。如果您想使用原始的 Adan,请通过以下方式安装:

git clone https://github.com/sail-sg/Adan.git
cd Adan
python3 setup.py install --unfused

使用方法

为了方便您使用 Adan,我们简要提供了一些直观的说明,然后提供一些通用的实验技巧,最后为论文中的每个实验提供更多细节(如具体命令和超参数)。

1) 使用 Adan 的两个步骤

步骤 1. 通过在配置中添加以下超参数来添加 Adan 依赖的超参数:

parser.add_argument('--max-grad-norm', type=float, default=0.0, help='如果 l2 范数大于此超参数,则裁剪梯度(默认:0.0,不进行梯度裁剪)') parser.add_argument('--weight-decay', type=float, default=0.02, help='权重衰减,类似于 AdamW 中使用的值(默认:0.02)') parser.add_argument('--opt-eps', default=None, type=float, metavar='EPSILON', help='优化器 epsilon,用于避免二阶矩为零的不良情况(默认:None,在 adan 中使用优化器默认值 1e-8)') parser.add_argument('--opt-betas', default=None, type=float, nargs='+', metavar='BETA', help='Adan 中的优化器 beta 值(默认:None,在 Adan 中使用优化器默认值 [0.98, 0.92, 0.99])') parser.add_argument('--no-prox', action='store_true', default=False, help='是否像 AdamW 那样执行权重衰减(默认为 False)')

opt-betas:为保持与我们的使用习惯一致,论文中的 $\beta$ 实际上是代码中的 $(1-\beta)$。

foreach (bool):如果为 True,Adan 将使用 torch._foreach 实现。它更快但使用略多的内存。

no-prox:它决定了带权重衰减的参数的更新规则。默认情况下,Adan 按照论文中算法 1 所示的方式更新参数:

$$\boldsymbol{\theta}_{k+1} = ( 1+\lambda \eta)^{-1} \left[\boldsymbol{\theta}_k - \boldsymbol{\eta}_k \circ (\mathbf{m}_k+(1-{\color{blue}\beta_2})\mathbf{v}_k)\right]$$

但也可以像 Adamw 那样更新参数:

$$\boldsymbol{\theta}_{k+1} = ( 1-\lambda \eta)\boldsymbol{\theta}_k - \boldsymbol{\eta}_k \circ (\mathbf{m}_k+(1-{\color{blue}\beta_2})\mathbf{v}_k).$$

步骤 2. 创建 Adan 优化器如下。在这一步中,我们可以直接使用以下命令替换原始优化器:

from adan import Adan optimizer = Adan(param, lr=args.lr, weight_decay=args.weight_decay, betas=args.opt_betas, eps = args.opt_eps, max_grad_norm=args.max_grad_norm, no_prox=args.no_prox)

2) 实验技巧

  • 为了简化Adan,除论文中的表12外的所有实验中,我们没有使用Adan的重启策略。但表12显示重启策略可以进一步略微提高Adan的性能。
  • Adan通常允许使用更大的峰值学习率,这往往会导致其他优化器(如Adam和AdamW)失败。例如,除了MAE预训练和LSTM外的所有实验中,Adan使用的学习率是Adam/AdamW的5-10倍
  • Adan对beta1beta2beta3相对鲁棒,尤其是对beta2。如果你想要更好的性能,可以先调整beta3,然后再调整beta1
  • 在单节点上,Adan比Adam/AdamW略微增加了GPU内存消耗。然而,这个问题可以通过使用ZeroRedundancyOptimizer来解决,它在分布式数据并行进程中共享优化器状态以减少每个进程的内存占用。具体来说,当在两个以上的GPU上使用ZeroRedundancyOptimizer时,Adan和Adam消耗的内存几乎相同。

3) 更多详细步骤和结果

请参考以下链接获取详细步骤。在这些详细步骤中,我们甚至包含了docker镜像以便复现。

各种任务的结果

大型语言模型的结果

专家混合系统(MoE)

为了研究Adan优化器对LLM的有效性,我们使用MoE模型进行了预训练实验。这些实验使用了RedPajama-v2数据集,有三种配置,每种包含8个专家:8x0.1B(共0.5B可训练参数)、8x0.3B(2B可训练参数)和8x0.6B(4B可训练参数)。这些模型分别用10B、30B、100B和300B个token的采样数据进行训练。

模型大小8x0.1B8x0.1B8x0.1B8x0.3B8x0.3B8x0.3B8x0.6B
Token数量10B30B100B30B100B300B300B
AdamW2.7222.5502.4272.3622.2182.0702.023
Adan2.6972.5132.4042.3492.2062.0452.010
<p align="center"> <img src="https://github.com/sail-sg/Adan/assets/10042844/4c69c8d2-cb52-4c96-8d6b-574abc8ca775" width="58%" /> <img src="https://github.com/sail-sg/Adan/assets/10042844/d8d79ee3-c19c-4cdf-9ba0-939d030f49a9" width="40%" /> </p>

GPT2-345m

我们提供了在BigCode数据集上预训练的GPT2-345m的配置和日志,并通过零样本学习在HumanEval数据集上进行评估。HumanEval用于衡量从文档字符串合成程序的功能正确性。它包含164个原创编程问题,评估语言理解、算法和简单数学,其中一些可与简单的软件面试问题相媲美。我们在评估时设置Temperature = 0.8

步骤pass@1pass@10pass@100下载
GPT2-345m (Adam)300k0.08400.2090.360日志&配置
GPT2-345m (Adan)150k0.08430.2210.377日志&配置

<u>Adan仅用一半的成本就获得了可比的结果</u>

视觉任务的结果

为了方便您使用Adan,我们提供了ImageNet-1k实验的配置和日志文件。

模型训练轮数训练设置准确率 (%)配置文件批量大小下载链接
ViT-S150I80.1配置2048日志/模型
ViT-S150II79.6配置2048日志/模型
ViT-S300I81.1配置2048日志/模型
ViT-S300II80.7配置2048日志/模型
ViT-B150II81.7配置2048日志/模型
ViT-B300II82.6配置2048日志/模型
ResNet-50100I78.1配置2048日志/模型
ResNet-50200I79.7配置2048日志/模型
ResNet-50300I80.2配置2048日志/模型
ResNet-101100I80.0配置2048日志/模型
ResNet-101200I81.6配置2048日志/模型
ResNet-101300I81.9配置2048日志/模型
ConvNext-tiny150II81.7配置2048日志/模型
ConvNext-tiny300II82.4配置2048日志/模型
MAE-small800+100---83.8配置4096/2048预训练日志/微调日志/模型
MAE-Large800+50---85.9配置4096/2048预训练日志/微调日志/模型

自然语言处理任务结果

BERT-base

我们提供了在Bookcorpus和Wikipedia数据集上预训练并在GLUE任务上微调的BERT-base模型的配置和日志文件。请注意,我们在./NLP/BERT文件夹中提供了BERT-base的配置、日志文件和详细说明

预训练配置批量大小日志模型
Adan配置256日志模型
在GLUE任务上微调评估指标结果配置
--------------------:-----------:-----::--------------------------------------------------:
CoLAMatthew相关系数64.6配置
SST-2准确率93.2配置
STS-B皮尔逊相关系数89.3配置
QQP准确率91.2配置
MNLI匹配准确率/不匹配准确率85.7/85.6配置
QNLI准确率91.3配置
RTE准确率73.3配置

关于GLUE任务的微调,请参阅相应配置文件中的总批量大小。

Transformer-XL-base

我们提供了在WikiText-103数据集上训练的Transformer-XL-base的配置和日志。此实验的总批量大小为60*4

步数测试困惑度下载
基准(Adam)200k24.2日志&配置
Transformer-XL-base50k26.2日志&配置
Transformer-XL-base100k24.2日志&配置
Transformer-XL-base200k23.5日志&配置

大型语言模型的结果

GPT2-345m

我们提供了在来自BigCode的数据集上预训练的GPT2-345m的配置和日志,并通过零样本学习在HumanEval数据集上进行评估。HumanEval用于衡量从文档字符串合成程序的功能正确性。它包含164个原始编程问题,评估语言理解、算法和简单数学,其中一些可与简单的软件面试问题相媲美。我们在评估时设置温度 = 0.8

步数pass@1pass@10pass@100下载
GPT2-345m (Adam)300k0.08400.2090.360日志&配置
GPT2-345m (Adan)150k0.08430.2210.377日志&配置

<u>Adan仅用一半的成本就获得了可比的结果</u>

扩散模型的结果

我们展示了由DreamFusion项目支持的文本到3D任务的结果。更多可视化结果可以在这里找到。 以下是使用Adam和Adan从文本提示"悉尼歌剧院,鸟瞰图"生成的示例:

视频1

视频2

内存和效率

以下是优化器峰值内存和运行时间的简要比较。持续时间是200次optimizer.step()的总时间。我们进一步详细比较了GPT-2上的Adam和FusedAdan。更多结果请参见这里

模型模型大小 (MB)Adam 峰值 (MB)Adan 峰值 (MB)FusedAdan 峰值 (MB)Adam 时间 (ms)Adan 时间 (ms)FusedAdan 时间 (ms)
ResNet-50257142719571769.04.21.9
ResNet-1014410055102151016017.57.03.4
ViT-B869755975897588.912.34.3
Swin-B8716118162021617317.912.84.9
ConvNext-B8817353173891737719.115.65.0
Swin-L19624299243162431017.528.110.1
ConvNext-L19726025260552604418.631.110.2
ViT-L30425652256582565618.043.215.1
GPT-275825096254062510049.9107.737.4
GPT-2131334357385953436381.8186.064.4

编辑推荐精选

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

下拉加载更多