@TOC
Xavier初始化理论
权值初始化对网络优化至关重要。早年深度神经网络无法有效训练的一个重要原因就是早期人们对初始化不太重视。我们早期用的方法大部分都是随机初始化,而随着网络深度的加深,随机初始化在控制数值稳定性上也可能失效。Xavier这个方法可以考虑输入层与输出层的维度,使在forward 和backward阶段保持每层之间均值与方差接近。
我们拿mlp举例,为了方便运算,忽略激活函数,上图是神经网络的一部分,我们假设
h1t为输入层
htt+1为输出层,我们假设权重系数W~iid(independent identically distribution),均值为0,方差为a,其中
ht、ht+1独立于w。
前向计算公式为:
hjt+1=i∑wij⋅hit
Xavier的核心思想是让输入层与输出层方差接近,我们首先考虑
ht、ht+1的均值,因为t层最初可以追溯到数据输入层,可以通过归一化的手段控制,所以我们直接考虑t+1层。
E[hjt+1]=E[i∑wij⋅hit]=1∑E[wij]⋅E[hit]=i∑0⋅E[hit]=0
我们发现t+1层均值为0,之后计算方差:
Var[hjt+1]=E[(hjt+1)2]−E[hjt+1]2=E[hjt+1)2]−0=E⎣⎢⎡(i∑wij⋅hit)2⎦⎥⎤=E[i∑(wij)2(hit)2]=i∑E[(wij)2]E[(hit)2]=i∑Var[wij]⋅Var[hit]
我们的目标是让前后层方差相等,所以并且w的方差在上面我们假设为a,所以我们要满足:
nt∗a=1
到目前为止,我们的前向计算的满足条件就计算完成了,我们接下来计算反向传播:
∂ht∂Loss=∂ht+1∂loss⋅Wij
计算步骤可前面一样,最终我们可以得出:
nt+1∗a=1
我们到了一个进退两难的地步,因为无法同时满足:
nt∗a=1、
nt+1∗a=1,所以Xavier采取了一个折中的方案:
(nt+nt+1)⋅a=2a=2nt+nt+1
我们有了权重的均值和方差,我们就可以初始化了。
当加入激活函数,是否他们会改变呢?
我们加入激活函数:为了方便运算,假设线性激活函数为:
σ(x)=αx+βE[σ(hjt+1)]=αE[hjt+1]+E[β]=0
为了保证均值为0,其中E
[hjt+1]均值为0,
β也要为0.
Var[σ(hjt+1)]=E[(hjt+1)2]−E[hjt+1)]2=E[(αhjt+1+β)2]=E[((αhjt+1)2+2αhjt+1β+β2)]=α2E[(hjt+1)2]=α2Var[hjt+1]
我们发现,经过激活函数,变成了之前的alpha 方倍,为了保持方差不变,让 alpha =1。也就是说,我们的激活函数尽量选择与y =x 接近的函数,才可以在Xavier上表现较好。
代码实现
import torch
from torch import nn
model = nn.Linear(20, 30)
input = torch.randn(128, 20)
model.weight=torch.nn.Parameter(nn.init.uniform_(torch.Tensor(30,20)))
model.weight=torch.nn.Parameter(nn.init.normal_(torch.Tensor(30,20)))
output = m(input)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
评论(0)