反向传播为我们提供了梯度——但是梯度是什么?在反向传播运行之前,我们需要一个数字来捕获模型的错误程度。该数字来自损失函数。一旦我们有了梯度,优化器就会决定如何更新权重。它们共同构成了学习循环。
损失函数(也称为成本函数)采用模型的预测和真实答案,并返回一个衡量“错误”的数字。训练的目标是最小化这个数字。
可以把它想象成高尔夫球的得分——越低越好。损失为 0 意味着预测完美。
在预测连续值(房价、温度)时,我们使用 均方误差 (MSE):
MSE = (1/n) × Σ(predicted - actual)²
平方有两个作用:它使所有错误都为正,并且不成比例地惩罚大错误。预测房价下跌 10 万英镑,平方误差比下跌 1 万英镑要差 100 倍。
MSE 的历史可以追溯到 1795 年 Carl Friedrich Gauss 提出的——比神经网络早两个多世纪。他用它来追踪小行星谷神星的轨道。
在预测类别(是否为垃圾邮件、猫与狗)时,我们使用交叉熵损失。它衡量模型的预测概率与真实标签的距离。
如果正确答案是“猫”并且模型显示 99% 是猫,则损失很小。如果说10%的猫,损失是巨大的。交叉熵有一个有用的属性:当模型确信错误时,它会变得“无限”不高兴,从而创建一个强大的梯度来纠正错误。
二元交叉熵适用于二类问题。 分类交叉熵通过比较概率分布来处理多个类别。
为什么 MSE 不是分类任务的糟糕选择?
定义了损失函数后,我们可以可视化损失景观——一个表面,其中每个点代表一组权重,高度就是损失。训练意味着找到最低的山谷。
梯度下降是让我们达到目标的算法:
每个步骤的大小由学习率控制——可以说是深度学习中最重要的超参数。
想象一下,徒步走下一座雾蒙蒙的山,你只能感觉到脚下的斜坡。走下山坡,却看不到全貌。你怎么可能会陷入一个不是最深山谷的小洼地呢?这就是局部最小值问题。
每次更新前使用整个数据集计算梯度。对于大型数据集来说准确但速度慢得令人痛苦 - 想象一下在纠正单个拼写错误之前重新阅读图书馆中的每一本书。
在每个单个示例之后更新权重。速度快但噪音大——道路曲折蜿蜒。噪声实际上可以帮助逃脱局部最小值,这是一个令人惊讶的好处。
登录 参与讨论
实用的最佳点。计算小批量**(通常为 32-512 个示例)的梯度。平衡速度和稳定性,几乎是所有现代训练所使用的。
普通 SGD 有局限性。研究人员开发了更智能的优化器,可以随时适应。
就像一个重球滚下坡,动量会在一致的方向上积累速度并抑制振荡。如果梯度保持指向同一方向,动量就会加速。如果它不断改变方向,动量就会使它变得平滑。
调整每个参数的学习率。经常更新的权重会得到更小的步长;很少更新的权重会得到更大的步长。非常适合稀疏数据(如文本),但随着时间的推移,学习率可能会缩小到零。
结合动量和每参数自适应率。它保持梯度(一阶矩)和梯度平方(二阶矩)的运行平均值。 Adam 是当今大多数从业者的默认选择。
Adam相对于基本SGD有什么优势?
现代训练通常不会固定学习率,而是安排它:
直觉:尽早采取大步骤进行广泛探索,然后再采取小步骤进行微调。
有时梯度会爆炸(正如我们在反向传播课程中看到的那样)。 梯度裁剪在更新步骤之前限制梯度大小。如果梯度超过阈值,则按比例缩小。这是训练 RNN 和 Transformer 时的标准做法。
梯度裁剪可以防止什么?
Adam 优化器论文(Kingma & Ba,2014)被引用超过 150,000 次,使其成为所有计算机科学领域被引用次数最多的论文之一。
如果您正在训练一个模型,并且损失在几个时期后停止减少,您会首先研究什么 - 学习率、损失函数还是数据?为什么?