深度学习:反向传播算法

这是本文档旧的修订版!


第三章 反向传播算法

神经网络的训练本质上是一个优化问题:寻找一组最优参数$\theta$,使得损失函数$\mathcal{L}(\theta)$最小化。

$$\theta^* = \arg\min_{\theta} \mathcal{L}(\theta)$$

其中,$\theta$包含网络中的所有权重和偏置,$\mathcal{L}$是衡量模型预测与真实值差异的损失函数。

这个优化问题具有以下特点:

  1. 高维:现代神经网络可能有数百万甚至数十亿个参数
  2. 非凸:损失函数通常是非凸的,存在多个局部最优
  3. 大规模数据:需要在海量数据集上进行优化
  4. 计算昂贵:每次评估损失函数都需要前向传播整个网络

梯度下降是最基本的优化算法,其核心思想是沿损失函数梯度的反方向更新参数:

$$\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)$$

优点:平衡了计算效率和梯度准确性,是现代深度学习的主流选择

学习率是最重要的超参数之一,需要精心选择和调整。

学习率衰减策略

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)

初始阶段从小学习率逐渐增大,避免早期训练不稳定

反向传播(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}$$

考虑一个$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)}$$

完整的反向传播算法步骤如下:

输入:训练样本$(\mathbf{x}, \mathbf{y})$,当前网络参数

输出:各参数的梯度

1. 前向传播

  1. 设置$\mathbf{a}^{(0)} = \mathbf{x}$
  2. 对于$l = 1$到$L$:
    1. $\mathbf{z}^{(l)} = \mathbf{W}^{(l)} \mathbf{a}^{(l-1)} + \mathbf{b}^{(l)}$
    2. $\mathbf{a}^{(l)} = f(\mathbf{z}^{(l)})$

2. 计算输出层误差

  1. $\boldsymbol{\delta}^{(L)} = \frac{\partial \mathcal{L}}{\partial \mathbf{a}^{(L)}} \odot f'(\mathbf{z}^{(L)})$

3. 反向传播误差

  1. 对于$l = L-1$到$1$:
    1. $\boldsymbol{\delta}^{(l)} = ((\mathbf{W}^{(l+1)})^T \boldsymbol{\delta}^{(l+1)}) \odot f'(\mathbf{z}^{(l)})$

4. 计算梯度

  1. 对于$l = 1$到$L$:
    1. $\frac{\partial \mathcal{L}}{\partial \mathbf{W}^{(l)}} = \boldsymbol{\delta}^{(l)} (\mathbf{a}^{(l-1)})^T$
    2. $\frac{\partial \mathcal{L}}{\partial \mathbf{b}^{(l)}} = \boldsymbol{\delta}^{(l)}$

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,这是深层网络中梯度消失的重要原因。

Tanh函数的导数为: $$\tanh'(x) = 1 - \tanh^2(x)$$

Tanh导数的最大值在$x=0$处,为1。相比Sigmoid,Tanh的梯度更强,但仍会随着$|x|$增大而趋近于0。

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,这是它们能够缓解梯度消失问题的关键。

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。

物理类比:将参数更新想象为小球在损失曲面上滚动。动量项相当于速度,梯度相当于加速度。小球在一致的梯度方向上加速,在震荡方向上相互抵消。

优点:

  1. 加速收敛,特别是在一致梯度方向
  2. 减少震荡
  3. 有助于逃离局部最优和鞍点

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$是小常数防止除零。

缺点:学习率单调递减,可能过早衰减到极小值。

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$。

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的优势

  1. 自适应学习率
  2. 动量加速
  3. 偏差校正帮助早期训练
  4. 对超参数选择相对鲁棒
  1. SGD + Momentum:收敛后泛化性能可能更好,适合需要最优泛化性能的场景
  2. Adam:训练速度快,适合大多数情况,特别是稀疏梯度或噪声大的场景
  3. AdamW:Adam的改进版本,解耦权重衰减,泛化性能更好
  4. LARS/LAMB:用于大批量训练

