学習データの誤差は下がっているのに、検証データの誤差だけが増えていく。ディープラーニング特有の過学習対策を整理します。
こんにちは、zawato(@zawato7)です!
本記事はディープラーニング入門ロードマップの第13回です。
- ディープラーニングが過学習しやすい理由と、代表的な4つの対策
- ドロップアウトとバッチ正規化のしくみと効果
- 重み減衰・早期終了の使い方と、二重降下現象という落とし穴
なぜディープラーニングは過学習しやすいのか
表現力が高いモデルほど、学習データをそのまま覚えてしまうからです。過学習は学習データに合わせすぎて未知データでの精度が落ちる状態で、学習データの誤差が下がる裏で検証データの誤差が増え始めるのがサインです。ディープラーニングは層もノードも多く、パラメータが桁違いに多いため、これが起きやすいのです。
そこで、構造や学習の進め方に手を入れる次の4つの対策が使われます。
| 対策 | やること |
|---|---|
| ドロップアウト | ノードを一定の割合でランダムに無効化する |
| バッチ正規化 | 層の途中でデータの分布を整える |
| 正則化(重み減衰) | 重みが大きくなりすぎないよう罰則を与える |
| 早期終了 | 検証データの誤差が増え始めた時点で打ち切る |
ドロップアウト|ノードをランダムに無効化する
学習のたびに一部のノードを使わないことで、特定の経路に頼りすぎるのを防ぎます。無効化するノードはミニバッチごとにランダムに選び直されるので、全体ではどのノードも学習されます。ノード数が50や100あれば少々減っても問題ありません。
結果として、少しずつ形の違うネットワークをいくつも学習させ、平均を取るのに近い状態になります。これがアンサンブル効果で、過学習が抑えられ精度が上がります。数値データでは特によく使われます。
バッチ正規化|層の途中でデータを整える
ミニバッチごとに平均0・分散1へ揃える処理を、層の途中でも行う手法です。前処理での標準化と同じことを、ネットワークの内部でも行うイメージです。
入れるのは活性化関数の手前が多くなります。学習が進むと層に入るデータの分布がずれ、たとえばReLUでは0以下に偏ると出力が全部0になって学習が止まるためです。手前で平均0にしておけばこれを防げます。学習が速く安定し過学習も抑えられるので、分布の偏りやすい画像ではほぼ必須です。
重み減衰と早期終了|重みを抑える・止めどきを見極める
重み減衰は重みの大きさに罰則をかける方法、早期終了は誤差が悪化する前に学習を止める方法です。重み減衰はL2正則化にあたり、重みの2乗をペナルティとして加えて値が大きくなりすぎないようにします。効き具合は係数次第で、小さすぎれば過学習が収まらず、大きすぎれば未学習になります。
早期終了は、検証データの誤差が増え始めた時点で学習を打ち切ります。とはいえその瞬間は分からないため、5エポック改善しなければ打ち切るといった条件を決めておき、悪化前の状態を最終的なモデルとします。
ただし、一度増え始めた誤差がその後ふたたび下がり始めることがあります。これを二重降下現象と呼び、打ち切りのタイミングは慎重に判断しましょう。
まとめ
- ディープラーニングはパラメータが多く過学習しやすい。対策はドロップアウト・バッチ正規化・重み減衰・早期終了の4つが代表格
- ドロップアウトはノードをランダムに無効化してアンサンブル効果を生む。バッチ正規化は層の途中で平均0・分散1に揃える(名前は正規化、中身は標準化)
- 重み減衰は重みの2乗を罰則に加えるL2正則化。早期終了は悪化前に打ち切るが、二重降下現象があるため慎重に
よくある質問
Q. ドロップアウトはどのくらいの割合でノードを無効化するのですか?
A. 0.5前後がよく使われますが、割合は人が決めるハイパーパラメータです。無効化されるのは学習中だけで、推論時はすべてのノードを使います。
Q. 重み減衰とL2正則化は別のものですか?
A. 同じものを指します。重みの2乗をペナルティとして加える手法で、重みを小さく保つ働きから重み減衰とも呼ばれます。
Q. 対策は1つだけ選ぶのですか?
A. 併用するのが普通です。バッチ正規化にドロップアウトや重み減衰を重ね、早期終了で打ち切るというように組み合わせます。



コメント