Batch Normalization是由google提出的一种训练优化方法。参考论文:Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift 网上对BN解释详细的不多,大多从原理上解释,没有说出实际使用的过程,这里从what, why, how三个角度去解释BN。

What is BN

Normalization是数据标准化(归一化,规范化),Batch 可以理解为批量,加起来就是批量标准化。 先说Batch是怎么确定的。在CNN中,Batch就是训练网络所设定的图片数量batch_size。

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

https://imgconvert.csdnimg.cn/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYxMTI4MTM1MjU0NDYz?ynotemdtimestamp=1630827031319

输入:输入数据x1…xm(这些数据是准备进入激活函数的数据) 计算过程中可以看到, 1.求数据均值 2.求数据方差 3.数据进行标准化(个人认为称作正态化也可以) 4.训练参数γ,β 5.输出y通过γ与β的线性变换得到新的值

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

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

https://imgconvert.csdnimg.cn/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYxMTI4MTQwMjA4NjAw?ynotemdtimestamp=1630827031319

Why is BN

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

梯度消失

,以sigmoid函数为例子,sigmoid函数使得输出在[0,1]之间。

https://imgconvert.csdnimg.cn/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYxMTI4MTIyODQwNjQ2?ynotemdtimestamp=1630827031319

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

https://imgconvert.csdnimg.cn/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYxMTI4MTIzMjM5ODY4?ynotemdtimestamp=1630827031319

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

https://imgconvert.csdnimg.cn/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYxMTI4MTIzOTU1ODcx?ynotemdtimestamp=1630827031319

在深度网络中,如果网络的激活输出很大,其梯度就很小,学习速率就很慢。假设每层学习梯度都小于最大值0.25,网络有n层,因为链式求导的原因,第一层的梯度小于0.25的n次方,所以学习速率就慢,对于最后一层只需对自身求导1次,梯度就大,学习速率就快。 这会造成的影响是在一个很大的深度网络中,浅层基本不学习,权值变化小,后面几层一直在学习,结果就是,后面几层基本可以表示整个网络,失去了深度的意义。

关于梯度爆炸,根据链式求导法, 第一层偏移量的梯度=激活层斜率1x权值1x激活层斜率2x…激活层斜率(n-1)x权值(n-1)x激活层斜率n 假如激活层斜率均为最大值0.25,所有层的权值为100,这样梯度就会指数增加。