nykergoto’s blog

機械学習とpythonをメインに

ニューラルネットにおける変数の初期化について

最近 keras をつかって色々とやることにはまってます。

tensorflow や chainer と比較して keras だとネットワーク記述から fit までが完結に記述できてとても気に入っています。 そのときにドキュメントや実装を読んだりもしますが、ネットで自分がやりたいタスクで検索をかけて似たようなことをやっている人のコードを参考にしています。

その時、keras レイヤーの重みの初期化の引数に he_normal というのを指定しているのを見かけました。
ドキュメントを参照すればこの関数の定義式自体はわかりましたが、この関数が何をやってるのか、なぜこの関数にするとうれしいのか、平均0分散1のガウス分布ではだめなのか、ということがわからず困ってしまいました。

ニューラルネットワークにおける変数の初期化の方法について全く知らなかったので、ちょうどいい機会とおもい各種論文を読んでみたので、その内容をまとめていきます。

黎明期

黎明期、という言い方はあれかもしれませんが、まだ relu も登場していない時代の話から始めます。 この頃は、ヒューリスティックに以下のような分布が一般に用いられていたようです。

$$ W_{j, k}^{i} \sim U \left[ - \frac{1}{\sqrt{n_i}}, \frac{1}{\sqrt{n_i}} \right] $$

ここで $W_{j,k}$ は 第 $i$ レイヤーの重みの $(j, k)$ 成分、 $U[-a, a]$ は下限 $-a$, 上限 $a$ の一様分布, $n_i$ は第 $i$ 番目の隠れ層の数を表しています。またバイアス項はすべて 0 とします。

この関数をどのぐらい積極的に使っていたのかは、その当時に僕が機械学習をやっていなかったのでわかりませんが、んとなくこういう分布が経験的によいと知られていたのでしょうか。

この経験則に対し、活性化関数が linear なときという仮定のもとで議論を行い、新しい重みの分布の提案を行った論文が Understanding the difficulty of training deep feedforward neural networks で、これは今では一般に Glorot の一様分布と呼ばれているものです。

Glorot の一様分布 (Glorot Uniform)

Glorot の一様分布と呼ばれている初期化の方法では、第 $i$ 番目のレイヤーに対して以下のような分布から重みを選びます。

$$ W \sim U \left[ -\frac{ \sqrt{6}}{\sqrt{n_i + n_{i+1}} }, \frac{ \sqrt{6}}{\sqrt{n_i + n_{i+1}} } \right] $$

ここで $n_i$ は第 $i$ 番目の隠れ層の数を表します。 これだけ言われても「その6どこからきたの?」とかいろいろ聞きたいことがありますよね。 以下では提案論文を元に、なぜこの分布が導出されたかを追っていきましょう。

導出

ニューラルネットワーク上の第 $i$ 番目のレイヤーについて考えます。 第 $i$ レイヤーの活性化関数を $f$, レイヤーへの入力ベクトルを $x^i \in {\mathbb R^{n_i}}$, 活性化関数を通す前の出力ベクトルを $y^i \in \mathbb R^{n_{i+1}}$, レイヤーの重みを $W^i \in \mathbb R^{n_{i+1}, n_{i}}$ とします。ここで $n_i \in \mathbb N$ は第 $i$ レイヤーの入力次元を表しています。 以上の定義を用いると、以下の関係が成り立ちます。

$$ y^{i} = W^{i} x^i + b^i \\ x^{i+1} = f(y^i) $$

つぎにネットワークの学習について考えたいので、backpropagation で必要とされるネットワークの誤差 $C$ に対する偏微分を考えていきます。すると以下を得ます。

$$ \frac{\partial C}{\partial y_j^i} = f'(y_k^i) W_j^{i+1} \frac {\partial C}{\partial y^{i+1}} \\ \frac{\partial C}{\partial w_{j, k}^i} = x_k^i \frac{\partial C}{\partial y_j^i} $$

ここで、初期化された段階において, 活性化関数は線形性を持っていて, 重みは独立に初期化されていて, 入力変数はすべて同じ分散 ($Var[x]$) を持つ, という仮定を加えます。