在深层神经网络中,梯度在反向传播时可能变得非常小(梯度消失)或非常大(梯度爆炸)。

梯度消失:梯度逐层衰减,浅层参数几乎得不到更新。典型症状是训练损失不再下降,深层网络的浅层参数变化极小。

梯度爆炸:梯度逐层放大,参数更新幅度极大。典型症状是训练损失突然变为NaN或无穷大。

考虑一个$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,则导致梯度指数级增大。

梯度消失解决方案

1. 使用ReLU激活函数:正区间梯度恒为1

2. 残差连接(Residual Connections):引入跳跃连接

3. 批归一化(Batch Normalization):稳定每层的分布

4. 更好的初始化:如He初始化

5. 门控架构:如LSTM中的门控机制

梯度爆炸解决方案

1. 梯度裁剪(Gradient Clipping)

  1. 按值裁剪:$g_i = \max(\min(g_i, c), -c)$
  2. 按范数裁剪:如果$||\mathbf{g}|| > c$,则$\mathbf{g} = c \cdot \frac{\mathbf{g}}{||\mathbf{g}||}$

2. 权重正则化:限制权重大小

3. 更小的学习率:减缓参数更新速度

题目:考虑以下简单网络:

  1. 输入:$x = 2$
  2. 权重:$w_1 = 0.5$,$w_2 = 0.3$
  3. 计算:$z_1 = w_1 \cdot x$,$a_1 = \text{ReLU}(z_1)$,$\hat{y} = w_2 \cdot a_1$
  4. 真实值:$y = 1$
  5. 损失函数:$\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$$

题目:比较Sigmoid、Tanh、ReLU在$x=2$和$x=-2$处的梯度值,分析它们对梯度消失的影响。

解答

Sigmoid

  1. $\sigma(2) = \frac{1}{1+e^{-2}} \approx 0.881$
  2. $\sigma(-2) = \frac{1}{1+e^{2}} \approx 0.119$
  3. $\sigma'(2) = 0.881 \times (1-0.881) \approx 0.105$
  4. $\sigma'(-2) = 0.119 \times (1-0.119) \approx 0.105$

Tanh

  1. $\tanh(2) \approx 0.964$
  2. $\tanh(-2) \approx -0.964$
  3. $\tanh'(2) = 1 - 0.964^2 \approx 0.071$
  4. $\tanh'(-2) = 1 - (-0.964)^2 \approx 0.071$

ReLU

  1. $\text{ReLU}'(2) = 1$
  2. $\text{ReLU}'(-2) = 0$

分析

1. Sigmoid:在$|x|$较大时,梯度约为0.1,深层网络中多次相乘会迅速衰减

2. Tanh:梯度更小(约0.07),梯度消失问题更严重

3. ReLU:正区间梯度恒为1,有效缓解梯度消失;负区间梯度为0,可能导致神经元死亡

题目:某次反向传播计算得到的梯度为$\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$,符合要求。

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. 给定网络结构:

  1. $z = w_1 x_1 + w_2 x_2$,其中$x_1=1, x_2=2, w_1=0.5, w_2=-0.3$
  2. $\hat{y} = \sigma(z)$
  3. 损失$\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优化器,给定:

  1. 当前梯度$\mathbf{g}_t = [0.2, -0.3]$
  2. 上一时刻一阶矩$\mathbf{m}_{t-1} = [0.1, 0.1]$
  3. 上一时刻二阶矩$\mathbf{v}_{t-1} = [0.01, 0.01]$
  4. $\beta_1 = 0.9$,$\beta_2 = 0.999$,$t = 10$

请计算偏差校正后的$\hat{\mathbf{m}}_t$和$\hat{\mathbf{v}}_t$。

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]$$

本章完

该主题尚不存在

您访问的页面并不存在。如果允许,您可以使用创建该页面按钮来创建它。

  • 深度学习/反向传播算法.1772458526.txt.gz
  • 最后更改: 2026/03/02 21:35
  • 张叶安