权重归一化weight_norm

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||}, ω=gvv,
其中 g g g为标量,其大小等于 ω \omega ω的模长, v ∣ ∣ v ∣ ∣ \frac{v}{||v||} vv为与 ω \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ωLvT
∇ 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=vvgvωL=v2gvωLv2gvvvω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||}, vv=v(vTv)0.5=0.5(vTv)0.5v(vTv)=vv,
所以
∇ 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=vgωLv2ggLv=vgMωω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||} vg的缩放以及 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()

你可能感兴趣的:(论文复现中的知识补充,深度学习,人工智能)