すなわち活性化関数に関しては $f(x) = x, f'(0) = 1$ が成り立っている, ということを意味します(これは yigmoid や tanh など原点対称な活性化関数で成り立ちます)。 また重みに関しては独立に初期化されているので, 第$i$ 層の重みに対して $Var[w^i_{j, k}]$ が一定です。これを以下では $Var[W^i]$ と表記します。

このとき第 $i$ 層の出力の分散 $Var[x^i]$ を考えてみましょう. はじめに第 $i+1$ のレイヤと $i$ における $Var[W^i]$ の関係性を考えると

$$ \begin{aligned} Var[x^{i+1}] &= Var[f(y^i)]\\ &= Var[y^i] \\ &= Var[W^i x^i + b^i] \\ &= Var[W^i x^i] + Var[b^i] \\ &= n_i Var[W^i] Var [x^i] \end{aligned} $$

となります. これを繰り返し用いると

$$ Var[x^i] = Var[x] \prod_{l=0}^{i-1} n_{l} Var[W^l] $$

を得ます。 したがって全てで $d$ 層あるネットワークにおいては, 第 $i$ 層の出力に対する微分について以下が成立します。

$$ \begin{aligned} Var \left[\frac{\partial C} {\partial y^i} \right] &= Var\left[f'(y_k^i) W_j^{i+1} \frac {\partial C}{\partial y^{i+1}} \right] \\ &= n_{i+2} Var\left[W^{i+1} \right] Var \left[\frac {\partial C}{\partial y^{i+1}} \right] \\ &= \left( \prod_{l=i}^{d} n_{l+1} Var[W^l] \right) Var\left[ \frac{\partial C}{\partial y^{d}} \right] \end{aligned} $$

また重みに対する微分に対して、以下が成立します。

$$ \begin{aligned} Var \left[ \frac{\partial C}{\partial W^i} \right] &= Var\left[x_k^i \right] \times Var \left[ \frac{\partial C}{\partial y_j^i} \right] \\ &= Var[x] \prod_{l=0}^{i-1} n_{l} Var[W^l] \times \left( \prod_{l=i}^{d} n_{l+1} Var[W^l] \right) Var\left[ \frac{\partial C}{\partial y^{d}} \right] \end{aligned} $$

今度は、ネットワークの出力の伝搬について考えて行きます。 出力の伝搬のとき、各レイヤーを通してもその出力は無限に発散したり、0に減衰したりするとただしくロスを計算できないため困ります。その為各レイヤーの出力 $x^i$ は同じ分散を持つことが好ましいです。つまり

$$ \forall (i, i'), Var[x^i] = Var[x^{i'}] $$

が成り立っていてほしい、ということになります。 また逆伝搬についても同様に

$$ \forall (i, i'), Var\left[ \frac{\partial C}{\partial y^i}\right] = Var\left[ \frac{\partial C}{\partial y^{i'}}\right] $$

がなりたっている必要があります。 これらを先の方程式に代入すると以下の条件に変形できます。

$$ \forall i, n_i Var[W^i] = 1 \\ \forall i, n_{i+1} Var[W^i] = 1 $$

この2つの条件の中間をとろう、というのが Glorot の提案する分布です。すなわち

$$ \forall i,\ Var\left[W^i \right] = \frac{2}{n_i + n_{i+1}} $$

を満たすような確率分布から重みを初期化します。 ではこのような分散を持つような一様分布とはどんな分布でしょうか、というのに答えるのが、この章の先頭に示した分布です。再掲すると以下の分布でした。

$$ W \sim U \left[ -\frac{ \sqrt{6}}{\sqrt{n_i + n_{i+1}} }, \frac{ \sqrt{6}}{\sqrt{n_i + n_{i+1}} } \right] $$

$[-a, a]$ の範囲の一様分布の分散は $ a^2/3 $ ですから

$$ \frac{1}{3} \left(\frac{ \sqrt{6}}{\sqrt{n_i + n_{i+1}}} \right)^2 = \frac{2}{n_i + n_{i+1}} $$

