重み初期化(Weight Initialization): Xavier 初期化と He初期化

1 重み初期化(Weight Initialization)の概要

重み初期化(weight initialization)は,ディープニューラルネットワーク(DNN)各層の重みを,順・逆伝搬中にも重みの分布に偏りが起きていかないように初期化することで,DNNの学習を安定させるテクニックである.

この記事では Xavier初期化 [Glorot and Bengio, 2010](3節)と呼ばれるシグモイド活性化を持つDNN向けの手法と,それをReLU向けに対応させた He初期化 [He et al., 2015](4節)の 2手法を紹介する.

2手法とも,各ニューロンの識別境界(= 活性化値の分布「線形層+活性化層」を経る前後で一定に保つ目的で行う.その前後での分散一定化を「入出力ノード数で正規化したガウス分布により,重みをランダム初期化する 」ことで実現することから,[Glorot and Bengio, 2010] の論文では,この処理を正規化初期化と呼んでいる.この正規化初期化により,勾配消失・爆発や局所解収束を防ぐことができるので,深い層数のDNNでも,安定して学習することができる.

1.1 正規化初期化の2ステップ構成

初期化を行うDNNの$l$層目の線形層(もしくは畳み込み層)において,$i$番目の入$x_i$から,$j$番目の出力(活性化値)への重みを,$w_{ji}^{(l)}$とする.そして,入力ノード数を$n^{(l)}$とし,出力ノード数を入力ノード数を$n^{(l+1)}$とする.

このとき,Xavierの重み初期化(3節)は,以下の2ステップにより実施する:

  • [ステップ1]:$l$番目の線形層において,ガウス分布からi.i.dな$w_{ji}^{(l)}$をサンプリングする.
  • [ステップ2]:分散が$\hat{n} = \frac{n^{(l)}+n^{(l+1)}}{2}$と.入・出力ノード数の平均値になるように,各サンプリング値$w_{i,j}^{(l)}$を$w_{i,j}^{(l)} = w_{i,j}^{(l)} \cdot \sqrt{ \frac{2}{n^{(l)}+n^{(l+1)}} }$ と正規化する.

ステップ2により,学習開始後は順・逆伝搬時ともに,各層の出力(活性化値)の分散の大きさをキープできるように分散が分配され,重み初期化される(これが正規化初期化).

Xavier初期化(3節)はシグモイド関数むけの手法である.また,He初期化(4節)は,活性化関数がReLUであるDNN向けの手法であり,ステップ2の正規化分散値を少しだけ変更する.

ただし,強力なDNNの学習安定化・高速化手法であるバッチ正規化 [Ioffe and Szegedy, 2015] の登場以降は,重み初期化の学習安定化への貢献度はあまり大きくないかもしれない(4.2節で議論).

1.2 変遷

過去の3層のMLPは,重みパラメータを,平均ゼロ・標準偏差1の正規分布を$\frac{1}{n^{l}}$と出力ノード数で正規化した重みで初期化 [LeCun et al., 1998] しておけば,問題なく誤差逆伝搬法で学習できていた (2.1.2節)(これを「LeCunの重み初期化」と呼ぶことがある)

それに対して,4層以上の学習可能層を含むDNNでは,初期化分布の分散値の大きさ次第で,学習に問題が出がちであった(2.2節).DNNで順伝搬で多数の層を経ると,「入力が小さい値だと出力が 0に」 or 「入力が大きい値」だと1 に近づく「シグモイド型の活性化関数」で何度も活性化をおこなう.すると,初期の分散値次第で,多数の層を経ると勾配が消失して重みがほぼ更新されなくなったり,逆に勾配爆発で早くに各層の活性化値が1,-1に飽和するケースもあった.

そこで,まず,シグモイド型関数を用いたDNN向けの Xavier 初期化 が提案された(3節).同時期に,ReLU [Nair and Hinton, 2010] も登場するが,Xavier初期化では,ReLUとの相性が良くない.そこで,ReLU向けに,He初期化が提案され,(4節)DNN向け重み初期化の,定番手法となった.

1.3 記事の構成

2節以降のこの記事では,以下の構成で2種類のDNN重み初期化について述べる:

  • 2節 DNNで重み初期化が必要な理由は?
  • 3節 Xavier 初期化 [Glorot and Bengio, 2010]
  • 4節 He初期化 [He et al.,2015]
  • 5節 まとめ

2 DNNで重み初期化が必要な理由は?

2節では,まず「DNN向けに,特殊な重み初期化が必要となった理由」について整理する.

2.1 事前準備

2.1.1 ニューラルネットの線形層における順伝搬

まず,このあとの議論で必要なニューラルネットの基本事項として「線形層の順伝搬における,入出力の構成」を復習しておく.

ニューロンユニット
図1 ニューロンユニット(1層内の$j$番目の出力$y_j$を担当).

$l$番目の線形層とその直後の活性化層において,その$j$番目の出力ニューロンには,以下のような入力の計算が行われる(図1):

  • DNNの$l$番目の線形層において,$n^{(l)}$個の値$x_i$が入力される.
  • $x_i$に対応する重み$w_{i}$を掛けた値に対して,出力が$n^{(l)}$個出力され,その和にバイアスを与えた $\sum_{i=1}^{n^{(l)}} w_{ji} x_i +b $を1つ,ユニットの中間出力として算出する.
  • 活性化関数で最後に活性化を行い,ユニット出力 $y_j$ を出力する.
  • 活性化関数$f(\cdot)$には,シグモイド型関数を使用する.

2.1.2 三層MLP時代の重み初期化

ディープラーニング隆盛以前の3層MLPでは,一様分布 を$\sqrt{n^{(l)}}$で割って正規化した$U(-\frac{1}{\sqrt{n^{l}}},\frac{1}{\sqrt{n^{l}}})$ からランダムサンプリングを行い,各層の重みの値を初期化していた [LeCun et al., 1998].これはヒューリスティックな重み初期化法であったが,3層MLPではこのランダム初期化で,重みの偏りのない十分な識別力を持つ隠れ層表現が,学習できていた.

しかし,深いDNNの重みを「特定の分散値の範囲の」ガウス分布で初期化すると,学習問題が出てくることがわかり(2.2節),DNNでも学習が安定する Xavier/He重み初期化が,提案されていった.

2.2 重みが偏って,うまく行かないケース

2.1.1のようなMLPでは,活性化関数にtanhを使う.それに対して$f(\cdot)$にシグモイド系の活性化(tanh関数・ロジスティックシグモイド)を用いると,活性化値$f(y_j)$は[0,1]の範囲の値が出力される.

シグモイド関数には以下のような特徴がある:

  • 活性化値も,$x=0$付近の「線形に近い部分」以外の両端は,それぞれ出力が0 or 1に飽和しやすい.
  • また,$f(y_j)$の微分値も,$x=0$付近以外の両端は,0に飽和する.

このとき,層の数が多い(当時で言う5層~8,9層程度の)DNNに活性化関数をシグモイド系関数にして設計すると,学習時に以下の2つケースの問題が生じて,学習が中途半端になってしまう:

  1. [ケース1] 活性化値が,シグモイドの端の0と1に偏る:
    • 例えば,各層の重みを 平均=0.5,分散 = 1.0のガウス分布で初期化.
    • 活性化値が0と1に集中してしまう.
    • 0と1に偏った活性化は,勾配が指数関数的に減衰していき0に近づき,勾配消失してしまう.
    • 学習がそれ以上進行せず,よい解まで到達できない.
  2. [ケース2] 活性化値が,平均値くらいの同じ値に偏る場合:
    • 例えば,各層の重みを平均=0.5,分散 = 0.001のガウス分布で初期化.
    • 勾配消失はしないが,活性化値が,0.5 付近に狭く偏った状態で収束してしまう.
    • 重みも同じ値ばかりに偏るので,CNNの表現力が乏しくなってしまう(※ 同じ層内で,各ニューロンが同じ識別境界ばかり作ってしまうと,識別力が弱くなってしまう)

以上2ケースのどちらかに陥ると,良い重みを識別モデルにきちんと学習できない(参照記事リンクに挙げた,記事1記事2などでは,重みをわざと偏らせる実験がなされており,参考になる).

そこで [Glorot and Bengio, 2010] は,深いDNNでも上のケースが起こらずに,安定して大域解まで収束できる手法を提案する.

3 Xavier初期化

Xavier 初期化が提案された研究 “Understanding the difficulty of training deep feedforward neural networks.” [Glorot and Bengio, 2010] は,以下の2つの論点で(※ 当時の)CNNの学習の難しさを探った:

  1. 各層における活性化値の分布が,学習中にどう変わっていくかを観察する(※「活性化値の計測・可視化ツール」の提案).これにより,対象のDNN設計が「どのくらい学習が難しいか」を測ることができる.
  2. シグモイド活性化関数が,どういう重み初期化だとよくないかを探った.

具体的には,5層MLPに画像識別モデルを学習する際に(学習対象はMNIST,CIFAR10など),1のツールで分析を行い,2の結論になることを実証した.2の結果をうけて,独自の重み初期化である正規化初期化(Xavier初期化)を提案したのがこの論文である.

3節では,まず 概要(3.1節)を述べたあと,実際にどういう分布で「正規化ランダム初期化」を行うかを先に結論からのべる(3.2節).その後,導出手順と原理・仮定(3.3節)について詳しくみてみたい.

3.1 Xavier初期化の概要

[Glorot and Bengio, 2010] は,正規化初期化を提案した.順伝搬と逆伝搬時に,各層の入力分散と出力分散を保持できる手法なので,各ニューロンにおけるシグモイド活性値の2クラスの境界領域が,「平均値+その周辺の分散の範囲」のシグモイド関数の2クラス境界部分に綺麗に載りやすい(3.3節).

これにより,2節で述べた「DNNの学習で重みが偏るケース」を防ぎ,勾配消失による低速化や表現力不足も起きないようにでき,学習を安定化・高速化させられるようになった.

DNNやCNNを,事前学習無しでスクラッチから学習する際に,これらの重み初期化を使うことで正しく学習できるすくなるので,とても重要な手法である.

3.2 Xavier初期化に用いる2種類のランダム分布

3.2.1 ガウス分布

平均0分散1を,入出力ノード数の平均$\frac{n^{(l)} +n^{(l+1)}{2} $で割ってスケーリングしたガウス分布から,重み初期値をランダムサンプリングする(バイアスは0で初期化):

\begin{align}
w_{i,j}^{(l)} \sim \mathcal{N} \left(0,\sigma = \sqrt{\frac{2}{ n^{(l)} +n^{(l+1)} }} \right)\tag{3.2}
\end{align}

LeCunの重み初期化では,入力ノード数だけを用いて,$w_{i,j}^{(l)} \sim \mathcal{N} \left(0,\sigma\sqrt{ \frac{1}{n^{(l)} }$と初期化していた.

3.2.2 一様分布

一様分布から重み初期化する場合は,以下のように重み初期化を行う:

\begin{align}
w_{i,j}^{(l)} \sim \sqrt{\frac{6}{n^{(l)} + n^{(l+1)}}} U[-1,1] \tag{3.1}
\end{align}

論文[Glorot and Bengio, 2010] では,一様分布をメインにしてXiavier初期化が導出されているのだが,この記事では紹介せず,He初期化の論文 [He et al., 2015] でのガウス分布ベースの,数式記述スタイルに揃えて以後3節も紹介していく(読者には [He et al., 2015] をメインに読んでほしいため,そちらに合わせたい).

3.3 計算式の導出:層を経ても分散をキープする

ここからは,「ガウス分布からの初期化(3.2.1節)」の計算式の導出について述べる.

2.2節の重みが偏っていく2ケースを避けるために,まず「重みの分散が,単位長1である」と条件づける:

\[Var(w_i) = 1 \tag{3.3}\]

$l$層目の線形層の入力ノードが$n^{(l)}$個あるとする.$j$番目のニューロンの出力は$y_j = \bm{W}^{(l)} \cdot \bm{x} + b$であるので,まず$y_j$の分散が以下のようになる:

\[Var(y_j) = Var \left ( w_{1j} x_1 + w_{2j} x_2 + \ldots + w_{n^{(l)}j} x_{n^{(l)}} + b \right) \tag{3.4}\]

ここで,ニューロンの各入力$x_i$(の分布)が i.i.d. であり,重み$w_{ji}$(の分布)もi.i.d.で,なおかつそれら2つの分布もお互い独立であると仮定する.

シグモイド系関数は,0付近(特に入力が[-1.5~1.5]のあたり)は,ほぼ線形の入出力関係である.つまり,「シグモイドの入力が分散1・平均0の範囲にあれば,線形関数である」と仮定できる.

すると,$w_i$と$x_i$が独立であることから,式(3.4)右辺の各ユニット成分の分散は,以下のように分解できる:

\[Var(w_{ji} x_i) = Var(w_{ji})[E(x_i)]^2 + Var(w_{ji})Var(x_i) + [E(w_{ji})]^2 Var(x_i) \tag{3.4}\]

線形層の入力と重みが両方とも平均0で,分散1であると仮定すれば, (3.4)は以下のように簡潔になる:

\[
Var(w_{ji} x_i) =Var(w_{ji})Var(x_i) \tag{3.5}
\]

ここで$y_i$の分散は以下のようになる:

\begin{align}
Var(y_j) &= Var(w_{1j}) Var(x_1) + \ldots + Var(w_{n^{(l)}j}) Var(x_{n^{(l)}}) \\
&= \textcolor{red}{ n^{(l)} Var(w_{ji})} Var(x_i) \tag{3.6}
\end{align}

この式(3.6)から,出力ニューロンの分散 = 入力の各分散のn(l)倍である.よって,目的である「入力の分散 と出力の分散を同じにする」ためには,『式(3.6)の$n^{(l)} Var(w_i) = 1$にすればよい』ということがわかった.

以上より, Lecunの重み初期化[LeCun et al., 1998] では,重み$w_{ji}$の分散を以下のように$\frac{1}{n^{(l)}} に設定して初期化する:

\begin{align}
Var(w_{ji}) = \frac{1}{n^{(l)}} \tag{3.7}
\end{align}

式(3.7)は,要するに重みの分散を,nl個の入力ノードの分散へ均等分配することをしている.

こうして,式(3.6)から,各$l$層の入力の分散($Var(x_i)$)と出力の分散($Var(y_j)$)を同じ値にキープできる(ここまでが[LeCun et al., 1998] の話).

ただし,これだと入力ノード数$n^{(l)}$のみ考慮した均等分配になっている.DNNでは,AutoEncoderやCNNだと,入力と出力のノード数はバラバラで異なる.つまり,入力ノード数$n^{(l)} $だけを用いて正規化すると,逆伝搬時に弱くなる意味でも好ましくない.

したがって,逆伝搬時も,入力勾配の分散と出力勾配の分散を一定化させると,もっと学習が安定する.よって,逆伝搬時は,式(3.7)とは逆に,出力ノード数$n^{(l+1)}$により重みを正規化したい:

\begin{align}
Var(w_{ji}) = \frac{1}{n^{(l+1)}} \tag{3.8}
\end{align}

以上より,順伝搬の分配だけでなく逆伝搬時の分配も考慮した,入出力ノード数の平均$\hat{n} = \frac{1}{n^{(l)} + n^{(l+1)}}$を,ガウス分布の分散として正規化初期化に用いることを,Xavier初期化は最終的に提案した:

\begin{align}
Var(w_i) = \frac{1}{\hat{n}} \tag{3.9}
\end{align}

以上が,Xavier重み初期化の公式の導出と,その背景である.

3.4 呼び名が2通り存在している件

手法の内容紹介は終わったが,「Xavier初期化」と「Glorot初期化」の,2通りの呼び名がある件について,整理しておきたい.

Xavier初期化と呼ばれるが,主著者は Xavier Glorot 氏であり,Xavierはファーストネームである.よって,手法名にはファミリーネーム(苗字)をつけるコンピュータサイエンスの慣習にのっとって「Glorot初期化」と呼ばれたほうがややこしくなかった側面がある.よって,この慣習通りに,ファミリーネームの命名で Glorot InitializerとかGlorot初期化と呼ぶ人たちも居る.

Xavier初期化という名前が定着してしまったのは,初期の定番 deep learning ライブラリであった caffeにおいて,「’xavier’ type の初期化」と名付けられた影響が大きい.当時の研究者にはcaffeユーザーが多かったことから「Xavier初期化」の名前が定着した.実際,4節の論文 [He et al., 2015] でも,”Xavier”と名付けたのはcaffeであることに言及している(論文中のSection 2.2).

Xavier初期化は,2つ呼び名があったせいで,「ライブラリごとに呼び方が違う問題」も生じている.例えば,Kerasは「GlorotNormal」を用いるとXavier重み初期化を使用できるが,PyTorch だと 「torch.init.nn.xavier_normal_」 である.いずれにせよ,主著者の本名を知っておくしかない.

また,上述のKerasとPytorchの重み初期化は,[Hanin and Rolnick 2018]によると,(2018年当時)ガウス分布を「平均値で切り詰め(truncation)」している実装だったそうである .

4 He初期化

4.1 ReLU向けの改善版

He初期化 [He et al., 2015]が,ReLU・PReLU向けの正規化初期として提案された.

Xavier初期化は,シグモイド型活性化関数むけに「活性化関数は(局所的に)線形である」という仮定のもとで使用できる 式 (3.7)を用いて,活性化の分散値を通過前後で一定にする初期化であった.よって,線形の仮定が使えない,非線形活性化関数のReLUやPReLUでは使用できない仮定である.そこで,ReLU・PReLUむけに正規化値を変更したHe初期化が提案された.

4.1.1 He初期化で変わった点

Xavier初期化では,式(3.7)のように標準偏差$\sqrt{\frac{1}{n^{(l)}}}$になるようにガウス分布をスケーリングしていた.それをHe初期化では,ReLU・PReLUに対応させるために,$\sqrt{\frac{2}{n^{(l)}}}$へと変更した.

Xavier 初期化では,式(3.6)の関係から$n^{(l)}Var(w_{ji}) = 1$となるように重み初期化することで,層の入出力の分散を同じ値にキープできた.しかし,PReLUを使う場合は,負の入力だと活性化値が0 or 0付近であり,すなわち「期待値が半分になる」ことから,式(3.7) の関係式は,以下のように変わる(詳しい導出は省略するので [He et al., 2015] を参照):

\begin{align}
Var(y_j) = \frac{1}{2} n^{(l)} Var(w_{ji}) Var(x_i)\tag{3.8}
\end{align}

よって$\frac{1}{2}n^{(l)}Var(w_{ji}) = 1$とすれば,入出力の分散を一定に保てる.したがって,He初期化では,以下の分散値になるよう,ガウス分布をスケーリングする:

\[ Var(w_{ji}) = \frac{2}{n^{l}}\tag{3.9}\]

ちなみに,[He et al., 2015] は,ReLU [Nair and Hinton, 2010]の発展型の,PReLU (Parametric Rectified Linear Units) も提案しており,DL界隈の重要論文の1つであると言える(※ ちなみに重み初期化同様に,PReLUも勾配消失を防ぐ).

4.2 バッチ正規化も使うと,重み初期化は役にあまり立っていない?

He初期化の論文と同時期に「バッチ正規化」が,CNNむけに提案された [Ioffe and Szegedy, 2015].He初期化 [He et al., 2015] の脚注4でも,「並行研究であるバッチ正規化も,同程度の画像認識性能を示した」と言及しているように,重み初期化と目的・性能の両面で似ている手法である.

また,LSTM/GRUを用いた自然言語処理やTransformerでも,レイヤー正規化(Layer Normalization)[Ba et al., 2016] が使用されている.つまり現在のDNNでは,スクラッチから学習する際に,CNNでもRNNでも,バッチ正規化で学習を安定化・高速化させるのが標準的なアプローチである.

バッチ正規化は,は重み初期化と同じで,DNNの学習安定化・高速化の役割を,学習中「各層でずっと繰り返し調整できる」と言える).この意味で,学習の初期化時だけに行う「重み初期化」よりも,バッチ正規化の方が,学習安定化への貢献度は高いと言えるかもしれない.(あくまで筆者個人の見解であることに注意).

ただし,バッチ正規化の発展型の各論文でも「実験では,重み初期化にはLecun/Xavier/He初期化を使った」とあるだけで,2者間の貢献度比較の議論や実験まではされない(どちらがどれくらい効くかは実験系もつくりづらそうである).

一方,2015年以降は,ResNet残差接続を用いることや,スキップ接続による(U-Netライクな)Encoder-Decoder構造やFeature Pyramid Networkでスキップ接続を用いることなどによっても,CNN・DNNにおける勾配消失問題は解決されるようになってきている.よって,なおのこと学習安定化はどの技術がどのくらい貢献しているかの切り分けは難しくなっており,あまり議論したくないので,両者を比較せずじまいなのかもしれない.残差ブロックやスキップ接続を用いたネットワークで,He重み初期化がどれくらい効いているかについても,現時点(2021年12月)では管理人は詳しくない.

5 まとめ

Xavier重み初期化は,多数の層を持つDNNも,安定して学習できる,DNN向けのランダム正規化初期化テクニックである.初期化ガウス分布を,入・出力ノード数平均値でスケーリングした分散値で初期化する.これにより,順逆伝搬時ともに,活性化層の入出力間で,値の分散がキープできるので,(大きい勾配で)高速に学習でき,なおかつローカル極値で止まらない収束性の良い学習がおこなえるようになった.

また,ReLU層の登場後は,ReLU層に合わせて正規化スケール定数を変更した「He初期化」が標準的に用いられるようになった.ReLUを使用するDNNだと,Xaiver初期化よりもHe初期化の方が,早く収束することができる.

参考書籍

References

  • [Ba et al., 2016] J. Ba, R. Kiros, and G. E. Hinton. Layer normalization. ArXiv, abs/1607.06450, 2016.
  • [Glorot and Bengio, 2010] Xavier Glorot and Y. Bengio. Understanding the difficulty of training deep feedforward neural networks. In Proceedings of International Conference on Artificial Intelligence and Statistics (AISTATS), volume 9, pages 249–256, 2010.
  • [Hanin and Rolnick, 2018] Hanin, B., & Rolnick, D. (2018). How to start training: The effect of initialization and architecture. arXiv preprint arXiv:1803.01719.
  • [He et al., 2015] He, K., Zhang, X., Ren, S., Sun, J.: Delving deep into rectifiers: Surpassing human-level performance on imagenet classification. In ICCV, 2015.
  • [Ioffe and Szegedy, 2015] S. Ioffe and C. Szegedy, “Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift” In ICML , 2015.
  • [LeCun et al., 1998] LeCun, Y., Bottou, L., Orr, G. B., and Mu ̈ller, K. “Efficient backprop.”, (1998) In Neural Networks, Tricks of the Trade.
  • [Nair and Hinton, 2010] Nair, V., Hinton, G.E. Rectified linear units improve restricted Boltzmann machines. In, ICML 2010.

参照外部リンク

関連記事

↓ ためになった方は,記事をSNSでシェアをしてくださると,管理人の記事執筆モチベーションが上がります