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倍了。
这篇东西主要参考自这个博客,要是将来传播出了什么偏差,我是不会背锅的。