# 3.4 归一化网络的激活函数（ Normalizing activations in a network）

在神经网络中，第$$l$$层隐藏层的输入就是第$$l-1$$层隐藏层的输出$$A^{\[l-1]}$$。对$$A^{\[l-1]}$$进行标准化处理，从原理上来说可以提高$$W^{\[l]}$$和$$b^{\[l]}$$的训练速度和准确度。这种对各隐藏层的标准化处理就是Batch Normalization。一般是对$$Z^{\[l-1]}$$进行标准化处理而不是$$A^{\[l-1]}$$

Batch Normalization对第$$l$$层隐藏层的输入$$Z^{\[l-1]}$$做如下标准化处理，忽略上标$$\[l-1]$$：

$$
\mu=\frac1m\sum\_iz^{(i)}
$$

$$
\sigma^2=\frac1m\sum\_i(z\_i-\mu)^2
$$

$$
z^{(i)}\_{norm}=\frac{z^{(i)}-\mu}{\sqrt{\sigma^2+\varepsilon}}
$$

m是单个mini-batch包含样本个数，ε是为了防止分母为零，可取值$$10^{-8}$$。使得该隐藏层的所有输入$$z^{(i)}$$均值为0，方差为1

大部分情况下并不希望所有的$$z^{(i)}$$均值都为0，方差都为1，也不太合理。通常需要对$$z^{(i)}$$进行进一步处理：

$$
\tilde z^{(i)}=\gamma\cdot z^{(i)}\_{norm}+\beta
$$

$$\gamma$$和$$\beta$$是learnable parameters，可以通过梯度下降等算法求得。$$\gamma$$和$$\beta$$是让$$\tilde z^{(i)}$$的均值和方差为任意值，只需调整其值。如：

$$
\gamma=\sqrt{\sigma^2+\varepsilon},\ \ \beta=u
$$

则$$\tilde z^{(i)}=z^{(i)}$$，即identity function。设置$$\gamma$$和$$\beta$$为不同的值，可以得到任意的均值和方差

通过Batch Normalization，对隐藏层的各个$$z^{[l](https://baozoulin.gitbook.io/neural-networks-and-deep-learning/di-er-men-ke-gai-shan-shen-ceng-shen-jing-wang-luo-chao-can-shu-tiao-shi-zheng-ze-hua-yi-ji-you-hua/improving-deep-neural-networks/hyperparameter-tuning/i)}$$进行标准化处理，得到$$\tilde z^{[l](https://baozoulin.gitbook.io/neural-networks-and-deep-learning/di-er-men-ke-gai-shan-shen-ceng-shen-jing-wang-luo-chao-can-shu-tiao-shi-zheng-ze-hua-yi-ji-you-hua/improving-deep-neural-networks/hyperparameter-tuning/i)}$$，替代$$z^{[l](https://baozoulin.gitbook.io/neural-networks-and-deep-learning/di-er-men-ke-gai-shan-shen-ceng-shen-jing-wang-luo-chao-can-shu-tiao-shi-zheng-ze-hua-yi-ji-you-hua/improving-deep-neural-networks/hyperparameter-tuning/i)}$$

输入的标准化处理Normalizing inputs和隐藏层的标准化处理Batch Normalization是有区别的。Normalizing inputs使所有输入的均值为0，方差为1。而Batch Normalization可使各隐藏层输入的均值和方差为任意值。从激活函数的角度来说，如果各隐藏层的输入均值在靠近0的区域即处于激活函数的线性区域，这样不利于训练好的非线性神经网络，得到的模型效果也不会太好
