# Batch Norm and other Normalizations

![](https://443921002-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGHUhl6VYqrZm4Re77O%2F-LTcn6q4TQdqzT1b6-st%2F-LTcnCRNsjrZz0Onb9Gk%2FScreen%20Shot%202018-12-13%20at%2010.20.25%20AM.png?alt=media\&token=a36c5a93-cc3e-415f-8921-eb352135ccdd)

{% embed url="https://zhuanlan.zhihu.com/p/33173246" %}

## BN:

### 0. What is Batch Norm

*   本质上是一种 loss （cs231n有讲）It has been long known (LeCun et al., 1998b; Wiesler & Ney, 2011) that the network training converges faster if its inputs are whitened – i.e., linearly transformed to have zero means and unit variances, and decorrelated.\
    ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FxabrJgI9EOODmrBftx4M%2Ffile.png?alt=media)\
    BN algorithm，这里的 x1..m  指的是一个batch内，m 张图，每张图的某一个 channel （k）的 activation，这里 k 被省略了，参见 paper section 3 图前一段。\
    先对输入 x 的 k channel 所有 m 张图做 normalization，到 mean = 0， variance = 1然后再用 参数 gamma 和 beta 对这个 normalized 的 input 做 scale 和 transformation



### **1.为什么 BN 还要再学 scale 和 bias：**

* 除了充分利用底层学习的能力，另一方面的重要意义在于保证获得非线性的表达能力。Sigmoid 等激活函数在神经网络中有着重要作用，通过区分饱和区和非饱和区，使得神经网络的数据变换具有了非线性计算能力。而第一步的规范化会将几乎所有数据映射到激活函数的非饱和区（线性区），仅利用到了线性变化能力，从而降低了神经网络的表达能力。而进行再变换，则可以将数据从线性区变换到非线性区，恢复模型的表达能力。

### **2.经过这么的变回来再变过去，会不会跟没变一样？**

* 不会。因为，再变换引入的两个新参数 g 和 b，可以表示旧参数作为输入的同一族函数，但是新参数有不同的学习动态。在旧参数中， ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2Fmris2CZI4vGye1212t3I%2Ffile.svg?alt=media) 的均值取决于下层神经网络的复杂关联；但在新参数中， ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FZjcArRfQJGr772pvN7xu%2Ffile.svg?alt=media) 仅由 ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FO2uOaKeaekqwQ7AjAeet%2Ffile.svg?alt=media) 来确定，**去**除了与下层计算的密切**耦合**。新参数很容易通过梯度下降来学习，简化了神经网络的训练。

## **Layer Normalization:**

![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FYPtcAhNzmmGVdmumTSqn%2Ffile.png?alt=media)

\
LN 针对单个训练样本进行，不依赖于其他数据，因此可以避免 BN 中受 mini-batch 数据分布影响的问题，**可以用于 小mini-batch场景、动态网络场景和 RNN，特别是自然语言处理领域。**&#x6B64;外，LN 不需要保存 mini-batch 的均值和方差，节省了额外的存储空间。

但是，BN 的转换是针对单个神经元可训练的——不同神经元的输入经过再平移和再缩放后分布在不同的区间，而 LN 对于一整层的神经元训练得到同一个转换——**所有的输入都在同一个区间范围内。如果不同输入特征不属于相似的类别（比如颜色和大小），那么 LN 的处理可能会降低模型的表达能力。**

## **Weight Normalization:**

![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2F6g7sD6wdFE7S8jOiGBV1%2Ffile.png?alt=media)

![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FAIOx3dEG1cQL9jiqOnaF%2Ffile.png?alt=media)

\
回忆一下，**BN 和 LN 是用输入的特征数据的方差对输入数据进行 scale**，而 **WN 则是用 神经元的权重的欧氏范式对输入数据进行 scale**。虽然在原始方法中分别进行的是特征数据规范化和参数的规范化，但本质上都实现了对数据的规范化，只是用于 scale 的参数来源不同。

另外，我们看到**这里的规范化只是对数据进行了 scale，而没有进行 shift**，因为我们简单地令 ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FXfPEeR18zYl569F74RM6%2Ffile.svg?alt=media). 但事实上，这里留下了与 BN 或者 LN 相结合的余地——那就是利用 BN 或者 LN 的方法来计算输入数据的均值 ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FpK6vz0FY74E2wWlMt40f%2Ffile.svg?alt=media) 。WN 的规范化不直接使用输入数据的统计量，因此**避免了 BN 过于依赖 mini-batch 的不足，以及 LN 每层唯一转换器的限制，同时也可以用于动态网络结构**。

## **Cosine  Normalization:**

Normalization 还能怎么做？我们再来看看神经元的经典变换 ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FrawnhSuvX7I3BjqZjPOB%2Ffile.svg?alt=media).对输入数据 ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FzLpwdpmwvoXhBOHl3A0t%2Ffile.svg?alt=media) 的变换已经做过了，横着来是 LN，纵着来是 BN。对模型参数 ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2Fy0A6LYVn3TVLeksoqDkp%2Ffile.svg?alt=media) 的变换也已经做过了，就是 WN。好像没啥可做的了。然而天才的研究员们盯上了中间的那个点，对，就是![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FiI1CIJmpAi0T2vKkdwgI%2Ffile.svg?alt=media)

