深度神经网络问题以及解决方法
参考博客:深度学习中的highway network、ResNet
参考博客:神经网络梯度与归一化问题总结
一份详细讲解的代码:https://iamtrask.github.io/2015/11/15/anyone-can-code-lstm/
问题一:误差信号的多层反向传播容易产生“梯度消失”、“梯度爆炸”现象
问题二:随着深度神经网络层数的增加,训练误差没有降低反而升高
当神经网络层数过深的时候,会出现“退化”的现象,即在网络层数加深时,网络的loss不降反增。对于该问题,提出了高速网络(Highway network)和残差网络(Residual Network)来解决网络层数过深的问题。
highway network
highway network 主要解决问题是:网络深度加深,梯度信息回流受阻,造成网络训练困难的问题
shortcut(或shortpath,中文“直连”或“捷径”)是CNN模型发展中出现的一种非常有效的结构, 残差连接的思想起源于中心化,在神经网络系统中,对输入数据等进行中心化转换,即将数据减去均值,被广泛验证有利于加快系统的学习速度。
1、一般一个网络, 每层网络对输入进行一个非线性映射变换
2、对于CNN网络, 定义一层网络结构如下,T 和 C 分别表示对输入的门控(0到1)和直接传送
观察到, 对于特殊的门值T
该层的雅可比变换转换为:
物理意义:假设所有的门t的均值为0.5的话,将所有原始信息一半激活、一半不变直接输入下一层, 保留了很多信息。
反向传播的时候,可以让更多的梯度信息直接回流到输入, 而不需要经过一个非线性转换。
ResNet网络
模型增加一个identity mapping(恒等映射), 将原始所需要学的函数 转换成, 两种函数表达效果像如同, 但是的优化会比简单很多。图像处理中的残差向量编码 , 将一个问题分解成多个尺度直接的残差问题。
- 这个简单的加法并不会给网络增加额外的参数和计算量,同时却可以大大增加模型的训练速度、提高训练效果
- 并且当模型的层数加深时,这个简单的结构能够很好的解决退化问题。因为identity map是的梯度可以直接回流到了输入层
对于shortcut的方式:
1.使用恒等映射, 如果residual block的输入输出维度不一致, 对增加的维度用0来填充
2.在block输入输出维度一致时使用恒等映射, 不一致时使用线性投影以保证维度一致
3.对于所有的block均使用线性投影
Inception
解决深度学习 参数过多、梯度消失的问题, 解决方法就是增加网络深度和宽度的同时减少参数。
Inception网络在同一层里面使用不同的卷积模板,对不同size感受野做特征提取, 即为一种混合模型; max pooling 也具有特征提取的作用, 和卷积不同, 没有参数不会过拟合,亦可作为一个分支; 使用1*1卷积核可以起到降低特征图厚度的作用(对于使用两层堆叠的3 * 3卷积核 代替一层的5 * 5卷积核, 参数量减少了, 计算量也减少了, 层数变深了, 效果变好了)
梯度消失/梯度爆炸的问题
神经网络训练的方法是BP算法。BP算法的基础就是导数的链式法则。在CNN以及RNN网络中会明显出现梯度消失和梯度爆炸的问题
在使用sigmoid()函数作为激活函数时, 两侧饱和区域的导数很小, 随着网络的加深, 梯度反向传播到浅层网络时, 基本不能引起数值的扰动, 浅层的网络就无法学习到新的特征。解决方法:1、更换激活函数 2、使用层归一化 3、在权重初始化上下功夫 4、构建新的网络结构
激活函数
ReLU()函数, 稀疏激活, 负数端抑制状态, 正数端兴奋激活, 没有将数据压缩, 会使得数据的范围可能会很大。
Leaky ReLU()函数, 负数端不完全抑制。
sigmoid()函数
tanh()函数
批量层归一化
BN通过将输出层的数据归一化到mean = 0, var = 1的分布中, 即使均值方差相同不代表分布也相同
归一化可以解决ReLU()函数不能把数据压缩的问题; 可以使用更高的学习率, 保证每层、每维的scale保持一致, 可以加快收敛; 归一化会破坏原本学习的特征的分布, 加入两个参数来恢复原本的分布, 新添加的两个参数, 是通过训练学习的, 最后可能恢复,也可能未恢复, 这样可以增加网络的capicity,网络中就存在多种不同的分布了。covariate shift (尚未理解) 在加入BN之后可以不使用dropout, dropout是用来正则化增强网络的泛化能力, 减少过拟合, BN是用来提升精度。 过拟合一般发生在数据边缘的噪声位置, BN把它归一化操作