となって、ピッタリさきの分散に一致するように選ばれています。 一見どこから来たかわからない 6 という数字にも意味があったのですね。

一様分布以外にも, この分散を取り平均が 0 であるガウス分布 (Glorotのガウス分布) も提案されています。

まとめ

Glorot の分布の議論の仮定、特徴をまとめると以下のようになります。

  • 活性化関数が原点対称かつ原点周りで線形であることを仮定して議論
  • 順伝搬, 逆伝搬で各層の値がおなじになる、ということを制約としている
  • $i$ 番目のレイヤーの初期重みを $2 / (n_i + n_{i+1})$ を分散に持つような分布から選ぶ

問題点

きれいに片付いたかに見えた初期化分布問題ですが、Glorot は活性化関数に大きな仮定をおいていました。それは

  • 原点対称である
  • 原点付近で線形である

ということでした。 またネットワークの構造についても全結合のネットワークが対象であり CNN のようなカーネルを用いたレイヤーは想定されていません。 というわけで relu とか CNN で解析してみたよ、というのが次に紹介する He の正規分布と呼ばれているものです。*1

He の正規分布 (He normal)

He の正規分布は第 $i$レイヤーの初期重みを 平均0, 分散 $2/n_i$ の正規分布から設定します。 すなわち

$$ Var[W^i] = \frac{2}{n_i} $$

を満たします。 この分散を持つべき理由を導出していきましょう。

導出

まずネットワークの順伝搬 (Forward Propagation) について考えていきます。 第 $i$ 層の CNNの出力は

$$ y^i = W^i x^i + b^i $$

と書くことができます。 ここで $x \in \mathbb R^{c k^2}$ は $c$ チャネルの $(k, k)$のピクセルを持つ入力です (以下では簡易化のため $n = c k^2$ と記述します)。 また $W \in \mathbb R^{d, n}$ は各行がフィルタの重みとなるような $d$ のフィルタを表します。 $b \in \mathbb R^n$ はバイアス項, $y\in \mathbb R^d$ は出力マップの値です。 $f$ を活性化関数とすると

$$ x^{i+1} = f(y^i) $$

が成り立ちます。 ここでつぎの3つを仮定として加えます。

  • バイアス $b$ は 0 とする。
  • $x^i$ の各要素が独立同分布である
  • $x^i$ と $W^i$ の各要素は独立である。
  • $W^i$ の分布の期待値は 0 である。

すると

$$ \begin{aligned} Var[y^i] &= Var[W^i x^i + b^i] \\ &= Var[W^i x^i] \\ &= n_i Var[w^i x^i] \\ &= n_i \mathbb E[ (w^i x^i)^2] - n_i \mathbb E [w^i x^i]^2 \\ &= n_i \mathbb E[ (w^i)^2] \mathbb E[ (x^i)^2] - 0 \\ &= n_i Var[w^i] \mathbb E[ (x^i)^2] \end{aligned} $$

と変形できます。 ここで $\mathbb E [x^i]^2$ は $x^i$ の期待値が 0 でない限り分散に一致しません。 というのも $ Var [x^i] = \mathbb E [(x^i)^2] + (\mathbb E [x^i])^2 $ ですから

$$ Var[x^i] - \mathbb E[ (x^i)^2] = (\mathbb E [x^i])^2 \ne 0 $$

となるのです。 これはたとえば活性化関数が relu のときに起こります。 なぜならば relu 関数は $ {\rm relu}(y) = \max (0, y) $ですから $x^i = {\rm relu}(y^{i-1}) = \max (0, y^{i-1})$ となりこれは明らかに期待値が 0 にはなりません.

ここで $w^{i-1}$ が 0 のまわりで対称な分布であったとし、また $b^{i-1} =0$とします。すると $y^{i-1} = W^{i-1} x^{i-1}$ と $W, x$ の独立性の仮定より $y^{i-1}$の各成分は平均 0 の対称な分布となります。 したがって

