数据标准化
由于神经网络的表达能力大多来自激活函数的非线性,所以让输入数据“适应于”激活函数是很重要的,具体而言:
- 对于sigmoid系列的激活函数而言,由于函数两端过于平坦,所以为了不陷入梯度消失的窘境,我们希望神经元的输入集中在函数中央,而不希望神经元的输入(绝对值)过大。
- 对于Relu激活函数而言,由于函数在输入小于0的区域恒等于0,那么从直观上来说,如果一个很大的梯度把某个神经元的输入拉到了小于0很多的区域,该神经元从此以后的输出将永远是0了,因为他基本不可能回到大于0的区域。这就是著名的“Dying Relu问题”,这通常会导致最后很多神经元处于“死亡”状态。
总结一下,可以把激活函数对输入数据的要求归结为如下两点:
- 输入数据不要过大
- 输入数据带来的梯度不要太大
一个合理且行之有效的做法就是(即:数据标准化):
- 将输入数据的均值控制在0,从而意味着数据的“中心”是0
- 将输入数据的方差控制在1,从而意味着数据的“波动”不会太大
批量规范化(Batch Normalization,BN)
仅仅对原始输入数据进行标准化是不充分的,因为虽然这种做法可以保证原始输入数据的质量,但它却无法保证隐藏层输入数据的质量。浅层参数的微弱变化经过多层线性变换与激活函数后被放大,改变了每一层的输入分布,造成深层的网络需要不断调整以适应这些分布变化,最终导致模型难以训练收敛。
由于网络中参数变化导致的内部节点数据分布发生变化的现象被称做ICS(Internal Covariate Shift,内部协变量转移)。ICS现象容易使训练过程陷入饱和区,减慢网络的收敛。Relu从激活函数的角度出发,在一定程度上解决了梯度饱和的现象。而2015年提出的BN层,则从改变数据分布的角度避免了参数陷入饱和区。由于BN层优越的性能,其已经是当前卷积网络中的标配。
简单的将每层得到的数据进行直接的标准化操作显然是不可行的,因为这样会破坏每层自身学到的数据特征。为了使“规范化”之后不破坏层结构本身学到的特征,BN引入了两个可以学习的“重构参数”以期望能够从规范化的数据中重构出层本身学到的特征。 算法步骤如下:其中批处理输入:,输出:规范化后的网络响应。
- 计算批处理数据均值
- 计算批处理数据方差
- 规范化
- 尺度变换和偏移
最后的尺度变换和偏移操作是为了让因训练所需而加入的BN能够有可能还原最初的输入(即当和时),从而保证了整个网络的容量(capacity)。
BN层的优缺点总结
优点:
1、缓解梯度消失,加速网络收敛。
2、简化调参,网络更稳定。BN层抑制了参数微小变化随网络加深而被放大的问题,对参数变化的适应能力更强,更容易调参。
3、防止过拟合。BN层将每一个batch的均值和方差引入到网络中,由于每个batch的这俩个值都不相同,可看做为训练过程增 加了随机噪声,可以起到一定的正则效果,防止过拟合。
缺点:
1、由于是在batch的维度进行归一化,BN层要求较大的batch才能有效的工作,而物体检测等任务由于占用内存过高,限制了batch的大小,这回限制BN层有效的发挥归一化的功能。
2、数据的batch大小在训练和测试时往往不一样。在训练时一般采用滑动来计算平均值与方差,在测试时直接拿训练集的平均值与方差来使用。这种方式会导致测试集依赖与训练集,然而有时测试集与训练集的数据分布并不一致。
针对上述缺点,GN(Group Normalization)算法从通道方向计算均值和方差,避开了batch大小对归一化的影响。
摘抄自以下几本书籍:《深度学习之Pytorch物体检测实战》
《解析深度学习卷积神经网络原理与视觉实战》
《Python与神经网络实战》
《深度学习之Tensorflow入门、原理与进阶实战》