Normalization(中文为归一化) 是深度学习中的重要技术。

常见的Normalization包括:

  • Batch Normalization
  • Group Normalization
  • Layer Normalization
  • Instance Normalization

对于一个机器学习模型,最理想的输入当然是 独立同分布(independent identically distributed, iid)的。

关于数据集的独立性,通常使用 白化(whitening) 来对数据进行预处理。

常见的白化方法有 主成分分析(PCA),线性判别分析(LDA),拉普拉斯特征映射(Laplacian Eigenmaps)等等,这篇文章不做介绍。

而达到同分布则可以使用Normalization。所以这些 Normalization 的套路都是相同的:

  1. 减去均值(mean),
  2. 除以标准差(standard deviation)
  3. 做线性映射

具体公式如下(其中,$\gamma$为缩放因子,$\beta$为偏置,它们用来进行线性映射)

$$ y=\gamma\left(\frac{x-\mu(x)}{\sigma(x)}\right)+\beta $$

上述几种Normalization都是使用这个方法,唯一不同的则是他们的 feature map 的维度不同。下面我将详细地区分这几种Normalization。

Batch Normalization

Batch Normalization简称BN,是最早的Normalization方法,但效果通常不弱于后面出现的其他Normalization方法。

假设有N个样本,通道数为C,高为H,宽度为W。当前数据的定义为:

$$ x \in \mathbb{R}^{N \times C \times H \times W} $$

BN在取均值与方差时,是根据通道C来取的。

也就是对第$i$个通道而言,把所有样本(N)的第$i$个通道的所有宽(W)高(H)加在一起,并求平均,得到属于这个通道的均值,当然方差也是按这个思想。具体的公式为:

$$ \mu_{c}(x)=\frac{1}{N H W} \sum_{n=1}^{N} \sum_{h=1}^{H} \sum_{w=1}^{W} x_{n c h w}\\ \sigma_{c}(x)=\sqrt{\frac{1}{N H W} \sum_{n-1}^{N} \sum_{k=1}^{H} \sum_{i t-1}^{W}\left(x_{n c h w}-\mu_{c}(x)\right)^{2}+\epsilon} $$

Layer Normalization

Batch Normalization有一个弱点,就是需要较大的样本量才能得到较为准确的数据均值和方差,这通常需要设计较大的Batchsize,需要足够的内存与显存支持。不仅如此,当使用RNN模型时,如果输入数据长度是不同的,BN就没法用了。

Layer Normalization在求均值和方差时,不在Batch上求,转而在样本自身来做Normalization。

其均值与标准差的公式如下:

$$ \begin{array}{c}{\mu_{n}(x)=\frac{1}{C H W} \sum_{c=1}^{C} \sum_{h=1}^{H} \sum_{w=1}^{W} x_{n c l u}} \\ {\sigma_{n}(x)=\sqrt{\frac{1}{C H W} \sum_{c=1}^{C} \sum_{h=1}^{H} \sum_{k=1}^{W}\left(x_{n c h w}-\mu_{n}(x)\right)^{2}+\epsilon}}\end{array} $$

这让Layer Normalization不需要考虑Batch的大小,还能够处理不定长的数据。

Instance Normalization

与Layer Normalization类似,Instance Normalization也是根据样本自身的值做Normalization。IN是对样本自身的每个通道分别求均值和标准差。

具体公式如下:

$$ \begin{array}{c}{\mu_{n c}(x)=\frac{1}{H W} \sum_{h=1}^{H} \sum_{w=1}^{W} x_{n c h w}} \\ {\sigma_{n c}(x)=\sqrt{\frac{1}{H W} \sum_{h=1}^{H} \sum_{w=1}^{W}\left(x_{n c h w}-\mu_{n c}(x)\right)^{2}+\epsilon}}\end{array} $$

Group Normalization

Layer Normalization虽然解除了很多限制,但根据 no free lunch的思想,在某些场合下,LN的效果通常不如BN。但如果使用BN效果好,但内存却不够怎么办?可以试试Group Normalization。

GN在计算均值和标准差时,是把每一个样本的feature map的通道分成G组,没每组有$C/G$个通道,然后再对这些通道中的元素求均值和标准差。

具体公式如下:

$$ \begin{array}{c}{\mu_{n g}(x)=\frac{1}{(C / G) H W} \sum_{c=g C / G}^{(g+1) C / G} \sum_{h=1}^{H} \sum_{w=1}^{W} x_{n c h w}} \\ {\sigma_{n g}(x)=\sqrt{\frac{1}{(C / G) H W} \sum_{c=g C / G}^{(g+1) C / G} \sum_{h=1}^{H} \sum_{w=1}^{W}\left(x_{n c h w}-\mu_{n g}(x)\right)^{2}+\epsilon}}\end{array} $$

总结

这些Normalization虽然各不相同,但思想及解决问题的目的都是相同的。

Batch Normalization:对批次中所有数据的通道做归一化

Layer Normalization:根据自身的值做归一化

Instance Normalization:根据自身的通道做归一化

Group Normalization:根据批次样本的通道组做归一化

最后,附上一张不知出处的图,它非常清楚地表达了这些 Normalization 的区别和特点:

学习交流:
微信:ElijahMingLiu
Wechat

最后修改:2021 年 06 月 01 日 02 : 19 PM
如果觉得我的文章对你有用,请随意赞赏