训练深层次网络中的问题和一些解决办法
训练深层次的网络
当需要解决非常复杂的问题时,有可能需要训练数数十层或更多的神经网路,每层也许包含数百个神经元,通过数十万个连接。这时训练就面临着如下的问题:
- 梯度消失或者梯度爆炸,并且低层难以训练
- 训练缓慢
- 具有数百万参数的模型将会有严重的过拟合训练集的风险
因此,我们将讨论这些问题,并提出解决技巧。
梯度消失/爆炸问题—参考
反向传播算法的工作原理是从输出层到输入层,传播误差的梯度。当算法计算了网络中的每个参数的损失函数的梯度,就会在这些梯度下降步骤中来更新每个参数。
但是,随着网络的层次加深或者激活函数的选择不当,就会出现梯度消失/爆炸问题。
非饱和激活函数(ReLU函数 or leaky ReLU)
- ReLu 死区
当小于0的这部分值,梯度会迅速降为0而不在影响网络训练。 这会造成部分神经元从来不被激活,也称作“死区”
因此引入了,Leaky ReLU.
- Leaky ReLU
将小于0部分的梯度提高到
\alpha
一般取较小的正数,如0.01 或 0.001
ELU 激活函数的主要缺点是计算速度慢于 ReLU 及其变体(由于使用指数函数),但是在训
练过程中,这是通过更快的收敛速度来补偿的。 然而,在测试时间,ELU 网络将比 ReLU 网
络慢。
- 如何选择激活函数
一般 ELU > leaky ReLU(及其变体) > ReLU > tanh > sigmoid。
如果您关心运行时性能,那么
您可能喜欢 leaky ReLU超过ELU。
如果你不想调整另一个超参数,你可以使用前面提到的默
认的 α 值(leaky ReLU 为 0.01,ELU 为 1)。
如果您有充足的时间和计算能力,您可以使
用交叉验证来评估其他激活函数,特别是如果您的神经网络过拟合,则为RReLU;
如果您拥有庞大的训练数据集,则为 PReLU
批量标准化(Batch Normalization,BN)
-
对输入层进行中心(Zero-Centering) 和 标准化
中心化:使数据均值为0,标准差为1;
标准化:是数据输出映射为[0,1]
-
中间层的输入(激活函数前)使用两个新参数对结果进行尺度变换和偏移
一个用于尺度变换
一个用于偏移 -
Batch Normalization algorithm
\mu _B = \frac{1}{m_B} \sum_{i=1}^{m_B} x^i ;
{\sigma}_B^2 = \frac{1}{m_B} \sum_{i=1}^{m_B}(x^i - \mu _B)^2 ;
\hat{x}_i = \frac{x^i - \mu_B}{\sqrt[2]{\sigma_B^2} + \epsilon}
z^i = \gamma \hat{x}^i + \beta
\mu_B
是整个小批量B的经验均值
{\sigma}_B
是经验性的标准差,也是来评估整个小批量的
m_B
是小批量中的实例数量
\hat{x}_i
是以中心化和标准化的输入
\gamma
是层的缩放参数
\beta
是层的移动参数(偏移量)
\epsilon
通常选择一个很小的数字,避免被0整除(10^ -3),该项被称为平滑项(Laplace Smoothing)
z^i
是BN操作的输出,是输入缩放和移位后的状态
作者证明,这项技术大大改善了他们试验的所有深度神经网络。梯度消失问题大大减少了,
他们可以使用饱和激活函数,如 tanh 甚至 sigmoid 激活函数。网络对权重初始化也不那么敏
感。他们能够使用更大的学习率,显著加快了学习过程。具体地,他们指出,“应用于最先进
的图像分类模型,批标准化用少了 14 倍的训练步骤实现了相同的精度,以显著的优势击败了
原始模型。批量标
准化也像一个正则化项一样,减少了对其他正则化技术的需求(如
dropout).
然而,批量标准化的确会增加模型的复杂性(尽管它不需要对输入数据进行标准化,因为第
一个隐藏层会负责这一点,只要它是批量标准化的)。 此外,还存在运行时间的损失:由
于每层所需的额外计算,神经网络的预测速度较慢。 所以,如果你需要预测闪电般快速,你
可以尝试普通ELU + He初始化执行之前如何执行批量标准化。
Tensorflow 的实现
import tensorflow as tf
tf.layers.batch_normalization()