当前位置: 首页 > >

神经网络的权重初始化

发布时间:

权重初始化的合理与否常常决定了训练时网络能否收敛。常用的神经网络权重初始化方法有xavier和msra。由于基于的激活函数的假设不一样,msra的方差是xavier的2倍。


xavier初始化基于线性激活函数,线性激活函数相当于没有激活函数。原始论文发表于2010年,当时卷积神经网络尚未被引爆,因此是基于多层感知器网络的。假使论文的读者以为是基于卷积神经网络,可能对其中的个别符号会有误解。例如在论文中,fin_in被标记为n(l)和n(l+1),这个标记默认了这一层fin_out等于下一层的fin_in。对于CNN中的某一个卷积层:
fin_in = k_h*k_w*c_in
fin_out=k_h*k_w*c_out(注:fin_out在卷积层的stride大于1时存疑)
前后层的卷积核尺寸差异会导致上面的条件不满足。只有在全连接网络,输入和输出特征图的空间尺寸是1x1,使得:
k_h=k_w=1
fin_in=c_in=n(l)
fin_out=c_out=n(l+1)
xavier初始化使用的是均匀分布:

对应的caffe实现代码:


template
class XavierFiller : public Filler {
public:
explicit XavierFiller(const FillerParameter& param)
: Filler(param) {}
virtual void Fill(Blob* blob) {
CHECK(blob->count());
int fan_in = blob->count() / blob->num();
int fan_out = blob->count() / blob->channels();
Dtype n = fan_in; // default to fan_in
if (this->filler_param_.variance_norm() ==
FillerParameter_VarianceNorm_AVERAGE) {
n = (fan_in + fan_out) / Dtype(2);
} else if (this->filler_param_.variance_norm() ==
FillerParameter_VarianceNorm_FAN_OUT) {
n = fan_out;
}
Dtype scale = sqrt(Dtype(3) / n);
caffe_rng_uniform(blob->count(), -scale, scale,
blob->mutable_cpu_data());
CHECK_EQ(this->filler_param_.sparse(), -1)
<< "Sparsity not supported by this Filler.";
}
};

caffe的blob存储卷积层的权重的时候,还是按NCHW的顺序,只不过这里的N是输出通道数,而C是输入通道数。


msra初始化时的公式推导是基于ReLu的,然而尴尬的是何恺明的那篇文章使用的是PReLu(参数化的ReLu)。相同的信号流经ReLu和PReLu后,整流出来的信号能量是不同的,能量比是(1+a^2) : 1。具体地,在原始论文中a被初始化为0.25,能量比为1.0625:1。估计是因为这个比例非常地接*1,所以msra初始化没有基于PReLu另写一个公式。


msra初始化是基于高斯分布的,不是xavier使用的均匀分布。个人觉得高斯分布更符合网络稀疏性的要求。


上述两种权重初始化方法均基于传统CNN网络,从GoogleNet开始打破了传统的CNN网络结构,按理说权重初始化方法应该随着网络结构的变化而更新。然而到目前为止,出名的就上面两种。这是为什么呢?因为2015年出现的batch normalization技术已经弱化了权重初始化对网络是否收敛的影响,batch normalization技术使得权重初始化方差在一个很宽的范围内网络均能收敛。


在一些较为复杂的网络中,即使将权重初始化为xavier或msra,网络仍然不收敛。这类网络往往很难训练出来,这个时候只能使用fine-tune的方法初始化网络权重,例如使用标准Resnet网络模型文件或网络在其他数据集的模型文件,作为部分或全部层的初始化参数。


References
1. Xavier Glorot, Yoshua Bengio. Understanding the Difficulty of Training Deep Feedforward Neural Networks
2. Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun. Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification



友情链接: