ドロップアウト、L1正則化、L2正則化
ドロップアウト(Dropout)、L1正則化、L2正則化とは?
これらはニューラルネットワークの過学習(Overfitting)を防ぐための手法です。
1. ドロップアウト(Dropout)
概要:
- ニューラルネットワークの学習時にランダムに一部のニューロンを無効化(重みを0にする)。
- これにより、特定のニューロンに依存しすぎることを防ぎ、より汎用性の高いモデルを作る。
特徴:
- 訓練時のみ適用され、推論(テスト)時には全てのニューロンが有効になる。
- ニューラルネットワークのアンサンブル学習(多数のモデルを統合して予測精度を向上させる)に似た効果がある。
実装例(PyTorch):
import torch.nn as nn
model = nn.Sequential(
nn.Linear(256, 128),
nn.ReLU(),
nn.Dropout(0.5), # 50%の確率でニューロンを無効化
nn.Linear(128, 64),
nn.ReLU(),
nn.Linear(64, 10)
)
2. L1正則化(Lasso回帰)
概要:
- 損失関数に**重みの絶対値の合計(L1ノルム)**を追加する。
- **スパースなモデル(多くの重みがゼロのモデル)**を作る。
- 特徴選択の効果があり、不必要な特徴量を削除するのに有効。
損失関数への追加項目: LL1=λ∑∣wi∣L_{\text{L1}} = \lambda \sum |w_i|
(λ\lambda は正則化の強さを調整するハイパーパラメータ)
特徴:
- 不要な重みを0にするため、特徴選択にも使われる。
- 学習データの一部の特徴が強く影響する場合に向いている。
- 計算が収束しにくい場合がある(非連続なため、勾配が一定でない)。
実装例(Scikit-learn):
from sklearn.linear_model import Lasso
lasso = Lasso(alpha=0.01) # αが大きいほど正則化が強くなる
lasso.fit(X_train, y_train)
3. L2正則化(Ridge回帰)
概要:
- 損失関数に**重みの二乗の合計(L2ノルム)**を追加する。
- 小さな重みを持つモデルを作る(重みの大きさを制限し、極端な値を防ぐ)。
- 安定した学習と汎化性能の向上に有効。
損失関数への追加項目: LL2=λ∑wi2L_{\text{L2}} = \lambda \sum w_i^2
特徴:
- 重みがゼロにはならず、すべての特徴を活用する。
- 過学習を防ぐのに有効で、数値データが多い回帰問題に適している。
- 計算が安定し、収束しやすい。
実装例(Scikit-learn):
from sklearn.linear_model import Ridge
ridge = Ridge(alpha=0.01) # αが大きいほど正則化が強くなる
ridge.fit(X_train, y_train)
L1とL2の違い
| 正則化 | 計算方法 | 特徴選択 | 適用場面 |
|---|---|---|---|
| L1正則化(Lasso) | 重みの絶対値の合計 | 特徴選択が可能(不要な特徴をゼロにする) | 特徴の数が多いデータ |
| L2正則化(Ridge) | 重みの二乗の合計 | すべての特徴を活用 | 過学習防止・回帰問題 |
どれを使うべきか?
- ドロップアウト → ニューラルネットワークの過学習防止に有効。
- L1正則化 → 不要な特徴を削除したい場合(スパースなモデルを作る)。
- L2正則化 → すべての特徴を使いつつ、過学習を抑えたい場合。
使うべきと判断できるタイミングや方法
適用タイミング
- 過学習が起きる前に適用するのが基本。
- 一般的には、モデルの訓練時(学習フェーズ)に最初から適用する。
なぜ過学習後ではなく、前なのか?
- 過学習が進むと、特定のニューロンの重みが極端に大きくなり、その状態でドロップアウトを適用しても学習のバランスが崩れやすい。
- 初期段階から適用することで、ニューロン間の依存を抑えつつ、より汎化性能の高い学習が進む。
使い方の具体例
- モデルの学習時に適用
- たとえば、
nn.Dropout(0.5)のように設定し、50%の確率でランダムにニューロンを無効化する。
- たとえば、
- 推論時(テスト時)には適用しない
model.eval()を使うと、ドロップアウトが無効になり、すべてのニューロンが有効になる。
例(PyTorch)
import torch.nn as nn
model = nn.Sequential(
nn.Linear(256, 128),
nn.ReLU(),
nn.Dropout(0.5), # 50%の確率でニューロンを無効化
nn.Linear(128, 64),
nn.ReLU(),
nn.Linear(64, 10)
)
L1正則化(Lasso) – スパースなモデルとは?
スパースなモデルとは?
- スパース(Sparse) = “まばら” という意味。
- ほとんどの重みが0に近く、一部の重要な特徴量だけが選択されるモデルのこと。
不要な特徴を削除するとは?
- L1正則化では、重みが小さい特徴量は0になる。
- つまり、モデルが「影響が小さい特徴量」を自動で削除する。
- これによって、不要な特徴(ノイズ)を減らし、よりシンプルなモデルになる。
特徴を削除する基準
- 学習データに対する影響が少ない特徴の重みが 0 に近づく。
- 例えば、以下のように 5 つの特徴があったとする:
- X1X_1(影響大):重み w1=0.8w_1 = 0.8
- X2X_2(影響中):重み w2=0.3w_2 = 0.3
- X3X_3(影響小):重み w3=0.05w_3 = 0.05
- X4X_4(影響ほぼなし):重み w4=0.002w_4 = 0.002
- X5X_5(影響なし):重み w5=0w_5 = 0
- L1正則化を適用すると、影響の小さい X4,X5X_4, X_5 の重みが 0 になるので、モデルが不要な特徴を排除できる。
L1正則化の数式(損失関数) ![]()
実装例(Scikit-learn)
from sklearn.linear_model import Lasso
lasso = Lasso(alpha=0.01) # αが大きいほど正則化が強くなる
lasso.fit(X_train, y_train)
L2正則化(Ridge)の特徴と使い分け
L2正則化の特徴
- すべての特徴を活用しつつ、過学習を抑える。
- 重みが極端に大きくなるのを防ぐことで、安定した学習を実現する。
L2正則化の数式 ![]()
L2正則化を使えばいいのでは?
- L2正則化は、全ての特徴を活用するが、不要な特徴を削除するわけではない。
- 例えば、L1正則化のように「特徴を完全にゼロ」にすることはないため、重要でない特徴も学習に影響を与え続ける。
- 「不要な特徴を削除したい」場合にはL1正則化を使う必要がある。
L1正則化 vs. L2正則化の使い分け
| 正則化手法 | 特徴 | メリット | デメリット | 使うべき場面 |
|---|---|---|---|---|
| L1正則化(Lasso) | 重みの絶対値を抑える | 特徴選択が可能(不要な特徴が0になる) | 一部の特徴しか使わないので情報を捨てる可能性あり | 特徴量が多すぎる場合(スパースなモデルを作りたい) |
| L2正則化(Ridge) | 重みの二乗を抑える | すべての特徴を利用しながら、過学習を防ぐ | 不要な特徴も残るため、特徴選択には向かない | すべての特徴を活用しながら安定したモデルを作りたい場合 |
結論:どれを使うべきか?
ドロップアウト
- ニューラルネットワークで過学習を防ぎたいとき。
- 過学習が進む前に適用(学習時に設定)。
L1正則化
- 特徴選択をしたいとき(不要な特徴を削除)。
- 高次元データ(特徴量が多すぎる場合)に有効。
L2正則化
- すべての特徴を活かしながら過学習を防ぎたいとき。
- 線形回帰やニューラルネットワークの安定化に使う。