ディープラーニングを学び始めると、「過学習(Overfitting)」という壁に突き当たることがよくあります。モデルが学習データを記憶しすぎてしまい、新しい未知のデータに対してうまく性能を発揮できなくなる現象です。この厄介な問題を解決する強力な手法の一つが、今回解説する「L2正則化」です。
そもそも「過学習」とは?
L2正則化を理解する前に、まずは「過学習」について簡単におさらいしましょう。
過学習とは、機械学習モデルが訓練データに過剰に適合(学習)しすぎて、訓練データでは非常に高い精度を出すものの、実世界の未知のデータ(テストデータ)に対しては予測精度が大幅に低下してしまう状態を指します。 これは、モデルがデータの本質的なパターンではなく、訓練データ特有のノイズや偶然のパターンまで学習してしまうために起こります。
例えるなら、試験勉強で過去問を丸暗記した生徒が、少し捻られた応用問題が出ると全く解けなくなる状態と似ています。 この過学習を防ぎ、どんなデータにも対応できる能力(汎化性能)を高めることが、実用的なAIモデル開発において非常に重要です。
L2正則化の仕組み
L2正則化は、過学習を抑制するための代表的な手法の一つです。 その基本的な考え方は、「モデルの複雑さにペナルティを課す」というものです。
具体的には、モデルの性能を評価する「損失関数」に、「正則化項」と呼ばれるペナルティ項を追加します。 L2正則化の場合、この正則化項は「すべての重み(パラメータ)の2乗和」で計算されます。
新しい損失関数 = 元の損失関数 + λ × (すべての重みの2乗の合計)
ここでいう「重み」とは、モデルが学習するパラメータのことで、入力データが予測結果にどれだけ影響を与えるかを示す数値です。「λ(ラムダ)」は正則化の強さを決めるハイパーパラメータで、この値が大きいほどペナルティが強くなります。
この仕組みにより、モデルは損失関数を最小化する際に、元の損失(予測の誤差)を小さくするだけでなく、同時に重みの値も小さく保つように学習を進めます。重みの値が大きくなるほどペナルティが課されるため、特定の入力データに過剰に反応するような、極端に大きな重みを持つことを防ぎます。 結果として、モデルが滑らかになり(複雑さが抑制され)、過学習が起こりにくくなるのです。
もう一つの名前:リッジ回帰
L2正則化は、特に線形回帰モデルに適用された場合、「リッジ回帰(Ridge Regression)」という名前で呼ばれることがあります。 リッジ回帰は1970年に発表された歴史ある手法で、統計学の分野で広く利用されてきました。
リッジ回帰は、説明変数間に強い相関がある状態(多重共線性)の問題を緩和する効果もあります。 このように、L2正則化とリッジ回帰は、使われる文脈(ディープラーニングか線形回帰か)によって呼び方が変わることがありますが、本質的には同じ考え方に基づいた手法です。
L1正則化との違い
正則化には、L2の他にも「L1正則化」という代表的な手法があります。 L1正則化は「Lasso回帰」とも呼ばれます。 両者は過学習を抑制するという目的は同じですが、ペナルティの与え方に違いがあり、それがモデルの挙動に異なる影響を与えます。
項目 | L2正則化 (リッジ) | L1正則化 (Lasso) |
---|---|---|
正則化項 | 重みの2乗和 | 重みの絶対値の和 |
重みへの影響 | 重みを全体的に0に近づけるが、完全に0にはなりにくい。 | 不要な特徴量の重みを完全に0にすることがある。 |
特徴 | 全ての入力特徴量を考慮しつつ、モデルを滑らかにする。 | 不要な特徴量を自動的に取り除く「特徴選択」の効果がある。 |
主な用途 | 汎化性能の向上、過学習の抑制。ディープラーニングで一般的に使われる。 | 特徴選択を行いたい場合、モデルを解釈しやすくしたい場合。 |
TensorFlow/Kerasでの実装例
ディープラーニングのフレームワークであるTensorFlowのKeras APIを使えば、L2正則化は非常に簡単に実装できます。 各層の引数にkernel_regularizer
を追加するだけです。
import tensorflow as tf
from tensorflow.keras import layers, models, regularizers
# モデルを定義
model = models.Sequential([ # 入力層と中間層にL2正則化を適用 # regularizers.l2(0.001) の数値が正則化の強さ(λ) layers.Dense( 64, kernel_regularizer=regularizers.l2(0.001), activation='relu', input_shape=(100,) ), layers.Dense( 64, kernel_regularizer=regularizers.l2(0.001), activation='relu' ), # 出力層 layers.Dense(10, activation='softmax')
])
# モデルのコンパイル
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.summary()
上記のコードでは、Dense
レイヤー(全結合層)のkernel_regularizer
引数にregularizers.l2(0.001)
を指定しています。 これだけで、モデルの学習時にL2正則化が適用され、重みが大きくなりすぎるのを防いでくれます。
まとめ
L2正則化は、ディープラーニングにおける過学習を防ぐための基本的かつ非常に強力なテクニックです。
- 目的: モデルが訓練データに過剰に適合する「過学習」を防ぎ、汎化性能を高める。
- 仕組み: 損失関数にペナルティとして「重みの2乗和」を追加し、重みが大きくなるのを抑制する。
- 特徴: 重みを全体的に小さく保つことで、滑らかで複雑すぎないモデルを構築する。
- 別名: 線形回帰では「リッジ回帰」とも呼ばれる。
モデルの学習がうまくいかない場合や、訓練データでの精度は高いのにテストデータで精度が出ない場合には、L2正則化の導入を検討してみましょう。