均值归一化_各种归一化实现及梯度推导——Batch、Layer、Instance、Switchable Norm

永远在你身后:Numpy实现神经网络框架(7)——Batch Normalization​zhuanlan.zhihu.com

在上面链接的文章中讨论了批量归一化(Batch Normalization)的主要功能以及正、反向过程的实现。这一篇接着讨论各种各种的实现及作用:

  • Batch Normalization(下面的文章中会使用BN来代替,包括LN,IN,SN同理)
  • Layer Normalization
  • Instance Normalization
  • Switchable Normalization

因为上面的链接中只针对全连接网络的BN进行了讨论,所以补充一下卷积神经网络中的BN。首先,上面四种Normalization都可以概括为两步:归一化仿射

(1)

(2)

公式(1)就是归一化的过程,其中

分别的输入及其
均值方差,公式(2)就是仿射(就是缩放和平移),其中
分别是
缩放系数以及 平移系数(或者把两者共同叫做仿射系数),并且这两组参数都是可学习的

本文讨论的四种Normalization主要的区别在于

的计算方式不同(
大小都是一样的),如下图所示:

49bb2444b56953b19b2dedefc0f754ed.png

Batch Normalization

具体到BN,对于卷积神经网络的BN来说,其输入是四维张量:

,这四个维度分别是样本数目(batch size,N),样本数据的高、宽(H,W),样本的通道数(C)。设
为输入
中的一个具体元素,BN的具体计算过程如下:

首先是在输入的N,H,W这三个维度上计算均值和方差:

(3)

(4)

通过下标可以看出,均值和方差都是大小为与输入通道数(C)相同的向量。接着将两者代入到式(1)中,对输入的每一个元素进行归一化:

同时BN的仿射系数都是大小为C的向量,即:

,将它们代入式(2)中,得到:

就是BN的输出,
是输出中的具体的一个元素,因为文章开头的链接中关于BN的作用已经说的很清楚了,所以就不再赘述了,直接开始BN的梯度推导,因为
是BN的输出,所以损失关于
的梯度不用BN来管,由反向传播中的上一层计算后传过来,首先是计算损失关于
的梯度:

(5)

(6)

(7)

式(5)(6)得到了

的梯度后就可以使用梯度下降等算法对它们进行优化,而得到
之后,BN的反向过程就只需要算出
并将之继续往回传递就行了。因为式(1)是一个多元复合函数,所以它的求导计算如下(开头的链接中有更详细的解释):

(8)

然后将BN的具体数据代入到式(7)中:

先把上式中容易算的直接贴出来:

(9)

(10)

(11)

为了方便下一步计算,包括后面LN,IN,SN中避免重复计算,这里先把两个中间量算出来:

(12)

(13)

最后计算

(14)

把式(12)代入(14)中就得到了上面的结果。同样,将式(13)代入到

的计算中:

(15)

最后,整理一下上面的结果,将它们代入到式(8)中,得到:

接着, 令

,同时
,将这两项代入上式,最后得到:

(16)

写成这样是为了方便下面讨论LN,IN时复用,并且借助爱因斯坦求和约定,可以很高效方便的实现这个式子的计算而不用顾虑它的维度(同时兼容输入是二维和四维的情况),下面将BN的正反向过程实现代码贴出来:

class 

上面是BN的粗略代码,因为BN还要通过训练样本来估计整体训练集上的均值和方差,这里就不讨论了。令外,为了方便表述,forward的实现中写死了计算均值和是标准差的维度,这一部分也是可以通过einsum函数实现的

Layer Normalization

前面费了较多的篇幅讨论BN,不过这也是值得的,LN的过程还是和式(1)(2)所描述的一样,只不过BN在N,H,W这三个维度上( 如果输入是二维的则只在维度N上)计算

,而LN是使用H,W,C这三个维度(如果LN输入是二维的,则在维度N之外的维度上计算均值和方差):

(17)

(18)

与BN不同,LN并不依赖于批训练样本的数量(batch size),即使只使用单个样本进行训练表现依然稳定,同时,也不需要对训练集整体的均值和方差进行估计;并且LN还能够很好的用与循环神经网络

还有一点需要注意的是LN的学习参数:

,关于这两组参数的规模,论文上是与单个样本的大小一样,在pytorch的文档中可以看到使用的是这种方式,例如当输入
时,
;与之不同的是Tensorflow的实现方式,当输入是一个四维张量时,这两组参数是一个大小与通道数相等的向量,即:
,下面的讨论中使用后一种方式进行计算

(19)

(20)

LN正向计算的过程与BN大同小异,接下来讨论LN的反向过程,因为

的维度与BN时一样,所以梯度的计算公式也是一样的,还包括
也是一样的,同公式(5)(6)(7),而计算
也只需将式(8)稍加改动

(21)

到这一步基本上就和前面的一样了,直接贴公式:

(22)

(23)

(24)

(25)

(26)

将上面的结果连同式(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中的均值和方差,
等变量是对应的权重,这六个权重由另外6个参数:
,通过Softmax函数计算得到:

另外,由于

,而
,所以将这三组均值方差同时使用时,BN与LN的均值与方差会参与更多的计算,这一点在反向求梯度时会用到

首先是正向过程,如果直接从输入计算三种均值和方差的话会造成大量重复运算,为了避免提高效率,先算出IN的均值和方差:

然后在此基础上计算BN和LN的均值、方差:

(27)

(28)

下面就

为例推导(27)(28),不感兴趣可以跳过这部分:


以上就是SN的正向过程, 接下来是梯度推导,因为SN的

与BN、LN、IN一样,所以这两组参数的梯度也是一样:

接着计算多元复合函数的梯度:

(29)

与IN、BN等公式一样

然后首先是

的相关梯度:

但是由于

的复合的,所以
的计算就要复杂一些:

(30)

其中,

的值前面已经给出了,就不赘述了,最后整合公式的时候再代入进去,然后是:

(31)

(32)

(33)

(32)、(33)与(31)不同是因为

参与了更多的
的计算过程,并且上面的三个权重其实应该是
,但是论文中为了方便表述,就将它们与均值的三个权重统一了

最后将结果代入到(30)中,得到:

由于

的相关梯度计算过程雷同,下面就直接贴公式:

最后,将这些结果代入到式(29)中,就得到一个“长长的”公式:

最后的最后,就只剩下

这三个控制参数的梯度了,下面直接把论文中的公式贴上来,回头再慢慢研究

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值