Regularization
正則化は、ノイズを記憶するのではなく汎化できるよう、学習中のモデルに制約を加えます。L1、L2、重み減衰、ドロップアウト、早期終了を解説します。
正則化とは、新しいデータに対する誤差を下げることを目的としたモデルの学習方法に対するあらゆる変更であり、学習データ上の誤差が増えても適用されます。これは、十分な容量を持つモデルが、見たことのある例のノイズや特異性を記憶してしまう過学習を抑えます。正則化では、大きな重みへのペナルティ、ノイズの注入、多様なデータの追加、早期終了などにより、モデルの実効的な複雑さを制限します。バイアスと分散の観点では、分散を大きく下げる代わりに、多少のバイアス増加を受け入れます。
L1およびL2ペナルティ#
古典的な形式では、損失関数に重みへのペナルティを加えます。合計損失 = データ損失 + λ × ペナルティです。L2正則化は、重みの二乗和Σw²にペナルティを課します。これにより、各重みは大きさに比例してゼロへ近づき、線形モデルではリッジ回帰と呼ばれます。L1正則化は、重みの絶対値の和にペナルティを課します。一定の力で重みを縮小するため、多くの重みが正確にゼロになり、ラッソとも呼ばれるL1ペナルティ付き線形回帰は特徴量選択も兼ねます。Elastic Netは両方を組み合わせます。ペナルティの強さλは、scikit-learnではalphaと呼ばれるハイパーパラメーターです。小さすぎるとモデルは依然として過学習し、大きすぎると学習不足になります。正弦波から得たノイズを含む12点に9次多項式を当てはめると、両方の失敗例が見られます。
import numpy as np
from sklearn.linear_model import Ridge
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import PolynomialFeatures
rng = np.random.default_rng(0)
# 12 noisy training points from a sine wave, plus clean test points
x_train = rng.uniform(0, 1, (12, 1))
y_train = np.sin(2 * np.pi * x_train[:, 0]) + rng.normal(0, 0.2, 12)
x_test = np.linspace(0, 1, 200)[:, None]
y_test = np.sin(2 * np.pi * x_test[:, 0])
# The same degree-9 polynomial, fit with a growing L2 penalty on its coefficients
for alpha in (0.0, 1e-4, 1e-2, 1.0):
model = make_pipeline(PolynomialFeatures(9), Ridge(alpha=alpha)).fit(x_train, y_train)
train_mse = np.mean((model.predict(x_train) - y_train) ** 2)
test_mse = np.mean((model.predict(x_test) - y_test) ** 2)
weight_norm = np.linalg.norm(model[-1].coef_)
print(f"alpha {alpha:g}: train MSE {train_mse:.4f}, test MSE {test_mse:.4f}, |w| {weight_norm:.1f}")ペナルティがない場合、多項式はノイズに沿って曲がります。係数ノルムは約425,000に達し、学習誤差は0.0148、テスト誤差は0.1859です。ペナルティを0.0001にすると、係数ノルムは20.8まで縮小し、学習誤差が0.0334に増える一方で、テスト誤差は11分の1の0.0170になります。alphaを1にすると、ペナルティが支配的になり、テスト誤差が0.3998となってモデルは学習不足になります。
ニューラルネットワークにおけるWeight DecayとDropout#
ニューラルネットワークでは、L2正則化は通常、weight decayとして適用されます。各更新時に、それぞれの重みを値の小さな割合だけ縮小します。通常の確率的勾配降下法では、この2つは同等です。Adamなどの適応型オプティマイザーでは、勾配に加えたL2項がAdamのパラメーターごとのスケーリングで割られるため、勾配の大きな重みにはほとんど正則化がかかりません。分離型weight decayは、代わりに縮小を直接適用します。この方法を使うAdamWオプティマイザーは、Transformerの標準的な選択肢です。
Dropout層は、学習ステップごとに確率pで各ユニットの出力をゼロにし、残った出力を1/(1 − p)倍します。これにより、ネットワークが特定のユニットだけに依存できなくなり、重みを共有する多数の縮小サブネットワークを実質的に学習します。推論時には、すべてのユニットが有効になります。元の実験では、隠れユニットのドロップ確率を0.5にすると、幅広いネットワークとタスクでほぼ最適でした。
Ultralytics YOLOの学習では、両方の設定を利用できます。weight_decayはデフォルトで0.0005で、畳み込み層と線形層の重みにのみ適用され、バイアスと正規化層のパラメーターは対象外です。dropoutはデフォルトで0.0で、YOLO26の分類モデルにおいて、最後の線形層の直前に適用されます。
from ultralytics import YOLO
# 事前学習済みのYOLO26n分類モデルを読み込みます
model = YOLO("yolo26n-cls.pt")
# 分類ヘッドにDropoutを適用し、weight decayを強めて学習します
results = model.train(data="mnist160", epochs=10, dropout=0.2, weight_decay=0.001)その他の正則化手法#
- データ拡張: 反転、クロップ、スケーリング、色調変更、モザイクによって学習画像の多様性を広げ、元のデータセットに含まれる以上に多様な条件下で各物体をモデルに見せます。
- ラベルスムージング: one-hot形式の分類ターゲットをわずかに平滑化したものに置き換え、モデルがロジットを極端な確信度へ押し上げるのを防ぎます。
- 暗黙的な正則化: 小規模バッチ学習に伴う勾配ノイズと、バッチ正規化に伴うバッチ間のノイズは、どちらも明示的な項を追加することなく正則化として働きます。
早期終了は、学習時間を制限することで正則化します。エポックごとにモデルを検証データで評価し、patienceと呼ばれる所定のエポック数にわたってスコアが改善しなければ学習を停止します。その時点までに得られた最良の重みを保持します。
正則化と関連用語#
- 正規化: 入力または活性化を再スケーリングして、学習を高速化し、安定させます。バッチ正規化には、副次的な効果として正則化の働きもあります。
- ハイパーパラメーター調整: λ、Dropout確率、patienceなどの正則化設定に加え、その他すべてのハイパーパラメーターについて適切な値を探索します。
- モデルアンサンブル: 独立して学習した複数のモデルの予測を平均することで、分散を低減します。Dropoutは、1つのネットワーク内でアンサンブルを近似します。学習時には指数関数的な数の縮小サブネットワークからサンプリングし、テスト時にはすべてのユニットを有効にしたネットワークを実行することで、それらすべての予測の平均を近似します。










