跳转到内容

Lion — 让程序自己搜出来的优化器,比 AdamW 内存少一半

是什么

Lion(EvoLved Sign Momentum)是 Google Brain 在 2023 年发布的一个深度学习优化器。它有两个特别的地方:

  1. 它不是人想出来的,是程序”进化搜索”出来的。研究员让一个程序在”所有可能的优化器配方”里乱搭乱试,最后挑出 Lion 这一个公式。
  2. 它比当时主流的 AdamW 内存少一半,效果还略好。

日常类比:AdamW 像一个会带两本笔记本的会计——一本记”最近钱往哪流”(一阶动量),一本记”最近波动多大”(二阶动量)。Lion 只带一本,做账更糙但够用,反而行李轻、走得快。

为什么重要

训练大模型时,优化器自己也吃显存。一个 70 亿参数的模型,AdamW 单是 m / v 两份状态就要 56 GB(fp32)。Lion 砍掉一份,直接省 28 GB,正好等于一张 A100 的差价。

但 Lion 出名不光因为省内存:

  • 谁发明的有点反常识:以前优化器都是数学家手推(SGD / Momentum / Adam / AdamW 都是)。Lion 是机器在 1 万小时算力里搜出来的,开源后大家发现”它居然真的好”。
  • 2023 年最受关注的新优化器:HuggingFace / Keras / lucidrains 三天内就有 PyTorch 实现,PaLM 2 / 一批扩散模型在它身上做了对比实验。
  • 它把”搜索 = 发现”这条路走通了。后续 Sophia / Adan / Tiger 都受它启发,但都没它出圈。

核心要点

Lion 一次更新只做三件事(伪代码,state 只有一个 m):

# 输入: 学习率 lr, 动量系数 beta1=0.9, beta2=0.99, 权重衰减 wd
# 状态: m (动量缓冲, 初始 0)
def lion_step(param, grad, m, lr, beta1, beta2, wd):
update = sign(beta1 * m + (1 - beta1) * grad) # 1. 取符号
param = param - lr * (update + wd * param) # 2. 走一步 + 解耦权重衰减
m = beta2 * m + (1 - beta2) * grad # 3. 用更慢的 beta2 更新动量
return param, m

三个反常识的设计:

  1. sign(...) 把更新压成 ±1:不管梯度多大多小,每个参数每步都只走 lr 这么远。好处是稳,坏处是丢了”梯度大小”的信息。
  2. 两个 beta,不是一个beta1 用来算”这一步往哪走”,beta2 用来”记住更久的过去”。AdamW 里 m 只用一个 beta,Lion 把”决策”和”记忆”拆开。
  3. 没有 epsilon:因为没有除法(AdamW 要除 sqrt(v) + eps),Lion 公式里只有加减乘和 sign,纯整数级稳定

一图看懂三个公式

把 SGD / AdamW / Lion 三家的更新公式并排放,差别一目了然:

SGD : param -= lr * grad
AdamW : param -= lr * m / (sqrt(v) + eps) + lr * wd * param
其中 m, v 都是用同一个梯度做 EMA(指数滑动平均)
Lion : param -= lr * sign(beta1*m + (1-beta1)*grad) + lr * wd * param
其中 m 用 beta2 做 EMA(更慢)

读这三行能看出 Lion 的两条独立创新:

  1. sign(...) 取代 m / sqrt(v)——把”自适应缩放”换成”统一步长”。原来 AdamW 每个参数走多远要靠 v 来归一化,Lion 直接全部 ±1。
  2. beta1beta2 解耦——决策(每步用什么方向)和记忆(动量缓冲怎么更新)用不同节奏。这点是程序搜出来的,论文作者也没事先预料到。

实践案例

案例 1:换上 Lion 时唯一要改的两个超参

# 原 AdamW 配置
optimizer = AdamW(params, lr=1e-4, weight_decay=0.01)
# 换成 Lion
optimizer = Lion(params, lr=3e-5, weight_decay=0.1)
# ↑ 缩小 3-10 倍 ↑ 放大 3-10 倍

为什么:Lion 每步走 lr * 1(因为 sign),AdamW 每步大致走 lr * grad/sqrt(v)(数量级 0.1-0.3)。要走相同的总距离,Lion 的 lr 必须小。weight_decay 反向调整,保持 lr * wd 乘积不变。

案例 2:内存账(70 亿参数模型)

AdamW (fp32)Lion (fp32)
参数28 GB28 GB
梯度28 GB28 GB
动量 m28 GB28 GB
二阶 v28 GB0
合计112 GB84 GB

省下的 28 GB 等于一张 A100 80GB 卡的 35%,可以多塞一段序列长度或大一截 batch。

案例 3:搜索过程长什么样

研究员先定义一个”优化器编程语言”——只有少数几种操作(加减、乘除、动量、sign、clip 等)。然后让进化算法在这个语言里随机生成几万个候选优化器,每个都跑一段小训练做测分,留下分高的 → 突变 → 再测。最后冒尖的那一个,就是 Lion。

整个过程吃了 1 万 + GPU 小时,但产物是一个人类几乎写不出来的怪公式:beta1 ≠ beta2、用 sign、没 epsilon——每一步都和已有优化器不一样。

踩过的坑

  1. 小 batch 时反而比 AdamW 差。论文实验里 batch < 64 时 Lion 输给 AdamW;这是因为 sign 把”小梯度”和”大梯度”拍平成一样大,梯度估计本来就抖时雪上加霜
  2. 学习率必须重调。直接拿 AdamW 的 lr 套 Lion,第一步就发散。新人第一次用最常踩这个坑。
  3. 微调任务收益小。Lion 在”从零预训练”时优势明显,但微调(fine-tuning)/ 持续训练任务上经常和 AdamW 打平。如果你的工作流以微调为主,省下的内存才是主要收益。
  4. 配 ZeRO / 8-bit 优化器后,省内存优势缩水。bitsandbytes 的 8-bit AdamW 已经把 m / v 压到 1 字节,Lion 比它只省 1 字节 / 参数,不再是减半
  5. 超长训练里偶尔会”卡住”。社区报告过几例:Lion 在 100 K + step 后 loss 不再下降,但同样配置换 AdamW 就好——可能是 sign 丢失梯度细节后的累积偏差。

适用 vs 不适用场景

适用

  • 大 batch(≥ 64)的视觉 / 语言模型预训练
  • 显存吃紧、还没上 ZeRO / 8-bit 的中等规模训练
  • 想省训练算力(论文报 ViT、扩散模型有 5-15% 提速)
  • 想在论文里加一个”试了 SOTA 优化器”的 ablation

不适用

  • 小 batch(< 64)/ 单卡小数据
  • 已经用 ZeRO-3 + 8-bit AdamW 的工业训练栈(边际收益太小)
  • 微调 / RLHF 这种短训练
  • 不愿意调超参的项目(必须重调 lr 和 wd)

历史小故事(可跳过)

  • 2017 - 2022:AdamW 当王。所有大模型(BERT / GPT-2 / GPT-3 / PaLM / LLaMA)默认用它。
  • 2020 年:Google 同组先有 AutoML-Zero——让程序从加减乘除搜出”机器学习算法”。当时只是玩具,但思路埋下伏笔。
  • 2023 年 2 月:Lion 论文 arXiv 上线,几天内 GitHub 开源。社区两周内做完独立复现,一个月内集成进 HuggingFace / timm / lucidrains/lion-pytorch。
  • 2023 年下半年:Sophia(Hessian 信息)/ Adan(双动量)/ Tiger(极简)等”新一代优化器”密集出现,Lion 成为基线之一
  • NeurIPS 2023:Lion 被收录,但没拿奖——因为”只是搜出来的,没新数学”。圈里争论:实证有效但缺理论算不算贡献?

学到什么

  1. 优化器不一定要数学家发明。给搜索算法一个好的搜索空间,机器能找到人想不到的解。
  2. 少即是多。AdamW 多一份 v,是为了在每个参数上自适应缩放——但 sign(m) 直接把缩放固定成 1,反而稳。
  3. 单一指标会骗你。Lion 在 ImageNet / 预训练上赢,但在小 batch / 微调上输。换基线前必须在你自己的工作流上跑一次
  4. 新优化器换上去不是”换名字”那么简单:lr / wd 必须重调,否则一定崩。
  5. 省内存不等于省钱。如果你已经在用 ZeRO + 8-bit,Lion 的内存收益已经被吃光了。

延伸阅读

关联

  • adam-2014 —— Adam 是 Lion 的直系父亲(动量 + 自适应)
  • adamw-2017 —— AdamW 是 Lion 的直接对照基线
  • adafactor-2018 —— Adafactor 也是为省内存而生(思路:分解 v 矩阵),可对比
  • automl-zero-2020 —— Lion 用的”程序合成”思路在这里第一次出现
  • scaling-laws —— 大模型时代为什么连优化器都要省内存

反向链接

  • adam-2014 —— Adam — 让深度学习自己挑步长的优化器
  • adamw-2017 —— AdamW — 把 weight decay 从梯度里拆出来
  • scaling-laws —— Scaling Laws — 神经语言模型的缩放规律