1. 权重归一化原理
对于网络中一神经元,其输入为 x,输出为 y,计算过程为
y
=
ϕ
(
ω
∗
x
+
b
)
y=\phi(\omega *x+b)
y=ϕ(ω∗x+b)
ω
\omega
ω为与该神经元连接的权重,通过损失函数与梯度下降对网络进行优化的过程就是求解最优
ω
\omega
ω的过程。将
ω
\omega
ω的长度与方向解耦,可以将
ω
\omega
ω表示为
ω
=
g
v
∣
∣
v
∣
∣
,
\omega = g\frac{v}{||v||},
ω=g∣∣v∣∣v,
其中
g
g
g为标量,其大小等于
ω
\omega
ω的模长,
v
∣
∣
v
∣
∣
\frac{v}{||v||}
∣∣v∣∣v为与
ω
\omega
ω同方向的单位向量,此时,原先训练过程中
ω
\omega
ω的学习转化为
g
g
g和
v
v
v的学习。假设损失函数以
L
L
L表示,则
L
L
L对
g
g
g和
v
v
v的梯度可以分别表示为,
∇
g
L
=
∇
g
ω
∗
(
∇
ω
L
)
T
=
∇
ω
L
∗
v
T
∣
∣
v
∣
∣
\nabla_gL=\nabla_g \omega * (\nabla_\omega L)^T = \frac{\nabla_\omega L*v^T}{||v||}
∇gL=∇gω∗(∇ωL)T=∣∣v∣∣∇ωL∗vT
∇
v
L
=
∇
v
ω
∗
∇
ω
L
=
∂
g
∗
v
∣
∣
v
∣
∣
∂
v
∗
∇
ω
L
=
g
∗
∣
∣
v
∣
∣
∣
∣
v
∣
∣
2
∗
∇
ω
L
−
g
∗
v
∗
∂
∣
∣
v
∣
∣
∂
v
∣
∣
v
∣
∣
2
∗
∇
ω
L
\nabla_vL = \nabla_v\omega*\nabla_\omega L=\frac{\partial \frac{g*v}{||v||}}{\partial v}*\nabla_\omega L=\frac{g*||v||}{||v||^2}*\nabla_\omega L-\frac{g*v*\frac{\partial||v||}{\partial v}}{||v||^2}*\nabla_\omega L
∇vL=∇vω∗∇ωL=∂v∂∣∣v∣∣g∗v∗∇ωL=∣∣v∣∣2g∗∣∣v∣∣∗∇ωL−∣∣v∣∣2g∗v∗∂v∂∣∣v∣∣∗∇ωL
因为
∂
∣
∣
v
∣
∣
∂
v
=
∂
(
v
T
∗
v
)
0.5
∂
v
=
0.5
∗
(
v
T
∗
v
)
−
0.5
∗
∂
(
v
T
∗
v
)
∂
v
=
v
∣
∣
v
∣
∣
,
\frac{\partial||v||}{\partial v}=\frac{\partial (v^T*v)^{0.5}}{\partial v}=0.5*(v^T*v)^{-0.5}*\frac{\partial (v^T*v)}{\partial v}=\frac{v}{||v||},
∂v∂∣∣v∣∣=∂v∂(vT∗v)0.5=0.5∗(vT∗v)−0.5∗∂v∂(vT∗v)=∣∣v∣∣v,
所以
∇
g
L
=
g
∣
∣
v
∣
∣
∗
∇
ω
L
−
g
∗
∇
g
L
∣
∣
v
∣
∣
2
∗
v
=
g
∣
∣
v
∣
∣
∗
M
ω
∗
∇
ω
L
,
\nabla_gL = \frac{g}{||v||}*\nabla_\omega L-\frac{g*\nabla_g L}{||v||^2}*v=\frac{g}{||v||}*M_\omega*\nabla_\omega L,
∇gL=∣∣v∣∣g∗∇ωL−∣∣v∣∣2g∗∇gL∗v=∣∣v∣∣g∗Mω∗∇ωL,
其中
M
ω
=
I
−
ω
∗
ω
T
∣
∣
ω
∣
∣
2
M_\omega=I-\frac{\omega*\omega^T}{||\omega||^2}
Mω=I−∣∣ω∣∣2ω∗ωT,与向量点乘可以投影任意向量至
ω
\omega
ω的补空间,相对于原先的
∇
ω
L
\nabla_\omega L
∇ωL,
∇
v
L
\nabla_v L
∇vL进行了
g
∣
∣
v
∣
∣
\frac{g}{||v||}
∣∣v∣∣g的缩放以及
M
ω
M_\omega
Mω的投影,两者对优化过程都起到作用。
2. Pytorch中weight normalization的使用
import torch
import torch.nn as nn
net = nn.Linear(200,10)
net.weight.data
nn.utils.weight_norm(net, name='weight')
net.weight_g.size(),net.weight_v.size()