梯度消失/爆炸问题
反向传播算法的工作原理是从输出层到输入层,传播误 差的梯度。 一旦该算法已经计算了网络中每个参数的损失函数的梯度,它就使用这些梯度来 用梯度下降步骤来更新每个参数。
不幸的是,梯度往往变得越来越小,随着算法进展到较低层。 结果,梯度下降更新使得低层 连接权重实际上保持不变,并且训练永远不会收敛到良好的解决方案。 这被称为梯度消失问 题。
在某些情况下,可能会发生相反的情况:梯度可能变得越来越大,许多层得到了非常大 的权重更新,算法发散。这是梯度爆炸的问题,在循环神经网络中最为常见。
非饱和激活函数
Glorot 和 Bengio 在 2010 年的论文中的一个见解是,消失/爆炸的梯度问题部分是由于激活函 数的选择不好造成的。 在那之前,大多数人都认为,如果大自然选择在生物神经元中使用 sigmoid 激活函数,它们必定是一个很好的选择。 但事实证明,其他激活函数在深度神经网 络中表现得更好,特别是 ReLU 激活函数,主要是因为它对正值不会饱和(也因为它的计算 速度很快)。
不幸的是,ReLU激活功能并不完美。 它有一个被称为 “ReLU 死区” 的问题:在训练过程中, 一些神经元有效地死亡,意味着它们停止输出 0 以外的任何东西。在某些情况下,你可能会 发现你网络的一半神经元已经死亡,特别是如果你使用大学习率。 在训练期间,如果神经元 的权重得到更新,使得神经元输入的加权和为负,则它将开始输出 0 。当这种情况发生时, 由于当输入为负时,ReLU函数的梯度为0,神经元不可能恢复生机。
为了解决这个问题,你可能需要使用 ReLU 函数的一个变体,比如 leaky ReLU。这个函数定义为(见图11-2 )。
- ReLU(z)=max(0,z)
- LeakyReLU(z)=max( α \alpha αz,z)
ELU > leaky ReLU(及其变体)> ReLU > tanh > sigmoid
批量标准化
在 2015 年的一篇论文中,Sergey Ioffe 和 Christian Szegedy 提出了一种称为批量标准化(Batch Normalization,BN)的技术来解决梯度消失/爆炸问题,每层输入的分布在训练期间 改变的问题,更普遍的问题是当前一层的参数改变,每层输入的分布会在训练过程中发生变 化(他们称之为内部协变量偏移问题)。
该技术包括在每层的激活函数之前在模型中添加操作,简单地对输入进行zero-centering和规 范化,然后每层使用两个新参数(一个用于尺度变换,另一个用于偏移)对结果进行尺度变 换和偏移。 换句话说,这个操作可以让模型学习到每层输入值的最佳尺度,均值。为了对输入 进行归零和归一化,算法需要估计输入的均值和标准差。 它通过评估当前小批量输入的均值 和标准差(因此命名为“批量标准化”)来实现。 整个操作在方程 11-3 中。
-
u B u_{B} uB是整个小批量B的经验均值
-
σ B 2 \sigma_B^2 σB2是经验性的标准差,也是来评估整个小批量的。
-
m B m_B mB是小批量中的实例数量。
-
x ( i ) x^{(i)} x(i)是以为零中心和标准化的输入。
-
γ \gamma γ是层的缩放参数。
-
β \beta β是层的移动参数(偏移量)
-
ϵ \epsilon ϵ是一个很小的数字,以避免被零除(通常为1e-3 ,这被称为平项拉布拉斯平滑,Laplace Smoothing)。
-
x ( i ) x^{(i)} x(i)是BN操作的输出:它是输入的缩放和移位版本。
在测试时,没有小批量计算经验均值和标准差,所以您只需使用整个训练集的均值和标准 差。 这些通常在训练期间使用移动平均值进行有效计算。 因此,总的来说,每个批次标准化的层次都学习了四个参数: γ \gamma γ(标度), β \beta β(偏移), u B u_{B} uB(平均值)和 σ B \sigma_B σB(标准差)。
如何产⽣稀疏模型
- 在训练模型中,将过⼩的权重设置为 0。
- 在训练过程中应⽤强 l1 正则化。
- l1 正则化与FTRL算法⼀起使⽤。
通过正则化避免过拟合
⼀些最流⾏的神经⽹络正则化技术:
- 早期停⽌
- l1 和 l2 正则化
- drop out
- 最⼤范数正则化
- 数据增强
梯度裁剪
减少梯度爆炸问题的⼀种常⽤技术是在反向传播过程中对梯度进⾏裁剪,使它们不超过某个阈值,这就是所谓的梯度裁剪
更快的优化器提升速度
-
动量优化
-
Nesterov 加速梯度
-
AdaGrad
-
RMSProp
-
Adam 优化
Off-policy 算法
在Q-Learning算法中给定⾜够的迭代后,算法将收敛到最优Q值,称为Off-policy 算法,即正在训练的策略不是正在执⾏的策略。
估值Q-Learning
Q-Learning的主要问题是它不能很好地扩展到具有许多状态和动作的⼤型(甚⾄是中型)MDP问题,找到⼀个使⽤参数数量可管理的函数来近似Q值,称为估值Q-Learning(Approximate Q-Learning)。