キカベン
機械学習でより便利な世の中へ
G検定対策
お問い合わせ
   

更なるテクニック

thumb image

1. 学習目標🔝

ディープラーニングの精度をさらに高めるべく考えられた数々のテクニックを理解する。

  • ドロップアウト
  • 早期終了
  • データの正規化・重みの初期化
  • バッチ正規化

キーワード過学習アンサンブル学習ノーフリーランチの定理二重降下現象正規化標準化白色化

2. データの正規化🔝

2.1. 入力データの正規化🔝

入力データの前処理や正規化はディープラーニングに限らず機械学習全般で必要なものです。例えば、異なる特徴量でデータのスケールに大きな差があるとパラメータにも大きな偏りが生じるのでパラメータの更新が難しくなり学習効率が悪くなります。

各特徴量の範囲を0から1に収めたりしてスケールを合わせるのも一つの方法です。画像処理などでは画素値が0から255と決まっているのでこの方法が当てはまります。

もともとのデータが正規分布に従うものなら標準化を行い、特徴量の平均を0、分散を1の標準正規分布に変換します。

また、白色化という手法もあります。これは各特徴量を無相関化してから標準化します。ただし、単純な標準化よりも計算コストが高いのが難点です。

2.2. バッチデータの正規化🔝

せっかくデータを正規化してもディープニューラルネットワーク内でデータの値が大きく変化すると隠れ層にとっては正規化されていないインプットを受け取ることになるので問題になります。例えばReLUを活性化関数として使っているそうで負の値ばかりが計算されたら勾配消失の問題を招きます。

そこで各層で活性化関数を呼ぶ前に正規化を行います。これをバッチ正規化(batch normalization)と呼びます。バッチ正規化は過学習を防ぐ効果もあると言われています。

3. 重みの初期化🔝

ディープラーニングではニューラルネットワークの重みを調節して損失値を最小にします。初めから重みの最適値はわからないので訓練前のパラメータは通常ランダムな値で初期化します。ただし、一様分布や正規分布からの乱数を用いても必ずしもうまくはいきません。各層のニューロンの数や使用する活性化関数によって重みの初期化を変えるなどの工夫が必要です。

重みの初期化によって入力データがどのように複数の層を伝播していくかが決まります。これは各層における重みの平均と分散がその層からの出力値の平均と分散に影響を与えるからです。

例えば、重さが小さい値ばかりだと入力値の分散が層を伝播するごとに小さくなりシグナルや特徴量としての意味が無くなります。逆に重さが大きい値ばかりだと入力値の分散が層を伝播するごとに大きくなり活性化関数によっては問題を起こします。

つまり、入力値を正規化しても重みの初期化が良くないと勾配消失が起こりやすくなります。逆に言うと、入力値の分散と出力値の分散が初期化の段階であまり大きく異ならないことが望まれます。

このような理由から重みの初期値を工夫する研究が行われました。そして、シグモイド関数・tanh関数にはXavierの初期値、ReLU関数に対してはHeの初期値が提案されました。

3.1. Xavierの初期値🔝

