mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
14300 字
38 分钟
深度学习基础:优化、正则化与归一化

本文整理深度学习基础学习笔记,围绕深度网络训练中的关键议题,系统梳理临界点、批量训练、动量优化与归一化机制。

深度学习基础:优化与训练机制#

局部极小值与鞍点#

临界点及其种类#

优化失败的现象与分析#

在深度神经网络的训练过程中,我们经常观察到以下现象:随着参数不断更新,训练损失下降到一定程度后不再下降,但这个损失值仍然不够低,我们对模型的性能不满意。例如,将深层网络与较浅的网络或线性模型比较时,有时会发现深层网络并没有表现出其应有的优势。这表明优化过程可能存在问题。

更极端的情况是,模型从一开始就难以训练,无论怎么更新参数,损失都无法有效下降。这时,我们需要探究其根本原因。

1768126415298

临界点的概念与梯度为零的条件#

一个常见的猜想是,优化过程可能停滞在损失函数关于参数的梯度(Gradient) 为零或接近零的点。如图3.1所示,两条训练曲线在损失不再下降时,其梯度值都非常小。

当梯度为零时,梯度下降法的更新公式 θθηL(θ)\theta \leftarrow \theta - \eta \nabla L(\theta) 中的更新量会变为零,参数停止更新,训练陷入停滞。

梯度为零的点统称为临界点(Critical Point)。临界点不仅包括我们熟知的局部极小值(Local Minimum),还包括鞍点(Saddle Point)局部极大值(Local Maximum)

  1. 局部极小值(Local Minimum):如图3.2(a)所示,该点在所有方向上都是附近区域的最低点。如果陷入局部极小值,往任意方向移动都会导致损失上升。
  2. 鞍点(Saddle Point):如图3.2(b)所示,该点在某些方向上是局部极小值,在另一些方向上是局部极大值,形似马鞍。在鞍点处,梯度也为零,但存在某些方向可以使损失下降。
  3. 局部极大值(Local Maximum):该点在所有方向上都是附近的最高点,梯度也为零,但任何移动都会使损失下降(在最小化问题中,我们不会长期停留于此)。

1768126424593

区分临界点的类型至关重要:如果陷入局部极小值,可能意味着已经找到了一个局部最优解,但可能不是全局最优;如果只是鞍点,那么理论上可以通过某些方向逃离,继续降低损失。

判断临界点种类的方法#

泰勒展开与海森矩阵#

为了判断一个临界点 θ\theta' 的类型(局部极小、局部极大还是鞍点),我们需要分析该点附近损失函数的形状。虽然无法得知完整的 L(θ)L(\theta),但可以通过泰勒展开(Taylor Expansion)θ\theta' 附近进行近似。

L(θ)L(\theta)θ\theta' 附近的二阶泰勒展开近似为:

L(θ)L(θ)+(θθ)Tg+12(θθ)TH(θθ)(式 3.1)L(\theta) \approx L(\theta') + (\theta - \theta')^T \mathbf{g} + \frac{1}{2} (\theta - \theta')^T H (\theta - \theta') \quad \text{(式 3.1)}

