いものやま。

雑多な知識の寄せ集め

ニューラルネットワークについて学んでみた。(その5)

昨日は誤差逆伝播法について説明した。

今日は学習を行うときの工夫について。

過適合

ニューラルネットワークの学習で実現したいのは、まだ見ぬデータに対して正しい推定を行えるようにすること。
そのために、訓練データを使って学習をしている。

けれど、訓練データに適合しすぎて、まだ見ぬデータに対しては誤差が大きくなってしまうということが起こる。
これを、過適合や過学習という。

過適合が起きていないか確認するためには、データを訓練データとテストデータに分けて、学習は訓練データだけを使い、テストデータの誤差を確認すればいい。

訓練データに対する誤差を訓練誤差、テストデータに対する誤差をテスト誤差と呼ぶ。
そして、訓練誤差、テスト誤差がどのように変化しているかを表したグラフを、学習曲線という。

一般に、訓練誤差の学習曲線は、単調に減少していく。
一方、テスト誤差の学習曲線は、途中から乖離したり、場合によっては増加し始めるということも起きる。
その場合、過適合が起こっていると考えられる。

過適合が起こってしまうと、それ以上の学習は意味がないので、学習を打ち切ることになる。
これを、早期終了や早期打ち切りという。

過適合を起こさないようにするために、いろいろな工夫が考えられている。

データに関する工夫

データの正規化

訓練データに偏りがないようにする方法を、データの正規化という。

まず、訓練データの平均  \overline{ \boldsymbol{x} } を次のように求める:

 {\displaystyle
\overline{ \boldsymbol{x} } = \frac{1}{N} \sum_{n=1}^N \boldsymbol{x}_n
}

そのあと、訓練データを次のようにして、平均が0になるようにする:

 {\displaystyle
\boldsymbol{x}_n \leftarrow \boldsymbol{x}_n - \overline{ \boldsymbol{x} }
}

さらに、次のようにして、各成分ごとの標準偏差を求める:

 {\displaystyle
\sigma_i = \sqrt{ \frac{1}{N} \sum_{n=1}^N \left( x_{n, i} - \overline{x_i} \right)^2 }
}

そのあと、次のようにして、分散が1になるようにする:

 {\displaystyle
x_{n, i} \leftarrow \frac{ x_{n, i} - \overline{ x_i } }{ \sigma_i }
}

この正規化されたデータを使って、学習を行っていく。

なお、テストデータを使って誤差を確認するときも、テストデータに対して同じ変換を行ってから使うことになる。
(変換のときに必要になる平均や標準偏差は、当然、訓練データの値を使うことに注意)

データ拡張

訓練データの数が少ない場合、水増しを行う。

画像処理の場合、画像を平行移動したり、水平/垂直に反転させたり、回転させたり、ランダムノイズを入れたりする。

重みに関する工夫

重みの初期値

重みの初期値は、ガウス分布  \mathcal{N} (0, \sigma^{2}) に従ってランダムに生成した値を用いるのが一般的。

標準偏差  \sigma をどのような値にするかについては、入力  \boldsymbol{x} が正規化されている(=分散が1)として、重みと入力の内積の分散を  \sigma_{u}^{2} としたい場合、

 {\displaystyle
\sigma = \frac{ \sigma_u }{ \sqrt{ M } }
}

とすればいい。
ただし、 M は、ユニットの入力側の結合数。

重みの制約

ネットワークの自由度が高いと、過適合が起こりやすいと考えられる。
そこで、学習時に重みの自由度を制限する方法が考えられている。
これを正則化という。

正則化には、重み減衰や重み上限という方法がある。

重み減衰では、誤差関数に重みの二乗和を加える:

 {\displaystyle
E (\boldsymbol{w}) = \sum_{n=1}^N E_n (\boldsymbol{w}) + \frac{\lambda}{2} \| \boldsymbol{w} \|^2
}

 \lambda正則化の強さを制御するパラメータで、0.1〜0.00001程度にするらしい。
(幅広すぎだろと思うけど・・・)

これにより、重みの大きさを出来るだけ小さいものにしようという制御が働くことになる。

また、重み上限では、各ユニットの重みのサイズに上限を与える。
すなわち、ある定数  c に対して、すべてのユニットの重みが次の条件を満たすようにする。

 {\displaystyle
\boldsymbol{w}_j {}^{\mathrm{T}} \boldsymbol{w}_j < c
}

この条件が満たされていないユニットの重みについては、1未満の定数を掛けて、この条件を満たすようにする。

学習に関する工夫

学習係数の決め方

学習係数の決め方として、AdaGradという方法がある。

この方法では、 t 回目の学習の誤差関数の勾配を  \boldsymbol{g}_t = \nabla E としたとき、 i 成分の更新量を次のようにする:

 {\displaystyle
- \frac{ \varepsilon }{ \sqrt{ \sum_{t'=1}^{t} g_{t', i}^2 } } g_{t, i}
}

こうすることで、学習した回数の多い成分は分母が大きくなっていくので、学習係数が徐々に小さくなっていくことになる。

ドロップアウト

ある層のユニットを、学習時に  p \: (0 \lt p \lt 1) の割合だけランダムに使うようにする方法を、ドロップアウトという。
これにより、ユニットの学習が平均化され、推定の精度が向上すると考えられる。

ドロップアウトを行って学習を行った場合、実際にそのネットワークを使うときに、その層の出力をすべて  p 倍する必要がある。
これは、ドロップアウトしたときのその層の出力は、すべてのユニットを使ったときの出力の  p 倍になってしまっているので、すべてのユニットを使ったときにはドロップアウトしたときの出力の  \frac{1}{p} 倍になってしまっているから。

モメンタム

収束性能を向上させる方法の一つとして、モメンタムを使う方法がある。

これは、前回の重みの修正量を  \Delta \boldsymbol{w}^{(t-1)} としたとき、今回の重みの修正量  \Delta \boldsymbol{w}^{(t)} を、次のようにする方法:

 {\displaystyle
\Delta \boldsymbol{w}^{(t)} = - \varepsilon \nabla E + \mu \Delta \boldsymbol{w}^{(t-1)}
}

なお、 \mu はモメンタムの強さを制御するためのパラメータで、0.5〜0.9程度にするらしい。

モメンタムを使うと、誤差関数が谷のようになっている場所での探索が効率的になる。

今日はここまで!

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)