Xavierの初期値では以下の仮定がなされています。

  • 各層で重さも入力データも平均が0になっている。
  • 重さと入力データは独立同一分布になっている。
  • バイアスは0に初期化される。
  • 活性化関数は入力値が0の近辺でほぼ線形である(例:シグモイド関数tanh関数

特に最後のポイントが重要です。重さが小さすぎると層からの出力値がほぼ線形になるので非線形の活性化関数を使う意味が無くなります。また、重さが大きすぎるとシグモイド関数やtanh関数の勾配がほぼ0になり勾配消失を生じます。

ある層への入力値を$x_1, x_2, …, x_n$、その層のあるニューロンの重さを$w_1, w_2, …, w_n$、バイアスを$b$、活性化関数を適用する前のニューロンの出力の一つを$y$とします。

$y = w_1 x_1 + w_2 x_2 + … + w_n x_n + b$

$y$の分散を計算します。

$var(y) = var(w_1 x_1 + w_2 x_2 + … + w_n x_n + b)$

各層で重さも入力データも独立分布なので、$w_i x_i$の分散が以下のように計算できます(独立変数の積の分散)。

$var(w_i x_i) = E(x_i)^2 var(w_i) + E(w_i)^2 var(x_i) + var(x_i) var(w_i)$

ここで$E(x_i)$と$E(w_i)$は0と仮定されているので以下のように簡略化されます。

$var(w_i x_i) = var(x_i) var(w_i)$

また、バイアス$b$は固定値なので分散は0です。よって、$y$の分散はすべての$w_i x_i$の分散を合計で決まります。

$var(y) = \sum\limits_{i=1}^n var(x_i) var(w_i)$

すべての$x_i$と$w_i$は同一分布なのでさらに簡略化されます。

$var(y) = n \, var(x_i) var(w_i)$

ここで$i$は1から$n$のどれでも同じです。

$y$の分散を$x_i$の分散と同じにしたいとすると、

$n \, var(w_i) = 1$

となればよく、すべての$i$に対して

$var(w_i) = \frac{1}{n}$

が導かれます。

まとめると、Xavierの初期値は前層からのノード数が$n$個であるとき、平均0、標準偏差$\frac{1}{\sqrt{n}}$である正規分布から初期値を生成します。これによって各層の入力値と出力値が(少なくとも初期化した段階では)近い分布を持つことを期待しています。

3.2. Heの初期値🔝

ReLUではXavierの初期値と同じ仮定が使えません。特に最後のポイントが変わります。ReLUを通すと平均が0の分散は半減します。よって、各層の入力値と出力値の分布を近づけるにはXavierの初期値による分散の2倍にする必要があります。

つまり、Heの初期値では標準偏差に$\sqrt{\frac{2}{n}}$を使います。直感的に考えると分散を2倍にすることでReLUによる勾配消失を避けているとも言えます。

4. 過学習を防ぐ方法🔝

勾配消失問題や鞍点回避などと並んで、機械学習で重要な問題は過学習です。特にディープニューラルネットワークは複雑な関数を表現でき訓練データに過剰適応してしまいがちなので、より過学習を避ける努力が必要となります。

過学習を防ぐ方法には重さの正則化以外に次のような手法があります。

4.1. ドロップアウト🔝

ドロップアウト(dropout)は過学習を避けるための手法です。学習のバッチごとに毎回ランダムに一部のニューロンを除外します。こうすることで毎回異なるネットワークの構成になり、アンサンブル学習と同様の効果が得られます。

4.2. 早期終了🔝

早期終了(early stopping)は過学習が進む前に訓練を終了させる手法です。ディープニューラルネットワークは強力な関数なので学習を続けるほと訓練データの特徴を取り入れてしまいます。訓練誤差がまだ減少しているのに検証用データからの誤差は減らないか増えたりした場合、過学習が起きていると考えられます。

早期終了では検証データからの誤差が上がり始めたところで訓練を終了させます。エポックごとにモデルの重さと精度を記録しておけば、検証誤差が最低のモデルを選ぶことができます。

この手法はとても単純で、ジェフリー・ヒントンが「Early stopping (is) beautiful free lunch(早期終了は素晴らしいフリーランチだ」といったと言われています。これはノーフリーランチの定理No free lunch theorem)の「どのような問題でも最適な手法は存在しない」を意識して言われた言葉です。どんな手法にも暗黙の了解やバイアスが存在するのですべての問題で最適にはなり得ない。つまり、何かを犠牲にしたりコストがある。しかし、早期終了はどんな問題にも通用するしコストもない。そのくらい便利だと言いたかったのでしょう。

ただし、検証誤差が一旦上がった後、また下がるという二重降下現象(double descent phenomenon)も確認されているので訓練を止めるタイミングには注意が必要です。



コメントを残す

メールアドレスは公開されません。