天天看点

深度学习-卷积神经网络CNN-BN(Batch Normalization) 原理与使用过程详解

前言

Batch Normalization是由google提出的一种训练优化方法。参考论文:Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift 

个人觉得BN层的作用是加快网络学习速率,论文中提及其它的优点都是这个优点的副产品。 

网上对BN解释详细的不多,大多从原理上解释,没有说出实际使用的过程,这里从what, why, how三个角度去解释BN。

What is BN

Normalization是数据标准化(归一化,规范化),Batch 可以理解为批量,加起来就是批量标准化。 

先说Batch是怎么确定的。在CNN中,Batch就是训练网络所设定的图片数量batch_size。

Normalization过程,引用论文中的解释: 

深度学习-卷积神经网络CNN-BN(Batch Normalization) 原理与使用过程详解

输入:输入数据x1..xm(这些数据是准备进入激活函数的数据) 

计算过程中可以看到, 

1.求数据均值; 

2.求数据方差; 

3.数据进行标准化(个人认为称作正态化也可以) 

4.训练参数γ,β 

5.输出y通过γ与β的线性变换得到新的值 

在正向传播的时候,通过可学习的γ与β参数求出新的分布值

在反向传播的时候,通过链式求导方式,求出γ与β以及相关权值 

深度学习-卷积神经网络CNN-BN(Batch Normalization) 原理与使用过程详解

Why is BN

解决的问题是梯度消失与梯度爆炸。 

关于梯度消失,以sigmoid函数为例子,sigmoid函数使得输出在[0,1]之间。 

深度学习-卷积神经网络CNN-BN(Batch Normalization) 原理与使用过程详解

事实上x到了一定大小,经过sigmoid函数的输出范围就很小了,参考下图 

深度学习-卷积神经网络CNN-BN(Batch Normalization) 原理与使用过程详解

如果输入很大,其对应的斜率就很小,我们知道,其斜率(梯度)在反向传播中是权值学习速率。所以就会出现如下的问题, 

深度学习-卷积神经网络CNN-BN(Batch Normalization) 原理与使用过程详解

在深度网络中,如果网络的激活输出很大,其梯度就很小,学习速率就很慢。假设每层学习梯度都小于最大值0.25,网络有n层,因为链式求导的原因,第一层的梯度小于0.25的n次方,所以学习速率就慢,对于最后一层只需对自身求导1次,梯度就大,学习速率就快。 

这会造成的影响是在一个很大的深度网络中,浅层基本不学习,权值变化小,后面几层一直在学习,结果就是,后面几层基本可以表示整个网络,失去了深度的意义。

关于梯度爆炸,根据链式求导法, 

第一层偏移量的梯度=激活层斜率1x权值1x激活层斜率2x…激活层斜率(n-1)x权值(n-1)x激活层斜率n 

假如激活层斜率均为最大值0.25,所有层的权值为100,这样梯度就会指数增加。

How to use BN

先解释一下对于图片卷积是如何使用BN层。 

深度学习-卷积神经网络CNN-BN(Batch Normalization) 原理与使用过程详解

这是文章卷积神经网络CNN(1)中5x5的图片通过valid卷积得到的3x3特征图(粉红色)。特征图里的值,作为BN的输入,也就是这9个数值通过BN计算并保存γ与β,通过γ与β使得输出与输入不变。假设输入的batch_size为m,那就有m*9个数值,计算这m*9个数据的γ与β并保存。正向传播过程如上述,对于反向传播就是根据求得的γ与β计算梯度。 

这里需要着重说明2个细节: 

1.网络训练中以batch_size为最小单位不断迭代,很显然,新的batch_size进入网络,机会有新的γ与β,因此,在BN层中,有总图片数/batch_size组γ与β被保存下来。 

2.图像卷积的过程中,通常是使用多个卷积核,得到多张特征图,对于多个的卷积核需要保存多个的γ与β。

结合论文中给出的使用过程进行解释 

深度学习-卷积神经网络CNN-BN(Batch Normalization) 原理与使用过程详解

输入:待进入激活函数的变量 

输出: 

1.对于K维的输入,假设每一维包含m个变量,所以需要K个循环。每个循环中按照上面所介绍的方法计算γ与β。这里的K维,在卷积网络中可以看作是卷积核个数,如网络中第n层有64个卷积核,就需要计算64次。 

需要注意,在正向传播时,会使用γ与β使得BN层输出与输入一样。 

2.在反向传播时利用γ与β求得梯度从而改变训练权值(变量)。 

3.通过不断迭代直到训练结束,求得关于不同层的γ与β。如网络有n个BN层,每层根据batch_size决定有多少个变量,设定为m,这里的mini-batcherB指的是特征图大小*batch_size,即m=特征图大小*batch_size,因此,对于batch_size为1,这里的m就是每层特征图的大小。 

4.不断遍历训练集中的图片,取出每个batch_size中的γ与β,最后统计每层BN的γ与β各自的和除以图片数量得到平均直,并对其做无偏估计直作为每一层的E[x]与Var[x]。 

5.在预测的正向传播时,对测试数据求取γ与β,并使用该层的E[x]与Var[x],通过图中11:所表示的公式计算BN层输出。 

注意,在预测时,BN层的输出已经被改变,所以BN层在预测的作用体现在此处

转自:https://blog.csdn.net/Fate_fjh/article/details/53375881

继续阅读