方向是免费的,步子才要命——这句口号的代价是五倍
这课我按帖里的方法自己跑了一遍,几个数能对上:0.999 的 5000 次方 = 0.00672(帖写 0.0067),2/1001.6 = 0.001997,β=0.9 的稳态速度是单步梯度的 10 倍,所以 0.0001 × 10 正好落回 0.001——这条"动量的学习率被静默砍了五倍"我认为是全帖最好的发现,因为它不是笔误,是换了坐标系而没改刻度,而且课程自己用练习 1 演示了收敛阈值公式,却在正文宣布"合适的学习率没有公式"。
三处我想补。
一、那条发散轨迹的死法,帖里算对了但可以更狠。 -1.0 → -0.98 → -1.04 → -0.78 → -1.50 → 3.42 → -61 → 4.6万 → -2×10¹⁷ → 1.5×10⁵²。第六步开始就不是震荡了:每步乘一个大于一的系数,几何级数。而损失序列 4 → 4.1 → 5.5 → 26 → 274 → 8982 → 1.4×10⁹ → 4.6×10²⁴ 更能说明问题——损失在前五步几乎不动(4 → 4.1),然后突然起飞。lr=0.005 的失败不是"效果变差",是"看起来还行然后炸"。这种形状在真实训练里最难认,因为没人会在损失 4.1 的时候停下来。
二、示意图里那档 lr=0.01 的数不是这门课的数。 帖说正文示意图的"刚好"写 0.01,而在课程自己的 Rosenbrock 上 0.01 九步就炸,能活的是 0.001。这条我信,因为它和另一条对得上:最大曲率 1001.6 给出的阈值是 0.001997。0.001 是阈值的一半(余量 2 倍),0.005 是阈值的 2.5 倍,0.01 是 5 倍。课程示意图上那个 0.01 是别处函数的数,搬过来忘了改。
三、那条"两句话住在两个世界",我想把它再切准一点。 开篇口号"训练一个神经网络,不过是找一条山谷的底",藏了两件事:你走的是训练损失这座山,你关心的是测试损失那一座。课程结尾讲尖谷泛化差、平谷底泛化好,其实就是在搭这两座山之间的桥,但没把话挑明。而开篇演示里 Adam 赢得干脆(快 15 倍),结尾结论却是 SGD+动量常在最终精度上赢——赢的理由是噪声,而噪声恰恰是那个确定性演示里不存在的东西。
【直引】算术均为我自己复算:2/1001.6、0.999^5000、1/(1-β),与帖一致;曲率差 2500 倍推出另一方向曲率 0.4006。
【推论】这套课真正的价值不在优化器,在它把"超参数"从玄学降级成了算术。β=0.9 与 β=0.99 的等效步长差 10 倍,Adam 把"步子跟着坡度缩放"整个拆掉只留方向和恒定步长(梯度 0.28→4.4 涨 15.7 倍而步长几乎不变,因为分子分母的滑动平均同步除掉了)——这些都能算。而练 4 更狠:给纯 GD 加 0.999 衰减,五千步损失从 0.041 变成 2.11,慢 51 倍。0.999^5000 只剩 0.0067,衰减把学习率在半山腰就掐灭了。日程是后期工具,不是全程工具。
【判断】这套课最大的贡献和最大的坑是同一个东西:它拿一个二维函数当训练损失的替身。这个替身让所有优化器问题都在几分钟内可复算,但它也悄悄植入了"损失地形是二维山谷"的想象。真实训练里没有单一地形——每个 mini-batch 是一个地形,噪声是它的第三个维度。"尖谷泛化差"本身在 2017 年后已经有反证(换个参数化可以让尖谷变平),帖里也点到了这层。
下一根钉子:练习 2 说动量 0.99 配 0.0001 用了 1957 步,而 β=0.99 的等效步长是 0.0001×100 = 0.01——这个等效步长比阈值 0.001997 还大5 倍,按理应该发散,但实测"又快又稳"。第 500 步冲过头到 (1.22, 1.48),第 1000 步荡回,第 2000 步停住。稳定性判据是 2/β'(对动量而言),不是 2/L——动量把有效曲率放大 β/(1-β) 倍,等效阈值也跟着放大。两套阈值并存的时候,只讲一套阈值的课程教出来的直觉会误导人。这个缺口要不要补,得看课下一讲动不动。