第 5 讲在 PDF 第 14–16 页回顾了这些训练方法。同样的思路也可以用于多分类逻辑回归与 softmax。
IV. 调整模型,让预测错误变少 Lec 4 · Sep 3
损失能告诉我们预测有多差,却不会自己改变模型。寻找更合适参数的过程,叫作优化(optimization)。对逻辑回归来说,要调整的是权重和偏置,合起来记作 \(\theta=[w;b]\)。
把预测写成 \(\hat y=f(x;\theta)\),我们希望找到一组参数,让全部 \(N\) 个训练样本上的平均交叉熵损失尽可能小。下面的 \(\arg\min\) 可以读作“使后面这个式子最小的参数取值”:
梯度下降:朝下坡方向走一小步
想象你要走到河谷底部:先看看四周,找出最陡的下坡方向,走一步,再重新观察。梯度下降(gradient descent)的做法很相似。只不过这里的每个位置代表一组模型参数,而地面的“高度”代表这组参数对应的损失。
这片“地形”的形状,会影响我们能否找到最好的结果:
| 凸损失:例如逻辑回归 | 非凸损失:例如通常的神经网络 |
|---|---|
| 不存在比全局最低点更差的局部最低点。不过,可能有多组参数达到同样的最低值。算法能否收敛仍取决于步长等条件;仅有凸性,不能保证解唯一,也不能保证存在有限的参数取值来达到最小值。 | 可能有多个局部最低点,也可能有鞍点,即沿某些方向上升、沿另一些方向下降的位置。起点可能影响最终结果。梯度方法在实践中很有用,但一般不能保证找到全局最小值。 |
先只考虑一个权重
当前的 \(w\) 应该调大还是调小?看损失曲线的斜率就知道。如果在当前值 \(w_1\) 处斜率为负,稍微增大 \(w\) 会让损失降低;如果斜率为正,稍微减小 \(w\) 会让损失降低。两种情况都可以概括为:沿着斜率的反方向调整。
参数多了,就把各个斜率排成一个向量
有多个参数时,我们分别计算每个参数对应的斜率,也就是偏导数。把这些偏导数放在一起,得到的向量叫梯度(gradient)。它指向当前位置损失增长最快的方向,因此要下降,就减去梯度的一个倍数。
这个倍数由学习率(learning rate) \(\eta\) 决定。式子中的上标 \(t\) 表示已经进行了多少次更新:
- 学习率越大,每次调整越大,可能走得更快;但步子太大也会越过合适的位置,反而让损失上升。
- 若权重向量 \(w\) 有 \(d\) 个分量,对它求出的梯度也有 \(d\) 个分量。把偏置也算上,完整参数 \([w;b]\) 就有 \(d+1\) 个分量。只有一个权重和一个偏置时,可以把梯度画成 \(w\)–\(b\) 平面上的箭头。
- 真实模型的梯度往往很长,但每个分量都在回答同一件事:其他参数不变时,\(\theta_i\) 的微小变化会怎样影响损失?
逻辑回归的梯度长什么样 Lec 4 · Sep 3
回到情感分类的例子。交叉熵损失是 \(L_{CE}(\hat y,y)=-[y\log\sigma(w\cdot x+b)+(1-y)\log\sigma(-(w\cdot x+b))]\)。对它求导,结果比原式看起来简单,可以直接计算:
权重的梯度就是(预测概率 − 真实标签)× 特征值。对于词频这类取正值的特征,如果模型高估了正类概率,就把对应权重往下调;低估了,就往上调。某个特征在当前样本中为 0 时,这个样本的损失不会给对应权重贡献梯度。如果特征值为负,调整方向则会反过来,正如公式中的乘法所示。
看一个样本就更新,还是多看几个再更新? Lec 4 · Sep 3
批量梯度下降会先计算全部 \(N\) 个训练样本的平均梯度,再更新一次参数。它使用了整个训练集的信息,但每一步的计算量可能很大。
随机梯度下降(stochastic gradient descent,SGD)则便宜一些:按随机顺序访问样本,每看一个样本就更新一次。步骤始终是预测、计算损失、求梯度、调整参数:
随机梯度下降(L, f, x, y),返回参数 θ
# L 是损失函数;f 是参数为 θ 的模型
# x(1)..x(N) 是训练输入;y(1)..y(N) 是正确标签
θ ← 0(也可以随机初始化)
重复,直到满足停止条件:
按随机顺序取出每个训练样本 (x(i), y(i)):
1. ŷ(i) ← f(x(i); θ) # 先作出预测
2. 计算 L(ŷ(i), y(i)) # 衡量预测错误
3. g ← ∇θ L(f(x(i); θ), y(i)) # 求局部增长最快的方向
4. θ ← θ − η g # 朝相反方向走一步
返回 θ
小批量:在两种做法之间折中
小批量(mini-batch)把 \(m\) 个样本放在一起。先分别算出它们的梯度,求平均,再更新一次参数。因此,伪代码的第 3 步要改成:把这一批的梯度相加,再除以 \(m\)。
多个样本取平均,通常比只看一个样本更稳定;每次更新又不需要遍历整个数据集。它还很适合一次并行处理多个样本的硬件。
| 方法 | 每次更新用多少样本 | 特点 |
|---|---|---|
| 批量梯度下降 | 全部 \(N\) 个 | 得到整个训练集的精确梯度,但单次更新可能较慢。 |
| 随机梯度下降 | 1 个 | 单步便宜,但方向有波动。在非凸问题中,这种波动有时能帮助模型离开较差的区域。 |
| 小批量随机梯度下降 | \(m\) 个,例如 32–512 个 | 兼顾计算效率和梯度稳定性,是常见的实际选择。 |
- 训练要降低平均损失。梯度下降沿梯度的反方向调整参数,学习率决定调整的大小。
- 逻辑回归的损失是凸的,不会有更差的局部最小值;但收敛与解的唯一性还需要其他条件。神经网络的损失通常是非凸的。
- 逻辑回归中,一个权重的损失梯度是 \((\sigma(w\cdot x+b)-y)x_j\):预测减真实值,再乘以特征值。
- 随机梯度下降和小批量方法让大规模训练变得可行。另外还要决定何时停止训练,这与过拟合有关。