目的:

数据经过隐层 层层传递还能保持一开始的样子,我们希望不同批次数据在一开始传进来的时候,数据分布就尽可能一致。那么我们就一开始对输入的数据做归一化。

原因:

从正向传播的角度去考虑:

在神经网络中,我们一般是一批次一批次进行训练,如果不同批次数据之间数据分布差异较大,网络刚刚学完上一个批次,又去学下一个批次,那么参数学习的波动就会大。

cnn 反向传播 通俗易懂_深度学习

由图象可以看出,数据分布状况经过一层层tanh隐层的传递,最后方差变得越来越小,这样直接导致的结果影响最终softmax分类的准确率。

cnn 反向传播 通俗易懂_反向传播_02

对于Relu函数同样出现这种情况,随着隐层层层传递,最后方差越来越小,影响最终分类效果。

(方差越大,对于分类来说分界越容易找到,相反方差越小,分界就越不容易找到。)

从反向传播的角度考虑:

对于sigmoid和tanh来说,在反向传播的时候,越靠前的梯度越趋近于0(图像离0远的地方会有饱和区间)relu的饱和区间是最多的,只要小于零,那么梯度就是0。

假如神经网络正向传播时,有一层WX+b<0,那么经过Relu激活函数后,得到的所有结果就是0,当反向传播的时候,回来的值会连乘激活函数得到函数,但是激活函数的值是0,所以乘0后就会使得所有的参数调整变成0。导致梯度消失(神经元死亡)。

cnn 反向传播 通俗易懂_cnn 反向传播 通俗易懂_03

 解决办法:

良好初始化的数据数据可以一定程度上缓解这个问题。将数据初始化到期望为0的附近,使数据躲开包和区域。但是只能是缓解,经过迭代后,还会有数据<0。

BN:强制将数据分布变成期望为0方差为1的正态分布,这样就保证了反向传播的时候至少有一半的数据传播回来。这样的话从另一个角度将也缓解了过拟合的问题(因为只有一半的数据反向传播回来),也相当于Dropout,所以有了BN后就不会再用Dropout了。

优点:

能提高准确率,也能提高泛化能力。

缓解梯度消失的问题。

用法:

每一层隐层都会用到BN,每一层都会求均值和方差。使得每一层都是正态分布。

将输出值强行做一次标准归一化。  

公式:

cnn 反向传播 通俗易懂_cnn 反向传播 通俗易懂_04

x样本求均值,求方差,再求标准差后根据标准化公式得到标准化后的结果。

我们都知道标准差后的结果期望为0,标准差是1 ,方差的话不确定。(标准正态分布)

但是我们一开始训练集测试集数据不是标准正太分布。我们加上参数gamma和beta是想让经过BN后的数据尽量和一开始数据集的分布保持一致。

那么乘gamma是为了改变标准化后数据的方差,bata让标准差后的期望加bata(因为之前等于0,那么加上bate后就等于bata),加入这两个参数是为了保证每次数据经过归一化后还保留原来数据的特征。

每一层的gamma和bata都不一样,随着反向传播也会不断调整这两个参数。