Weight Normalization

引言

  Weight Normalization(WN)可以看成是对Batch Normalization(BN)更轻量、不那么noisy的近似。

数学推导

  WN对权重向量进行了重新参数化,具体来说,

$w=\frac{g}{||v||}v$。

其中$w\in \mathbb{R}^{k}$为原始网络参数,$g$为标量,$v\in \mathbb{R}^{k}$为重新参数化后的参数。重新参数初始化后网络的梯度为:

$\nabla_{g}L=\frac{\nabla_{w}L\cdot v}{||v||}$

$\nabla_{v}L = \frac{g}{||v||}\nabla_{w}L-\frac{g\nabla_{g}L}{||v||^{2}}v$。

此梯度也可以表示为:

$\nabla_{v}L = \frac{g}{||v||}M_{w}\nabla_{w}L$     $M_{w}=I-\frac{ww^{T}}{||w||^{2}}$。

   由于$w^{T}\nabla_{v}L=0$,我们知道$\Delta v\propto \nabla_{v}L$是与$w$正交。又由于$w$与$v$平行,所以$\Delta v$也与$v$正交。那么$v$的模长可以使用勾股定理计算,即$||v'||=||v+\Delta v|| = (||v||^{2}+||\Delta v||^{2})^0.5$。如果$||\Delta v||/||v||=c$,则可写成$||v'||=(1+c^{2})^{0.5}||v||$。可以发现,$v$的模长是单调递增的。如果$||\Delta v||$很大,那么$c$很大,$||v||$会增长的很快。此时标量$g/||v||$会因此减小,使得$||\Delta v||$减小,从而达到一种平衡。

  另外,WN也有对学习率鲁棒的能力。具体来说,如果学习率设置的过大,$||v||$会增长的很快。此时$||\Delta v||$相对$||v||$就显得比较小,学习率也是比较合适的。

初始化

  BN一个很大的优势是能够使得每层特征的尺度固定,而WN是没有这个效果的(不能控制特征值的均值。),所以WN需要小心地进行参数初始化。具体来说,$v$使用均值为0,方差为0.05的正态分布进行初始化。偏置$b$和$g$使用第一个mini-batch的统计值进行初始化。此时先假设$b$和$g$分别为0和1,做一次前向传播:

$t=\frac{v\cdot x}{||v||}$    $y=\phi (\frac{t-\mu [t]}{\sigma [t]})$。

通过设置

$g=\frac{1}{\sigma [t]}$    $b=\frac{-\mu [t]}{\sigma [t]}$,

保证了第一次前向传播时均值为0,方差为1(推这个结论时注意此时$w=\frac{v}{||v||}$。)。

  由于是类比BN推出的这个条件,因此这种初始化方法不能用在RNN或者LSTM中。此时使用标准初始化方法。

与BN的联系

  假设存在一个单层网络,输入被白化(均值为0方差为1),预激活值$t=vx$。此时$v$的均值和标准差分别为0和||v||。在这种情况下,WN和BN的结果一致(此时WN的$g$值设置为1)。另外,由于WN中特征值没有中心化,可以考虑将WN与只使用均值的BN组合起来使用。

自言自语

  最近在看pixelCNN的代码,其中使用了WN。在思考WN相比BN的优势过程中,就产生了这篇文章。其中一个优势是:由于BN统计每个mini-batch的统计量,给梯度引入了noise,这对于生成模型和强化学习来说是不可忍受的。

posted @ 2020-03-04 10:56  graycastle  阅读(538)  评论(0)    收藏  举报