常用的 Normalization 方法:BN、LN、IN、GN
1. BN 求均值时,相当于把这些书按页码一一对应地加起来(例如第1本书第36页,第2本书第36页……),再除以每个页码下的字符总数:
N×H×W,因此可以把 BN 看成求“平均书”的操作(注意这个“平均书”每页只有一个字),求标准差时也是同理。
2. LN 求均值时,相当于把每一本书的所有字加起来,再除以这本书的字符总数:
C×H×W,即求整本书的“平均字”,求标准差时也是同理。
3. IN 求均值时,相当于把一页书中所有字加起来,再除以该页的总字数:
H×W,即求每页书的“平均字”,求标准差时也是同理。
4. GN 相当于把一本 C 页的书平均分成 G 份,每份成为有 C/G 页的小册子,求每个小册子的“平均字”和字的“标准差”。
一、 Batch Normalization, BN (‘重点、重点、重点’,重要的事情说三遍)
论文链接:
https://arxiv.org/pdf/1502.03167.pdf
为什么要进行BN呢?
(1)在深度神经网络训练的过程中,通常以输入网络的每一个mini-batch进行训练,这样每个batch具有不同的分布,使模型训练起来特别困难。
(2)Internal Covariate Shift (ICS) 问题:
在训练的过程中,激活函数会改变各层数据的分布,随着网络的加深,这种改变(差异)会越来越大,使模型训练起来特别困难,收敛速度很慢,会出现梯度消失的问题。
BN的主要思想:
针对每个神经元, 使数据在进入激活函数之前,沿着通道计算每个batch的均值、方差,‘强迫’数据保持均值为0,方差为1的正态分布,
避免发生梯度消失。
具体来说,就是把第1个样本的第1个通道,加上第2个样本第1个通道 …… 加上第 N 个样本第1个通道,求平均,得到通道 1 的均值(注意是除以 N×H×W 而不是单纯除以 N,最后得到的是一个代表这个 batch 第1个通道平均值的数字,而不是一个 H×W 的矩阵)。
求通道 1 的方差也是同理。
对所有通道都施加一遍这个操作,就得到了所有通道的均值和方差。
BN的使用位置:
全连接层或卷积操作之后,激活函数之前。
BN算法过程:
- 沿着通道计算每个batch的均值μ
- 沿着通道计算每个batch的方差σ²
- 做归一化
- 加入缩放和平移变量 γ 和 β