对应 Maps to:Stanford CS236 Deep Generative Models(Fall 2023,Stefano Ermon),Lecture 17 · 2023-11-29 · Discrete Latent Variable Models(slides:
cs236_lecture17.pdf)。 依据说明:本讲按原课 slides 的主线展开:为什么关心离散(数据与结构本身是离散的)→ 随机优化:重参数化 vs 对数导数技巧(REINFORCE),多臂老虎机的例子 → 离散隐变量模型的变分学习,REINFORCE 的高方差 → 控制变量与基线、NVIL → 走向连续松弛:Gumbel 分布与 Gumbel-max 技巧 → Gumbel-softmax(Concrete)、温度带来的偏差–方差权衡、几何解释 → 推广到排列等组合对象(Plackett–Luce、Gumbel 排序、NeuralSort)。主要依据 Williams(REINFORCE,1992)、Mnih & Gregor(NVIL,2014)、Jang, Gu & Poole(Gumbel-softmax,2017)、Maddison, Mnih & Teh(Concrete,2017)、Grover, Wang, Zweig & Ermon(NeuralSort,2019)、Kool, van Hoof & Welling(Gumbel-top-k,留一法基线,2019)。用可以枚举的离散 VAE(4,096 个码字)精确量出每种估计量的偏差和方差、“q 均匀”的鞍点、NVIL 的方差归一化在 Adam 与闭式 KL 下的副作用、GRPO 式归一化的分析、松弛目标”过于乐观”的度量(解码器从 ŷ 的小数部分偷看的信息)、隐变量个数增加时各方法的表现是本讲义补充的。 配套代码 Code:code/lecture17/(PyTorch;共享模块discrete.py+ 5 个演示脚本,最长的约 75 秒) 预计阅读时间:3 小时(含运行代码)
0. 本讲导航 · How to read this lecture
0.1 学习目标 Learning goals
学完这一讲,你应该能够:
- 说出离散隐变量为什么让重参数化失效,并推导对数导数技巧(REINFORCE):。
- 用 REINFORCE 写出离散隐变量模型的 ELBO 梯度,说明为什么多出来的 项为零。
- 理解控制变量: 无偏、方差降到 倍;把基线、NVIL、留一法都看成控制变量;知道”组平均再除以标准差”(GRPO 式)带来了什么。
- 证明 Gumbel-max 技巧,写出 Gumbel-softmax 的定义,解释温度 的偏差–方差权衡和”松弛目标与离散目标不是同一个东西”。
- 知道直通估计(straight-through)、温度退火、松弛 ELBO 在 VAE 里的用法和陷阱。
- 把同样的思路推广到排列:Plackett–Luce 分布、Gumbel 排序、NeuralSort。
0.2 先修与本讲范围 Prerequisites & scope
| 默认你已经会 Assumed | 本讲只给直觉 Previewed only |
|---|---|
| 第 5–6 讲:ELBO、VAE、重参数化、REINFORCE 的初步比较(第 6 讲代码 01) | REBAR、RELAX 等更复杂的减方差方法(§4.5 一句话介绍) |
| 第 15 讲:IWAE 作为 的估计 | 强化学习中的策略梯度理论(价值函数、优势函数) |
| 第 1 讲:像素世界(177 个配置 + 翻转噪声) | VQ-VAE 等”离散码本”模型的细节(§9) |
0.3 本讲地图 Map
§1 为什么关心离散
§2 随机优化:重参数化 vs REINFORCE;多臂老虎机 ← 代码 01 第 1–2 部分
§3 离散隐变量模型的变分学习;"q 均匀"的鞍点 ← 代码 02 第 2 部分
§4 控制变量:基线、NVIL、留一法;GRPO 式归一化 ← 代码 01 第 1、3 部分,代码 02 第 1、3 部分
§5 Gumbel 分布与 Gumbel-max 技巧 ← 代码 03 第 1 部分
§6 Gumbel-softmax:温度、几何、偏差–方差 ← 代码 03 第 2–4 部分
§7 在 VAE 里用松弛:松弛目标 vs 离散 ELBO、直通、退火、隐变量变多 ← 代码 04,代码 02
§8 组合对象:排列、Plackett–Luce、NeuralSort ← 代码 05
§9 2023 年之后
§10–14 小结、常见误区、练习、延伸阅读、下一讲预告
0.4 记号 Notation
| 符号 | 含义 |
|---|---|
| , | 离散分布(“策略”或变分后验)与它的参数(logits) |
| 要最大化期望的函数:奖励、或 VAE 里的学习信号 | |
| 得分函数(score function;注意和第 13 讲的 不同:这里对参数求导) | |
| , | 基线(baseline):常数或依赖输入 |
| 标准 Gumbel 噪声, | |
| , | 温度与 Gumbel-softmax 样本 |
| , | 隐变量(符号)的个数、每个符号的类别数;码字共有 个 |
| 相对偏差、相对标准差 | 、( 是精确梯度) |
0.5 关于数字 · About the numbers
代码 01、03、05 的问题小到可以精确算出梯度(10 臂老虎机、5 个类别、720 个排列)。代码 02、04 的离散 VAE 用像素世界(第 3 讲的 pixel_data:1 万张训练图、5,000 张测试图,真实分布的熵约 25.5 bit / 图);隐变量是 个 8 类的符号,4,096 个码字可以全部枚举,所以 ELBO、、编码器的精确梯度都能算出来——这让我们能直接量出每种估计量的偏差和方差。所有数字来自固定种子的单次运行;和预想不同的结果记录在 代码 README 的”关于实验结果”里。
1. 为什么关心离散 · Why discrete?
从第 5 讲到第 16 讲,几乎每一个模型都依赖一件事:对连续变量求梯度。VAE 用重参数化 把梯度传过采样;流模型要求变换可逆、可导;GAN 的生成器要把判别器的梯度传回噪声;得分模型和扩散模型干脆把 当成要学的对象。
可是世界上很多东西本来就是离散的:
- 数据是离散的:文字(token)、DNA 序列、分子图、程序、乐谱。第 3 讲的自回归模型能处理它们,是因为它只需要 的 softmax,不需要对 求导。第 18 讲会讨论:扩散模型依赖的”梯度”在离散数据上没有定义,怎么办?
- 隐变量是离散的:类别(这张图是哪种形状?)、聚类、选择(看图像的哪一块——“硬注意力”)、结构(句法树、图的连边)、离散的码(VQ-VAE 把图像压成一串离散符号,§9)。离散的隐变量往往更可解释,也更适合表示”非此即彼”的结构。
- 决策是离散的:强化学习里选哪个动作,语言模型生成哪个 token。
这一讲关心的就是:当 离散时,怎样优化 ?像素世界本身就是一个离散隐变量模型(第 1 讲:177 个配置之一 + 独立翻转),它是这一讲的主要试验场。
2. 随机优化:重参数化 vs REINFORCE · Stochastic optimization
2.1 问题
很多学习问题都长这样:
VAE 里 是编码器、 是 ;强化学习里 是策略、 是奖励。难点在于:期望的分布本身依赖 ,梯度不能直接搬进期望里。
2.2 回顾:重参数化,以及它为什么在离散时失效
第 6 讲:如果能把采样写成 , 的分布不依赖 ,那么
这需要两件事: 是 的可导函数, 对 可导。离散的 两条都不满足: 稍微变一点, 要么不变(导数为 0),要么跳到另一个值(导数不存在);而 只在离散点上有定义。第 6 讲代码 01 第 3 部分已经看到:PyTorch 认为 argmax 的输出 requires_grad = False——梯度在这里断了。
2.3 对数导数技巧(REINFORCE)
换一个思路:不对样本求导,而对概率求导。设 取有限多个值:
第三个等号用了 ——这就是”对数导数技巧”(log-derivative trick),也叫得分函数估计量(score function estimator)、似然比估计量(likelihood ratio)、REINFORCE(Williams 1992)。于是可以用蒙特卡洛估计:
为什么它这么通用? 它只要求两件事:能从 采样、 对 可导。 可以是黑箱——不可导、不连续、甚至只能”做一次实验看结果”。代价是方差: 只以”一个数”的形式出现,乘在 上;它不知道” 往哪边变 会变好”,只知道”这次的 得了几分”。
直觉: 指向”让 更可能”的方向。REINFORCE 说:把每个样本往”更可能”的方向推,推的力度正比于它的得分。得分高的被推得多、得分低的被推得少,平均下来,概率就从差的 流向好的 。
2.4 例子:多臂老虎机
原课 slides 用多臂老虎机(multi-armed bandit)举例: 台老虎机,选第 台得到随机奖励;策略 ;目标是期望奖励 。奖励的公式我们不知道,只能”拉一下、看结果”——典型的黑箱 。
对 softmax,( 是 one-hot),所以单次拉动的 REINFORCE 估计是 。精确梯度是 :比平均水平好的机器,概率被推高。
代码 01 用 10 台中奖概率 0.0–0.9 的机器,在均匀策略 下比较估计量(2 万次估计):
| 估计量 | 平均值的方向余弦 | 单次相对标准差 | 拉几次到 10% 误差 |
|---|---|---|---|
| 不加基线: | 0.999 | 6.90 | 4,764 |
| 奖励整体加 100(不加基线) | −0.158 | 1049 | 1.1 亿 |
| 常数基线 | 1.000 | 5.09 | 2,594 |
两件事值得停下来想:
- REINFORCE 是无偏的:平均 2 万次以后方向几乎完全对(余弦 0.999)。但单次估计的标准差是真梯度长度的 7 倍——一次估计几乎是噪声。
- 奖励整体加一个常数,期望不变,方差爆炸:标准差从 6.9 涨到 1049(约 152 倍,方差约 2.3 万倍),2 万次的平均仍然全是噪声。原因在 §4:,所以加常数 只是给估计量加了一个均值为零、方差为 的噪声。
真正去学的时候(代码 01 第 2 部分,学习率 0.1、拉 4,000 次、50 个独立的赌徒),这种方差直接表现为失败:
| 估计量 | 拉 500 次后的 | 4,000 次后的 | 最常选的是最好机器的比例 |
|---|---|---|---|
| 不加基线 | 0.793 | 0.879 | 0.82 |
| 奖励加 100(不加基线) | 0.372 | 0.410 | 0.10 |
| 常数基线 | 0.818 | 0.895 | 0.98 |
| 滑动平均基线 | 0.817 | 0.897 | 1.00 |
奖励加 100 时,第一次拉到哪台机器, 就朝那台机器猛冲(一步的更新量约 ),策略立刻塌缩到一台随机的机器上,再也学不回来——0.10 的”找到最好机器”的比例就是随机猜的水平。方差大在优化里的样子不只是”学得慢”,而是被一次噪声带进死胡同。
3. 离散隐变量模型的变分学习 · Variational learning with discrete latents
3.1 ELBO 的梯度
隐变量模型 , 离散。ELBO(第 5 讲):
- 对 :期望的分布不依赖 ,,直接采样估计——和连续的 VAE 一样。
- 对 : 本身也依赖 ,所以多一项:
最后一步用了 。这个恒等式是整讲的关键,§4 还会反复用到。
能精确算的就精确算。 如果先验和后验都按符号分解(,),KL 项 有闭式解,于是只剩重构项 需要估计,学习信号就是 。把能精确算的部分精确算,本身就是一种减方差(Rao–Blackwell 化)。代码 discrete.py 的所有方法都这样处理 KL。
3.2 实验设置:一个可以枚举的离散 VAE
代码 02 的模型 CatVAE:,每个 ;先验均匀;编码器是 MLP,输出 个 logits;解码器是 MLP,输入 4 个 one-hot 拼成的 32 维向量,输出 64 个像素的伯努利 logits。
码字共 个,远多于像素世界的 177 个配置,表达能力绰绰有余。4,096 不大,所以:解码器只依赖 ,4,096 个码字只需要解码一次,所有 (图, 码字) 对的 是一次矩阵乘法(和第 1 讲 pixel_world.log_lik 一样)。于是 ELBO、、以及 ELBO 对编码器参数的精确梯度都能算出来。真实的模型做不到这一点(码字太多,或者解码器还依赖别的东西),但在这里,它让我们能直接量出每种估计量离真相有多远。
3.3 一个鞍点:“q 均匀、解码器忽略 z”
代码 02 第 2 部分从头训练 3,000 步(Adam,学习率 ),测试集上精确评估(bit / 图; bit 表示编码器输出均匀分布):
| 训练方法 | −ELBO | −log p(x) | |
|---|---|---|---|
| (初始化) | 64.27 | 64.23 | 11.98 |
| REINFORCE,不加基线 | 35.62 | 35.50 | 11.89 |
| 常数基线(滑动平均) | 35.55 | 35.53 | 11.99 |
| NVIL(§4.3) | 32.99 | 32.78 | 9.97 |
| 留一法 (§4.4) | 30.87 | 30.55 | 7.72 |
| Gumbel-softmax (§6) | 31.03 | 29.96 | 7.30 |
不加基线和常数基线的 REINFORCE,3,000 步后编码器还是均匀分布,解码器只学会了平均图像(各像素独立的模型约 35.6 bit / 图)。这是一个鞍点,形成的逻辑是一个闭环:
与此同时,闭式的 KL 项一直在把 拉向均匀先验。精确梯度能慢慢爬出来(一开始用单个 64 类变量做实验时,精确梯度也花了约 1,500 步,见代码 README 第 1 条),但单样本估计量的噪声把那一点微弱的信号淹没了。输入相关的基线(NVIL)和多样本的留一法噪声小,能爬出来;Gumbel-softmax 爬得最快——原因在 §7.1。
这个现象不是玩具特有的。 离散隐变量模型(以及第 6 讲的”后验坍缩”)都容易卡在”隐变量没被使用”的状态。实践中的对策包括:更好的估计量、KL 预热(不过在这里它反而让情况更糟,见代码 README 第 2 条)、用确定性的编码器预训练、或者像 VQ-VAE 那样干脆不用 KL(§9)。
4. 控制变量:基线、NVIL 与留一法 · Control variates
4.1 一般形式
想估计 。如果有另一个随机变量 ,它的均值 已知,就可以用
对任何系数 都无偏。方差 在
处最小,最小值是 , 是 和 的相关系数。控制变量和 越相关越有用。
4.2 基线就是控制变量
对 REINFORCE,取 ——它的均值已知,就是 0(§3.1 的恒等式)。于是
对任何不依赖 的 都无偏。 叫基线(baseline)。直觉: 的正负表示”这次比平时好还是差”;不减基线时,即使是很差的 (奖励为正的话)也会被推高,只是推得少一点——REINFORCE 要靠”推多推少”的差别来分辨好坏,噪声自然大。
代码 01 第 3 部分验证了一般形式( 的策略,REINFORCE 的第 3 个坐标 、):(不加基线)方差 0.189; 方差降到 0.231 倍; 方差降到 0.182 倍,正好等于理论的 。这里的 就是这个坐标的最优基线 ——不是平均奖励,而是”以 为权重的奖励加权平均”。实践中用平均奖励(或它的滑动平均)就已经很接近最优:代码 01 里,均匀策略下精确的 当基线的标准差 5.09,逐坐标最优基线 4.32,滑动平均基线 5.23。
4.3 输入相关的基线:NVIL
在 VAE 里,学习信号 的大小主要取决于 :有的图容易(−20 nat),有的难(−40 nat)。这部分变化和 无关,却被整个乘进了 。常数基线去不掉它;需要一个依赖 的基线 。只要 不依赖当前的 ,,估计仍然无偏。
NVIL(Neural Variational Inference and Learning,Mnih & Gregor 2014)的做法:
- 中心化:学习信号减去 , 是滑动平均, 是一个小网络,训练它最小化 ——也就是让它预测”这张图大概能得几分”。最优的 是 。
- 方差归一化:再除以 的滑动标准差(让学习率自适应)。
- 局部学习信号:多层隐变量时,每一层用只和它有关的那部分信号(这里只有一层,用不到)。
代码 02 第 1 部分在两个检查点上,用 100 张测试图、每种估计量重复 300 次,和枚举得到的精确梯度比较编码器梯度:
| 估计量 | 刚初始化:相对标准差 | 训练过 1,000 步:相对标准差 | 训练过:和精确梯度的余弦 |
|---|---|---|---|
| REINFORCE,不加基线 | 171.6 | 64.3 | 0.003 |
| 常数基线 | 0.72 | 13.67 | 0.069 |
| 理想的输入相关基线 | 0.43 | 3.82 | 0.253 |
| NVIL:学到的 | 0.44 | 6.17 | 0.155 |
| 留一法 | 0.44 | 3.71 | 0.250 |
| 留一法 | 0.25 | 2.14 | 0.409 |
(所有这些估计量的偏差都在噪声底以内。)刚初始化时不同的图的 几乎一样(标准差 0.15 nat),常数基线就够了;训练一段以后图与图的差别变大(标准差约 4.6 nat),输入相关的基线比常数基线好 3.6 倍。NVIL 的基线网络(固定模型训练 1,000 步)去掉了其中一大半,离理想还有距离。
一个和优化器有关的教训。 第一版代码照原论文做了方差归一化,结果 NVIL 比常数基线还差。原因是:KL 项是闭式算的、没有被归一化;只把学习信号除以一个大于 1 的数,等于调低了重构项相对 KL 项的权重,训练初期编码器被推向均匀分布(代码 02 第 3 部分”NVIL + 方差归一化”一行: 从检查点的 10.62 升到 11.23 bit)。而原论文配合普通 SGD 使用时,归一化的作用是自适应学习率;Adam 本来就对梯度的整体缩放不敏感,这个好处也就没有了。减方差的技巧和优化器、和目标里其他项的处理方式是耦合的。
4.4 留一法基线
不想训练基线网络?对每个 抽 个样本 ,第 个样本的基线用另外 个样本的平均:
基线和第 个样本独立,所以无偏;它又自动依赖 (同一张图的样本),所以起到了输入相关基线的作用。Kool, van Hoof & Welling(2019)的标题很形象:Buy 4 REINFORCE samples, get a baseline for free! 代价是每张图要算 次 ;按样本数算,它比”已知 “的理想基线贵 倍(代码 01: 时贵一倍, 的方差是 的两倍)。VIMCO(Mnih & Rezende 2016)把同样的想法用在多样本的 IWAE 目标上。
4.5 组平均、再除以标准差:GRPO 式的归一化
大语言模型的强化学习(§9)常用”组平均(含自己)当基线,再除以组内标准差”。代码 01 第 1 部分把它和留一法放在一起(均匀策略,):
| 估计量 | 平均值的方向余弦 | 平均值的长度比 | 单次相对标准差 | 拉几次到 10% |
|---|---|---|---|---|
| 留一法 | 1.000 | 0.99 | 2.96 | 3,516 |
| 组平均(含自己) | 1.000 | 0.74 | 2.22 | 3,572 |
| 组平均再除以组标准差 | 1.000 | 1.61 | 4.81 | 3,584 |
- 组平均(含自己)恰好等于留一法乘 :。方向不变、长度缩小 25%,信噪比和留一法完全一样——这种”偏差”只是缩放,等于换了学习率。
- 再除以组标准差:方向仍然基本对,长度被放大(0/1 奖励的组内标准差不到 1),在同样的学习率下步子更大(代码 01 第 2 部分里它前期学得更快)。组内奖励全相同时梯度为 0。它不再是严格的缩放:难度不同的问题被乘以不同的系数,对整体目标来说是有偏的——Liu et al.(2025)把这称为 GRPO 的”难度偏差”,并建议去掉这一步。
更复杂的减方差方法(本讲不展开):REBAR(Tucker et al. 2017)和 RELAX(Grathwohl et al. 2018)用 Gumbel-softmax 松弛(§6)构造控制变量,得到无偏且低方差的估计;ARM(Yin & Zhou 2019)利用对偶采样。
5. Gumbel 分布与 Gumbel-max 技巧 · The Gumbel-max trick
5.1 动机:能不能把离散采样也”重参数化”?
重参数化的本质是把采样写成”确定的函数 + 与参数无关的噪声”。对类别分布 ,有一个漂亮的写法。
5.2 Gumbel 分布
标准 Gumbel 分布的累积分布函数 ,用逆变换采样:,。它是”许多独立变量的最大值”的极限分布(极值理论),均值是欧拉常数 ,方差 。代码 03 第 1 部分用 100 万个样本核对:均值 0.5755,方差 1.6420。
它最重要的性质是在取最大值下封闭:若 独立,则 。代码里 10 个标准 Gumbel 的最大值均值 2.8797,正好是 ,方差不变。
5.3 Gumbel-max 技巧
一行推导:令 ,它的分布函数是 ,密度 。
(最后一步令 。)代码 03 第 1 部分的检验(100 万次,):Gumbel 噪声的卡方统计量 5.0(自由度 4,一致);换成标准高斯噪声,卡方统计量 5 万,频率明显偏离 ——噪声的分布不能随便换。另一个推论:最大值本身和”哪一类胜出”独立(无论哪一类胜出,最大值的均值都约为 0.577),这是 §8 排列采样的基础。
可惜 argmax 不可导。 Gumbel-max 把离散采样写成了 的确定函数,但这个函数是分段常数,梯度处处为 0。下一步自然是:把 argmax 换成一个光滑的近似。
6. Gumbel-softmax:连续松弛 · The Gumbel-softmax (Concrete) relaxation
6.1 定义
Jang, Gu & Poole(2017)和 Maddison, Mnih & Teh(2017,叫它 Concrete 分布)同时提出:
是单纯形上的一个点(各分量非负、和为 1),是 的可导函数——可以像第 6 讲那样重参数化,用路径梯度 。温度 控制它有多像离散:
- :softmax 变成 argmax, 变成 one-hot,恰好是 Gumbel-max 的样本;
- :,和 、和噪声都无关。
Maddison et al. 给出了 的密度(练习 6 会用到):
6.2 几何:单纯形上的样本
代码 03 第 2 部分在三类单纯形上画出了样本(;三个顶点是 one-hot;三个温度共用同一组噪声):
| 最大分量的平均 | 最大分量 > 0.99 的比例 | argmax() 的频率 | ||
|---|---|---|---|---|
| 0.1 | 0.957 | 0.733 | (0.200, 0.299, 0.500) | (0.200, 0.299, 0.501) |
| 1 | 0.665 | 0.011 | (0.237, 0.315, 0.448) | (0.200, 0.299, 0.501) |
| 5 | 0.414 | 0.000 | (0.305, 0.330, 0.365) | (0.200, 0.299, 0.501) |
文字画的密度图里, 的样本几乎全贴在三个顶点上; 的样本挤在单纯形中心附近一小团。表格揭示了松弛的两面:
- argmax() 的分布在任何温度下都恰好是 (softmax 不改变谁最大)。离散的信息一直都在。
- 但 , 越大越偏向均匀。用 代替 one-hot,哪怕目标是线性的 ,期望也变了。这就是松弛的偏差的根源:我们优化的是 ,而不是 。
6.3 偏差–方差权衡
代码 03 第 3 部分:5 个类别,,,精确梯度已知。5 万次估计:
| 估计量 | 相对偏差 | 单次相对标准差 | 100 次平均后的相对误差 |
|---|---|---|---|
| Gumbel-softmax | 0.076 | 8.53 | 0.86 |
| 0.211 | 3.86 | 0.44 | |
| 0.746 | 0.98 | 0.75 | |
| 0.970 | 0.07 | 0.97 | |
| 直通 Gumbel | 0.670 | 2.30 | 0.71 |
| REINFORCE + 留一法() | 0.011 | 2.38 | 0.24 |
- 小,偏差小、方差大:softmax 很陡,梯度 ,只有落在”决策边界”附近的噪声才产生大梯度,其余几乎为零——均值慢慢变对,单次估计越来越不稳定。
- 大,方差小、偏差大: 的估计几乎是常数,但方向基本不对(相对误差约 1,和”猜梯度为零”差不多)。
- 偏差不会被平均掉,方差会。 把 100 次估计平均(一个小批量、或者连续很多步的更新都相当于平均),误差 在中等温度()最小。最好的温度取决于你能平均多少次。
- 在这个只有 5 个类别、 很简单的问题上,REINFORCE + 留一法反而最准(代码 README 第 5 条:原以为松弛会全面占优)。松弛的优势在 复杂、维数高的时候——例如一个神经网络解码器(§7)。
6.4 偏差的后果:收敛到错误的离散解
代码 03 第 4 部分真的去最小化 (各类别的 = 2.56, 0.36, 0.16, 1.96, 5.76,离散最优是把全部概率放在第 2 类):
| 梯度 | 最后的 (最优 0.16) | (第 2 类) | |
|---|---|---|---|
| 精确梯度 | 0.160 | 0.999 | 2.00 |
| Gumbel | 0.169 | 0.985 | 1.99 |
| Gumbel | 0.215 | 0.737 | 1.74 |
| Gumbel, 从 2 退火到 0.1 | 0.166 | 0.972 | 1.97 |
| 直通 | 0.248 | 0.625 | 1.62 |
| REINFORCE + 留一法 | 0.162 | 0.997 | 2.00 |
大时,松弛的目标近似是 ,只要”平均的 “等于 1.6 就是零——于是它学到一个把概率分散在第 1、2 类之间的 ( 被拉向 1.6)。按离散的 算,这个解明显更差。松弛的目标和真正的目标有不同的最优解。 低温或退火(Jang et al. 的做法:从高温开始、逐渐降温)能找到正确的解。
7. 在 VAE 里用松弛 · Relaxations in a discrete VAE
7.1 怎么用
把编码器的样本换成 ,解码器的输入从 one-hot 变成 :整条路可导,编码器和解码器一起用路径梯度训练。KL 项有两种处理:
- Jang et al.:KL 仍然按离散的 和 闭式计算,只有重构项用松弛样本(本讲的代码这样做);
- Maddison et al.:用 Concrete 密度(§6.1)计算松弛变量之间的 KL,得到”松弛模型”的一个严格的 ELBO。
测试时用真正的离散 。为什么 §3.3 里 Gumbel 能最快爬出鞍点?因为 是 logits 的连续函数:哪怕 几乎均匀, 也带着一点关于 的信息,解码器可以利用它、再把梯度沿着这条路径传回编码器。REINFORCE 没有这条”信息通道”,它只能等 自己显出差别。
7.2 松弛目标”过于乐观”:解码器在偷看
这条信息通道也是问题的来源。代码 04 第 1 部分扫温度(从头训练 3,000 步)。“松弛目标”是训练时真正优化的量,“偷看”是同一个噪声样本下 ——给解码器看松弛的 比只看它对应的离散 好多少:
| 训练方法 | 松弛目标 | −ELBO(离散) | 偷看的信息 | −log p(x) |
|---|---|---|---|---|
| Gumbel | 32.11 | 32.29 | 0.18 | 31.84 |
| Gumbel | 30.67 | 31.18 | 0.51 | 30.57 |
| Gumbel | 29.02 | 31.26 | 2.33 | 29.82 |
| Gumbel | 25.94 | 35.82 | 9.87 | 31.68 |
| Gumbel | 24.51 | 42.74 | 18.26 | 36.30 |
| Gumbel, 从 2 退火到 0.25 | 30.36 | 31.53 | 1.16 | 30.38 |
| 直通 | 32.84 | 32.84 | 0.00 | 32.48 |
(单位 bit / 图。) 时松弛目标是 24.5 bit——比真实分布的熵(25.5)还低,这在离散模型里是不可能的:解码器把 的小数部分当成了一个额外的连续信道,偷看了 18 bit 的信息。测试时只给 one-hot,这些信息就没有了,离散的 −ELBO 高达 42.7。训练和测试在优化不同的东西。
太小(0.1)偷看得少,但梯度方差大、学得慢;–0.5 最好。从高温退火到 0.25 的结果介于两者之间,没有超过最好的固定温度(代码 README 第 6 条)——退火的价值在于不必事先知道哪个温度合适。
7.3 直通估计 · Straight-through
直通 Gumbel(straight-through Gumbel-softmax;Bengio et al. 2013 的直通思想):前向传播用 ,反向传播假装用的是 。代码里就一行:y_hard - y.detach() + y。
- 优点:解码器只看到 one-hot,没有”偷看”(上表最后一行:松弛目标 = 离散 ELBO,偷看 = 0);测试时和训练时一致。
- 缺点:梯度是”借来的”——它是另一个函数的梯度,有偏,而且偏差不随训练消失。在代码 02、03、04 里它都不如合适温度的 Gumbel-softmax。
直通的思想在 VQ-VAE(§9)里被大规模使用:量化操作的前向是”选最近的码字”,反向直接把梯度复制给量化之前的向量。
7.4 隐变量变多:不能枚举的时候
个 8 类的符号有 万个码字,不能枚举了,只能用重要性采样(IWAE,第 5、15 讲)估计 。代码 04 第 2 部分先在能枚举的 模型上检查:精确 −ELBO 31.44、精确 −log p 30.32;IWAE = 1 / 30 / 300 给出 31.33 / 30.34 / 30.32—— 已经和精确值相同。然后比较 (300 张测试图):
| 训练方法() | IWAE (≈ −ELBO) | (≈ −log p) | (均匀 = 24) |
|---|---|---|---|
| REINFORCE + NVIL | 35.51 | 35.49 | 23.99 |
| 留一法 | 32.34 | 32.02 | 20.57 |
| Gumbel | 32.28 | 31.29 | 20.32 |
| 直通 | 33.35 | 32.96 | 22.35 |
同样 3,000 步,每种方法都比 时差约 1.5 bit(码更长、参数更多)。NVIL 在 时能爬出鞍点, 时爬不出来:单样本 REINFORCE 的学习信号是同一个 乘以 8 个符号的得分之和,每个符号分到的”功劳”更难分辨,噪声随 增长。原以为 Gumbel 受 的影响会比留一法小得多,数据不支持(代码 README 第 7 条):两者都差了约 1.5 bit,Gumbel 仍然最好。
7.5 小结:怎么选
| REINFORCE + 基线 | Gumbel-softmax | 直通 | |
|---|---|---|---|
| 偏差 | 无 | 有,随 增大 | 有(梯度是借来的) |
| 方差 | 大,靠基线 / 多样本压低 | 小,随 减小而增大 | 中等 |
| 对 的要求 | 只要能算值(黑箱也行) | 要在单纯形内部有定义、可导 | 同左 |
| 适合 | 奖励不可导(强化学习、BLEU 分数……)、需要无偏(理论保证) | 是神经网络、维数高 | 必须让下游看到离散值 |
8. 组合对象:排列 · Beyond categorical: permutations
原课最后把同样的思路推广到组合对象。例子:给 篇文档排名,排名(排列 )本身是一个离散隐变量,有 种取值。
8.1 Plackett–Luce 分布与 Gumbel 排序
Plackett–Luce(PL)分布:每个物品有分数 ,第一名按 选,第二名在剩下的里面按同样的比例选,依此类推:
Gumbel 技巧的推广:给每个 加独立的 Gumbel 噪声,从大到小排序,得到的排列恰好服从 PL 分布。第一名就是 Gumbel-max;而”最大值与 argmax 独立”(§5.3)让剩下的物品又是一个同样形式的问题。代码 05 第 1 部分(、、40 万次):24 个排列的频率和 PL 公式的卡方统计量 21.5(自由度 23,一致)。
只取前 名就是”按权重不放回地抽 个”(Gumbel-top-k,Kool et al. 2019)。注意”进入前 2”的概率不是 :代码里四个物品进入前 2 的概率是 0.23、0.44、0.61、0.72,不放回抽样把概率摊平了。子集采样的连续松弛(Xie & Ermon 2019)就建立在它上面。
8.2 NeuralSort:松弛排序
排序算子不可导。NeuralSort(Grover, Wang, Zweig & Ermon 2019)利用一个恒等式:第 大的元素是
把 argmax 换成 softmax(温度 ),得到一个 的行随机矩阵 ,第 行是”排在第 位的是哪个物品”的分布。和 Gumbel-softmax 把 argmax 换成 softmax 是同一个想法;配合 Gumbel 噪声(),就得到 PL 分布的可重参数化松弛。
代码 05 第 2 部分: 时 就是真正的置换矩阵; 时每行和真置换矩阵的平均差 0.56,“松弛的第一名”(真的最大值 1.2,被拉向平均)。按行取 argmax 和温度无关,总能还原真排序。每一行和为 1,但列和不为 1( 时最多偏离 0.19)——同一个物品可能被”分到”多于一个位置,这是 NeuralSort 的已知缺点。
8.3 学一个排序
代码 05 第 3 部分:6 个物品、相关度 (3, 0, 2, 1, 0, 2.5),最大化期望 DCG(最优 6.008),720 个排列可以枚举出精确梯度:
| 估计量 | 相对偏差 | 相对标准差 | 优化 1,500 步后的 | 排对的比例 |
|---|---|---|---|---|
| REINFORCE + 留一法 | 0.020 | 2.97 | 5.989 | 1.00 |
| Gumbel + NeuralSort | 0.041 | 3.80 | 5.984 | 1.00 |
| Gumbel + NeuralSort | 0.115 | 2.45 | 5.994 | 1.00 |
| Gumbel + NeuralSort | 0.454 | 1.17 | 5.894 | 0.50 |
和类别变量完全是同一个图景:REINFORCE 无偏;松弛的偏差随温度升高、方差随温度降低。温度太高时目标变成”糊掉的排序”的 DCG,一半的运行最后排错了。 时排列有 个,枚举只在玩具规模可行——这正是需要这些估计量的原因。
9. 2023 年之后 · Since 2023
- REINFORCE 的复兴:大语言模型的强化学习。 语言模型生成的每个 token 是离散的,奖励(人类偏好、答案是否正确)是黑箱——这正是 §2 的设定。Ahmadian et al.(ACL 2024)指出,对 RLHF 来说 PPO 的很多复杂性不必要,REINFORCE + 留一法基线(RLOO,就是 §4.4)就足够好。DeepSeekMath(Shao et al. 2024)提出的 GRPO 用组内平均当基线、再除以组内标准差(§4.5),后来被 DeepSeek-R1(2025)等推理模型的训练采用;Liu et al.(2025,Dr. GRPO)分析了除以标准差和按长度归一化带来的偏差。
- 离散码本成为生成模型的”分词器”。 VQ-VAE(van den Oord et al. 2017)用直通估计(§7.3)训练离散码本,VQGAN(Esser et al. 2021)加上对抗损失;图像和视频被压成离散 token 序列,再用自回归或掩码 Transformer 生成(MaskGIT 2022、Parti 2022、LlamaGen 2024 等)。FSQ(Mentzer et al., ICLR 2024)用逐维取整代替码本查找,同样靠直通估计训练,避免了码本”坍缩”。音频编解码器(SoundStream、EnCodec)也是这条路线。
- 推理链作为离散隐变量。 把语言模型的”思考过程”看成离散隐变量 、把答案看成 ,最大化 ——其变分或 EM 式的训练(例如 Hoffman et al., NeurIPS 2023 的 TRICE)正是本讲的问题: 的空间巨大、离散、只能采样。
- 离散数据上的扩散模型。 离散的数据(文本)不能用 ,但可以用”概率比”代替梯度——第 18 讲。
10. 小结 · Summary
- 离散让重参数化失效: 不是 的可导函数, 也只在离散点上有定义。
- REINFORCE:,无偏、通用( 可以是黑箱),方差大;对奖励的零点敏感(加 100,标准差涨约 150 倍)。
- 控制变量: 无偏,方差降到 ;基线是 时的控制变量。常数基线 → 输入相关的基线(NVIL)→ 留一法,一级比一级更贴近”这个 的平均水平”。
- 离散 VAE 的鞍点:“q 均匀 ⇒ 解码器忽略 z ⇒ 信号消失”,单样本 REINFORCE 爬不出来;减方差的技巧要和优化器(Adam)、闭式 KL 的处理方式一起考虑。
- Gumbel-max:argmax(log π + Gumbel) ~ Categorical(π)。Gumbel-softmax:把 argmax 换成 softmax(·/τ),可重参数化;argmax 的分布不变,但 。
- 温度的偏差–方差权衡: 小偏差小、方差大; 大反之;最好的 取决于能平均多少次。偏差可以让优化收敛到错误的离散解。
- VAE 里的松弛:解码器会从 的小数部分”偷看”信息,松弛目标过于乐观( 时偷看 18 bit);直通估计没有偷看,但梯度有偏。
- 排列:Gumbel 排序 = Plackett–Luce 采样;NeuralSort 是排序的松弛;同样的偏差–方差图景。
11. 常见误区 · Common pitfalls
- “离散变量没法求梯度,所以离散隐变量模型不能用梯度训练。” REINFORCE 给出的是期望对参数的精确梯度的无偏估计;不可导的是样本,不是期望(§2.3)。
- “基线会让估计有偏。” 只要基线不依赖当前样本 (可以依赖 、可以依赖其他样本),,就无偏(§4.2)。用包括自己在内的组平均当基线才会引入(纯缩放的)偏差(§4.5)。
- “REINFORCE 的方差大,是因为样本太少。” 更主要的原因是学习信号的”零点”和”与 无关的部分”(§2.4、§4.3);一个好基线比十倍的样本还有效。
- “Gumbel-softmax 是离散分布的重参数化。” Gumbel-max 才是精确的离散采样;Gumbel-softmax 是另一个(连续)分布,优化它得到的是有偏的梯度(§6.2)。
- “温度越低越好,因为越接近离散。” 偏差小了,方差却按 增长;要看能平均多少次(§6.3)。
- “训练时的松弛 ELBO 就是模型的 ELBO。” 解码器会利用 的小数部分;必须用离散的 评估(§7.2: 时差 18 bit)。
- “直通估计是无偏的,因为前向用的是真正的离散值。” 前向的值无偏,反向的梯度是借来的、有偏(§7.3)。
- “方差归一化总是有用的。” 在 Adam 下它几乎只改变各项的相对权重;如果 KL 是闭式算的、没被归一化,它会把编码器推向均匀(§4.3)。
12. 练习 · Exercises
练习 1(对数导数技巧的前提) (a) 推导 。(b) 对 ELBO 的学习信号 ,证明第二项为零。
参考答案
(a) ,第一项用 。(b) ,。注意:这只在期望里成立;单个样本的 不为零,把它留在估计量里只会增加方差。
练习 2(多臂老虎机的精确梯度) 对 、,证明 ,并验证它等于 。
参考答案
,所以 。另一边 ,相同。代码 01 的 exact_grad 就是这个公式。
练习 3(最优常数基线) 对标量参数,求使 最小的 ()。它什么时候等于 ?
参考答案
(因为 ,均值与 无关)。对 求导:。当 与 不相关时 。代码 01 第 3 部分:,和控制变量公式的 一致。
练习 4(组平均 vs 留一法) 证明 ,并说明为什么”组平均(含自己)“的估计量期望是真梯度的 倍。
参考答案
右边展开: = 左边。留一法无偏,乘常数 后期望也乘这个常数。代码 01 的”长度比”一列 0.74–0.75 就是 。
练习 5(Gumbel-max 与 log-sum-exp) (a) 证明 。(b) 由此说明 ——“Gumbel 噪声下的 max 是 log-sum-exp 的随机版本”。
参考答案
(a) ,正是位置参数 的 Gumbel 分布函数。(b) Gumbel 的均值是 。这也说明了为什么 softmax 是 argmax 的”光滑版本”:log-sum-exp 是 max 的光滑版本,它的梯度就是 softmax。
练习 6(Concrete 的密度,) 时 , 服从标准 logistic 分布。由此推出 的密度,并和 §6.1 的公式核对。
参考答案
令 , 的分布函数 。,即 。。,化简得 ,和 §6.1 的公式(,)一致。
练习 7(松弛的偏差,线性目标) 设 是线性的。证明 REINFORCE 的期望梯度和 Gumbel-softmax 的期望梯度分别是 和 ,并用代码 03 第 2 部分的表格说明后者在 时为什么不对。
参考答案
,REINFORCE 无偏地估计它的梯度。Gumbel-softmax 优化的是 。表格显示 时 :被拉向均匀分布,所以函数 和 不同,梯度也不同。只有 时两者一致。
练习 8(解码器为什么能”偷看”) 、 时,解码器的输入是 。证明 是 的单调函数,并说明:在 不太小时,它携带了离散的 所没有的、关于 的连续信息。这和 §7.2 表格里”偷看”一列随 增大有什么关系?
参考答案
,,是 的单调函数,所以解码器从 能还原 ——一个连续的、带噪声的关于 的量;而离散的 只告诉它 的符号(1 bit)。 大时 远离 0、1,这个连续量容易被解码器读出(偷看得多); 时 饱和在 0 或 1,只剩符号。表格里偷看的信息从 的 0.18 bit 涨到 的 18 bit。
练习 9(Plackett–Luce 的第二名) 在 PL 分布下,求”物品 排第二”的概率,并对 的物品 4 算出数值。用它核对代码 05 第 1 部分”物品 4 进入前 2”的概率 0.7159。
参考答案
第一名是 的概率 (),之后在剩下的物品里选,剩余总分是 :。物品 4():。进入前 2 = 排第一()+ 排第二(0.3159)= 0.7159,和代码一致。容易犯的错误是把分母写成 或忘了它随第一名变化。
练习 10(REINFORCE 用于 LLM) 把一个语言模型对提示 生成的回答 看成离散的”隐变量”,奖励 是黑箱。(a) 写出 的 REINFORCE 形式,说明 怎样分解到每个 token。(b) 对同一个提示采样 个回答,写出 RLOO 的估计量。(c) 为什么基线可以依赖提示 ,却不能依赖回答 ?
参考答案
(a) ,——每个 token 的 log-softmax 梯度之和(第 3 讲的自回归分解)。(b) 。(c) ;若 依赖 ,这一项不再为零,估计有偏。提示 在这里扮演 VAE 里 的角色, 就是 NVIL 的输入相关基线(PPO 的价值函数是它的推广)。
13. 延伸阅读 · Further reading
REINFORCE 与控制变量
- Williams, Simple Statistical Gradient-Following Algorithms for Connectionist Reinforcement Learning, Machine Learning 1992
- Mnih & Gregor, Neural Variational Inference and Learning in Belief Networks, ICML 2014(NVIL)
- Mnih & Rezende, Variational Inference for Monte Carlo Objectives, ICML 2016(VIMCO)
- Kool, van Hoof & Welling, Buy 4 REINFORCE Samples, Get a Baseline for Free!, ICLR 2019 Workshop
- Mohamed, Rosca, Figurnov & Mnih, Monte Carlo Gradient Estimation in Machine Learning, JMLR 2020(综述)
- Tucker et al., REBAR, NeurIPS 2017;Grathwohl et al., Backpropagation through the Void(RELAX), ICLR 2018;Yin & Zhou, ARM, ICLR 2019
连续松弛
- Jang, Gu & Poole, Categorical Reparameterization with Gumbel-Softmax, ICLR 2017
- Maddison, Mnih & Teh, The Concrete Distribution, ICLR 2017
- Bengio, Léonard & Courville, Estimating or Propagating Gradients Through Stochastic Neurons for Conditional Computation, 2013(直通估计)
- Huijben, Kool, Paulus & van Sloun, A Review of the Gumbel-max Trick and its Extensions for Discrete Stochasticity in Machine Learning, TPAMI 2022
组合对象
- Grover, Wang, Zweig & Ermon, Stochastic Optimization of Sorting Networks via Continuous Relaxations, ICLR 2019(NeuralSort)
- Kool, van Hoof & Welling, Stochastic Beams and Where to Find Them: The Gumbel-Top-k Trick, ICML 2019
- Xie & Ermon, Reparameterizable Subset Sampling via Continuous Relaxations, IJCAI 2019
2023 年之后
- Ahmadian et al., Back to Basics: Revisiting REINFORCE Style Optimization for Learning from Human Feedback in LLMs, ACL 2024
- Shao et al., DeepSeekMath, 2024(GRPO);Liu et al., Understanding R1-Zero-Like Training: A Critical Perspective, 2025
- van den Oord, Vinyals & Kavukcuoglu, Neural Discrete Representation Learning(VQ-VAE), NeurIPS 2017;Mentzer et al., Finite Scalar Quantization: VQ-VAE Made Simple, ICLR 2024
- Hoffman et al., Training Chain-of-Thought via Latent-Variable Inference, NeurIPS 2023
14. 下一讲预告 · Next lecture
这一讲处理的是离散的隐变量;数据本身(像素世界的 0/1 像素)用的是自回归或伯努利似然。最后一讲(原课 Lecture 18,客座讲者 Aaron Lou,Diffusion Models for Discrete Data)回到第 16 讲的扩散模型,问:数据是离散的(文本)时,扩散模型依赖的得分 没有定义——怎么办?
- 具体得分(concrete score):用概率比 代替梯度,只看”相邻”的状态;
- 得分熵(score entropy)损失,以及它的去噪版本;
- 连续时间马尔可夫链:均匀转移与吸收(掩码)转移,反向过程由概率比给出;
- 采样(一次改多个 token)、提示补全与填空、似然的上界与困惑度——和自回归模型比较。