$$ \mathbb E (x^i)^2 = \mathbb E [\max (0, {y^{i-1}}^2)] = 0 + \frac{1}{2} \mathbb E[(y^{i-1})^2] = \frac{1}{2} Var[y^{i-1}] $$

と変形することができます。 これより

$$ Var[y^i] =\frac{1}{2} n_i Var[w^i] Var[y^{i-1}] $$

を得ます。これを繰り返し用いると第 $L$ 層の出力 $y^L$ の分散は

$$ Var[y^L] = Var[y^1] \left( \prod_{i=2}^L \frac{1}{2} n_i Var[w^i] \right) $$

となります。 この後半の積の部分が 1 でなければ、層が増えていくにしたがって、指数的に無限大に発散もしくは0に収束してしまうことになります。 よってこの部分は 1 にっていることが望ましいです。 したがって

$$ Var[w^i] = \frac{2}{n_i}\ \forall i $$

を満たすような分布を用いて、重みの初期化を行うことが望ましいといえます。 今回は順伝搬についての議論でしたが、逆伝搬に対してもほぼ同様の議論ができ

$$ Var[w^i] = \frac{2}{n^{i+1}}\ \forall i $$

が得られます。 Glorotのときにも同じような結果となったので、まあそうなるよね、といったところでしょうか。 このような分散を満たす分布を keras では he_normal と呼んでいます。 Glorot のときと同様, これの一様分布 version の he_uniform もあったりします。

ちなみに、議論中 relu を通した期待値を計算するところで prelu を用いると以下が得られます。

$$ Var[w^i] = \frac{1}{1 + a^2} \frac{2}{n^i}\ \forall i $$

ここで $a$ は prelu の係数です。 prelu は $a=1$ のとき linear な関数に一致しますが, その時 Glorot のときに出てきた式と一致します。 また $a=0$ のとき prelu は relu と一致し, 初期重みの式も一致しています。

比較

さて大きくわけて2つの初期化分布を紹介しました。 これの違いは単純に分散が二倍ちがうだけです。

$$ \begin{aligned} Glorot&: \frac{2}{n_i + n_{i+1}}\\ He&: \frac{2}{n_i} \end{aligned} $$

対して違わないようですがこの初期化分布のズレは、層を重ねるごとに掛け算されていきますから、指数的に影響を及ぼします。ですから深いネットワークになればなるほど、この違いが顕著に現れるのです。 というのを実験している結果が以下になります。(参考文献 2 Figure 3 より引用)

f:id:dette:20171015120652p:plain:w600
n_layer = 22 のとき

赤いラインが He の正規化を行ったネットワークでの学習を表しています。 青いラインは凡例では Xavier となっていますがこれは Glorot の初期化の別名です。 これを見ると 22 layers のときは He のほうがよさそうですがまあ甲乙つけがたい感じとなっています。 しかしこれが 30 layers になると差が明らかになります。

f:id:dette:20171015120816p:plain:w600
n_layer = 30 のとき

Glorot の初期化では学習が全く進んでいない一方、 He の初期化では epoch 数はかかっているものの、先と同様に学習ができている事がわかります。 このことから層が深くなると初期化の影響が大きくなるという主張がある程度裏付けられた形となっています。 初期化って適当に選んでいましたが、大事なんですね。

まとめ

ざっくりというと以下の事がわかりました。

  • 初期化アルゴリズム Glorot と He は活性化関数に対する仮定が違う
    • Glorot: 原点周りにおいて線形な活性化関数
    • He: relu
  • ちゃんと初期化アルゴリズムを選ばないと、特に深いネットワークの学習を行う際に痛い目をみる

適当に使うとだめってことがわかったので、調べたかいがあったかな?

参考文献

  1. Understanding the difficulty of training deep feedforward neural networks, Xavier Glorot, Yoshua Bengio ; Proceedings of the Thirteenth International Conference on Artificial Intelligence and Statistics, PMLR 9:249-256, 2010.
  2. Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification, Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun

*1:https://arxiv.org/pdf/1502.01852.pdf この論文は活性化関数 prelu の提案論文でもあったりします。