bojone / tiger

A Tight-fisted Optimizer

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[中文|English]

Tiger

A Tight-fisted Optimizer, 一个“抠”到极致的优化器!

特性

  • 不逊色于AdamWLAMB的效果;
  • 梯度累积下的显存需求最小化;
  • 类似LAMB的分参数学习率自适应;
  • 简单的预防模型崩溃到NaN的策略;
  • 可以模拟任意schedule的分段线性学习率。

简介

Tiger、Lion和AdamW的对比:

Lion的视角,Tiger是一个简化版的Lion(beta1=beta2);从SignSGD的视角,Tiger是一个带有动量和weight decay的SignSGD。

Tiger只用到了动量来构建更新量,根据《隐藏在动量中的梯度累积:少更新几步,效果反而更好?》的结论,此时我们不新增一组参数来“无感”地实现梯度累积!这也意味着在我们有梯度累积需求时,Tiger已经达到了显存占用的最优解,这也是“Tiger”这个名字的来源(Tight-fisted Optimizer,抠门的优化器,不舍得多花一点显存)。

使用

目前的实现在tensorflow 1.15下开发,估计tensorflow 2.x的前几个版本也能用,后面的版本由于没有使用经验,不确定能否可用。

参考代码:

from tiger import Tiger

optimizer = Tiger(
    learning_rate=1.76e-3,  # 全局相对学习率lr
    beta=0.965,  # beta参数
    weight_decay=0.01,  # 权重衰减率
    grad_accum_steps=4,  # 梯度累积步数
    lr_schedule={
        40000: 1,  # 前40k步,学习率从0线性增加到1*lr【即warmup步数为40000/4步】
        160000: 0.5,  # 40k-160k步,学习率从1*lr线性降低到0.5*lr
        640000: 0.1,  # 160k-640k步,学习率从0.5*lr线性降低到0.1*lr
        1280000: 0.01,  # 640k-1280k步,学习率从0.1*lr线性降低到0.01*lr,并在之后保持不变
    }
)

model.compile(loss='categorical_crossentropy', optimizer=optimizer)

鸣谢

特别感谢Lion的充分实验,以及Lion作者们的友好交流。

引用

@misc{tigeropt,
  title={Tiger: A Tight-fisted Optimizer},
  author={Jianlin Su},
  year={2023},
  howpublished={\url{https://github.com/bojone/tiger}},
}

交流

QQ交流群:808623966,微信群请加机器人微信号spaces_ac_cn

About

A Tight-fisted Optimizer

License:MIT License


Languages

Language:Python 100.0%