神经网络的权重初始化
2018-01-05 21:27
399 查看
权重初始化的合理与否常常决定了训练时网络能否收敛。常用的神经网络权重初始化方法有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实现代码:
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
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 <typename Dtype> class XavierFiller : public Filler<Dtype> { public: explicit XavierFiller(const FillerParameter& param) : Filler<Dtype>(param) {} virtual void Fill(Blob<Dtype>* 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<Dtype>(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
相关文章推荐
- 神经网络权重初始化问题
- 神经网络优化(初始化权重)
- 【deeplearning.ai】第二门课:提升深层神经网络——权重初始化
- 神经网络权重初始化问题
- 神经网络权重初始化问题
- 神经网络八:权重初始化
- 深度学习 | Why and How:神经网络中的权重初始化
- Coursera | Andrew Ng (02-week-1-1.11)—神经网络的权重初始化
- 神经网络中的权重初始化:Why and How
- 神经网络之权重初始化(附代码)
- 神经网络优化(初始化权重)
- [DeeplearningAI笔记]改善深层神经网络_深度学习的实用层面1.10_1.12/梯度消失/梯度爆炸/权重初始化
- 神经网络之权重初始化
- 初始化神经网络的权重和偏置
- 为何神经网络权重初始化要随机初始化,不能以0为初始化
- 八、改进神经网络的学习方法(4):权重初始化
- 神经网络基本原理-4.4神经网络之权重初始化方法
- 斯坦福cs231n学习笔记(8)------神经网络训练细节(数据预处理、权重初始化)
- 深度学习--神经网络权重初始化
- 神经网络超参之权重初始化的方法