BN(Batch Normalization)层的详细介绍
1.BN层的前世:LRN层( Local Response Normalization)
没有提出BN层之前,Alexnet网络使用LRN层来处理归一化的。
LRN(局部响应归一化)
- 是归一化后的值,i是通道的位置,代表更新第几个通道的值,x与y代表待更新像素的位置。
- 是输入值,是激活函数Relu的输出值
- k、alpha、beta、n/2 都是自定义系数,可以先不用理会有什么用。
- N是总的通道数,不同通道累加的平方和。 累加多少个通道的像素值呢?这个是取决于自定义系数 n/2
sqr_sum[a, b, c, d] = sum(input[a,b, c, d - depth_radius : d + depth_radius + 1] ** 2)
output = input / (bias +alpha * sqr_sum) ** beta
LRN现在用的很少了
2.BN层的引入原因
参考博客:https://www.cnblogs.com/guoyaohua/p/8724433.html
BN的提出是为了解决“Internal Covariate Shift”问题的。
机器学习领域有个很重要的假设:<font color=#FF0000 size=3 face="黑体">IID独立同分布假设</font>,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。
但对于深度学习这种包含很多隐层的网络结构,在训练过程中,因为各层参数不停在变化,所以每个隐层都会面临covariate shift的问题,也就是在训练过程中,隐层的输入分布老是变来变去,这就是所谓的“Internal Covariate Shift”,Internal指的是深层网络的隐层,是发生在网络内部的事情,而不是covariate shift问题只发生在输入层。
3.BN层的本质
BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。