正則化によるニューラルネットワークの訓練

正則化とは,まだ見ていない検証データに一般化しないように訓練データの詳細を記憶する,ディープニューラルネットワーク等の表現力の高いモデルの傾向である過学習を防ぐのに使われる手法である.
Wolfram言語では,正規化を実行する方法が4つある.
過学習
解決策を紹介する前に,簡単な例を使ってこの問題を示す.が薄曲線からノイズの多いサンプルを取ることで合成の訓練データ集合を作成する.次に,これらのサンプルでネットを訓練する.ネットは必要以上の「容量」を持っている.つまり,このネットはガウス曲線をフィットするのに必要なものよりずっと複雑な関数をモデル化することができるということである.実際のモデルの形式が分かっているので,過学習が起こったときは見れば分かる.訓練されたネットはもとのデータの「ノイズを学習」するため,ガウシアンとは全く異なる関数を生成するのである.これは,ガウシアンから2つ目の点の集合を抽出し,その値を予測するようにネットを訓練することによって定量化することができる.訓練されたネットは「正規化することができない」.訓練データには適合したフィットであるが,新しいテストデータをうまく近似しない.
ガウス曲線に基づくノイズの多いデータ集合を作成する:
多数の隠れユニットを含む多層パーセプトロンを作成する:
30秒間ネットを訓練する:
データにノイズがあるにもかかわらず,最終的な損失は非常に低い:
結果のネットは,基本の関数に加えノイズも学習して,データをオーバーフィットする.これを見るために,ネットが学習した関数ともとのデータを一緒にプロットする.
NetTrainResultsObjectからネットを取得する:
オーバーフィットが起きたことを示す,より定量的な方法は,同じ基本の分布のものではあるがネットを訓練するのに使ったものとは異なるデータでネットを検証することである.
検証集合として使う訓練データの2つ目の集合を合成する:
新しい検証集合における平均誤差を測定する関数を作成する:
検証集合の平均損失は訓練集合のものより格段に大きく,オーバーフィットが起きたことを示している:
フィットしたネットは,視覚的に検証のサンプルをうまく説明できない:
検証集合
オーバーフィットを軽減する最初のアプローチは,2つ目の検証データ(訓練に使われたものではない)に対するネットの性能を測定し,訓練履歴全体から検証周到に対して最も性能がよい特定のネットを選ぶというものである.これは,各ラウンドの終了後に検証データに対するネットを測定するValidationSetオプションを使って実行できる.これらの測定値は2つのことを行う.まず,検証損失曲線(分類が実行されいるときは検証誤差曲線)を生成する.また,最低の「訓練」損失ではなく最低の「検証」損失を持つ中間のネットを選ぶよう,訓練が使用する選択プロセスを変更する.
NetTrainValidationSetオプションを使って,実際に取得するネットが確実に検定損失を最小化するようにする.オーバーフィットが起こり始める前の訓練の部分が見やすくなるよう,訓練ラウンドを制限する点に注意のこと:
検定損失は訓練の770ラウンド目辺りで最小値を持つ:
NetTrainResultsObjectから訓練されたネットを抽出し,それをプロットする.ネットが訓練集合のノイズの特異性を記憶し始める前に,NetTrainが効率的にネットのスナップショットを撮ったため,結果はずっと滑らかになる:
結果のオブジェクトは,すべてのランドにおける検定集合に対する平均損失も保存する.選ばれたネットの損失を調べることができる.この損失は,過学習のネットについて計算した損失よりずっと小さい:
早期打切り
過学習を軽減するためによく使われる2つ目の方法は,早期打切りである.これは,ネットの何らかの測定値が悪化し始めたときに訓練を打ち切るというものである.この操作はNetTrainValidationSetオプションと併せてTrainingStoppingCriterionオプションを使うことで実行することができる.これにはValidationSetだけを使う場合よりも有利な点が2つ考えられる.前の例で1300ラウンド余計にネットを訓練した.この場合はネットと訓練データ集合が両方小さいので問題にならなかったが,非常に無駄になる可能性がある,という点が1つである.2つ目は,損失以外の測定値を使って最適なネットを決定した方がよいという点である.
いつ訓練を打ち切るかを決定するのに,決定係数による測定を使う.patienceを20ラウンドにして,訓練プロセスのノイズが原因の打切りを避ける:
NetTrainResultsObjectの訓練済みのネットを抽出して,前と同じようにそれをプロットする:
選ばれたネットに対応する損失を調べる:
重み減衰
3つ目のよくある正則化のテクニックは「重み減衰」と呼ばれるものである.このアプローチでは,ネットの重みの大きさが,各バッチ更新の後わずかに減少し,重みがゼロに近付く.これは重みのL2ノルムに当る損失項を加えることとほぼ同じである.
重み減衰を行うことによって,まだ適切にデータをモデル化する,あるいはデータではなくノイズにフィットすることにより生じた複雑性に対してネットに罰を与える重みの倹約設定を,ネットが探すようにする.
一般に,重み減衰の強さの最適値は事前に導くことが難しいため,適切な値を見付けるために検証集合を使ってハイパーパラメータ検索を実行する.
L2正則化について小さい値でネットを訓練する:
結果のネットはガウシアンに適合しており,もとのオーバーフィットしたネットよりもよい正則化を示している:
ドロップアウト
よく使われる正則化テクニックの4つ目はドロップアウトである.ドロップアウトはネットの隠れ活性化にノイズを導入するが,与えられた層での活性化の全体的な統計量は変化しない.ノイズは非活性化のランダムパターンの形を取る.このとき,入力配列の成分のランダムな集合(通常「ユニット」あるいは「ニューロン」と呼ばれる)がゼロに設定され,残りの成分の大きさが埋め合せのために増大する.基本的な考えは,ドロップアウトはニューロンが,それより下位の層にある特定のニューロンに依存しすぎないようにし,より強力な表現の学習を促進させるというものである.
ドロップアウトはDropoutLayerを使って,あるいはLongShortTermMemoryLayer等の特定の層の「Dropout」パラメータを指定することで,ネットに導入することができる.
ドロップアウトを含む多層パーセプトロンを作成する:
ネットを訓練する:
結果のネットは,容認できるガウシアンのフィットであり,もとの過学習のネットよりもよい正則化であることを示している:
バッチ正規化
5つ目の正則化の方法は,バッチ正規化である.これは,データの平均と分散を学習することによって,入力データを正規化するものである.バッチ正規化は多数の便利な特性を持ち,訓練速度を向上させ正則化を提供する.BatchNormalizationLayerは通常,LinearLayerまたはConvolutionLayerとそのアクティベーション関数との間に挿入される.
BatchNormalizationLayerを含む多層パーセプトロンを作成する:
ネットを訓練する:
結果のネットは,容認できるガウシアンのフィットであり,もとのフォーバーフィットしたネットよりもよい正則化を示している: