Lion — 让程序自己搜出来的优化器,比 AdamW 内存少一半
是什么
Lion(EvoLved Sign Momentum)是 Google Brain 在 2023 年发布的一个深度学习优化器。它有两个特别的地方:
- 它不是人想出来的,是程序”进化搜索”出来的。研究员让一个程序在”所有可能的优化器配方”里乱搭乱试,最后挑出 Lion 这一个公式。
- 它比当时主流的 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三个反常识的设计:
sign(...)把更新压成 ±1:不管梯度多大多小,每个参数每步都只走lr这么远。好处是稳,坏处是丢了”梯度大小”的信息。- 两个 beta,不是一个:
beta1用来算”这一步往哪走”,beta2用来”记住更久的过去”。AdamW 里 m 只用一个 beta,Lion 把”决策”和”记忆”拆开。 - 没有 epsilon:因为没有除法(AdamW 要除
sqrt(v) + eps),Lion 公式里只有加减乘和 sign,纯整数级稳定。
一图看懂三个公式
把 SGD / AdamW / Lion 三家的更新公式并排放,差别一目了然:
SGD : param -= lr * gradAdamW : 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 的两条独立创新:
sign(...)取代m / sqrt(v)——把”自适应缩放”换成”统一步长”。原来 AdamW 每个参数走多远要靠 v 来归一化,Lion 直接全部 ±1。beta1和beta2解耦——决策(每步用什么方向)和记忆(动量缓冲怎么更新)用不同节奏。这点是程序搜出来的,论文作者也没事先预料到。
实践案例
案例 1:换上 Lion 时唯一要改的两个超参
# 原 AdamW 配置optimizer = AdamW(params, lr=1e-4, weight_decay=0.01)
# 换成 Lionoptimizer = 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 GB | 28 GB |
| 梯度 | 28 GB | 28 GB |
| 动量 m | 28 GB | 28 GB |
| 二阶 v | 28 GB | 0 |
| 合计 | 112 GB | 84 GB |
省下的 28 GB 等于一张 A100 80GB 卡的 35%,可以多塞一段序列长度或大一截 batch。
案例 3:搜索过程长什么样
研究员先定义一个”优化器编程语言”——只有少数几种操作(加减、乘除、动量、sign、clip 等)。然后让进化算法在这个语言里随机生成几万个候选优化器,每个都跑一段小训练做测分,留下分高的 → 突变 → 再测。最后冒尖的那一个,就是 Lion。
整个过程吃了 1 万 + GPU 小时,但产物是一个人类几乎写不出来的怪公式:beta1 ≠ beta2、用 sign、没 epsilon——每一步都和已有优化器不一样。
踩过的坑
- 小 batch 时反而比 AdamW 差。论文实验里 batch < 64 时 Lion 输给 AdamW;这是因为 sign 把”小梯度”和”大梯度”拍平成一样大,梯度估计本来就抖时雪上加霜。
- 学习率必须重调。直接拿 AdamW 的
lr套 Lion,第一步就发散。新人第一次用最常踩这个坑。 - 微调任务收益小。Lion 在”从零预训练”时优势明显,但微调(fine-tuning)/ 持续训练任务上经常和 AdamW 打平。如果你的工作流以微调为主,省下的内存才是主要收益。
- 配 ZeRO / 8-bit 优化器后,省内存优势缩水。bitsandbytes 的 8-bit AdamW 已经把 m / v 压到 1 字节,Lion 比它只省 1 字节 / 参数,不再是减半。
- 超长训练里偶尔会”卡住”。社区报告过几例: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 被收录,但没拿奖——因为”只是搜出来的,没新数学”。圈里争论:实证有效但缺理论算不算贡献?
学到什么
- 优化器不一定要数学家发明。给搜索算法一个好的搜索空间,机器能找到人想不到的解。
- 少即是多。AdamW 多一份 v,是为了在每个参数上自适应缩放——但 sign(m) 直接把缩放固定成 1,反而稳。
- 单一指标会骗你。Lion 在 ImageNet / 预训练上赢,但在小 batch / 微调上输。换基线前必须在你自己的工作流上跑一次。
- 新优化器换上去不是”换名字”那么简单:lr / wd 必须重调,否则一定崩。
- 省内存不等于省钱。如果你已经在用 ZeRO + 8-bit,Lion 的内存收益已经被吃光了。
延伸阅读
- 论文 PDF:Symbolic Discovery of Optimization Algorithms (arXiv:2302.06675)(30 页,3-15 页讲搜索方法,16-25 页是实验)
- 官方实现:google/automl/tree/master/lion(300 行 JAX + PyTorch)
- 社区 PyTorch 版:lucidrains/lion-pytorch(50 行核心代码,最易读)
- 视频讲解:Yannic Kilcher — Lion paper review(45 分钟逐页讲)
- 反方观点:Sebastian Raschka — Why I Stopped Using Lion(实战中 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 — 神经语言模型的缩放规律