损失函数:把「错」变成一个数
要让机器改进,首先得能度量「现在有多差」。损失函数就是这个度量——它把模型的输出和正确答案之间的差距,压缩成一个数字。
不同任务用不同的损失函数:分类常用交叉熵,回归常用均方误差。选择的原则是:损失函数要和你真正关心的目标一致。如果损失函数度量的是 A,但你在意的是 B,那模型会把 A 优化得很好、B 一塌糊涂。
梯度下降:沿着下坡走
有了损失这个「高度」,就可以想象一个地形图:每个参数组合对应一个高度。训练的目标是走到最低点。
梯度下降的做法很朴素:算出现在位置的坡度,往低的方向走一小步,重复。
学习率是这里最重要的超参数。步子太小,收敛得极慢、还容易卡在半路;步子太大,会在谷底两边来回跳,甚至越跳越高(发散)。大部分训练失败,最后都能追溯到学习率设得不对。
为什么不是简单的下坡
真实情况比「往低处走」复杂得多:
- 局部最优点:走到了一个小坑里,四周都是上坡,但远处还有更深的谷。
- 鞍点:某个方向是上坡、另一个方向是下坡,梯度接近零但并不是最优——这在超高维空间里其实比局部最优更常见。
- 病态曲率:不同方向的坡度差异巨大,导致在陡的方向来回震荡、在平的方向走得太慢。
这也是为什么实践中很少用「纯」梯度下降,而是用带动量的方法(积累历史梯度,帮助穿过平坦区域和鞍点)、以及自适应学习率的方法(对不同参数用不同的步长)。
随机性不是缺陷,是特性
实际训练时几乎不会用全部数据算一次梯度,而是用小批量(mini-batch)估计。这让每次迭代快得多,而且梯度里的噪声反而有助于跳出鞍点和尖锐的局部最优。
所以「随机梯度下降」里的随机,不是无奈之举,而是被有意保留的特性。批大小因此成了一个重要的调节旋钮:批越大,梯度越准但计算越重、泛化有时反而变差。
要点回顾
- 损失函数把「错得有多离谱」压缩成一个标量,是优化的目标。
- 梯度下降:算坡度、往低走一小步、重复;学习率决定步长,是最关键的参数。
- 真实地形里有局部最优、鞍点和病态曲率,纯梯度下降不够用。
- 动量、自适应学习率等方法,都是为了应对这些地形问题。
- 小批量的随机性有助于跳出鞍点,不是单纯的妥协。