这是本文档旧的修订版!
第三章 反向传播算法
3.1 梯度下降基础
3.1.1 优化问题概述
神经网络的训练本质上是一个优化问题:寻找一组最优参数$\theta$,使得损失函数$\mathcal{L}(\theta)$最小化。
$$\theta^* = \arg\min_{\theta} \mathcal{L}(\theta)$$
其中,$\theta$包含网络中的所有权重和偏置,$\mathcal{L}$是衡量模型预测与真实值差异的损失函数。
这个优化问题具有以下特点:
- 高维:现代神经网络可能有数百万甚至数十亿个参数
- 非凸:损失函数通常是非凸的,存在多个局部最优
- 大规模数据:需要在海量数据集上进行优化
- 计算昂贵:每次评估损失函数都需要前向传播整个网络
3.1.2 梯度下降算法
梯度下降是最基本的优化算法,其核心思想是沿损失函数梯度的反方向更新参数:
$$\theta_{t+1} = \theta_t - \eta \nabla_{\theta} \mathcal{L}(\theta_t)$$
其中$\eta$是学习率,控制每次更新的步长。
梯度下降有三种主要变体:
批量梯度下降(Batch Gradient Descent)
使用整个训练集计算梯度:
$$\nabla_{\theta} \mathcal{L} = \frac{1}{N} \sum_{i=1}^{N} \nabla_{\theta} \mathcal{L}(\mathbf{x}_i, y_i)$$
优点:梯度估计准确,更新稳定
缺点:计算开销大,内存需求高
随机梯度下降(Stochastic Gradient Descent, SGD)
每次迭代使用一个样本:
$$\theta_{t+1} = \theta_t - \eta \nabla_{\theta} \mathcal{L}(\mathbf{x}_i, y_i)$$
优点:计算快速,可逃离局部最优
缺点:梯度估计噪声大,收敛不稳定
小批量梯度下降(Mini-batch Gradient Descent)
每次迭代使用一个小批量样本(通常32-512个):
$$\nabla_{\theta} \mathcal{L} = \frac{1}{m} \sum_{i=1}^{m} \nabla_{\theta} \mathcal{L}(\mathbf{x}_i, y_i)$$
优点:平衡了计算效率和梯度准确性,是现代深度学习的主流选择
3.1.3 学习率调度
学习率是最重要的超参数之一,需要精心选择和调整。
学习率衰减策略
1. 步进衰减(Step Decay):每隔固定epoch将学习率乘以衰减因子
$$\eta_t = \eta_0 \cdot \gamma^{\lfloor t / s \rfloor}$$
2. 指数衰减(Exponential Decay):
$$\eta_t = \eta_0 \cdot e^{-kt}$$
3. 余弦退火(Cosine Annealing):
$$\eta_t = \eta_{min} + \frac{1}{2}(\eta_{max} - \eta_{min})(1 + \cos(\frac{t}{T}\pi))$$
4. 预热(Warmup):
初始阶段从小学习率逐渐增大,避免早期训练不稳定
3.2 反向传播算法
3.2.1 链式法则
反向传播(Backpropagation)是高效计算神经网络梯度的算法,其核心是微积分中的链式法则。
对于复合函数$f(g(x))$,链式法则给出: $$\frac{\partial f}{\partial x} = \frac{\partial f}{\partial g} \cdot \frac{\partial g}{\partial x}$$
对于多变量函数,链式法则推广为: $$\frac{\partial z}{\partial x} = \sum_i \frac{\partial z}{\partial y_i} \cdot \frac{\partial y_i}{\partial x}$$
3.2.2 反向传播原理
考虑一个$L$层神经网络,第$l$层的计算为: $$\mathbf{z}^{(l)} = \mathbf{W}^{(l)} \mathbf{a}^{(l-1)} + \mathbf{b}^{(l)}$$ $$\mathbf{a}^{(l)} = f(\mathbf{z}^{(l)})$$
反向传播计算损失函数对各层参数的梯度,分为两个阶段:
前向传播:计算并保存各层的中间结果
反向传播:从输出层向输入层逐层计算梯度
误差反向传播
定义第$l$层的误差项$\boldsymbol{\delta}^{(l)}$为损失函数对$\mathbf{z}^{(l)}$的梯度: $$\boldsymbol{\delta}^{(l)} = \frac{\partial \mathcal{L}}{\partial \mathbf{z}^{(l)}}$$
对于输出层(第$L$层): $$\boldsymbol{\delta}^{(L)} = \frac{\partial \mathcal{L}}{\partial \mathbf{a}^{(L)}} \odot f'(\mathbf{z}^{(L)})$$
其中$\odot$表示逐元素乘法。
对于隐藏层,误差反向传播: $$\boldsymbol{\delta}^{(l)} = ((\mathbf{W}^{(l+1)})^T \boldsymbol{\delta}^{(l+1)}) \odot f'(\mathbf{z}^{(l)})$$
这表示第$l+1$层的误差通过权重矩阵反向传播到第$l$层。
参数梯度计算
获得误差项后,可以计算参数的梯度: $$\frac{\partial \mathcal{L}}{\partial \mathbf{W}^{(l)}} = \boldsymbol{\delta}^{(l)} (\mathbf{a}^{(l-1)})^T$$ $$\frac{\partial \mathcal{L}}{\partial \mathbf{b}^{(l)}} = \boldsymbol{\delta}^{(l)}$$
3.2.3 反向传播算法流程
完整的反向传播算法步骤如下:
输入:训练样本$(\mathbf{x}, \mathbf{y})$,当前网络参数 输出:各参数的梯度
1. 前向传播
- 设置$\mathbf{a}^{(0)} = \mathbf{x}$
- 对于$l = 1$到$L$:
- $\mathbf{z}^{(l)} = \mathbf{W}^{(l)} \mathbf{a}^{(l-1)} + \mathbf{b}^{(l)}$
- $\mathbf{a}^{(l)} = f(\mathbf{z}^{(l)})$
2. 计算输出层误差
- $\boldsymbol{\delta}^{(L)} = \frac{\partial \mathcal{L}}{\partial \mathbf{a}^{(L)}} \odot f'(\mathbf{z}^{(L)})$
3. 反向传播误差
- 对于$l = L-1$到$1$:
- $\boldsymbol{\delta}^{(l)} = ((\mathbf{W}^{(l+1)})^T \boldsymbol{\delta}^{(l+1)}) \odot f'(\mathbf{z}^{(l)})$
4. 计算梯度
- 对于$l = 1$到$L$:
- $\frac{\partial \mathcal{L}}{\partial \mathbf{W}^{(l)}} = \boldsymbol{\delta}^{(l)} (\mathbf{a}^{(l-1)})^T$
- $\frac{\partial \mathcal{L}}{\partial \mathbf{b}^{(l)}} = \boldsymbol{\delta}^{(l)}$
3.3 常见激活函数的梯度
3.3.1 Sigmoid导数
Sigmoid函数$\sigma(x) = \frac{1}{1 + e^{-x}}$的导数有一个简洁的形式: $$\sigma'(x) = \sigma(x)(1 - \sigma(x))$$
这个性质在反向传播中很方便,因为在正向传播时已经计算了$\sigma(x)$,可以直接用于梯度计算。
Sigmoid导数的最大值在$x=0$处,为0.25。这意味着梯度在通过Sigmoid层时至少会被缩小为原来的1/4,这是深层网络中梯度消失的重要原因。
3.3.2 Tanh导数
Tanh函数的导数为: $$\tanh'(x) = 1 - \tanh^2(x)$$
Tanh导数的最大值在$x=0$处,为1。相比Sigmoid,Tanh的梯度更强,但仍会随着$|x|$增大而趋近于0。
3.3.3 ReLU及其变体导数
ReLU导数 $$\text{ReLU}'(x) = \begin{cases} 1 & \text{if } x > 0 \\ 0 & \text{if } x < 0 \end{cases}$$
在$x=0$处通常定义为0或1。
Leaky ReLU导数 $$\text{LeakyReLU}'(x) = \begin{cases} 1 & \text{if } x > 0 \\ \alpha & \text{if } x \leq 0 \end{cases}$$
ReLU类激活函数在正区间的梯度恒为1,这是它们能够缓解梯度消失问题的关键。
3.4 高级优化算法
3.4.1 Momentum
SGD在更新时只考虑当前梯度,容易在峡谷区域震荡。Momentum方法引入动量项,累积历史梯度信息:
$$\mathbf{v}_t = \gamma \mathbf{v}_{t-1} + \eta \nabla_{\theta} \mathcal{L}(\theta_t)$$ $$\theta_{t+1} = \theta_t - \mathbf{v}_t$$
其中$\gamma$是动量系数,通常设为0.9。
物理类比:将参数更新想象为小球在损失曲面上滚动。动量项相当于速度,梯度相当于加速度。小球在一致的梯度方向上加速,在震荡方向上相互抵消。
优点: - 加速收敛,特别是在一致梯度方向 - 减少震荡 - 有助于逃离局部最优和鞍点
3.4.2 AdaGrad
AdaGrad自适应地为每个参数调整学习率,对频繁出现的特征使用较小的学习率,对稀疏特征使用较大的学习率:
$$\mathbf{g}_t = \nabla_{\theta} \mathcal{L}(\theta_t)$$ $$\mathbf{G}_t = \mathbf{G}_{t-1} + \mathbf{g}_t \odot \mathbf{g}_t$$ $$\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\mathbf{G}_t + \epsilon}} \odot \mathbf{g}_t$$
其中$\mathbf{G}_t$累积了历史梯度的平方,$\epsilon$是小常数防止除零。
缺点:学习率单调递减,可能过早衰减到极小值。
3.4.3 RMSProp
RMSProp改进了AdaGrad的学习率衰减问题,使用指数移动平均而非累积:
$$\mathbf{E}[\mathbf{g}^2]_t = \beta \mathbf{E}[\mathbf{g}^2]_{t-1} + (1-\beta) \mathbf{g}_t \odot \mathbf{g}_t$$ $$\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\mathbf{E}[\mathbf{g}^2]_t + \epsilon}} \odot \mathbf{g}_t$$
通常$\beta = 0.9$,$\eta = 0.001$。
3.4.4 Adam
Adam(Adaptive Moment Estimation)结合了Momentum和RMSProp的优点,是目前最常用的优化算法:
$$\mathbf{m}_t = \beta_1 \mathbf{m}_{t-1} + (1-\beta_1) \mathbf{g}_t$$ $$\mathbf{v}_t = \beta_2 \mathbf{v}_{t-1} + (1-\beta_2) \mathbf{g}_t \odot \mathbf{g}_t$$
偏差校正: $$\hat{\mathbf{m}}_t = \frac{\mathbf{m}_t}{1-\beta_1^t}$$ $$\hat{\mathbf{v}}_t = \frac{\mathbf{v}_t}{1-\beta_2^t}$$
参数更新: $$\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{\mathbf{v}}_t} + \epsilon} \hat{\mathbf{m}}_t$$
默认参数:$\beta_1 = 0.9$,$\beta_2 = 0.999$,$\epsilon = 10^{-8}$,$\eta = 0.001$
Adam的优势: - 自适应学习率 - 动量加速 - 偏差校正帮助早期训练 - 对超参数选择相对鲁棒
3.4.5 优化算法选择建议
- SGD + Momentum:收敛后泛化性能可能更好,适合需要最优泛化性能的场景 - Adam:训练速度快,适合大多数情况,特别是稀疏梯度或噪声大的场景 - AdamW:Adam的改进版本,解耦权重衰减,泛化性能更好 - LARS/LAMB:用于大批量训练
3.5 梯度消失与梯度爆炸
3.5.1 问题描述
在深层神经网络中,梯度在反向传播时可能变得非常小(梯度消失)或非常大(梯度爆炸)。
梯度消失:梯度逐层衰减,浅层参数几乎得不到更新。典型症状是训练损失不再下降,深层网络的浅层参数变化极小。
梯度爆炸:梯度逐层放大,参数更新幅度极大。典型症状是训练损失突然变为NaN或无穷大。
3.5.2 根本原因
考虑一个$n$层网络,使用激活函数$\sigma$。第$l$层的梯度为: $$\frac{\partial \mathcal{L}}{\partial \mathbf{W}^{(l)}} = \boldsymbol{\delta}^{(l)} (\mathbf{a}^{(l-1)})^T$$
其中$\boldsymbol{\delta}^{(l)}$包含多个雅可比矩阵的连乘: $$\boldsymbol{\delta}^{(l)} = \mathbf{J}^{(L)} \mathbf{J}^{(L-1)} \cdots \mathbf{J}^{(l+1)} \frac{\partial \mathcal{L}}{\partial \mathbf{a}^{(L)}}$$
如果雅可比矩阵的特征值小于1,多次连乘会导致梯度指数级减小;如果大于1,则导致梯度指数级增大。
3.5.3 解决方法
梯度消失解决方案:
1. 使用ReLU激活函数:正区间梯度恒为1 2. 残差连接(Residual Connections):引入跳跃连接 3. 批归一化(Batch Normalization):稳定每层的分布 4. 更好的初始化:如He初始化 5. 门控架构:如LSTM中的门控机制
梯度爆炸解决方案:
1. 梯度裁剪(Gradient Clipping):
- 按值裁剪:$g_i = \max(\min(g_i, c), -c)$
- 按范数裁剪:如果$||\mathbf{g}|| > c$,则$\mathbf{g} = c \cdot \frac{\mathbf{g}}{||\mathbf{g}||}$
2. 权重正则化:限制权重大小
3. 更小的学习率:减缓参数更新速度
3.6 例题分析
例题3.1 反向传播计算
题目:考虑以下简单网络: - 输入:$x = 2$ - 权重:$w_1 = 0.5$,$w_2 = 0.3$ - 计算:$z_1 = w_1 \cdot x$,$a_1 = \text{ReLU}(z_1)$,$\hat{y} = w_2 \cdot a_1$ - 真实值:$y = 1$ - 损失函数:$\mathcal{L} = \frac{1}{2}(y - \hat{y})^2$
请计算$\frac{\partial \mathcal{L}}{\partial w_1}$和$\frac{\partial \mathcal{L}}{\partial w_2}$。
解答:
前向传播: $$z_1 = 0.5 \times 2 = 1$$ $$a_1 = \text{ReLU}(1) = 1$$ $$\hat{y} = 0.3 \times 1 = 0.3$$ $$\mathcal{L} = \frac{1}{2}(1 - 0.3)^2 = \frac{1}{2} \times 0.49 = 0.245$$
反向传播:
首先计算输出层梯度: $$\frac{\partial \mathcal{L}}{\partial \hat{y}} = -(y - \hat{y}) = -(1 - 0.3) = -0.7$$
计算$w_2$的梯度: $$\frac{\partial \mathcal{L}}{\partial w_2} = \frac{\partial \mathcal{L}}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial w_2} = -0.7 \times a_1 = -0.7 \times 1 = -0.7$$
计算$w_1$的梯度: $$\frac{\partial \hat{y}}{\partial a_1} = w_2 = 0.3$$ $$\frac{\partial a_1}{\partial z_1} = \text{ReLU}'(1) = 1$$ $$\frac{\partial z_1}{\partial w_1} = x = 2$$
$$\frac{\partial \mathcal{L}}{\partial w_1} = \frac{\partial \mathcal{L}}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial a_1} \cdot \frac{\partial a_1}{\partial z_1} \cdot \frac{\partial z_1}{\partial w_1}$$ $$= -0.7 \times 0.3 \times 1 \times 2 = -0.42$$
例题3.2 激活函数梯度比较
题目:比较Sigmoid、Tanh、ReLU在$x=2$和$x=-2$处的梯度值,分析它们对梯度消失的影响。
解答:
Sigmoid: - $\sigma(2) = \frac{1}{1+e^{-2}} \approx 0.881$ - $\sigma(-2) = \frac{1}{1+e^{2}} \approx 0.119$ - $\sigma'(2) = 0.881 \times (1-0.881) \approx 0.105$ - $\sigma'(-2) = 0.119 \times (1-0.119) \approx 0.105$
Tanh: - $\tanh(2) \approx 0.964$ - $\tanh(-2) \approx -0.964$ - $\tanh'(2) = 1 - 0.964^2 \approx 0.071$ - $\tanh'(-2) = 1 - (-0.964)^2 \approx 0.071$
ReLU: - $\text{ReLU}'(2) = 1$ - $\text{ReLU}'(-2) = 0$
分析:
1. Sigmoid:在$|x|$较大时,梯度约为0.1,深层网络中多次相乘会迅速衰减 2. Tanh:梯度更小(约0.07),梯度消失问题更严重 3. ReLU:正区间梯度恒为1,有效缓解梯度消失;负区间梯度为0,可能导致神经元死亡
例题3.3 梯度裁剪应用
题目:某次反向传播计算得到的梯度为$\mathbf{g} = [10, -15, 5]$,使用按范数裁剪,阈值$c=10$。求裁剪后的梯度。
解答:
计算梯度范数: $$||\mathbf{g}|| = \sqrt{10^2 + (-15)^2 + 5^2} = \sqrt{100 + 225 + 25} = \sqrt{350} \approx 18.71$$
因为$18.71 > 10$,需要裁剪: $$\mathbf{g}_{clip} = c \cdot \frac{\mathbf{g}}{||\mathbf{g}||} = 10 \cdot \frac{[10, -15, 5]}{18.71} \approx [5.34, -8.02, 2.67]$$
验证范数:$\sqrt{5.34^2 + (-8.02)^2 + 2.67^2} \approx 10$,符合要求。
3.7 训练题
选择题
1. 反向传播算法的核心是:
A. 前向传播 B. 链式法则 C. 梯度上升 D. 损失函数
2. 关于梯度消失问题,以下说法错误的是:
A. 主要发生在深层网络中 B. Sigmoid激活函数容易导致梯度消失 C. ReLU可以完全避免梯度消失 D. 残差连接可以缓解梯度消失
3. Adam优化器中,$\mathbf{m}_t$和$\mathbf{v}_t$分别表示:
A. 一阶矩估计和二阶矩估计 B. 权重和偏置 C. 梯度和学习率 D. 动量和正则化项
4. 以下哪种方法不能解决梯度爆炸问题?
A. 梯度裁剪 B. 权重正则化 C. 使用ReLU激活 D. 减小学习率
5. 小批量梯度下降中,批量大小通常选择:
A. 1 B. 32-512 C. 整个训练集 D. 10000以上
填空题
6. 梯度下降中,参数更新公式为$\theta_{t+1} = \theta_t - \eta$。 7. 在反向传播中,$\boldsymbol{\delta}^{(l)} = \frac{\partial \mathcal{L}}{\partial \mathbf{z}^{(l)}}$被称为项。
8. Sigmoid函数的导数可以表示为$\sigma'(x) =$。 9. Momentum优化中,动量系数$\gamma$通常设为。
10. 梯度裁剪的两种主要方式是裁剪和裁剪。
计算题
11. 给定网络结构:
- $z = w_1 x_1 + w_2 x_2$,其中$x_1=1, x_2=2, w_1=0.5, w_2=-0.3$
- $\hat{y} = \sigma(z)$
- 损失$\mathcal{L} = -y\log(\hat{y}) - (1-y)\log(1-\hat{y})$,$y=1$
请计算$\frac{\partial \mathcal{L}}{\partial w_1}$和$\frac{\partial \mathcal{L}}{\partial w_2}$。
12. 使用Adam优化器,给定:
- 当前梯度$\mathbf{g}_t = [0.2, -0.3]$
- 上一时刻一阶矩$\mathbf{m}_{t-1} = [0.1, 0.1]$
- 上一时刻二阶矩$\mathbf{v}_{t-1} = [0.01, 0.01]$
- $\beta_1 = 0.9$,$\beta_2 = 0.999$,$t = 10$
请计算偏差校正后的$\hat{\mathbf{m}}_t$和$\hat{\mathbf{v}}_t$。
3.8 答案与解析
选择题答案
1. 答案:B
解析:反向传播基于链式法则高效计算梯度。
2. 答案:C
解析:ReLU在负区间梯度为0,仍可能出现"神经元死亡"的类似问题。
3. 答案:A
解析:$\mathbf{m}_t$是一阶矩(梯度均值),$\mathbf{v}_t$是二阶矩(梯度方差)。
4. 答案:C
解析:ReLU主要解决梯度消失问题,对梯度爆炸影响不大。
5. 答案:B
解析:小批量通常为32-512,平衡计算效率和梯度准确性。
填空题答案
6. 答案:$\nabla_{\theta} \mathcal{L}(\theta_t)$(或梯度)
7. 答案:误差
8. 答案:$\sigma(x)(1-\sigma(x))$
9. 答案:0.9
10. 答案:按值;按范数
计算题答案
11. 解答:
**前向传播**:
$$z = 0.5 \times 1 + (-0.3) \times 2 = 0.5 - 0.6 = -0.1$$
$$\hat{y} = \sigma(-0.1) = \frac{1}{1 + e^{0.1}} \approx \frac{1}{1.105} \approx 0.475$$
**反向传播**:
$$\frac{\partial \mathcal{L}}{\partial \hat{y}} = -\frac{y}{\hat{y}} + \frac{1-y}{1-\hat{y}} = -\frac{1}{0.475} \approx -2.105$$
$$\frac{\partial \hat{y}}{\partial z} = \sigma(-0.1)(1-\sigma(-0.1)) = 0.475 \times 0.525 \approx 0.249$$
$$\frac{\partial z}{\partial w_1} = x_1 = 1, \quad \frac{\partial z}{\partial w_2} = x_2 = 2$$
$$\frac{\partial \mathcal{L}}{\partial w_1} = -2.105 \times 0.249 \times 1 \approx -0.524$$
$$\frac{\partial \mathcal{L}}{\partial w_2} = -2.105 \times 0.249 \times 2 \approx -1.048$$
12. 解答:
**计算一阶矩**:
$$\mathbf{m}_t = 0.9 \times [0.1, 0.1] + 0.1 \times [0.2, -0.3]$$
$$= [0.09, 0.09] + [0.02, -0.03] = [0.11, 0.06]$$
**计算二阶矩**:
$$\mathbf{v}_t = 0.999 \times [0.01, 0.01] + 0.001 \times [0.04, 0.09]$$
$$= [0.00999, 0.00999] + [0.00004, 0.00009] = [0.01003, 0.01008]$$
**偏差校正**:
$$1 - \beta_1^t = 1 - 0.9^{10} = 1 - 0.349 = 0.651$$
$$1 - \beta_2^t = 1 - 0.999^{10} = 1 - 0.990 = 0.010$$
$$\hat{\mathbf{m}}_t = \frac{[0.11, 0.06]}{0.651} \approx [0.169, 0.092]$$
$$\hat{\mathbf{v}}_t = \frac{[0.01003, 0.01008]}{0.010} \approx [1.003, 1.008]$$
— 本章完