引言
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,这对于生成模型和强化学习来说是不可忍受的。