第二部分 · 学习给文本分类

模型怎样从错误中一点点改进?

梯度告诉我们该往哪个方向调整参数,学习率决定每次调整多少。重复这个过程,模型就能逐步降低误差。

第 5 讲在 PDF 第 14–16 页回顾了这些训练方法。同样的思路也可以用于多分类逻辑回归与 softmax。

IV. 调整模型,让预测错误变少 Lec 4 · Sep 3

损失能告诉我们预测有多差,却不会自己改变模型。寻找更合适参数的过程,叫作优化(optimization)。对逻辑回归来说,要调整的是权重和偏置,合起来记作 \(\theta=[w;b]\)。

把预测写成 \(\hat y=f(x;\theta)\),我们希望找到一组参数,让全部 \(N\) 个训练样本上的平均交叉熵损失尽可能小。下面的 \(\arg\min\) 可以读作“使后面这个式子最小的参数取值”:

\[ \hat\theta = \arg\min_{\theta} \ \frac{1}{N} \sum_{i=1}^{N} L_{CE}\big( f(x^{(i)}; \theta),\ y^{(i)} \big) \]

梯度下降:朝下坡方向走一小步

想象你要走到河谷底部:先看看四周,找出最陡的下坡方向,走一步,再重新观察。梯度下降(gradient descent)的做法很相似。只不过这里的每个位置代表一组模型参数,而地面的“高度”代表这组参数对应的损失。

这片“地形”的形状,会影响我们能否找到最好的结果:

凸损失:例如逻辑回归非凸损失:例如通常的神经网络
不存在比全局最低点更差的局部最低点。不过,可能有多组参数达到同样的最低值。算法能否收敛仍取决于步长等条件;仅有凸性,不能保证解唯一,也不能保证存在有限的参数取值来达到最小值。可能有多个局部最低点,也可能有鞍点,即沿某些方向上升、沿另一些方向下降的位置。起点可能影响最终结果。梯度方法在实践中很有用,但一般不能保证找到全局最小值。

先只考虑一个权重

当前的 \(w\) 应该调大还是调小?看损失曲线的斜率就知道。如果在当前值 \(w_1\) 处斜率为负,稍微增大 \(w\) 会让损失降低;如果斜率为正,稍微减小 \(w\) 会让损失降低。两种情况都可以概括为:沿着斜率的反方向调整。

参数多了,就把各个斜率排成一个向量

有多个参数时,我们分别计算每个参数对应的斜率,也就是偏导数。把这些偏导数放在一起,得到的向量叫梯度(gradient)。它指向当前位置损失增长最快的方向,因此要下降,就减去梯度的一个倍数。

这个倍数由学习率(learning rate) \(\eta\) 决定。式子中的上标 \(t\) 表示已经进行了多少次更新:

减去梯度的一部分,大小由 \(\eta\) 控制
\[ \theta^{t+1} = \theta^{t} - \eta \, \nabla_\theta L\big(f(x; \theta), y\big) \]
每个参数对应一个偏导数
\[ \nabla_\theta L = \Big[ \frac{\partial L}{\partial w_1},\ \frac{\partial L}{\partial w_2},\ \ldots,\ \frac{\partial L}{\partial w_d},\ \frac{\partial L}{\partial b} \Big] \]
  • 学习率越大,每次调整越大,可能走得更快;但步子太大也会越过合适的位置,反而让损失上升。
  • 若权重向量 \(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))]\)。对它求导,结果比原式看起来简单,可以直接计算:

\[ \frac{\partial L_{CE}(\hat y, y)}{\partial w_j} = \big[ \sigma(w \cdot x + b) - y \big] \, x_j \qquad\qquad \frac{\partial L_{CE}(\hat y, y)}{\partial b} = \sigma(w \cdot x + b) - y \]

权重的梯度就是(预测概率 − 真实标签)× 特征值。对于词频这类取正值的特征,如果模型高估了正类概率,就把对应权重往下调;低估了,就往上调。某个特征在当前样本中为 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\):预测减真实值,再乘以特征值。
  • 随机梯度下降和小批量方法让大规模训练变得可行。另外还要决定何时停止训练,这与过拟合有关。