Normalization(中文为归一化) 是深度学习中的重要技术。
常见的Normalization包括:
- Batch Normalization
- Group Normalization
- Layer Normalization
- Instance Normalization
对于一个机器学习模型,最理想的输入当然是 独立同分布(independent identically distributed, iid)的。
关于数据集的独立性,通常使用 白化(whitening) 来对数据进行预处理。
常见的白化方法有 主成分分析(PCA),线性判别分析(LDA),拉普拉斯特征映射(Laplacian Eigenmaps)等等,这篇文章不做介绍。
而达到同分布则可以使用Normalization。所以这些 Normalization 的套路都是相同的:
- 减去均值(mean),
- 除以标准差(standard deviation)
- 做线性映射
具体公式如下(其中,$\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