0%

深度学习-BN

为什么要进行归一化?

​ 原因在于神经网络的本身就在于学习数据的分布,一旦训练数据和测试数据分布不同,那么网络的泛化能力也将大大降低;另外一方面,再使用BSGD时一旦每批训练数据的分布不相同,那么网络在每次进行迭代时都要去适应不同的数据分布,这将大大降低网络的学习速度

为什么要使用BN?

​ 这主要是因为对于一般的归一化,只是在输入网络之前对数进行了归一化,而在神经网络的训练过程中并没有对数据做任何处理,而在神经网络的的训练过程中只要网络的前面几层的数据分布发生微小的变化,那么后面的网络就会不断积累放大这个分布的变化,因此一旦有任意一层的数据发生改变,这层以及后面的网络都会需要去从新适应学习这个新的数据分布,而如果训练过程中,每一层的数据都在不断发生变化,那么更将大大影响网络的训练速度,因此需要在网络的每一层输入之前都将数据进行一次归一化,保证数据分布的相同,加快网络训练速度

​ 在另一方面,由于将网络的每一步都进行了标准化,数据分布一致,因此模型的泛化能力将更强。

BN的本质是什么?

一个可学习有参数(γ、β)的使每层数据之前进行归一化的网络层

BN使用位置

线性层后全连接层之前

BN过程

对于一般的归一化没使用下面的公式进行归一化计算:

但是如果仅仅使用上面的公式来对某层的输出做下一层的输入做归一化,那么是会影响到前面一层学习到的特征的。例如:网络中间某一层学习到特征数据本身就分布在S型激活函数的两侧,强制把它归一化处理、标准差也限制在了1,把数据变换成分布于s函数的中间部分,这样就相当于我这一层网络所学习到的特征分布被搞坏了。因此,BN引入了可学习的参数γ、β

​ 上面的公式表明,通过学习到的重构参数γ、β,是可以恢复出原始的某一层所学到的特征的。

BN中为什么要在后面γ、β?不加可以吗?

​ 不可以,因为这是BN中的最关键步骤。不使用γ、β会造成归一化的同时破坏前一层提取到的特征,而BN通过记录每个神经元上的γ、β,使前一层的特征可以通过γ、β得以还原。

BN层是对每一个神经元归一化处理,那在CNN的BN层是怎么应用的?是不参数个数会非常多?

​ 对于CNN上采用了类似权值共享的策略,将一个特征图看做一个神经元,因此参数个数并不会很多。

例如:如果min-batch sizes为m,那么网络某一层输入数据可以表示为四维矩阵(m,f,w,h),m为min-batch sizes,f为特征图个数,w、h分别为特征图的宽高。在CNN中我们可以把每个特征图看成是一个特征处理(一个神经元),因此在使用Batch Normalization,mini-batch size 的大小就是:m.w.h,于是对于每个特征图都只有一对可学习参数:γ、β,总参数个数也就是2m个。

BN的作用

1.防止过拟合。有了BN,dropout和正则化的需求下降了

2.加速训练

BN算法是如何加快训练和收敛速度的呢?

BN算法在实际使用的时候会把特征给强制性的归到均值为0,方差为1的数学模型下。深度网络在训练的过程中,如果每层的数据分布都不一样的话,将会导致网络非常难收敛和训练,而如果能把每层的数据转换到均值为0,方差为1的状态下,一方面,数据的分布是相同的,训练会比较容易收敛,另一方面,均值为0,方差为1的状态下,在梯度计算时会产生比较大的梯度值,可以加快参数的训练,更直观的来说,是把数据从饱和区直接拉到非饱和区。更进一步,这也可以很好的控制梯度爆炸和梯度消失现象,因为这两种现象都和梯度有关。

BN算法为什么能防止过拟合?

在训练中,BN的使用使得一个mini-batch中的所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果。