模型拟合
损失与网络参数有关,本章着重于探讨如何确定能使损失最小化的参数值。这个过程称为网络参数的学习,或更通俗地说,是模型的训练或拟合。该过程首先是选取一组初始参数值,随后重复执行两个步骤:
- (i) 计算损失函数关于参数的导数(梯度);
- (ii) 根据梯度调整参数,以期减少损失。多次迭代后,目标是使损失函数达到其全局最小值。
本章重点讨论参数调整步骤,即采用何种算法来减少损失。
6.1 梯度下降
为了拟合模型,我们需要一组输入/输出对的训练集 { xi,yi}\{x_i, y_i\}{ xi,yi}。我们寻求模型 f(xi,ϕ)f(x_i, \phi)f(xi,ϕ) 的参数 ϕ\phiϕ,使得这些参数能够尽可能准确地将输入 xix_ixi 映射到输出 yiy_iyi。为此目的,我们定义了一个损失函数 L(ϕ)L(\phi)L(ϕ),它通过返回一个数值来量化映射中的误差。优化算法的目标是找到一组参数 ϕ^\hat{\phi}ϕ^,使得这个损失函数达到最小值:
ϕ^=argminϕL(ϕ)(6.1) \hat{\phi} = \arg\min_{\phi} L(\phi) \tag{6.1} ϕ^=argϕminL(ϕ)(6.1)
虽然存在多种优化算法,但训练神经网络通常采用迭代方法。这些方法首先启发式地设定初始参数值,然后反复调整参数以降低损失值。
这个过程中最基本的方法称为梯度下降。它从初始参数 ϕ=[ϕ0,ϕ1,…,ϕN]T\phi = [\phi_0, \phi_1, \ldots, \phi_N]^Tϕ=[ϕ0,ϕ1,…,ϕN]T 开始,并分两步迭代:
步骤 1. 计算损失相对于参数的导数:
∂L∂ϕ=[∂L∂ϕ0∂L∂ϕ1⋮∂L∂ϕN](6.2) \frac{\partial L}{\partial \phi} = \begin{bmatrix} \frac{\partial L}{\partial \phi_0} \\ \frac{\partial L}{\partial \phi_1} \\ \vdots \\ \frac{\partial L}{\partial \phi_N} \end{bmatrix} \tag{6.2} ∂ϕ∂L=
∂ϕ0∂L∂ϕ1∂L⋮∂ϕN∂L
(6.2)
步骤 2. 根据以下规则更新参数:
ϕ←ϕ−α⋅∂L∂ϕ(6.3) \phi \leftarrow \phi - \alpha \cdot \frac{\partial L}{\partial \phi} \tag{6.3} ϕ←ϕ−α⋅∂ϕ∂L(6.3)
其中,正数 α\alphaα 确定了调整的幅度。
第一步计算当前位置上损失函数的梯度,确定了损失增加的方向。第二步则是向相反方向(即下降方向)小幅移动。参数 α\alphaα 可以固定(此时称之为学习率),或者通过线性搜索尝试多个 α\alphaα 值,以找到能最大程度降低损失的值。
当损失函数达到最小值时,其表面必须是平坦的(否则,我们还能通过继续下降来进一步改进)。因此,梯度将变为零,参数也随之停止改变。在实践中,我们会监测梯度的大小,并在其变得过小时停止算法。
6.1.1 线性回归示例
考虑将梯度下降方法应用于第2章介绍的一维线性回归模型。该模型 f(x,ϕ)f(x, \phi)f(x,ϕ) 把一个标量输入 xxx 映射到一个标量输出 yyy,具有参数 ϕ=[ϕ0,ϕ1]T\phi = [\phi_0, \phi_1]^Tϕ=[ϕ0,ϕ1]T,分别代表了y轴截距和斜率:
y=f(x,ϕ)=ϕ0+ϕ1x(6.4) y = f(x, \phi) = \phi_0 + \phi_1x \tag{6.4} y=f(x,ϕ)=ϕ0+ϕ1x(6.4)
给定一个数据集 {
xi,yi}\{x_i, y_i\}{
xi,yi},包含 III 对输入/输出数据,我们采用最小二乘法作为损失函数:
L(ϕ)=∑i=1Iei=∑i=1I(f(xi,ϕ)−yi)2=∑i=1I(ϕ0+ϕ1xi−yi)2(6.5) L(\phi) = \sum_{i=1}^I e_i = \sum_{i=1}^I (f(x_i, \phi) - y_i)^2 = \sum_{i=1}^I (\phi_0 + \phi_1x_i - y_i)^2 \tag{6.5} L(ϕ)=i=1∑Iei=i=1∑I(f(xi,ϕ)−yi)2=i=1∑I(ϕ0+ϕ1xi−yi)2(6.5)
这里的 ei=(ϕ0+ϕ1xi−yi)2e_i = (\phi_0 + \phi_1x_i - y_i)^2ei=(ϕ0+ϕ1xi−yi)2 表示第 (i) 个训练样本对损失的单独贡献。
损失函数对参数的导数可以表示为各个贡献导数的总和:
∂L∂ϕ=∂∂ϕ∑i=1Iei=∑i=1I∂ei∂ϕ(6.6) \frac{\partial L}{\partial \phi} = \frac{\partial}{\partial \phi} \sum_{i=1}^I e_i = \sum_{i=1}^I \frac{\partial e_i}{\partial \phi} \tag{6.6} ∂ϕ∂L=∂