深度学习——Xavier初始化方法
20210609
https://blog.csdn.net/u011534057/article/details/51673458
https://blog.csdn.net/luoxuexiong/article/details/95772045
“Xavier”初始化方法是一種很有效的神經(jīng)網(wǎng)絡(luò)初始化方法,方法來源于2010年的一篇論文《Understanding the difficulty of training deep feedforward neural networks》,可惜直到近兩年,這個方法才逐漸得到更多人的應(yīng)用和認可。
為了使得網(wǎng)絡(luò)中信息更好的流動,每一層輸出的方差應(yīng)該盡量相等。
基于這個目標,現(xiàn)在我們就去推導(dǎo)一下:每一層的權(quán)重應(yīng)該滿足哪種條件。
文章先假設(shè)的是線性激活函數(shù),而且滿足0點處導(dǎo)數(shù)為1,即
現(xiàn)在我們先來分析一層卷積:
其中ni表示輸入個數(shù)。
根據(jù)概率統(tǒng)計知識我們有下面的方差公式:
特別的,當(dāng)我們假設(shè)輸入和權(quán)重都是0均值時(目前有了BN之后,這一點也較容易滿足),上式可以簡化為:
進一步假設(shè)輸入x和權(quán)重w獨立同分布,則有:
于是,為了保證輸入與輸出方差一致,則應(yīng)該有:
對于一個多層的網(wǎng)絡(luò),某一層的方差可以用累積的形式表達:
特別的,反向傳播計算梯度時同樣具有類似的形式:
綜上,為了保證前向傳播和反向傳播時每一層的方差一致,應(yīng)滿足:
但是,實際當(dāng)中輸入與輸出的個數(shù)往往不相等,于是為了均衡考量,最終我們的權(quán)重方差應(yīng)滿足:
———————————————————————————————————————
———————————————————————————————————————
學(xué)過概率統(tǒng)計的都知道 [a,b] 間的均勻分布的方差為:
因此,Xavier初始化的實現(xiàn)就是下面的均勻分布:
——————————————————————————————————————————
———————————————————————————————————————————
下面,我們來看一下caffe中具體是怎樣實現(xiàn)的,代碼位于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.";
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
由上面可以看出,caffe的Xavier實現(xiàn)有三種選擇
(1) 默認情況,方差只考慮輸入個數(shù):
(2) FillerParameter_VarianceNorm_FAN_OUT,方差只考慮輸出個數(shù):
(3) FillerParameter_VarianceNorm_AVERAGE,方差同時考慮輸入和輸出個數(shù):
之所以默認只考慮輸入,我個人覺得是因為前向信息的傳播更重要一些
---------------------
作者:shuzfan
來源:CSDN
原文:https://blog.csdn.net/shuzfan/article/details/51338178
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!
總結(jié)
以上是生活随笔為你收集整理的深度学习——Xavier初始化方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习的Xavier初始化方法
- 下一篇: 机器都会学习了,你的神经网络还跑不动?来