深度学习——Xavier初始化方法

“Xavier”初始化方法是一种很有效的神经网络初始化方法,方法来源于2010年的一篇论文《Understanding the difficulty of training deep feedforward neural networks》,可惜直到近两年,这个方法才逐渐得到更多人的应用和认可。

为了使得网络中信息更好的流动,每一层输出的方差应该尽量相等。

基于这个目标,现在我们就去推导一下:每一层的权重应该满足哪种条件。

文章先假设的是线性激活函数,而且满足0点处导数为1,即
这里写图片描述

现在我们先来分析一层卷积:
这里写图片描述
其中ni表示输入个数。

根据概率统计知识我们有下面的方差公式:
这里写图片描述

特别的,当我们假设输入和权重都是0均值时(目前有了BN之后,这一点也较容易满足),上式可以简化为:
这里写图片描述

进一步假设输入x和权重w独立同分布,则有:
这里写图片描述

于是,为了保证输入与输出方差一致,则应该有:
这里写图片描述

对于一个多层的网络,某一层的方差可以用累积的形式表达:
这里写图片描述

特别的,反向传播计算梯度时同样具有类似的形式:
这里写图片描述

综上,为了保证前向传播和反向传播时每一层的方差一致,应满足:

这里写图片描述

但是,实际当中输入与输出的个数往往不相等,于是为了均衡考量,最终我们的权重方差应满足

———————————————————————————————————————
这里写图片描述
———————————————————————————————————————

学过概率统计的都知道 [a,b] 间的均匀分布的方差为:
这里写图片描述

因此,Xavier初始化的实现就是下面的均匀分布:

——————————————————————————————————————————
这里写图片描述
———————————————————————————————————————————

下面,我们来看一下caffe中具体是怎样实现的,代码位于include/caffe/filler.hpp文件中。

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的Xavier实现有三种选择

(1) 默认情况,方差只考虑输入个数:
这里写图片描述

(2) FillerParameter_VarianceNorm_FAN_OUT,方差只考虑输出个数:
这里写图片描述

(3) FillerParameter_VarianceNorm_AVERAGE,方差同时考虑输入和输出个数:
这里写图片描述

之所以默认只考虑输入,我个人觉得是因为前向信息的传播更重要一些

  • 125
    点赞
  • 434
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
Xavier初始化方法是一种常用的参数初始化方法,用于初始化神经网络的权重。它的目标是使得前向传播和反向传播过程中的梯度保持一致,从而更好地进行模型训练。 Xavier初始化方法的核心思想是根据权重矩阵的输入和输出维度来确定合适的初始化范围。通常情况下,权重矩阵的元素应该服从一个均匀分布,使得输入和输出的方差保持一致。 具体来说,对于一个全连接层的权重矩阵W(形状为(output_dim, input_dim)),Xavier初始化方法可以通过以下方式进行: 1. 均匀分布: - 从均匀分布U(-a, a)中随机采样,其中a是根据输入和输出维度计算得到的上界。 2. 上界计算: - 对于具有输入维度为input_dim和输出维度为output_dim的权重矩阵W,上界a可以通过以下公式计算得到: ``` a = sqrt(6 / (input_dim + output_dim)) ``` 3. 初始化权重: - 使用均匀分布U(-a, a)来随机初始化权重矩阵W。 Xavier初始化方法可以在一定程度上避免梯度消失或梯度爆炸的问题,有助于提高模型的收敛速度和性能。它在很多深度学习框架和库中都有内置的实现方式,可以方便地应用于各种神经网络模型。 需要注意的是,Xavier初始化方法适用于激活函数为线性函数或具有类似线性性质的激活函数(如tanh、sigmoid等)。对于非线性激活函数(如ReLU、LeakyReLU等),其他初始化方法(如He初始化)可能更为合适。因此,在选择参数初始化方法时,要结合具体的激活函数和模型结构来进行选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值