用线性代数看懂梯度下降

把梯度下降还原成"在曲面上找最低点"这件事,需要的数学其实只有投影和一点线性代数。

学习《从零理解反向传播》

梯度下降的公式很短:

但很多人第一次看它时,卡住的地方不是微积分,而是 到底是什么。

它只是一个投影

假设参数只有两个,,损失函数是一张二维曲面上的高度。那么:

这个向量的方向,是从当前位置出发高度上升最快的方向。所以减去它,就是朝下降最快的方向走一步。学习率 决定这一步迈多大。

就这么简单。剩下全都是”怎么选步长”的工程问题。

为什么矩阵形式值得写出来

有几百万个分量时,逐个求偏导太慢。写成矩阵形式之后,一次乘法就能同时更新所有分量:

这里的 就是转置。 的样本矩阵, 得到的正好是 维向量——每个参数一个梯度分量。

符号形状含义
个样本,每个
权重
真实值
残差

一个能跑的验证

下面这段不是伪代码,是照着上面的公式写的。用它在纸上推一遍形状,比看十页推导有用:

import numpy as np

X = np.random.randn(1000, 3)          # 1000 个样本,3 维
w_true = np.array([1.5, -2.0, 0.5])
y = X @ w_true + np.random.randn(1000) * 0.1

W = np.zeros((3, 1))
eta, steps = 0.1, 200

for _ in range(steps):
    grad = X.T @ (X @ W - y.reshape(-1, 1)) / len(y)   # 就是上面那个式子
    W -= eta * grad

print(W.ravel())   # [1.5, -2.0, 0.5] 附近

学习率不是超参数里最要紧的那个

实践中更容易出问题的是没有标准化特征。如果 的量级是 ,损失面会变成一个极扁的椭球,梯度方向几乎不指向最低点, 怎么调都在震荡。

先做标准化,再谈学习率。这件事在公式里看不见,但它是新手卡住最常见的原因。

下一讲:为什么动量项能让它在椭球面上走得快得多。

相关