1. 权重归一化原理

对于网络中一神经元,其输入为 x,输出为 y,计算过程为
y=ϕ(ω∗x+b)y=\phi(\omega *x+b)y=ϕ(ωx+b)
ω\omegaω为与该神经元连接的权重,通过损失函数与梯度下降对网络进行优化的过程就是求解最优ω\omegaω的过程。将ω\omegaω的长度与方向解耦,可以将ω\omegaω表示为
ω=gv∣∣v∣∣,\omega = g\frac{v}{||v||},ω=gvv,
其中ggg为标量,其大小等于ω\omegaω的模长,v∣∣v∣∣\frac{v}{||v||}vv为与ω\omegaω同方向的单位向量,此时,原先训练过程中ω\omegaω的学习转化为gggvvv的学习。假设损失函数以LLL表示,则LLLgggvvv的梯度可以分别表示为,
∇gL=∇gω∗(∇ωL)T=∇ωL∗vT∣∣v∣∣\nabla_gL=\nabla_g \omega * (\nabla_\omega L)^T = \frac{\nabla_\omega L*v^T}{||v||}gL=gω(ωL)T=vωLvT
∇vL=∇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 LvL=vωωL=vvgvωL=v2gvωLv2gvvvωL
因为
∂∣∣v∣∣∂v=∂(vT∗v)0.5∂v=0.5∗(vT∗v)−0.5∗∂(vT∗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,
所以
∇gL=g∣∣v∣∣∗∇ωL−g∗∇gL∣∣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∣∣ω∣∣2M_\omega=I-\frac{\omega*\omega^T}{||\omega||^2}Mω=Iω2ωωT,与向量点乘可以投影任意向量至ω\omegaω的补空间,相对于原先的∇ωL\nabla_\omega LωL∇vL\nabla_v LvL进行了g∣∣v∣∣\frac{g}{||v||}vg的缩放以及MωM_\omegaMω的投影,两者对优化过程都起到作用。

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()
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