ひとことで言うと
ノルムペナルティは、データへの損失 にパラメータの大きさを表す項を加え、候補となるパラメータの範囲を狭める仕掛けです。係数を 、罰則を とすると、最小化する対象は になります。
山道で目的地までの距離だけを評価すると、急な近道も選べます。そこへ「道幅の狭い道には追加料金」という規則を足すと、距離と料金の合計が小さい道を選ぶようになります。ペナルティは正解を直接決めるものではなく、選択肢の優先順位を変えます。
なぜ必要か
損失だけを最小化すると、学習データに合わせるために一部の重みが大きくなる解も候補に残ります。ノルムペナルティは、そのような「大きなパラメータを使う解」に追加コストを課し、データへの適合とパラメータの小ささを同じ目的関数で比較します。ここで絞っているのはパラメータの取りうる範囲であり、学習率や更新則を置き換える操作ではありません。
は罰則の相対的な重みです。 なら元の損失だけ、大きくするほど罰則を優先します。したがって、係数を変えると同じデータでも選ばれる解が変わります。ニューラルネットでは重みを対象にし、バイアスを同じ扱いにしない設計もあります。何を罰するかは、式を見た時点で確認する箇所です。
| 比較する目的 | 選ばれやすい解 |
|---|---|
| データ損失だけ | 適合を優先し、重みの大きさは制限しない |
| データ損失とノルムペナルティ | 適合とパラメータの小ささを両方満たす |
仕組み
代表例は と です。重みベクトルを とすると、罰則の形は次のようになります。
は重みの個数です。2次元で罰則が同じ値になる点を結ぶと、L2は円、L1はひし形になります。損失の等高線が中心へ移動していくとき、円は座標軸との接点を持たず全方向から原点へ近づけます。一方、ひし形は軸上に角があるため、損失の等高線がその角に触れやすく、いくつかの座標が0になる解を選びやすい、という違いが生まれます。これが「L2は縮める」「L1はスパースにしやすい」を形から読む方法です。
試験でどう問われるか
| 問われ方 | 正解に寄る条件 | 引っかけ |
|---|---|---|
| 目的関数の形 | 元の損失に を加える | 罰則だけを最小化する |
| L1とL2の比較 | L1はひし形、L2は円。L1は0の重みを生みやすい | どちらも同じ形だとする |
| 係数の意味 | は無罰則、大きいほど罰則の比重が増す | 学習率そのものだとする |
実装で確かめる
損失の実装に罰則を足す操作だけを、2次元の重みで確認します。L1とL2は同じ「ノルム」でも、離れた点への課金の増え方が違います。
import numpy as np
w = np.array([3.0, -1.0])
alpha = 0.2
data_loss = 1.5
l1 = data_loss + alpha * np.abs(w).sum()
l2 = data_loss + alpha * 0.5 * np.square(w).sum()
print(l1, l2)
このコードで更新処理をしていないのは、ノルムペナルティの役割を最適化手法と混同しないためです。実際のモデルでは、対象にする重みだけを選び、データ損失と罰則を足した値を学習の目的に渡します。scikit-learn の Ridge も、最小二乗損失に L2 項を加える仕様です。
取り違えやすいもの
| 用語 | ノルムペナルティとの切り分け |
|---|---|
| L2正則化・Ridge | 罰則の形が二乗和。重みを全方向から原点へ寄せる |
| L1正則化 | 絶対値和。ひし形の角により0の座標を含む解になりやすい |
| weight decay | 文脈によってL2ペナルティを指す呼び名。目的関数への項か更新則かは実装で確認する |
| Dropout | パラメータのノルムを直接測る項ではなく、別の正則化操作 |
想起チェック
ノルムペナルティは目的関数に何を加えるか
元の損失に、係数 とパラメータの大きさを測る の積を加えます。
L1がスパースな解を選びやすい理由は何か
等高線がひし形で、座標軸上に角を持つためです。損失の等高線がその角に触れやすく、座標が0になりやすくなります。
罰則の係数を0にするとどうなるか
ノルムペナルティの寄与が消え、元の損失だけを最小化します。