显示页面讨论过去修订反向链接回到顶部 本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。 ====== 第三章 反向传播算法 ====== ===== 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]$$ 登录 Detach Close 该主题尚不存在 您访问的页面并不存在。如果允许,您可以使用创建该页面按钮来创建它。 深度学习/反向传播算法.txt 最后更改: 2026/03/02 21:37由 张叶安 登录