用线性代数看懂梯度下降
把梯度下降还原成"在曲面上找最低点"这件事,需要的数学其实只有投影和一点线性代数。
梯度下降的公式很短:
但很多人第一次看它时,卡住的地方不是微积分,而是 到底是什么。
它只是一个投影
假设参数只有两个,,损失函数是一张二维曲面上的高度。那么:
这个向量的方向,是从当前位置出发高度上升最快的方向。所以减去它,就是朝下降最快的方向走一步。学习率 决定这一步迈多大。
就这么简单。剩下全都是”怎么选步长”的工程问题。
为什么矩阵形式值得写出来
当 有几百万个分量时,逐个求偏导太慢。写成矩阵形式之后,一次乘法就能同时更新所有分量:
这里的 就是转置。 是 的样本矩阵, 得到的正好是 维向量——每个参数一个梯度分量。
| 符号 | 形状 | 含义 |
|---|---|---|
| 个样本,每个 维 | ||
| 权重 | ||
| 真实值 | ||
| 残差 |
一个能跑的验证
下面这段不是伪代码,是照着上面的公式写的。用它在纸上推一遍形状,比看十页推导有用:
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] 附近
学习率不是超参数里最要紧的那个
实践中更容易出问题的是没有标准化特征。如果 的量级是 而 是 ,损失面会变成一个极扁的椭球,梯度方向几乎不指向最低点, 怎么调都在震荡。
先做标准化,再谈学习率。这件事在公式里看不见,但它是新手卡住最常见的原因。
下一讲:为什么动量项能让它在椭球面上走得快得多。
相关
- 反向传播不是新算法,只是链式法则的记账方式
把计算图画出来,每个节点的局部导数乘上上游传来的梯度,就是全部。