目的
为避免一学就会、一用就废,这里做下笔记
说明
本文内容紧接前文-深度学习,欲渐进,请循序。
前置知识(理解问题的基础)
1、反向传播算法
反向传播算法是训练神经网络的核心,它是一种高效计算损失函数相对于网络中所有权重参数的梯度的方法。有了这些梯度,我们就可以使用梯度下降等优化算法来更新权重,从而最小化损失函数,让网络学会预测。
2、链式求导法则
反向传播的本质是微积分中的链式法则。网络的前向传播计算输出和损失,反向传播则将损失从输出层"反向"传递到输入层,逐层计算每个参数对总损失的贡献(梯度)(具体数学公式这里不细究)
为什么叫"反向传播"?
因为计算梯度的顺序(从输出到输入)与前向传播(从输入到输出)的方向相反。我们首先计算输出层的梯度,然后利用它计算前一层的梯度,像多米诺骨牌一样一直倒推到输入层
为什么要"反向传播"?高效性:反向传播通过利用链式法则和中间结果,避免了为每个参数单独计算梯度的重复工作(穷举法计算量巨大),它是一种动态规划的思想
常见问题
常见问题主要指梯度消失 和梯度爆炸,它们是训练深层神经网络时,反向传播算法中梯度不稳定性的两种表现形式
1、梯度消失
现象:
在反向传播过程中,越靠近输入层的网络层,其梯度值变得极其微小,接近于零。导致这些层的权重几乎无法得到有效的更新(变化非常缓慢或停滞)。
根本原因:
当链式求导中连乘的因子(尤其是激活函数的导数)持续小于1时,多次连乘的结果会指数级地趋近于零。
主要诱因:
- 饱和激活函数(Sigmoid, Tanh)
- 权重初始化过小
直接后果:
浅层参数无法有效更新,网络无法深度训练
模型表现
训练早期停滞,损失下降缓慢或很早进入平台期
2、梯度爆炸
现象:
与梯度消失相反,在反向传播过程中,越靠近输入层的网络层,其梯度值变得极其巨大。
根本原因:
当链式求导中连乘的因子(尤其是权重矩阵的范数)持续大于1时,多次连乘的结果会指数级地增长。
主要诱因:
- 权重初始化过大
- 深度网络结构设计不当
直接后果:
- 数值溢出(NaN),梯度值可能超过计算机浮点数表示范围
- 模型不稳定,难以收敛
模型表现
损失剧烈波动,可能出现NaN,训练崩溃
解决方案(两者通用)
深度学习的发展史,在很大程度上就是与这些问题斗争的历史。现代深度学习框架通过以下方法有效**缓解(非根治)**了这两个问题。
1、选择适当的激活函数(优化f)
- 使用ReLU 及其变种(Leaky ReLU, PReLU, ELU 等):这是最关键的突破。ReLU 的正区间导数为恒定的1,完美解决了梯度消失问题(在正区间)。同时,其导数不会大于1,也抑制了梯度爆炸。
- 注意:ReLU可能导致"神经元死亡",其变体对此进行了改进。
2、输入批量归一化(优化x)
- 通过将每一层的输入归一化到稳定的均值或方差,可以平滑优化输入向量空间,允许使用更高的学习率,同时在一定程度上抑制了梯度爆炸。
3、适当的参数初始化(优化w)
- 使用专门设计的初始化方法,使各层激活值的方差在正向传播和反向传播过程中保持稳定。
- Xavier/Glorot 初始化:适用于 Tanh、Sigmoid 等线性激活函数。
- He/Kaiming 初始化:专门为 ReLU 系列激活函数设计,是现代深度网络的默认选择之一。
4、优化网络架构设计
- 残差连接:ResNet 提出的"跳跃连接"创造了一条梯度可以无损(通过恒等映射)反向传播的捷径,极大缓解(甚至基本解决)了极深网络中的梯度消失问题,是深度学习的里程碑。