神经网络的训练本质上是一个优化问题:寻找一组最优参数$\theta$,使得损失函数$\mathcal{L}(\theta)$最小化。
$$\theta^* = \arg\min_{\theta} \mathcal{L}(\theta)$$
其中,$\theta$包含网络中的所有权重和偏置,$\mathcal{L}$是衡量模型预测与真实值差异的损失函数。
这个优化问题具有以下特点:
梯度下降是最基本的优化算法,其核心思想是沿损失函数梯度的反方向更新参数:
$$\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. 前向传播
2. 计算输出层误差
3. 反向传播误差
4. 计算梯度
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。
物理类比:将参数更新想象为小球在损失曲面上滚动。动量项相当于速度,梯度相当于加速度。小球在一致的梯度方向上加速,在震荡方向上相互抵消。
优点:
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的优势:
在深层神经网络中,梯度在反向传播时可能变得非常小(梯度消失)或非常大(梯度爆炸)。
梯度消失:梯度逐层衰减,浅层参数几乎得不到更新。典型症状是训练损失不再下降,深层网络的浅层参数变化极小。
梯度爆炸:梯度逐层放大,参数更新幅度极大。典型症状是训练损失突然变为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):
2. 权重正则化:限制权重大小
3. 更小的学习率:减缓参数更新速度
题目:考虑以下简单网络:
请计算$\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:
Tanh:
ReLU:
分析:
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. 给定网络结构:
请计算$\frac{\partial \mathcal{L}}{\partial w_1}$和$\frac{\partial \mathcal{L}}{\partial w_2}$。
12. 使用Adam优化器,给定:
请计算偏差校正后的$\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]$$