这是 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} }
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 依赖的超参数:
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)
beta1
、beta2
和beta3
相对鲁棒,尤其是对beta2
。如果你想要更好的性能,可以先调整beta3
,然后再调整beta1
。ZeroRedundancyOptimizer
时,Adan和Adam消耗的内存几乎相同。请参考以下链接获取详细步骤。在这些详细步骤中,我们甚至包含了docker镜像以便复现。
为了研究Adan优化器对LLM的有效性,我们使用MoE模型进行了预训练实验。这些实验使用了RedPajama-v2数据集,有三种配置,每种包含8个专家:8x0.1B(共0.5B可训练参数)、8x0.3B(2B可训练参数)和8x0.6B(4B可训练参数)。这些模型分别用10B、30B、100B和300B个token的采样数据进行训练。
模型大小 | 8x0.1B | 8x0.1B | 8x0.1B | 8x0.3B | 8x0.3B | 8x0.3B | 8x0.6B |
---|---|---|---|---|---|---|---|
Token数量 | 10B | 30B | 100B | 30B | 100B | 300B | 300B |
AdamW | 2.722 | 2.550 | 2.427 | 2.362 | 2.218 | 2.070 | 2.023 |
Adan | 2.697 | 2.513 | 2.404 | 2.349 | 2.206 | 2.045 | 2.010 |
我们提供了在BigCode数据集上预训练的GPT2-345m的配置和日志,并通过零样本学习在HumanEval数据集上进行评估。HumanEval用于衡量从文档字符串合成程序的功能正确性。它包含164个原创编程问题,评估语言理解、算法和简单数学,其中一些可与简单的软件面试问题相媲美。我们在评估时设置Temperature = 0.8
。
步骤 | pass@1 | pass@10 | pass@100 | 下载 | |
---|---|---|---|---|---|
GPT2-345m (Adam) | 300k | 0.0840 | 0.209 | 0.360 | 日志&配置 |
GPT2-345m (Adan) | 150k | 0.0843 | 0.221 | 0.377 | 日志&配置 |
<u>Adan仅用一半的成本就获得了可比的结果</u>。
为了方便您使用Adan,我们提供了ImageNet-1k实验的配置和日志文件。
模型 | 训练轮数 | 训练设置 |
---|