其中:

  • L(θ)L(\theta'):损失函数在临界点 θ\theta' 处的具体数值,是一个标量(Scalar)
  • (θθ)(\theta - \theta'):从临界点 θ\theta' 到任意一点 θ\theta位移向量(Displacement Vector)
  • g\mathbf{g}梯度向量(Gradient Vector),定义为损失函数在 θ\theta' 处的一阶偏导数向量,即 g=L(θ)\mathbf{g} = \nabla L(\theta')。其第 ii 个元素 gig_i 是损失函数对第 ii 个参数 θi\theta_i 的偏导数在 θ\theta' 处的取值: gi=L(θ)θi(式 3.2)g_i = \frac{\partial L(\theta')}{\partial \theta_i} \quad \text{(式 3.2)} 在临界点处,梯度向量为零向量,即 g=0\mathbf{g} = \mathbf{0}
  • HH海森矩阵(Hessian Matrix),定义为损失函数在 θ\theta' 处的二阶偏导数矩阵。它是一个 n×nn \times n 的方阵(nn 为参数 θ\theta 的维度)。其第 ii 行第 jj 列的元素 HijH_{ij} 是损失函数先对 θi\theta_i 求偏导、再对 θj\theta_j 求偏导(或反之)在 θ\theta' 处的取值,即: Hij=2θiθjL(θ)(式 3.3)H_{ij} = \frac{\partial^2}{\partial \theta_i \partial \theta_j} L(\theta') \quad \text{(式 3.3)}LL 的二阶偏导数连续时,求导顺序可交换,即 Hij=HjiH_{ij} = H_{ji},此时海森矩阵是一个实对称矩阵(Symmetric Matrix)
  • 12(θθ)TH(θθ)\frac{1}{2} (\theta - \theta')^T H (\theta - \theta') 是一个二次型(Quadratic Form),它描述了损失函数在临界点附近的曲率(Curvature) 信息。

由于在临界点 g=0\mathbf{g} = 0,式(3.1)可简化为:

L(θ)L(θ)+12(θθ)TH(θθ)(式 3.4)L(\theta) \approx L(\theta') + \frac{1}{2} (\theta - \theta')^T H (\theta - \theta') \quad \text{(式 3.4)}

因此,临界点附近损失函数的行为主要由二次项 12(θθ)TH(θθ)\frac{1}{2} (\theta - \theta')^T H (\theta - \theta') 决定。令 v=θθ\mathbf{v} = \theta - \theta',我们通过分析 vTHv\mathbf{v}^T H \mathbf{v} 来判断临界点类型。

通过海森矩阵的特征值判断临界点类型#

海森矩阵 HH 是一个实对称矩阵,其特征值和特征向量提供了判断临界点类型的便捷方法。

  1. 局部极小值:如果 HH 的所有特征值均为(即 HH正定矩阵),那么对于任意非零向量 v\mathbf{v},都有 vTHv>0\mathbf{v}^T H \mathbf{v} > 0。根据式(3.4),L(θ)>L(θ)L(\theta) > L(\theta'),即 θ\theta' 是附近的一个最低点。
  2. 局部极大值:如果 HH 的所有特征值均为(即 HH负定矩阵),那么对于任意非零向量 v\mathbf{v},都有 vTHv<0\mathbf{v}^T H \mathbf{v} < 0。这意味着 L(θ)<L(θ)L(\theta) < L(\theta'),即 θ\theta' 是附近的一个最高点。
  3. 鞍点:如果 HH 的特征值有正有负,那么 vTHv\mathbf{v}^T H \mathbf{v} 的值可能为正也可能为负。这意味着在 θ\theta' 附近,某些方向损失上升,某些方向损失下降。θ\theta' 既不是局部极小也不是局部极大。

实例分析:一个简单的神经网络#

考虑一个极简的神经网络:y=w1w2xy = w_1 w_2 x,训练数据仅有一组 (x=1,y=1)(x=1, y=1)​。其损失函数为均方误差:

1768126551342

L=(yy^)2=(1w1w2)2(式 3.6)L = (y - \hat{y})^2 = (1 - w_1 w_2)^2 \quad \text{(式 3.6)}

计算梯度

Lw1=w1(1w1w2)2=2(1w1w2)(w2)=2(1w1w2)(w2)Lw2=w2(1w1w2)2=2(1w1w2)(w1)=2(1w1w2)(w1)(式 3.7)\begin{aligned} \frac{\partial L}{\partial w_1} &= \frac{\partial}{\partial w_1} (1 - w_1 w_2)^2 = 2(1 - w_1 w_2) \cdot (-w_2) = 2(1 - w_1 w_2)(-w_2) \\ \frac{\partial L}{\partial w_2} &= \frac{\partial}{\partial w_2} (1 - w_1 w_2)^2 = 2(1 - w_1 w_2) \cdot (-w_1) = 2(1 - w_1 w_2)(-w_1) \end{aligned} \quad \text{(式 3.7)}

令梯度为零,可得到临界点满足 w1w2=1w_1 w_2 = 1w1=0,w2=0w_1 = 0, w_2 = 0

分析原点 (w1=0,w2=0)(w_1=0, w_2=0): 计算该点的海森矩阵 HH 的各元素:

H11=2Lw12=w1(2(1w1w2)(w2))=w1(2w2+2w1w22)=2w22(0,0)=0H12=2Lw1w2=w2(2(1w1w2)(w2))=w2(2w2+2w1w22)=2+4w1w2(0,0)=2H21=2Lw2w1=w1(2(1w1w2)(w1))=w1(2w1+2w12w2)=2+4w1w2(0,0)=2H22=2Lw22=w2(2(1w1w2)(w1))=w2(2w1+2w12w2)=2w12(0,0)=0(依据式 3.8 原理推导)\begin{aligned} H_{11} &= \frac{\partial^2 L}{\partial w_1^2} = \frac{\partial}{\partial w_1} \left( 2(1 - w_1 w_2)(-w_2) \right) = \frac{\partial}{\partial w_1} \left( -2w_2 + 2w_1 w_2^2 \right) = 2w_2^2 \bigg|_{(0,0)} = 0 \\ H_{12} &= \frac{\partial^2 L}{\partial w_1 \partial w_2} = \frac{\partial}{\partial w_2} \left( 2(1 - w_1 w_2)(-w_2) \right) = \frac{\partial}{\partial w_2} \left( -2w_2 + 2w_1 w_2^2 \right) = -2 + 4w_1 w_2 \bigg|_{(0,0)} = -2 \\ H_{21} &= \frac{\partial^2 L}{\partial w_2 \partial w_1} = \frac{\partial}{\partial w_1} \left( 2(1 - w_1 w_2)(-w_1) \right) = \frac{\partial}{\partial w_1} \left( -2w_1 + 2w_1^2 w_2 \right) = -2 + 4w_1 w_2 \bigg|_{(0,0)} = -2 \\ H_{22} &= \frac{\partial^2 L}{\partial w_2^2} = \frac{\partial}{\partial w_2} \left( 2(1 - w_1 w_2)(-w_1) \right) = \frac{\partial}{\partial w_2} \left( -2w_1 + 2w_1^2 w_2 \right) = 2w_1^2 \bigg|_{(0,0)} = 0 \end{aligned} \quad \text{(依据式 3.8 原理推导)}

因此,H=[0220]H = \begin{bmatrix} 0 & -2 \\ -2 & 0 \end{bmatrix}。这是一个实对称矩阵。

计算其特征值: 设特征值为 λ\lambda,满足特征方程 HλI=0|H - \lambda I| = 0,即:

0λ220λ=λ2(2)(2)=λ24=0\begin{vmatrix} 0-\lambda & -2 \\ -2 & 0-\lambda \end{vmatrix} = \lambda^2 - (-2)(-2) = \lambda^2 - 4 = 0

解得 λ1=2,λ2=2\lambda_1 = 2, \lambda_2 = -2​,一正一负。根据3.1.2.2节的判断准则,原点是鞍点。这与可视化误差表面(图3.4)的观察一致。

1768126628212

逃离鞍点:海森矩阵的指示作用#

海森矩阵不仅能用于判断临界点类型,还能为逃离鞍点提供方向。设 HH 有一个负特征值 λ<0\lambda < 0,其对应的特征向量为 u\mathbf{u}(满足 Hu=λuH\mathbf{u} = \lambda \mathbf{u}u0\mathbf{u} \neq \mathbf{0})。

现在,考虑从临界点 θ\theta' 出发,沿着特征向量 u\mathbf{u} 的方向移动一个单位(即 θ=θ+u\theta = \theta' + \mathbf{u})。将 v=u\mathbf{v} = \mathbf{u} 代入式(3.4):

L(θ)L(θ)+12uTHu=L(θ)+12uT(λu)(代入 Hu=λu)=L(θ)+12λ(uTu)=L(θ)+12λu2\begin{aligned} L(\theta) &\approx L(\theta') + \frac{1}{2} \mathbf{u}^T H \mathbf{u} \\ &= L(\theta') + \frac{1}{2} \mathbf{u}^T (\lambda \mathbf{u}) \quad \text{(代入 } H\mathbf{u} = \lambda \mathbf{u} \text{)} \\ &= L(\theta') + \frac{1}{2} \lambda (\mathbf{u}^T \mathbf{u}) \\ &= L(\theta') + \frac{1}{2} \lambda \|\mathbf{u}\|^2 \end{aligned}

由于 λ<0\lambda < 0u2>0\|\mathbf{u}\|^2 > 0,所以 12λu2<0\frac{1}{2} \lambda \|\mathbf{u}\|^2 < 0。因此,L(θ)<L(θ)L(\theta) < L(\theta')​这意味着,如果我们在鞍点处,只要沿着任意一个负特征值对应的特征向量方向更新参数,就可以降低损失,从而逃离鞍点。

在前面的例子中,原点处的海森矩阵有一个特征值 λ=2\lambda = -2,对应的特征向量可以是 u=[1,1]T\mathbf{u} = [1, 1]^T(验证:Hu=[0220][11]=[22]=2[11]H\mathbf{u} = \begin{bmatrix}0&-2\\-2&0\end{bmatrix}\begin{bmatrix}1\\1\end{bmatrix} = \begin{bmatrix}-2\\-2\end{bmatrix} = -2\begin{bmatrix}1\\1\end{bmatrix})。沿着 [1,1]T[1, 1]^T 方向更新,损失就会减小。

然而,在实际训练大型神经网络时,计算并分解海森矩阵(维数可能达到百万甚至千万级)的计算成本极高,因此很少直接用这种方法来逃离鞍点。更常用的方法是使用动量(Momentum)自适应学习率等方法,这些方法在某种程度上也有助于逃离平缓区域。

高维空间中的临界点:鞍点比局部极小更常见#

一个重要的见解是:在低维空间中看起来是局部极小值的点,在更高维的空间中可能只是一个鞍点。神经网络的参数空间通常维度极高(数百万维),这大大增加了鞍点出现的可能性,而使得真正的局部极小值相对稀少。

图3.6的实验结果支持了这一观点。该图展示了训练不同神经网络时,损失收敛后临界点的特征。横轴是最小值比例(Minimum Ratio),定义为正特征值数量与总特征值数量之比: 最小值比例=正特征值数量总特征值数量(式 3.12)\text{最小值比例} = \frac{\text{正特征值数量}}{\text{总特征值数量}} \quad \text{(式 3.12)} 纵轴是训练损失。

1768127249599

  • 如果最小值比例等于1,说明所有特征值为正,是严格的局部极小值。
  • 实验发现,大多数收敛点的最小值比例在0.5~0.6之间,远小于1。这意味着大约只有一半的方向是“向上”的(损失增加),另一半的方向是“向下”的(损失减少)。这些点本质上是鞍点,而非局部极小值。

因此,在实际训练深度网络时,当梯度变得很小时,我们更可能遇到的是鞍点,而非局部极小值。这也解释了为什么像动量法这样的技术能够有效帮助训练——它们可以帮助参数穿越鞍点区域,继续向损失更低的方向前进。

1768127263626

批量和动量#

批量大小对梯度下降法的影响#

批处理的实际操作流程与概念#

在实际训练中,我们几乎不会使用整个训练集(包含 NN​ 个样本)一次性计算损失和梯度。相反,标准的做法是采用批处理(Batching)

1768127672244

具体操作流程(对应图3.7):

  1. 随机初始化参数θ0\theta_0​
  2. 划分批量:将训练数据集随机打乱后,划分为若干个批量(Batch)。每个批量包含 BB 个样本,BB​ 称为批量大小(Batch Size)
  3. 迭代更新: a. 选取一个批量,计算该批量数据上的平均损失,记为 L1L_1。 b. 计算该损失 L1L_1 关于当前参数 θ0\theta_0 的梯度:L1(θ0)\nabla L_1(\theta_0)。 c. 使用该梯度更新参数:θ1θ0ηL1(θ0)\theta_1 \leftarrow \theta_0 - \eta \nabla L_1(\theta_0)。 d. 选取下一个批量,计算损失 L2L_2,计算梯度 L2(θ1)\nabla L_2(\theta_1),更新参数 θ2\theta_2。 e. 重复此过程,直至遍历完所有批量。
  4. 回合(Epoch):遍历完所有训练批量一次,称为完成了一个训练回合
  5. 重复回合:通常需要多个Epoch来训练模型。在每个Epoch开始前,通常会重新随机打乱数据以构成新的批量,这称为随机打乱(Shuffle)

关键概念关系

  • 一次更新(Update/Iteration):指使用一个批量计算梯度并更新一次参数。
  • 一个回合(Epoch):指使用所有批量各进行一次更新。
  • 关系:一个Epoch中包含的更新次数 = N/B\lceil N / B \rceil。例如,N=10000N=10000B=100B=100,则一个Epoch包含100次更新。

不同批量大小的极端情况:BGD与SGD#

1768127805993

批量大小 BB 是一个重要的超参数。考虑两种极端情况(图3.8):

  1. 批量梯度下降(Batch Gradient Descent, BGD)

    • 条件B=NB = N(即使用全部训练数据作为一个批量)。
    • 特点
      • 梯度估计准确:每次更新使用的梯度是基于整个数据分布的无偏估计,方向稳定。
      • 计算成本高:每次更新需遍历所有数据,计算和内存开销巨大。
      • 更新频率低:每个Epoch仅更新一次参数。
      • 容易陷入局部最优:梯度方向稳定,缺乏噪声,可能难以逃离平坦区域或尖锐最小值。
  2. 随机梯度下降(Stochastic Gradient Descent, SGD)

    • 条件B=1B = 1​(即每个样本单独构成一个批量)。
    • 特点
      • 梯度噪声大:每次更新仅基于一个样本,梯度估计是真实梯度的高方差估计,更新方向波动大(如图3.8中曲折路径)。
      • 计算成本低:单次更新计算快。
      • 更新频率高:每个Epoch可更新 NN 次。
      • 可能有助于泛化:梯度噪声可视为一种正则化,有助于逃离尖锐最小值,找到更平坦的区域,从而可能提升模型在测试集上的表现。

小批量梯度下降(Mini-batch Gradient Descent):这是实践中的标准做法,即 1<B<N1 < B < N​(常见值如32, 64, 128, 256)。它在梯度估计的稳定性和参数更新的频率/速度之间取得了良好的平衡。

批量大小与计算效率的深入分析(并行计算视角)#

1768128007310

在GPU等具备强大并行计算能力的硬件上,批量大小对计算时间的影响并非直觉上的线性关系。

  • 单次更新耗时:图3.9展示了在MNIST数据集上,使用不同批量大小时,计算一次梯度并完成一次参数更新所花费的时间。当批量大小在1到约1000的范围内时,由于GPU的并行性,计算时间几乎保持恒定。只有当批量非常大(如超过10000)时,计算时间才开始显著增加。
  • 一个Epoch耗时:图3.10展示了完成一个完整Epoch所需的时间。由于一个Epoch的更新次数为 N/BN/B​,因此:
    • 大批量(BB大)N/BN/B 小,尽管单次更新可能稍慢,但总Epoch时间短
    • 小批量(BB小)N/BN/B​ 大,即使单次更新快,但总Epoch时间长。 因此,从“看完所有数据一遍”的角度,大批量训练通常更

1768128257590

批量大小对优化结果与泛化性能的影响#

实验研究(如图3.11在MNIST和CIFAR-10上的结果)揭示了一个关键现象:使用较小的批量大小训练出的模型,往往在测试集(验证集)上表现出更高的准确率。这并非过拟合,因为训练准确率也显示出相同趋势。

1768128421746

理论解释

1768128493490

  1. 小批量的梯度噪声有助于优化:如3.2.1.2节所述,小批量引入的梯度噪声使优化路径更具随机性。如图3.12所示,假设在全批量损失 LL 的误差表面上,当前点 AA 梯度为零(可能是平坦区或鞍点)。但在小批量损失 L1L_1 的误差表面上,AA 点梯度可能不为零,因此优化可以继续。这种机制有助于模型逃离尖锐的局部最小值或平坦的鞍点区域。

1768128503292

  1. 小批量倾向于收敛到更平坦的最小值:论文《On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima》[1] 提出了一个深刻见解(图3.13)。训练损失和测试损失虽然相关,但因数据采样差异而略有不同。
    • 尖锐最小值(Sharp Minima):损失函数在此处曲率大。训练损失的一个微小偏移,可能导致测试损失剧烈增加,泛化能力差。
    • 平坦最小值(Flat Minima):损失函数在此处曲率小。训练损失的微小偏移,对测试损失影响小,泛化能力强。
    • 小批量梯度下降由于更新噪声大,难以稳定在狭窄尖锐的谷底,更容易收敛到宽阔平坦的谷底,从而获得更好的泛化性能。

表3.1 小批量梯度下降与批量梯度下降的比较总结

特性小批量梯度下降 (BB 较小)批量梯度下降 (B=NB = N)
单次更新速度(无并行)更快更慢
单次更新速度(有并行)相近(除非 BB 极大)相近(除非 BB 极大)
一个Epoch耗时更慢(更新次数多)更快(更新次数少)
梯度估计有噪声、高方差稳定、低方差
优化动态可能帮助逃离尖锐最小值易陷入尖锐最小值
泛化性能通常更好通常较差

:尽管小批量在泛化上通常有优势,但通过精心设计的学习率调度、优化器改进(如LARS、LAMB)和使用非常大的批量进行分布式训练,也能在用大批量时取得很好的结果,这常用于需要极快训练速度的场景(如在76分钟内训练BERT[4])。

动量法(Momentum)#

动量法的物理直观与基本原理#

梯度下降法的一个主要缺点是,在误差表面平坦(梯度小)的区域更新缓慢,且在临界点(梯度为零)会完全停止。动量法的灵感来源于物理学中的动量概念:一个运动的物体,由于惯性,在经过梯度为零的点时不会立刻停止,而是有继续前进的趋势。

1768130125578

类比(图3.14):将参数 θ\theta​ 想象成在山坡(误差表面)上滚动的小球。普通梯度下降(Vanilla Gradient Descent)的小球没有惯性,走到梯度为零的点(谷底或鞍点)就停住。而有动量的小球,由于惯性,在经过谷底时会继续向前滚动,甚至可能冲上一个小坡,从而有机会找到更深的谷底。

动量法的算法步骤#

1768130315558

1768130206957

动量法在参数更新时,不仅考虑当前的梯度方向,还引入一个累积的动量向量(Momentum Vector) mm,它记录了之前更新方向的指数加权平均。

算法流程(图3.16)

  1. 初始化参数 θ0\theta_0,初始化动量 m0=0m_0 = 0
  2. 在第 tt 次迭代时(tt 从0开始): a. 计算当前梯度:gt=L(θt)g_t = \nabla L(\theta_t)。 b. 更新动量mt+1=λmtηgtm_{t+1} = \lambda m_t - \eta g_t(核心更新公式) c. 更新参数θt+1=θt+mt+1\theta_{t+1} = \theta_t + m_{t+1}
  3. 重复步骤2。

参数说明

  • η\eta:学习率(Learning Rate),控制当前梯度的影响。
  • λ\lambda动量系数(Momentum Coefficient),是一个介于0和1之间的超参数(通常设为0.9)。它控制历史动量 mtm_t 的衰减速度,决定了“惯性”的大小。
  • mtm_t:动量向量,可以理解为过去所有梯度的指数加权移动平均(Exponentially Weighted Moving Average, EWMA) 的负方向。

【公式推导与理解】 将动量更新公式展开:

m0=0m1=ηg0m2=λm1ηg1=ληg0ηg1m3=λm2ηg2=λ2ηg0ληg1ηg2mt=ηi=0t1λt1igi\begin{aligned} m_0 &= 0 \\ m_1 &= -\eta g_0 \\ m_2 &= \lambda m_1 - \eta g_1 = -\lambda \eta g_0 - \eta g_1 \\ m_3 &= \lambda m_2 - \eta g_2 = -\lambda^2 \eta g_0 - \lambda \eta g_1 - \eta g_2 \\ &\vdots \\ m_t &= -\eta \sum_{i=0}^{t-1} \lambda^{t-1-i} g_i \end{aligned}

由此可见,当前时刻的动量 mtm_t 是所有历史梯度 {g0,g1,...,gt1}\{g_0, g_1, ..., g_{t-1}\} 的加权和,且时间越近的梯度权重越大(λt1i\lambda^{t-1-i}ii 增大而减小)。这使得更新方向不仅取决于当前瞬时梯度,还平滑了历史的更新趋势。

动量法的优势示例#

1768130385825

图3.17直观展示了动量法的优势:

  • 在梯度方向连续一致的区域(如长斜坡),动量会累积,导致更新速度越来越快,加速收敛。
  • 当梯度方向发生剧烈变化(如在山壁间震荡)时,当前梯度 gtg_t 可能会试图改变方向,但动量项 λmt\lambda m_t 会起到缓冲作用,减小震荡,使路径更平滑。
  • 当小球(参数)滚到局部极小值点时,普通梯度下降会停止(gt=0g_t=0)。但动量法由于 mt0m_t \neq 0,小球会依靠“惯性”冲过该点,从而有可能找到更优的全局极小值点

动量法与鞍点#

动量法对于逃离鞍点(Saddle Point) 尤其有效。在鞍点处,当前梯度 gt=0g_t = 0。对于普通梯度下降,更新停止。但对于动量法,更新公式变为: mt+1=λmt,θt+1=θt+λmtm_{t+1} = \lambda m_t, \quad \theta_{t+1} = \theta_t + \lambda m_t 只要历史动量 mtm_t 不为零,参数就会继续沿 mtm_t 的方向移动。如果 mtm_t 的方向恰好指向损失下降的方向(即鞍点处负曲率的方向),动量法就能自然地逃离鞍点。即使 mtm_t​ 的方向不是最优下降方向,动量提供的“推力”也能帮助参数探索周边区域,增加找到下降路径的机会。

总结:动量法通过引入历史更新方向的加权平均,有效地加速了在平坦或病态曲率区域的收敛,减少了优化路径的震荡,并增强了逃离局部极小值和鞍点的能力。它是现代深度学习优化器(如SGD with Momentum, Adam)中不可或缺的核心组件之一。

1768204485456

自适应学习率#

问题背景:固定学习率的局限性#

1768204594677

在传统的梯度下降法中,所有参数共享同一个全局学习率 η\eta​。然而,这在复杂的误差表面上会导致优化困难。如图3.21所示,一个凸误差表面的等高线呈椭圆形,在不同方向(参数)上具有非常不同的陡峭程度(梯度大小)。

1768204793722

问题分析:

  1. 学习率太大:如图3.22(a)所示,在陡峭方向(纵轴)上,大的学习率会导致参数在山壁间剧烈震荡,损失难以降低。
  2. 学习率太小:如图3.22(b)所示,在平坦方向(横轴)上,小的学习率会使参数更新极其缓慢,训练几乎停滞。

核心洞察:不同参数、甚至同一参数在不同训练阶段,其“理想”的学习率应该是不同的。因此,需要为每个参数每个时间步定制独立的学习率,即自适应学习率(Adaptive Learning Rate)

1768205840968

AdaGrad(Adaptive Gradient)#

算法原理#

AdaGrad的核心思想是:对于频繁更新(梯度大)的参数,降低其学习率;对于不常更新(梯度小)的参数,提高其学习率。这是通过为每个参数 θi\theta_i​ 维护一个累积历史梯度平方的变量来实现的。

参数更新公式: 标准的梯度下降更新为: θt+1iθtiηgti,其中 gti=Lθiθ=θt \theta_{t+1}^i \leftarrow \theta_t^i - \eta g_t^i \quad \text{,其中 } g_t^i = \frac{\partial L}{\partial \theta^i} \bigg|_{\theta = \theta_t} ​ AdaGrad将其修改为: θt+1iθtiησtigti(式 3.16)​ \theta_{t+1}^i \leftarrow \theta_t^i - \frac{\eta}{\sigma_t^i} g_t^i \quad \text{(式 3.16)} ​ 其中 σti\sigma_t^i​ 是参数 θi\theta^i​ 在时刻 tt​ 的自适应因子,定义为该参数过去所有梯度平方和的均方根(Root Mean Square, RMS)σti=1t+1j=0t(gji)2(式 3.22)​ \sigma_t^i = \sqrt{\frac{1}{t+1} \sum_{j=0}^{t} (g_j^i)^2} \quad \text{(式 3.22)} ​

算法步骤与计算细节#

  1. 初始化θ0i\theta_0^i 随机初始化。σ0i\sigma_0^i​ 在第一次更新前未定义,但我们可以从第一次更新开始计算。
  2. 第1次更新(t=0t=0​
    • 计算梯度 g0ig_0^i
    • 计算 σ0i=(g0i)2=g0i\sigma_0^i = \sqrt{(g_0^i)^2} = |g_0^i|(式 3.18)
    • 更新参数:θ1iθ0iησ0ig0i=θ0iηsign(g0i)\theta_1^i \leftarrow \theta_0^i - \frac{\eta}{\sigma_0^i} g_0^i = \theta_0^i - \eta \cdot \text{sign}(g_0^i)。第一步更新的大小被归一化为 η\eta,与梯度大小无关。
  3. 第2次更新(t=1t=1
    • 计算梯度 g1ig_1^i
    • 计算 σ1i=12[(g0i)2+(g1i)2]\sigma_1^i = \sqrt{\frac{1}{2}[(g_0^i)^2 + (g_1^i)^2]}(式 3.20)
    • 更新参数:θ2iθ1iησ1ig1i\theta_2^i \leftarrow \theta_1^i - \frac{\eta}{\sigma_1^i} g_1^i
  4. 通用第 t+1t+1 次更新
    • 计算梯度 gtig_t^i
    • 计算 σti=1t+1j=0t(gji)2\sigma_t^i = \sqrt{\frac{1}{t+1} \sum_{j=0}^{t} (g_j^i)^2}
    • 更新参数:θt+1iθtiησtigti\theta_{t+1}^i \leftarrow \theta_t^i - \frac{\eta}{\sigma_t^i} g_t^i​

效果与示例#

1768206004410

如图3.24所示,考虑两个参数 θ1\theta^1θ2\theta^2

  • θ1\theta^1 方向平坦,历史梯度 gj1g_j^1 较小,σt1\sigma_t^1 小,因此有效学习率 η/σt1\eta / \sigma_t^1 大,更新步长大。
  • θ2\theta^2​ 方向陡峭,历史梯度 gj2g_j^2​ 较大,σt2\sigma_t^2​ 大,因此有效学习率 η/σt2\eta / \sigma_t^2​ 小,更新步长小。

这实现了在不同方向上自动调整步长的目的。

AdaGrad的缺陷#

1768206142450

AdaGrad有一个显著缺点:随着训练进行,分母中的梯度平方和会单调递增,导致 σti\sigma_t^i​ 持续变大,有效学习率 η/σti\eta / \sigma_t^i​持续下降直至趋近于零。这可能导致训练提前终止,特别是在训练后期或非凸问题上。此外,它对所有历史梯度一视同仁,可能无法适应误差表面的动态变化(图3.25)。

RMSProp(Root Mean Squared Propagation)#

算法原理与改进#

RMSProp针对AdaGrad学习率单调下降的问题进行了改进。其核心思想是:使用指数移动平均(Exponential Moving Average, EMA) 代替算术平均来计算历史梯度平方的累积量,从而让“近期”的梯度拥有更大的权重。

参数更新公式:形式与AdaGrad相同 θt+1iθtiησtigti \theta_{t+1}^i \leftarrow \theta_t^i - \frac{\eta}{\sigma_t^i} g_t^i ​σti\sigma_t^i​ 的计算方式不同。

算法步骤#

  1. 第1次更新(t=0t=0:与AdaGrad相同,σ0i=g0i\sigma_0^i = |g_0^i|
  2. 第2次更新(t=1t=1)及以后σti=α(σt1i)2+(1α)(gti)2(式 3.24, 3.25)\sigma_t^i = \sqrt{\alpha (\sigma_{t-1}^i)^2 + (1-\alpha) (g_t^i)^2} \quad \text{(式 3.24, 3.25)} 其中 α\alpha 是一个衰减率(Decay Rate) 超参数,通常设置为0.9或0.99,0<α<10 < \alpha < 1

理解

  • α\alpha 接近1时,算法更依赖于历史累积量 σt1i\sigma_{t-1}^i,更新平滑但可能对近期变化不敏感。
  • α\alpha 接近0时,算法更依赖于当前梯度平方 (gti)2(g_t^i)^2,对近期变化敏感但可能不稳定。
  • 这种计算方式使得 σti\sigma_t^i​ 是一个有偏估计,但在实践中效果很好。

效果与示例#

如图3.26所示,RMSProp能够动态适应误差表面的变化:

  1. 在平坦的AB段,梯度小,σti\sigma_t^i 小,步长大,快速前进。
  2. 进入陡峭的BC段后,当前梯度 gtig_t^i 突然变大。由于 α\alpha 通常小于1,(1α)(gti)2(1-\alpha)(g_t^i)^2 项迅速使 σti\sigma_t^i 增大,从而快速降低步长(“踩刹车”),防止震荡。
  3. 进入平坦的CD段后,当前梯度 gtig_t^i 变小,σti\sigma_t^i 会随之减小,步长又自动增大。

这使得RMSProp能更好地处理非平稳(Non-stationary)目标。

Adam(Adaptive Moment Estimation)#

Adam是目前深度学习中最流行、最常用的优化器之一。它可以被看作是 RMSProp(自适应学习率)动量法(Momentum) 的结合。

算法核心思想

  1. 计算梯度的一阶矩估计(动量)mt=β1mt1+(1β1)gtm_t = \beta_1 m_{t-1} + (1-\beta_1) g_t​
  2. 计算梯度的二阶矩估计(自适应项)vt=β2vt1+(1β2)gt2v_t = \beta_2 v_{t-1} + (1-\beta_2) g_t^2
  3. 偏差校正:由于 m0,v0m_0, v_0​ 初始化为0,在训练初期矩估计会偏向0。Adam通过偏差校正来抵消这种影响: m^t=mt1β1t,v^t=vt1β2t \hat{m}_t = \frac{m_t}{1 - \beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1 - \beta_2^t} ​
  4. 参数更新θt+1θtηv^t+ϵm^t \theta_{t+1} \leftarrow \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t ​

超参数

  • η\eta​:学习率(建议默认 0.001)。
  • β1\beta_1:一阶矩衰减率(建议默认 0.9)。
  • β2\beta_2:二阶矩衰减率(建议默认 0.999)。
  • ϵ\epsilon:极小值,用于数值稳定(建议默认 10810^{-8})。

优势:Adam结合了动量法加速收敛和逃离鞍点的能力,以及RMSProp自适应调整各参数学习率的能力,在实践中通常能取得快速且稳定的收敛效果。在PyTorch等框架中,Adam通常是默认或首选的优化器。


本节总结: 自适应学习率方法通过为每个参数在不同时间点定制学习率,显著改善了梯度下降法在复杂误差表面上的优化性能。从AdaGrad到RMSProp再到Adam,其演进体现了从简单的累积平均到动态指数平均、从单一自适应到结合动量的思想发展,最终形成了强大且鲁棒的现代优化器。

学习率调度#

核心概念#

学习率调度(Learning Rate Scheduling)是指在学习率 η\eta 不再是一个固定值,而是与训练时间(更新次数)相关的函数,即 ηt\eta_t。其核心目的是在训练的不同阶段动态调整学习率,以解决优化过程中出现的问题,实现更快、更稳定的收敛。 学习率的调整策略需要人为设定,因此属于超参数

为什么需要学习率调度?#

1768207180082

自适应学习率方法(如 AdaGrad)虽然能根据参数梯度历史自动调整学习率,但在训练末期可能产生问题,如训练损失突然上升(“爆炸”)。

  • 问题分析(以AdaGrad为例):如 图 3.27 所示,在误差表面平坦区域(梯度小),σti\sigma_t^i 会累积很小的值,导致学习率 ησti\frac{\eta}{\sigma_t^i} 变得非常大。当参数更新步长过大时,可能会“冲”到梯度突然变大的区域,造成损失剧烈波动。
  • 解决方案:通过学习率调度,在训练后期降低学习率 ηt\eta_t 本身,即使 σti\sigma_t^i 很小,整体的更新步长 ηtσti\frac{\eta_t}{\sigma_t^i} 也能被控制,从而使优化过程平稳地收敛到最优点,如 图 3.29 所示。

1768207476691

主要调度策略#

1. 学习率衰减 (Learning Rate Decay) / 学习率退火 (Learning Rate Annealing)#

这是最常见的学习率调度策略。

  • 做法:随着参数更新次数 tt 的增加,让全局学习率 ηt\eta_t 逐渐变小。
  • 目的:在训练初期使用较大的学习率以快速下降;在训练后期使用较小的学习率以精细调整,稳定收敛,避免在最优点附近震荡。
  • 示意图图 3.28 展示了学习率随时间(更新次数)衰减的典型曲线。

1768207447763

2. 预热 (Warm-up)#

  • 做法:让学习率在训练开始时从一个较小的值逐步增大到一个预设的基准值,然后再按照衰减策略(如线性衰减)逐步减小。
  • 目的:解决自适应学习率算法(如 Adam、RMSProp)在训练初期统计量不准确的问题。
    • 这些方法需要计算 σti\sigma_t^i 来估计每个参数的更新幅度。在训练刚开始时,基于少量数据计算的 σti\sigma_t^i 统计不精准。如果此时学习率很大,可能导致不稳定的更新。
    • 预热阶段用较小的学习率进行“探索”,收集足够的数据以计算出更可靠的 σti\sigma_t^i 统计量后,再提高学习率进行快速学习。
  • 应用实例:ResNet、BERT、Transformer 等模型的训练中都使用了预热策略。
  • 进阶方法:RAdam (Rectified Adam) 是 Adam 的一个进阶版本,它通过理论分析改进了预热机制,使得训练初期更加稳定。具体机制论文中未详细展开,可参考文献 [9]

调度后的优化公式#

引入学习率调度后,完整的参数更新公式变为:

θt+1iθtiηtσtigti(3.26)\theta_{t+1}^i \leftarrow \theta_t^i - \frac{\eta_t}{\sigma_t^i} g_t^i \tag{3.26}
  • θti\theta_t^i:第 ii 个参数在第 tt 次迭代时的值。
  • θt+1i\theta_{t+1}^i:第 ii 个参数在第 t+1t+1 次迭代时的值(更新后)。
  • gtig_t^i:损失函数 LL 关于参数 θi\theta^i 在第 tt 次迭代时的梯度,即 Lθiθ=θt\left. \frac{\partial L}{\partial \theta^i} \right|_{\theta = \theta_t}
  • σti\sigma_t^i:自适应学习率因子(如 AdaGrad 或 RMSProp 中的梯度均方根),为第 ii 个参数定制,用于调整其步长大小。
  • ηt\eta_t随时间 tt 变化的学习率,由学习率调度策略决定(如衰减或预热衰减组合)。

本节总结#

学习率调度是优化深度学习模型的关键技巧之一。它通过动态调整全局学习率 ηt\eta_t,与为每个参数定制的自适应因子 σti\sigma_t^i 协同工作,共同决定了参数更新的最终步长。主要策略包括:

  1. 学习率衰减:用于训练后期稳定收敛。
  2. 预热:用于训练初期稳定统计量,常与衰减策略结合使用。

优化总结#

优化器的完整演进与最终形式#

本章详细阐述了深度学习优化技术的演进过程,从最基础的梯度下降法,逐步集成了动量、自适应学习率和学习率调度,形成了目前强大且通用的优化器范式。最终,一个完整的参数更新步骤可以总结为以下公式:

θt+1iθtiηtσtimti(3.27)\theta_{t+1}^i \leftarrow \theta_t^i - \frac{\eta_t}{\sigma_t^i} m_t^i \tag{3.27}

参数说明:

  • θti\theta_t^i: 第 ii 个参数在第 tt 次迭代(更新)时的值。
  • θt+1i\theta_{t+1}^i: 第 ii 个参数在第 t+1t+1 次迭代时的值(更新后)。
  • ηt\eta_t: 在第 tt 次迭代时的全局基础学习率,其值由学习率调度策略决定(如预热、衰减),是随时间 tt 变化的函数。
  • σti\sigma_t^i: 第 ii 个参数在第 tt 次迭代时的自适应学习率因子。它根据该参数历史梯度的大小(如 RMSProp、AdaGrad 的方法)进行计算,用于为不同参数或在不同训练阶段定制不同的学习率幅度。
  • mtim_t^i: 第 ii 个参数在第 tt 次迭代时的动量(Momentum)。它不再是当前时刻的梯度 gtig_t^i,而是过去所有梯度的一个加权和,决定了参数更新的方向

各组成部分的核心思想与作用#

  1. 基础:梯度下降

    • 原始形式θt+1iθtiηgti\theta_{t+1}^i \leftarrow \theta_t^i - \eta g_t^i​
    • 问题:固定学习率 η\eta 对所有参数一视同仁,无法处理误差表面崎岖(不同方向斜率差异大)或梯度稀疏的问题,易陷入局部最小或鞍点,收敛慢。
  2. 改进一:动量法

    • 作用:引入物理中的惯性概念,将上一次更新的方向 (mt1im_{t-1}^i) 与当前梯度方向 (gtig_t^i) 结合,作为本次更新的方向 mtim_t^i
    • 好处
      • 有助于冲出平坦区域或窄的局部最小值。
      • 可以加速在持续方向上的更新,抑制震荡,使收敛更稳定、更快。
    • 代表:带动量的随机梯度下降(Momentum SGD)。
  3. 改进二:自适应学习率

    • 作用:为每个参数 θi\theta^i 引入独立的自适应因子 σti\sigma_t^i,取代固定的 η\eta
    • 原理:根据参数历史梯度的大小调整其更新步长。梯度大的参数(陡峭方向),σti\sigma_t^i 大,步长小;梯度小的参数(平坦方向),σti\sigma_t^i 小,步长大。
    • 好处:缓解不同参数梯度尺度差异过大带来的训练困难,使优化过程更平稳。
    • 代表算法
      • AdaGradσti\sigma_t^i 为历史梯度平方和的均方根。对稀疏梯度效果好,但学习率可能过早衰减。
      • RMSProp:引入衰减因子 α\alpha,对近期梯度赋予更高权重,解决了 AdaGrad 学习率单调下降过快的问题。
      • Adam最常用。可视为 RMSProp(自适应学习率) + 动量(更新方向) 的结合。它同时计算梯度的一阶矩(动量,带偏置校正)和二阶矩(自适应因子),并进行更新。PyTorch等框架中通常使用其默认参数即可获得良好效果。
  4. 改进三:学习率调度

    • 作用:动态调整全局学习率 ηt\eta_t
    • 原理
      • 学习率衰减:随着训练进行,逐步降低 ηt\eta_t,有助于在末期稳定收敛,找到更精确的最优点。
      • 预热:训练初期逐步增加 ηt\eta_t,让自适应因子 σti\sigma_t^i 有足够数据积累准确的统计,稳定训练初期。
    • 好处:进一步提升训练稳定性和最终性能。预热策略在 Transformer、BERT 等模型训练中被广泛使用(进阶方法如 RAdam [9] 对预热有更优的理论设计)。

关于动量与自适应因子的重要辨析#

Q:mtim_t^iσti\sigma_t^i 都考虑了过去所有的梯度,一个在分子,一个在分母,它们的作用会互相抵消吗? A:不会。 因为两者利用历史梯度的方式有本质区别:

  • 动量 mtim_t^i:是梯度的加权和。它考虑了梯度的方向(正负),其作用是平滑更新方向,赋予优化过程“惯性”。
  • 自适应因子 σti\sigma_t^i:是梯度平方的加权平均(再开方)。它只考虑梯度的大小(幅值),而完全忽略其方向。其作用是根据历史梯度幅度来缩放当前更新的步长。 因此,动量决定了“往哪个方向走”,自适应因子决定了“在这个方向上走多大一步”,两者功能互补,不会抵消。

本节总结#

公式 (3.27)(3.27) 集成了现代深度优化器的核心思想。目前存在多种优化器(如 Adam、AdamW、NAdam 等),它们的区别主要在于计算 mtim_t^iσti\sigma_t^i 的具体方式不同,或是采用了不同的学习率调度策略。 理解这个通用框架,有助于根据具体任务选择和调整合适的优化器,或理解其训练行为。

分类#

分类(Classification)是与回归(Regression)并列的机器学习中最常见的任务之一。第一章的观看次数预测是回归问题,本章节将系统介绍分类问题。

1768208857077

分类与回归的关系#

核心区别在于输出形式:

  • 回归:输出是一个标量(scalar),例如预测PM2.5数值、房价等。模型的目标是让输出值 y^\hat{y} 尽可能接近真实的标签值 yy
  • 分类:输出是一个类别(class),模型需要从预设的几个选项(类别)中选择一个作为答案。它可以看作是一种“选择题”。

用回归的思路处理分类的尝试与问题: 一种直观的想法是将分类问题转化为回归问题:为每个类别分配一个数字编号(例如,类1=1,类2=2,类3=3),然后让模型输出一个标量 y^\hat{y},并希望 y^\hat{y} 尽可能接近目标类别的编号 yy

模型y^期望y^y\text{模型} \rightarrow \hat{y} \quad \text{期望} \quad \hat{y} \approx y

问题:这种做法隐含地假设了类别之间存在“距离”关系。例如,如果编号1代表“一年级”,2代表“二年级”,3代表“三年级”,那么模型会认为“一年级”和“三年级”(距离为2)的差异比“一年级”和“二年级”(距离为1)的差异更大。然而,在很多分类任务中(例如识别猫、狗、汽车),类别之间并没有这种有序的数值关系。这种强加的虚假关系会误导模型。

解决方案:独热编码(One-hot Encoding) 为了消除类别间的虚假距离,更标准的做法是使用独热向量来表示类别标签 yy

  • 假设有 CC 个类别,则标签 yy 是一个 CC 维的向量。
  • 向量中只有对应正确类别的那一维为1,其余所有维均为0。
  • 例如,对于3个类别(猫、狗、鸟):
    • 猫 = [1,0,0]T[1, 0, 0]^T
    • 狗 = [0,1,0]T[0, 1, 0]^T
    • 鸟 = [0,0,1]T[0, 0, 1]^T​
  • 这样,任意两个不同类别之间的“距离”(例如欧氏距离)都是相等的,避免了模型学习到不存在的序关系。

网络架构的调整: 由于标签 yy 变成了一个 CC 维向量,网络的输出层也必须对应地产生 CC 个数值,形成一个输出向量 y^\hat{\mathbf{y}}。这可以通过将原本输出单个标量的神经元(一组权重)复制 CC​ 次来实现,如 图 3.31 所示。

1768209034757

  • 输入:特征向量 a\mathbf{a}(来自上一隐藏层)。
  • 操作:将 a\mathbf{a} 分别与 CC 组不同的权重 w1,w2,...,wC\mathbf{w}_1, \mathbf{w}_2, ..., \mathbf{w}_C 和偏置 b1,b2,...,bCb_1, b_2, ..., b_C 进行线性组合。
  • 输出:得到一个 CC 维向量 y^=[y^1,y^2,...,y^C]T\hat{\mathbf{y}} = [\hat{y}_1, \hat{y}_2, ..., \hat{y}_C]^T,其中 y^i=wiTa+bi\hat{y}_i = \mathbf{w}_i^T \mathbf{a} + b_i
  • 目标:让输出的 CC 维向量 y^\hat{\mathbf{y}} 尽可能接近真实的独热标签向量 y\mathbf{y}

带有 softmax 的分类#

在网络输出 y^\hat{\mathbf{y}} 后,通常不会直接用它去和独热标签 y\mathbf{y} 计算损失。中间会引入一个 softmax 层,如 图 3.32 所示。

1769595425788

操作流程:

  1. 网络输出原始分数向量 y^\hat{\mathbf{y}}
  2. y^\hat{\mathbf{y}} 输入 softmax 函数,得到一个新的向量 y\mathbf{y}'
  3. 计算 y\mathbf{y}' 与真实标签 y\mathbf{y} 之间的损失。

为什么需要 softmax?

  1. 归一化(Normalization):独热标签 y\mathbf{y} 的元素非0即1,而网络原始输出 y^\hat{\mathbf{y}} 可以是任意实数值。Softmax 将 y^\hat{\mathbf{y}} 归一化到 (0,1)(0, 1) 区间,并且所有元素之和为1,即 iyi=1\sum_i y_i' = 1。这使得 y\mathbf{y}' 可以被解释为一个概率分布(每个类别的预测概率),从而与标签的形式(一个确定的类别分布)更具可比性。
  2. 放大差异:Softmax 通过指数运算会拉大原始分数 y^i\hat{y}_i 之间的差距。分数高的类别,其对应的概率 yiy_i' 会接近1;分数低的类别,其概率会接近0。

Softmax 函数定义: 对于 CC 分类问题,给定网络原始输出向量 y^=[y^1,y^2,...,y^C]T\hat{\mathbf{y}} = [\hat{y}_1, \hat{y}_2, ..., \hat{y}_C]^T,softmax 的第 ii 个输出 yiy_i' 计算如下:

yi=exp(y^i)j=1Cexp(y^j)(3.28)y_i' = \frac{\exp(\hat{y}_i)}{\sum_{j=1}^{C} \exp(\hat{y}_j)} \tag{3.28}
  • exp(y^i)\exp(\hat{y}_i):对第 ii 个类别的原始分数取指数,确保其为正。
  • j=1Cexp(y^j)\sum_{j=1}^{C} \exp(\hat{y}_j):对所有类别的指数分数求和,作为归一化分母。
  • 结果性质0<yi<10 < y_i' < 1,且 i=1Cyi=1\sum_{i=1}^{C} y_i' = 1

二分类的特殊情况: 当类别数 C=2C=2 时,softmax 等价于 sigmoid 函数。通常在这种情况下,模型会直接输出一个标量 y^\hat{y},然后通过 sigmoid 函数得到属于正类的概率 p=σ(y^)p = \sigma(\hat{y}),属于负类的概率则为 1p1-p​

分类损失#

在得到 softmax 输出(预测概率分布)y\mathbf{y}'​ 后,需要计算其与真实标签(目标概率分布)y\mathbf{y}​ 之间的差距 ee​,即损失。有两种常见的损失函数。

1. 均方误差 (Mean Squared Error, MSE) 将两个向量视为普通向量,计算其元素的平方差之和:

e=i=1C(yiyi)2(3.29)e = \sum_{i=1}^{C} (y_i - y_i')^2 \tag{3.29}

2. 交叉熵损失 (Cross-Entropy Loss) 这是分类任务中最常用的损失函数。公式如下:

e=i=1Cyilnyi(3.30)e = -\sum_{i=1}^{C} y_i \ln y_i' \tag{3.30}
  • 由于 y\mathbf{y} 是独热向量,假设第 kk 维为1(即真实类别为 kk),其余为0,则交叉熵损失简化为:e=lnyke = -\ln y_k'​
  • 直观理解:最大化真实类别 kk 的预测概率 yky_k',等价于最小化 lnyk-\ln y_k'。当预测完全正确 (yk=1y_k' = 1) 时,损失为0;当预测完全错误 (yk0y_k' \to 0) 时,损失趋于无穷大。
  • 与极大似然估计的关系:最小化交叉熵损失等价于对模型参数进行极大似然估计

为什么更常用交叉熵而非均方误差? 论文从优化难易度的角度进行了解释,见 图 3.36

1769598047261

  • 场景设定:考虑一个三分类问题,真实标签是 [1,0,0]T[1, 0, 0]^T。固定 y^3\hat{y}_3 为一个很小的值(如-1000),分析 y^1\hat{y}_1y^2\hat{y}_2 变化对损失的影响。
  • 损失曲面对比
    • 交叉熵 (图 3.36a):在预测错误严重(即 y^1\hat{y}_1 很小,y^2\hat{y}_2 很大)的区域(图中左上角),损失曲面仍有明显的梯度(有坡度)。这意味着即使初始参数很差,梯度下降也能找到明确的更新方向(朝向右下角),使训练能够启动并进行下去。
    • 均方误差 (图 3.36b):在同样的预测错误严重区域,损失曲面非常平坦(梯度接近0)。如果参数初始落在该区域,微小的梯度会导致更新步伐极其缓慢,训练过程可能“卡住”,难以逃离。
  • 结论:交叉熵损失函数产生的误差曲面在训练初期(模型性能差时)能提供更显著的梯度信号,从而优化难度更低,训练更稳定、更快。虽然使用如Adam这样的自适应优化器可能缓解MSE的平坦梯度问题,但交叉熵通常是更优、更直接的选择。

批量归一化(Batch Normalization, BN)#

问题背景与核心思想#

在深度神经网络训练中,我们常面临误差表面崎岖难优化的问题。即使对于凸误差表面(如碗状),若不同参数方向上的梯度尺度差异巨大(如图3.37所示),使用固定学习率的梯度下降也难以高效收敛。我们因此引入了自适应学习率等方法。

1769629827284

批量归一化的核心思想是直接对误差表面的地貌进行改造,使其变得更平滑、更容易优化,而不是仅仅调整优化算法。它的提出是为了解决内部协变量偏移(Internal Covariate Shift) 问题,但后续研究发现其主要优势在于改变误差表面的性质

特征归一化的动机与Z值归一化#

为何需要特征归一化?#

考虑一个简单的线性模型:y=w1x1+w2x2+by = w_1 x_1 + w_2 x_2 + b,损失 L=eL = \sum e。分析参数 w1w_1 对损失 LL 的影响(图3.39):

1769907165678

  • ΔLLw1Δw1\Delta L \approx \frac{\partial L}{\partial w_1} \Delta w_1,而 Lw1\frac{\partial L}{\partial w_1} 的计算链中依赖于 x1x_1
  • 如果特征 x1x_1 的数值普遍很小,则 Lw1\frac{\partial L}{\partial w_1} 也会很小,导致 w1w_1 方向的梯度小,更新缓慢。
  • 反之,如果特征 x2x_2 的数值很大,则 w2w_2 方向的梯度会很大,更新剧烈。

结论:当输入特征不同维度的数值范围(尺度)差异很大时,会导致损失函数在不同参数方向上的曲率(梯度变化率)差异巨大,形成难以训练的误差表面。特征归一化(Feature Normalization) 旨在解决此问题。

Z值归一化(标准化)#

Z值归一化(Z-score Normalization)标准化(Standardization) 是最常用的特征归一化方法之一。

操作步骤

  1. 对于训练数据集中的所有样本,针对每个特征维度 ii 单独计算:
    • 均值(Mean)mi=1Nn=1Nxinm_i = \frac{1}{N} \sum_{n=1}^{N} x_i^n
    • 标准差(Standard Deviation)σi=1Nn=1N(xinmi)2\sigma_i = \sqrt{\frac{1}{N} \sum_{n=1}^{N} (x_i^n - m_i)^2}
  2. 对每个样本的第 ii 维特征进行归一化: x~inxinmiσi(式 3.31)\tilde{x}_i^n \leftarrow \frac{x_i^n - m_i}{\sigma_i} \quad \text{(式 3.31)}
  3. 归一化后,该特征维度在所有样本上的分布将满足:均值为0,标准差为1

效果:通过对所有特征维度进行归一化,使得每个维度的数值范围大致相同,从而有望产生一个更“圆润”、更容易优化的误差表面,加速训练收敛。

深度网络中的批量归一化#

对隐藏层输出进行归一化#

在深度网络中,仅对输入层进行特征归一化是不够的。因为每一层的输出都会成为下一层的输入,其分布也会在训练过程中随着参数更新而改变。因此,我们需要对每个隐藏层的输出(或激活前的值)也进行归一化。

选择归一化对象:通常对激活函数之前的线性变换输出 z\mathbf{z}​ 进行归一化(如图3.41、3.42)。原因在于,对于如Sigmoid的激活函数,输入在0附近时梯度最大,归一化到0均值附近有利于梯度流动。

1769960572916

1769960582312

批量归一化的操作#

对于网络中的某一层,假设其线性输出为 z\mathbf{z}。在一个训练步骤中,我们有一个包含 BB 个样本的小批量(Mini-batch)

计算过程

  1. 计算该批量内 z\mathbf{z} 的均值向量 μ\boldsymbol{\mu} 和标准差向量 σ\boldsymbol{\sigma}μ=1Bb=1Bzb\boldsymbol{\mu} = \frac{1}{B} \sum_{b=1}^{B} \mathbf{z}^b σ=1Bb=1B(zbμ)2+ϵ\boldsymbol{\sigma} = \sqrt{\frac{1}{B} \sum_{b=1}^{B} (\mathbf{z}^b - \boldsymbol{\mu})^2 + \epsilon}ϵ\epsilon 是一个极小的常数,如 10810^{-8},用于数值稳定。)
  2. 对批量内的每个 zb\mathbf{z}^b 进行归一化: z~b=zbμσ \tilde{\mathbf{z}}^b = \frac{\mathbf{z}^b - \boldsymbol{\mu}}{\boldsymbol{\sigma}} ​ (这里的除法和平方都是逐元素操作。)
  3. 缩放与平移(可学习参数):为了不丢失网络的表达能力(例如,如果下一层是Sigmoid,我们可能不希望其输入总是被强制归一化到均值为0),引入两个可学习的参数向量 γ\boldsymbol{\gamma}​β\boldsymbol{\beta}​z^b=γz~b+β(式 3.35)​ \hat{\mathbf{z}}^b = \boldsymbol{\gamma} \odot \tilde{\mathbf{z}}^b + \boldsymbol{\beta} \quad \text{(式 3.35)} ​ 其中 \odot​ 表示逐元素相乘。γ\boldsymbol{\gamma}​β\boldsymbol{\beta}​ 的维度与 z\mathbf{z}​ 相同。它们被初始化为 γ=1\boldsymbol{\gamma} = \mathbf{1}​(全1向量),β=0\boldsymbol{\beta} = \mathbf{0}​(零向量)。这样,在训练初期,批量归一化层近似执行恒等变换,随着训练进行,网络可以学习到最适合的缩放和平移量。

为什么叫“批量”归一化? 因为其统计量(均值 μ\boldsymbol{\mu}、标准差 σ\boldsymbol{\sigma})是在每个训练批次的数据上计算得出的,而非整个训练集。这使得归一化成为网络前向传播的一部分(图3.43),且依赖于当前批次的样本。

测试/推理阶段的批量归一化#

问题:测试时没有批量#

在训练阶段,归一化所需的均值和标准差来自当前小批量。但在测试(推理)阶段,我们可能一次只处理一个样本(或样本数不固定的批次),无法计算有意义的批量统计量。

解决方案:使用移动平均#

在训练过程中,我们会为每个批量归一化层计算并记录其均值和标准差的指数移动平均(Exponential Moving Average, EMA)

训练时

  • 在每个训练步骤,计算当前批量的均值 μt\mu_t 和标准差 σt\sigma_t
  • 更新全局的移动平均值: μˉpμˉ+(1p)μt\bar{\mu} \leftarrow p \cdot \bar{\mu} + (1-p) \cdot \mu_t σˉpσˉ+(1p)σt\bar{\sigma} \leftarrow p \cdot \bar{\sigma} + (1-p) \cdot \sigma_t 其中 pp 是动量参数(通常接近1,例如0.9或0.99),控制历史信息保留的程度。

测试时

  • 不再计算当前数据的统计量
  • 直接使用训练过程中最终积累下来的移动平均值 μˉ\bar{\mu}σˉ\bar{\sigma} 进行归一化: z^=γzμˉσˉ+β\hat{z} = \gamma \cdot \frac{z - \bar{\mu}}{\bar{\sigma}} + \beta

内部协变量偏移与批量归一化的真实作用#

原始论文的动机:内部协变量偏移#

批量归一化原始论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》提出,其目的是减少内部协变量偏移

  • 协变量偏移(Covariate Shift):指训练集和测试集的输入数据分布不一致。
  • 内部协变量偏移:指深度网络内部,某一层的输入分布随着前一层参数的更新而发生变化的现象(图3.47)。作者认为这会导致训练困难,因为每一层都需要不断适应变化的输入分布。

后续研究的质疑与新见解#

论文《How Does Batch Normalization Help Optimization?》[11] 通过实验和理论分析指出:

  1. 内部协变量偏移可能不是关键问题:实验表明,无论是否使用批量归一化,网络中间层激活值分布的变化幅度相似,且这种变化本身对训练并无严重损害。
  2. 批量归一化的主要作用是平滑优化:该论文证明,批量归一化改变了损失函数的 Lipschitz 性质(即梯度的平滑性/变化幅度),使其Lipschitz 常数更小,梯度更可预测。这使得误差表面更加平滑,允许使用更大的学习率,并使得优化过程对超参数(如初始化)更不敏感。
  3. 其他归一化方法也有类似效果:论文发现,即使使用不精确的统计量进行归一化(如使用固定的均值和方差),只要对激活值进行某种归一化,就能带来类似的训练加速和稳定效果。这支持了“平滑优化是主要收益”的观点。

总结:批量归一化的优势#

  1. 允许更高的学习率:平滑的误差表面使得训练可以使用更大的学习率而不发散,加速收敛。
  2. 减少对初始化的依赖:网络对权重初始化的尺度不那么敏感。
  3. 有一定的正则化效果:由于每个批量的归一化统计量是基于该批次样本估计的,这给训练过程引入了噪声,类似于Dropout,可以起到轻微的正则化作用,有助于防止过拟合。
  4. 加速收敛:如图3.46的实验结果所示,使用批量归一化(红线)的网络在验证集准确率上能更快地达到较高的水平。

1770074681572

其他归一化技术#

批量归一化并非唯一的归一化方法,根据不同的应用场景和数据特性,后续衍生出了一系列变体:

  • 批量重归一化(Batch Renormalization) [12]:针对小批量或批量统计量不可靠的情况,对归一化结果进行额外的裁剪。
  • 层归一化(Layer Normalization) [13]:在样本维度(而非特征维度)上计算统计量,适用于循环神经网络(RNN)或批量大小很小的情况。
  • 实例归一化(Instance Normalization) [14]:主要用于图像风格迁移,对每个样本的每个通道单独归一化。
  • 组归一化(Group Normalization) [15]:将通道分成若干组,在每组内进行归一化,不依赖于批量大小。
  • 权重归一化(Weight Normalization) [16]:通过重参数化(Reparameterization)直接对权重向量进行归一化,而非激活值。
  • 谱归一化(Spectral Normalization) [17]:常用于生成对抗网络(GAN),通过约束权重矩阵的谱范数(最大奇异值)来稳定训练。

选择依据:这些方法的选择取决于网络架构(如CNN、RNN)、任务(如图像分类、生成模型)以及硬件限制(如可用的批量大小)。当批量大小足够大时,批量归一化通常是CNN中的首选。


本节核心总结: 批量归一化通过对网络中间层的激活值进行标准化(减均值、除标准差),并引入可学习的缩放和平移参数,有效地平滑了损失函数的误差表面。这允许使用更大的学习率,降低了对参数初始化的敏感性,并显著加速了深度神经网络的训练收敛。虽然其最初是为了解决内部协变量偏移而提出的,但后续研究揭示其更大的价值在于改善优化过程的本身

参考文献#

[1] KESKAR N S, MUDIGERE D, NOCEDAL J, et al. On large-batch training for deep learning: Generalization gap and sharp minima[J]. arXiv preprint arXiv:1609.04836, 2016.

[2] GUPTA V, SERRANO S A, DECOSTE D. Stochastic weight averaging in parallel: Large-batch training that generalizes well[J]. arXiv preprint arXiv:2001.02312, 2020.

[3] YOU Y, GITMAN I, GINSBURG B. Large batch training of convolutional networks[J]. arXiv preprint arXiv:1708.03888, 2017.

[4] YOU Y, LI J, REDDI S, et al. Large batch optimization for deep learning: Training bert in 76 minutes[J]. arXiv preprint arXiv:1904.00962, 2019.

[5] AKIBA T, SUZUKI S, FUKUDA K. Extremely large minibatch sgd: Training resnet-50 on imagenet in 15 minutes[J]. arXiv preprint arXiv:1711.04325, 2017.

[6] GOYAL P, DOLLÁR P, GIRSHICK R, et al. Accurate, large minibatch sgd: Training imagenet in 1 hour[J]. arXiv preprint arXiv:1706.02677, 2017.

[7] KINGMA D P, BA J. Adam: A method for stochastic optimization[J]. arXiv preprint arXiv:1412.6980, 2014.

[8] HE K, ZHANG X, REN S, et al. Deep residual learning for image recognition[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 770-778.

[9] LIU L, JIANG H, HE P, et al. On the variance of the adaptive learning rate and beyond[J]. arXiv preprint arXiv:1908.03265, 2019.

[10] IOFFE S, SZEGEDY C. Batch normalization: Accelerating deep network training by reducing internal covariate shift[C]//International conference on machine learning. pmlr, 2015: 448-456.

[11] SANTURKAR S, TSIPRAS D, ILYAS A, et al. How does batch normalization help optimization?[J]. Advances in neural information processing systems, 2018, 31.

[12] IOFFE S. Batch renormalization: Towards reducing minibatch dependence in batch-normalized models[J]. Advances in neural information processing systems, 2017, 30.

[13] BA J L, KIROS J R, HINTON G E. Layer normalization[J]. arXiv preprint arXiv:1607.06450, 2016.

[14] ULYANOV D, VEDALDI A, LEMPITSKY V. Instance normalization: The missing ingredient for fast stylization[J]. arXiv preprint arXiv:1607.08022, 2016.

[15] WU Y, HE K. Group normalization[C]//Proceedings of the European conference on computer vision (ECCV). 2018: 3-19.

[16] SALIMANS T, KINGMA D P. Weight normalization: A simple reparameterization to accelerate training of deep neural networks[J]. Advances in neural information processing systems, 2016, 29.

[17] YOSHIDA Y, MIYATO T. Spectral norm regularization for improving the generalizability of deep learning[J]. arXiv preprint arXiv:1705.10941, 2017.

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

深度学习基础:优化、正则化与归一化
https://castorice.xin/posts/深度学习基础/
作者
castorice
发布于
2026-03-05
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时