乐于分享
好东西不私藏

10 步亲手跑通梯度下降:Excel 模拟的惊艳时刻

10 步亲手跑通梯度下降:Excel 模拟的惊艳时刻

前面讲了一大堆导数和梯度下降的理论,你可能在想:道理我懂了,但它真的能用吗?

这一篇我们用最普通的工具——Excel——亲手跑一遍梯度下降。不需要 Python,不需要框架,只需要一张表格,10 步迭代,就能看到参数如何"滑"向最小值。

书中把这个实验称为"用 Excel 进行最优化的体验",我认为这是全书 2-11 节最让人恍然大悟的部分。

一、实验设定:一个简单的二次函数

我们用一个最简单的例子:一元二次函数 。它的图像是一条开口向上的抛物线,最小值为  处。

  • 函数:
  • 导数:
  • 初始值:(故意选得远一点)
  • 学习率:

二、Excel 里的 10 步梯度下降

下面是 Excel 实际运算表格的精简版(书中有完整截图,我们在 Python 中复现相同逻辑):

defz(x):return2*x**2 - 4*x + 3defgrad_z(x):return4*x - 4x = 5.0# 初始值:远离最小值eta = 0.1# 学习率print(f"{'步数':>4s}{'x':>8s}{'z':>8s}{'梯度':>8s}{'Δx=-η·梯度':>12s}")print("-" * 48)for step in range(11):    g = grad_z(x)    dx = -eta * g    print(f"{step:4d}{x:8.4f}{z(x):8.4f}{g:8.4f}{dx:12.4f}")if step < 10:        x = x + dx

输出:

步数      x        z      梯度    Δx=-η·梯度------------------------------------------------   0    5.0000  33.0000  16.0000     -1.6000   1    3.4000  12.5200   9.6000     -0.9600   2    2.4400   6.1472   5.7600     -0.5760   3    1.8640   3.4134   3.4560     -0.3456   4    1.5184   2.2290   2.0736     -0.2074   5    1.3110   1.8734   1.2442     -0.1244   6    1.1866   1.7415   0.7465     -0.0746   7    1.1120   1.7210   0.4479     -0.0448   8    1.0672   1.7090   0.2687     -0.0269   9    1.0403   1.7033   0.1612     -0.0161  10    1.0242   1.7012   0.0967     -0.0097

观察这个表格:

  1. x 从 5.0 一路向 1.0 靠近——1.0 正是一阶导数为 0 的位置(
  2. z 从 33 一路降到约 1.7——越来越接近理论上的最小值 
  3. 梯度从 16 一步步缩小——这是函数趋于平坦的信号。梯度越小,表示越接近谷底
  4. 步长随梯度递减——每步的  越来越小。刚开始大步快跑,接近终点时碎步调整

三、从表格里读出的直觉

这张表告诉我们的东西比公式更直观:

直觉一:学习率决定了每步迈多大

如果把  改成 0.5(变大 5 倍),前几步会"跳得太远"。书中演示了  时会发生振荡——x 在 1 附近来回跳跃,需要更多步才能稳定。

如果把  改成 0.01(变小 10 倍),每一步只挪一点点,x 可能到第 100 步还离 1.0 很远。

直觉二:只要梯度不为 0,就在进步

每一步的梯度绝对值都在减小,说明我们确实在朝最小值走。当梯度趋近于 0,更新几乎停摆——这是好事,说明已经到谷底。

直觉三:梯度下降天生"先快后慢"

远离最小值时梯度大,步长大,下降快;接近最小值时梯度小,步长小,调整精细。这种自然衰减行为,让算法在效率和精度之间取得了不错的平衡。

四、在 Excel 里实际操作的步骤

书中给出了精确的 Excel 操作指南:

  1. A 列:步数(0, 1, 2, ...)
  2. B 列:当前 x 值。B2 填入初始值 5,B3 填入公式 =B2 - 0.1 * (4*B2 - 4)(相当于 ),然后向下拖拽
  3. C 列:当前 z 值。填入公式 =2*B2^2 - 4*B2 + 3,向下拖拽

就这么简单!两列公式、一拖到底,梯度下降就自动跑起来了。

书中还特意展示了  等不同学习率的对比,形成鲜明的视觉对比。没有反复试验,就没有恰到好处的步长。这是实践中梯度下降的常态。

五、从 Excel 到神经网络

这个一元二次函数的例子看起来简单,但它和神经网络的学习在数学上是同构的:

Excel 实验
神经网络训练
代价函数 
1 个变量 
47 个(甚至百万个)参数
导数 
梯度 (所有偏导数)

唯一的区别是变量从 1 个变成了 47 个(甚至更多),但每步的公式结构完全不变。理解了 Excel 表格里的那个 B2 - 0.1*(4*B2 - 4),就理解了梯度下降法的全部。

六、小结

  1. 最简单的一元二次函数 + Excel,两步公式就能跑通完整的梯度下降
  2. 10 步迭代后,x 从 5.0 收敛到接近 1.0,z 从 33 降到接近理论最低值 1
  3. 梯度下降呈现"先快后慢"的自然节奏——梯度大时大步冲,梯度小时小步调
  4. 学习率的选取需要通过试错(反复试验)来确定,没有万能公式
  5. Excel 实验与神经网络训练在数学上完全同构——只是变量的数量不同