深度学习中的归一化
结构:
- 激活函数
- 激活函数导致的梯度消失
- 批量归一化
- 自归一化神经网络
- 只改变了激活函数
多层感知机:目的是近似估计一个未知函数f(x):x–>y
- 通过若干简单函数的叠加来实现一个复杂函数 f(x)=f1(f2(…fn(x)))
- 如果每个简单函数都是线性函数,那么复合函数仍然是线性函数,所以为了逼近复杂的的未知函数,这些中间函数需要有非线性性质(激活函数)
模型的训练:
通过调整简单函数的参数来训练
对于每个数据集X,可以定义损失函数Loss,来描述参数在X上的表现
常用方法:SGD:链式法则,容易陷入局部极小值,同时链式法则会将错误参数的影响积累到整个网络
小批量方法噪声多,可以防止过拟合
常见的激活函数:
Sigmoid:
- 优点:
- 具有良好的统计学意义
- 函数光滑可微,导数计算方便
- 缺点:
- 数轴的大部分区域导致近乎于0——梯度消失
- 函数只能取正值——梯度为正数,梯度下降方向选择范围少
Tanh:
- 优点:
- 函数光滑可微,导数计算方便
- 取值正负对称
- 缺点:
- 数轴的大部分区域导致近乎于0——梯度消失
ReLU:
- 优点:
- 导数计算方便
- 函数在正数范围内导数等于1
- 缺点:
- 函数只取正值
ELU:
- 优点:
- 导数计算方便
- 函数在正数范围内导数等于1
- 函数取值有正有负
层输出对下一层的影响
每层梯度都与前一层的输入有关,如果前一层的梯度恰好落在本层神经元的平坦区域(非线性饱和区域),那么本层的梯度就接近于0,而且该影响会随着链式法则对后续神经元产生影响
这种影响随着模型深度增加而越来越大,极大影响模型的训练效果
批量归一化:
Why use?——提升训练速度
在小批量随机梯度下降法训练中,如果小批量中在某一个神经元处的输入都位于平坦区域,那么这个神经元就将面临梯度消失。
如果这个batch在每个神经元的输出(下一个神经元的输入)值都以0为中心,且方差为1,就可以避免梯度消失的问题。
然后在两层layer之间插入一个线性层,该层的输入是前一层输出的归一化值——可以修正归一化导致的一些问题,让下一层的输入比较稳定
-
效果:在理想状况下,归一化层的学习参数在训练过程中逐渐趋于稳定,于是每个神经元接收的输入就会趋于一个稳定的分布。
- 降低了模型训练中的协变转移
- 防止由于数据噪声造成的梯度消失
- 保持原有模型的表达能力
自归一化
如果网络中隐藏层神经元总可以保持输入随机变量的均值和方差稳定不变,那么:
- 训练网络将不再会出现梯度消失或梯度爆炸
- 每层的输入也将会保持稳定的分布,从而达到批量归一化减小协变偏移的效果
ELU:左边缩小方差,右边保持方差 方差整体上缩小,均值得不到保障
SELU:适当选择参数,修改ELU,使得整体上保持方差与期望