【Kerasリファレンス】正則化(regularization)とドロップアウト(Dropout)

2024年8月20日

ドロップアウト
イラスト出展:OpenAI dall-e-3

初めに

ディープラーニングの正規化とドロップアウトについて説明するね。

Kerasのディープラーニングで利用できる正規化(regularization)とドロップアウト(Dropout)について纏めました。

※ この記事はディープラーニングおよびKerasの知識がある方向けのリファレンスになります。

正則化とドロップアウトとは

正則化とドロップアウトはどちらもニューラルネットワークの過学習(オーバーフィッティング)を防ぐために使用される手法です。

過学習(オーバーフィッティング)とは

過学習(オーバーフィッティング)とは、機械学習モデルが訓練データに対して非常に高い精度を示す一方で、未知のデータ(テストデータや新しいデータ)に対して低い精度を示す現象を指します。過学習は、モデルが訓練データのノイズや詳細なパターンを過度に記憶してしまい、一般化能力が低下することが原因です。

分かり易く言うと、写真を見てAさんの顔を覚えたとして、ちょっとでも太っちょになっていたら、もうその人をAさんと見分けられないということです。厳密に覚えすぎて融通が利かない状態が過学習状態の問題です。

過学習
出展:OpenAI dall-e-3

過学習が起きる原因

  • データ量の不足
    訓練データが少ない場合、モデルはデータのノイズや例外に適応しやすくなります。

  • モデルの複雑さ
    過度に複雑なモデルは、訓練データの詳細なパターンを学習し、汎化能力が低下します。

  • 不適切な正則化
    正則化が不足していると、モデルが過度に訓練データに適応してしまいます。

過学習の防止方法

過学習を防ぐための一般的な方法を以下に示します。

  • データの増加
    訓練データの量を増やすことで、モデルがより一般的なパターンを学習できるようになります。

  • モデルの簡略化
    モデルのパラメータ数を減らし、過度に複雑な構造を避ける。

  • 正則化、ドロップアウト
    モデルの複雑さを制約することにより、より良い汎化性能を実現する方法です。

過学習の対策として、「データの増加」と「モデルの簡略化」はイメージが付きやすいと思いますが、「正則化」と「ドロップアウト」は聞きなれない言葉かもしれませんので、次節より詳しくご説明致します。

正則化(regularization)とは

正則化は、ニューラルネットワークの重みに対してペナルティを加えることで過学習を防ぐ手法です。正則化にはL1正則化、L2正則化など幾つかの手法があります。

正則化

L1正則化(Lasso)

モデルの重みの絶対値の合計にペナルティを加えます。重みの一部をゼロにする傾向があり、特徴選択の効果があります。
L1正則化

L2正則化(Ridge)

モデルの重みの二乗の合計にペナルティを加えます。重みが大きくなりすぎないようにすることで、過学習を防ぎます。
L2正則化

Elastic Net

L1正則化とL2正則化を組み合わせた手法です。両方のペナルティを組み合わせることで、特徴選択と重みの制限の両方の効果を持ちます。

ドロップアウト(Dropout)とは

ドロップアウトも過学習を防ぐために使用される手法です。ドロップアウトは、訓練時に指定された割合(例えば50%)でランダムにニューロンを無効にします。無効にされたニューロンは、その訓練ステップでは重み更新に寄与しません。これにより、ネットワークは様々なニューロンの組み合わせで訓練されるため、特定のニューロンや特徴に過度に依存することがなくなります。推論時(評価や予測時)には、すべてのニューロンが有効になり、各ニューロンの出力がDropout率でスケーリングされます。

ドロップアウト

正則化とドロップアウトの実装方法

L1正則化(Lasso)

from keras.regularizers import l1
model.add(Dense(64, input_dim=100, activation='relu',
  kernel_regularizer=l1(0.01)))

L2正則化(Ridge)

from keras.regularizers import l2
model.add(Dense(64, input_dim=100, activation='relu',
  kernel_regularizer=l2(0.01)))

Elastic Net

from keras.regularizers import l1_l2
model.add(Dense(64, input_dim=100, activation='relu',
  kernel_regularizer=l1_l2(l1=0.01, l2=0.01)))

ドロップアウト(Dropout)

from keras.layers import Dropout
model.add(Dense(64, activation='relu', input_dim=100))
model.add(Dropout(0.5))

Kerasリファレンス

Kerasの詳しい使い方は本家の以下ページを参照下さい。
https://keras.io/api/

Keras

最後に

本記事がAIの理解に少しでもお役に立てば幸いです。機械学習など分かり易く記事にしていきますので今後とも宜しくお願いします。

一緒に楽しくAIについて学びましょう。

※ 本サイトの記事はより伝わり易い様にAIによりチェック・一部修正をしてます。