他们说，**我们要对数据进行规范化的原因，是数据经过神经网络的计算之后可能会变得很大**，导致数据分布的方差爆炸，而这一问题的根源就是我们的计算方式——点积，权重向量 ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FF7IMOYh8j3sGfO5ggmlx%2Ffile.svg?alt=media) 和 特征数据向量 ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2F3Bk9xz8hTuHg6q4MnWbC%2Ffile.svg?alt=media) 的点积。**向量点积是无界（unbounded）的啊！**

那怎么办呢？**我们知道向量点积是衡量两个向量相似度的方法之一**。哪还有没有其他的相似度衡量方法呢？有啊，很多啊！夹角余弦就是其中之一啊！而且关键的是，夹角余弦是有确定界的啊，\[-1, 1] 的取值范围，多么的美好！仿佛看到了新的世界！

于是，Cosine Normalization 就出世了。他们不处理权重向量 ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2Fb18pg3TJC6tgdsluyAgv%2Ffile.svg?alt=media) ，也不处理特征数据向量 ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FN1IfYKDrjV7z0HPUYg4V%2Ffile.svg?alt=media) ，就改了一下线性变换的函数：

![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FxKVpn3U0aeSbAyA7Zskn%2Ffile.svg?alt=media)

\
其中 ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FfLedO9u0B6AIJRSiuxR4%2Ffile.svg?alt=media) 是 ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2F4zJ3jDrO9tUoGbyM0hiF%2Ffile.svg?alt=media) 和 ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FOriLoguL6YPGbrOp6Z02%2Ffile.svg?alt=media) 的夹角。然后就没有然后了，所有的数据就都是 \[-1, 1] 区间范围之内的了！

不过，回过头来看，CN 与 WN 还是很相似的。我们看到上式中，分子还是 ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2F4qTdGiFRx8LtaY6p3ful%2Ffile.svg?alt=media) 和 ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FmZqU7Pz5LVspO0fFFLmD%2Ffile.svg?alt=media) 的内积，而分母则可以看做用 ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2F3Dsl76vduMP04Wb1cCLJ%2Ffile.svg?alt=media) 和 ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FWFo5iibk5lRgjnyiJzbQ%2Ffile.svg?alt=media) 二者的模之积进行规范化。对比一下 WN 的公式：

![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FmP7bNFREc7lHjCej14Yv%2Ffile.svg?alt=media)

一定程度上可以理解为，**WN 用 权重的模** ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2F4aHcRINIOOxfDpe1B3tH%2Ffile.svg?alt=media) **对输入向量进行 scale**，而 **CN 在此基础上用输入向量的模** ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FzuWG7ns8ifJuD0qaloU1%2Ffile.svg?alt=media) **对输入向量进行了进一步的 scale.**

CN 通过用余弦计算代替内积计算实现了规范化，但成也萧何败萧何。**原始的内积计算，其几何意义是 输入向量在权重向量上的投影，既包含 二者的夹角信息，也包含 两个向量的scale信息。去掉scale信息，可能导致表达能力的下降**，因此也引起了一些争议和讨论。具体效果如何，可能需要在特定的场景下深入实验。

## **Normalization 为什么有用：**

### **1.Normalization 的权重伸缩不变性**

权重伸缩不变性（weight scale invariance）指的是，当权重 ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FnfNFbxBay4h6x0qxoqYI%2Ffile.svg?alt=media) 按照常量 ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FmPN8sfJd4Ljc47P3FWNd%2Ffile.svg?alt=media) 进行伸缩时，得到的规范化后的值保持不变

![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FEDn1mSGS7i2cJzuqTrQU%2Ffile.png?alt=media)

因此，**权重的伸缩变化不会影响反向梯度的 Jacobian 矩阵，因此也就对反向传播没有影响，避免了反向传播时因为权重过大或过小导致的梯度消失或梯度爆炸问题**，从而加速了神经网络的训练。

![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FTIuJcKikdeTgNUKIodt2%2Ffile.png?alt=media)

因此，下层的权重值越大，其梯度就越小。这样，参数的变化就越稳定，相当于实现了参数正则化的效果，避免参数的大幅震荡，提高网络的泛化性能

### **2.数据伸缩不变性**

**数据伸缩不变性仅对 BN、LN 和 CN 成立。**&#x56E0;为这三者对输入数据进行规范化，因此当数据进行常量伸缩时，其均值和方差都会相应变化，分子分母互相抵消。而 WN 不具有这一性质。

**数据伸缩不变性可以有效地减少梯度弥散，简化对学习率的选择**。

每一层神经元的输出依赖于底下各层的计算结果。如果没有正则化，当下层输入发生伸缩变化时，经过层层传递，可能会导致数据发生剧烈的膨胀或者弥散，从而也导致了反向计算时的梯度爆炸或梯度弥散。

**加入 Normalization 之后，不论底层的数据如何变化，对于某一层神经元** ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FY8B0gWuGj0OhycEEDt3z%2Ffile.svg?alt=media) **而言，其输入** ![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FEiiuHEv777O9SUwdBZqb%2Ffile.svg?alt=media) **永远保持标准的分布，这就使得高层的训练更加简单**。从梯度的计算公式来看：

![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LGHUhl6VYqrZm4Re77O%2Fuploads%2FOh8VSehkqD4RdhxcTpTc%2Ffile.svg?alt=media)

\
数据的伸缩变化也不会影响到对该层的权重参数更新，使得训练过程更加鲁棒，简化了对学习率的选择。\
\
\
\
