# 3.6 Batch Norm 为什么奏效？（Why does Batch Norm work?）

## Batch Norm 可以加速神经网络训练的原因：

* 和输入层的输入特征进行归一化，从而改变Cost function的形状，使得每一次梯度下降都可以更快的接近函数的最小值点，从而加速模型训练过程的原理有相同的道理，只是Batch Norm是将各个隐藏层的激活函数的激活值进行的归一化，并调整到另外的分布
* Batch Norm 可以使权重比网络更滞后或者更深层

### 判别是否是猫的分类问题：

假设第一训练样本的集合中的猫均是黑猫，而第二个训练样本集合中的猫是各种颜色的猫。如果将第二个训练样本直接输入到用第一个训练样本集合训练出的模型进行分类判别，在很大程度上无法保证能够得到很好的判别结果

因为训练样本不具有一般性（即不是所有的猫都是黑猫），第一个训练集合中均是黑猫，而第二个训练集合中各色猫均有，虽然都是猫，但是很大程度上样本的分布情况是不同的，无法保证模型可以仅仅通过黑色猫的样本就可以完美的找到完整的决策边界

![](https://2314428465-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Le0cHhI0S0DK8pwlrmD%2F-Le0cKOp1vaxoORIi4ak%2F-Le0ctJ2A8AtULtpMozq%2F278import.png?generation=1556953144126968\&alt=media)

这种训练样本（黑猫）和测试样本（猫）分布的变化称之为**covariate shift**。如下图所示：

![](https://2314428465-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Le0cHhI0S0DK8pwlrmD%2F-Le0cKOp1vaxoORIi4ak%2F-Le0ctJ4of5Y0XBr5RES%2F273import.png?generation=1556953143628489\&alt=media)

深度神经网络中，covariate shift会导致模型预测效果变差，重新训练的模型各隐藏层的$$W^{\[l]}$$和$$B^{\[l]}$$均产生偏移、变化。而Batch Norm的作用恰恰是减小covariate shift的影响，让模型变得更加健壮，鲁棒性更强

使用深层神经网络，使用Batch Norm，该模型对花猫的识别能力应该也是不错

## **Batch Norm 解决Covariate shift的问题**

![](https://2314428465-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Le0cHhI0S0DK8pwlrmD%2F-Le0cKOp1vaxoORIi4ak%2F-Le0ctJ6KDS7H6kN9cmG%2F28-0import.png?generation=1556953143858001\&alt=media)

网络的目的是通过不断的训练，最后输出一个更加接近于真实值的$$\hat y$$，以第2个隐藏层为输入来看：

![](https://2314428465-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Le0cHhI0S0DK8pwlrmD%2F-Le0cKOp1vaxoORIi4ak%2F-Le0ctJAX0lUY2_vOki1%2F280import.png?generation=1556953150020219\&alt=media)

对于后面的神经网络，是以第二层隐层的输出值$$a^{\[2]}$$作为输入特征的，通过前向传播得到最终的$$\hat y$$，但是网络还有前面两层，由于训练过程，参数$$w^{\[1]},w^{\[2]}$$是不断变化的，对于后面的网络，$$a^{\[2]}$$的值也是处于不断变化之中，所以就有了Covariate shift的问题

如果对$$z^{\[2]}$$使用了Batch Norm，即使其值不断的变化，其均值和方差却会保持。Batch Norm的作用是限制前层的参数更新导致对后面网络数值分布程度的影响，使得输入后层的数值变得更加稳定。Batch Norm减少了各层$$W^{\[l]},B^{\[l]}$$之间的耦合性，让各层更加独立，实现自我训练学习的效果。如果输入发生covariate shift，Batch Norm的作用是对个隐藏层输出$$Z^{\[l]}$$进行均值和方差的归一化处理，让$$W^{\[l]},B^{\[l]}$$更加稳定，使得原来的模型也有不错的表现

Batch Norm 削弱了前层参数与后层参数之间的联系，使得网络的每层都可以自己进行学习，相对其他层有一定的独立性，有助于加速整个网络的学习

## Batch Norm 正则化效果

* 使用Mini-batch梯度下降，每次计算均值和偏差都是在一个Mini-batch上进行计算，而不是在整个数据样集上。这样在均值和偏差上带来一些比较小的噪声。那么用均值和偏差计算得到的![](https://2314428465-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Le0cHhI0S0DK8pwlrmD%2F-Le0cKOp1vaxoORIi4ak%2F-Le0ctJCcM1YEZEYWFDs%2F%C2%B7import.png?generation=1556953143409163\&alt=media)也将会加入一定的噪声
* 和Dropout相似，其在每个隐藏层的激活值上加入了一些噪声，（Dropout以一定的概率给神经元乘上0或者1）。Batch Norm 也有轻微的正则化效果
* 如果使用Batch Norm ，使用大的Mini-batch如256，相比使用小的Mini-batch如64，会引入更少的噪声，会减少正则化的效果&#x20;
* Batch Norm的正则化效果比较微弱，正则化不是Batch Norm的主要功能
