在上面链接的文章中讨论了批量归一化(Batch Normalization)的主要功能以及正、反向过程的实现。这一篇接着讨论各种各种的实现及作用:
- Batch Normalization(下面的文章中会使用BN来代替,包括LN,IN,SN同理)
- Layer Normalization
- Instance Normalization
- Switchable Normalization
因为上面的链接中只针对全连接网络的BN进行了讨论,所以补充一下卷积神经网络中的BN。首先,上面四种Normalization都可以概括为两步:归一化和仿射:
公式(1)就是归一化的过程,其中
本文讨论的四种Normalization主要的区别在于
![49bb2444b56953b19b2dedefc0f754ed.png](https://i-blog.csdnimg.cn/blog_migrate/673749217f8a697f9cedc4856307095b.jpeg)
Batch Normalization
具体到BN,对于卷积神经网络的BN来说,其输入是四维张量:
首先是在输入的N,H,W这三个维度上计算均值和方差:
通过下标可以看出,均值和方差都是大小为与输入通道数(C)相同的向量。接着将两者代入到式(1)中,对输入的每一个元素进行归一化:
同时BN的仿射系数都是大小为C的向量,即:
式(5)(6)得到了
然后将BN的具体数据代入到式(7)中:
先把上式中容易算的直接贴出来:
为了方便下一步计算,包括后面LN,IN,SN中避免重复计算,这里先把两个中间量算出来:
最后计算
把式(12)代入(14)中就得到了上面的结果。同样,将式(13)代入到
最后,整理一下上面的结果,将它们代入到式(8)中,得到:
接着, 令
写成这样是为了方便下面讨论LN,IN时复用,并且借助爱因斯坦求和约定,可以很高效方便的实现这个式子的计算而不用顾虑它的维度(同时兼容输入是二维和四维的情况),下面将BN的正反向过程实现代码贴出来:
class
上面是BN的粗略代码,因为BN还要通过训练样本来估计整体训练集上的均值和方差,这里就不讨论了。令外,为了方便表述,forward的实现中写死了计算均值和是标准差的维度,这一部分也是可以通过einsum函数实现的
Layer Normalization
前面费了较多的篇幅讨论BN,不过这也是值得的,LN的过程还是和式(1)(2)所描述的一样,只不过BN在N,H,W这三个维度上( 如果输入是二维的则只在维度N上)计算
与BN不同,LN并不依赖于批训练样本的数量(batch size),即使只使用单个样本进行训练表现依然稳定,同时,也不需要对训练集整体的均值和方差进行估计;并且LN还能够很好的用与循环神经网络
还有一点需要注意的是LN的学习参数:
LN正向计算的过程与BN大同小异,接下来讨论LN的反向过程,因为
到这一步基本上就和前面的一样了,直接贴公式:
将上面的结果连同式(12)(13)一起代入到式(16),最后得到:
其中
代码就不贴了,直接对照上面BN的改一下就行了,只不过需要注意的是numpy的广播机制
Instance Normalization
IN主要使用在图像的风格迁移中,效果比BN更好。与BN和LN都不同,IN在H,W这两个维度上计算均值和方差
同时IN的仿射系数也是大小为C的向量:
可以看到,BN,LN,IN(包括下面的SN)的仿射系数都是一样的,唯二的区别不过是均值和方差的计算维度罢了,所以IN的梯度计算也可以套用前面的公式,下面只列出不同之处:
最后代入式(16),得到:
Switchable Normalization
总的来说,SN并不是像BN,LN一样选取某些特定的维度计算均值和方差来进行归一化,而是通过不同的权重结合BN,LN,IN的均值和方差进行归一化,从而能够根据不同的任务场景自适应的进行归一化,更详细的介绍可以看论文作者的知乎文章:深度剖析 | 可微分学习的自适配归一化
SN的归一化的公式同(1)(2) 一样:
只不过其中的
上面两个式子,
另外,由于
首先是正向过程,如果直接从输入计算三种均值和方差的话会造成大量重复运算,为了避免提高效率,先算出IN的均值和方差:
然后在此基础上计算BN和LN的均值、方差:
下面就
以上就是SN的正向过程, 接下来是梯度推导,因为SN的
接着计算多元复合函数的梯度:
然后首先是
但是由于
其中,
(32)、(33)与(31)不同是因为
最后将结果代入到(30)中,得到:
由于
最后,将这些结果代入到式(29)中,就得到一个“长长的”公式:
最后的最后,就只剩下