Xavier initialization

Xavier初始化是什么鬼?

在Caffe中,每个卷积或全连接层的参数通过一个零均值与设定方差的正态分布进行初始化,其中方差的值为 1/nin ,其中 nin 该层的输入神经元数目。
这里需要提一下最开始在Glorot和Bengio的论文里他们是建议把方差设为 2/(nin+nout) 的,这里 nout 对应就是该网络层的输出神经元数目了。那么问题来了,干嘛Caffe不完全参照论文要做这样的修改呢?

方差公式是怎么来的?

现在假设有一个n维输入向量X和一个单层线性神经网络,它的权重向量是W,X通过网络后的输出是Y。那么Y的方差是多少呢?很明显,

Y=W1X1+W2X2+...+WnXn
对于每个 WiXi ,它对应的方差,
Var(WiXi)=E(Xi)2Var(Wi)+E(Wi)2Var(Xi)+Var(Xi)Var(Wi)
当输入的X均值为0的时候,输出的方差就是
Var(WiXi)=Var(Wi)Var(Xi)
进一步假设 Wi Xi 是独立同分布的,就可以得到
Var(Y)=nVar(Wi)Var(Xi)
也就是说输出的方差跟输入的方差只是相差了一个倍数 nVar(Wi) ,如果我们希望网络层的输入和输出方差是保持不变的话,就要有
nVar(Wi)=1
到这里就可以得到
Var(Wi)=1/nin
到这里就得到了Caffe里面的Xavier方差初始化公式。
而Bengio在这个基础上考虑了反向传播时输入输出刚好反转,也就是要求
Var(Wi)=1/nout
权衡两种情况的选择就是
Var(Wi)=2/(nin+nout)
Caffe只考虑输入数 nin 的原因可能是
1. 对于神经网络而言,前向比反向的重要性更大;
2. 从实现上权衡,要得到对下一层网络的输入是很麻烦的。

MSRA初始化

最后顺便提一提微软的小明针对ReLU激活函数提出的一种初始化方法

Var(Wi)=2/nin
这里的解释很简单,ReLU函数把输出的一半负值都置零了,为了保持输入输出的方差一致,显然需要把原来正数输出的方差变为原来的2倍了。

这篇东西主要参考自这个博客,要是将来传播出了什么偏差,我是不会背锅的。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值