L1/L2正則化シミュレーター 戻る
機械学習

L1/L2正則化シミュレーター — LassoとRidge

機械学習の過学習を抑える2つの正則化、L1(Lasso)とL2(Ridge)の挙動を可視化するツールです。正則化強度λと元の回帰係数を変えると、L1が重みをちょうど0にしてスパースなモデルを作り、L2が全係数を比例縮小する様子をリアルタイムで比較できます。

パラメータ設定
正則化強度 λ
大きいほど重みを強く縮小。0で正則化なし(OLS)
元の重みA(OLS推定値)
正則化なしで得られる係数A(強く効く特徴量)
元の重みB
小さめの係数B(ノイズかもしれない特徴量)
元の重みC
負の係数C(向きが逆の特徴量)
計算結果
重みA (L1)
重みA (L2)
重みB (L1)
重みB (L2)
L1のゼロ重み数
L1平均収縮率 (%)
縮小マップ — 入力重み w₀ → 正則化後の重み

横軸が元の重み w₀、縦軸が正則化後の重み。L1は[−λ,λ]の帯(脈動部分)で重みを0にし、L2は原点を通る傾き 1/(1+λ) の直線です。点A・B・Cが現在の3重みです。

重みA vs 正則化強度 λ
3重みの比較(元・L1・L2)
理論・主要公式

$$w_{L2}=\frac{w_0}{1+\lambda}\qquad\text{(Ridge: 比例縮小)}$$

L2正則化は元の重み w₀ を係数 1/(1+λ) で一律に縮小する。λ がどれだけ大きくても 0 には達しない。

$$w_{L1}=\operatorname{sign}(w_0)\max(|w_0|-\lambda,\,0)\qquad\text{(Lasso: 軟しきい値)}$$

L1正則化は軟しきい値関数で重みを縮める。|w₀| ≤ λ の重みはちょうど 0 になり、スパース(疎)なモデルが得られる。L2にこの厳密なゼロ化は起こらない。

$$\hat{w}=\arg\min_w\;\tfrac12(w-w_0)^2+\lambda\,R(w),\quad R_{L1}=|w|,\;R_{L2}=\tfrac12 w^2$$

いずれも「元の推定値 w₀ への近さ」と「ペナルティ R(w)」のバランスを取る最適化。直交設計ではこの解が上の2式に閉じた形で書ける。

L1/L2正則化とは

🙋
機械学習で「正則化」ってよく聞くんですが、そもそも何のためにやるんですか?
🎓
ざっくり言うと「過学習を防ぐブレーキ」だね。モデルは訓練データに合わせようとして、係数(重み)をどんどん大きくしてしまうことがある。そうすると訓練データには完璧に当てはまるけど、新しいデータでは全然当たらない。そこで「重みが大きくなりすぎたらペナルティを払え」というルールを損失関数に足すんだ。代表的なのがL1とL2の2種類。このツールでλを上げると、両方が重みを縮めていくのが見えるよ。
🙋
L1とL2、どっちも「重みを縮める」んですよね?何が違うんですか?
🎓
縮め「方」が決定的に違う。L2(Ridge)は w₀/(1+λ) で、全部の重みを同じ割合でスーッと縮める。3が1.5、0.6が0.3、という具合にね。でもL1(Lasso)は軟しきい値という仕組みで、|w₀| が λ より小さい重みを「ちょうど0」にしてしまうんだ。左で重みBを0.6、λを1.0にしてごらん。L2は0.30になるけど、L1は0.00。Bという特徴量がモデルから完全に消えるんだ。
🙋
えっ、0にしちゃうんですか。それって特徴量を捨ててるってことですよね?
🎓
そう、まさに「自動の特徴選択」なんだ。重みが0の特徴量は予測にまったく使われないから、実質的にモデルから外れる。例えば100個の説明変数があって、本当に効いてるのは10個だけ、というケースは現実によくある。Lassoを使えば残り90個の係数が0になって、「どの変数が効いているか」が一目で分かる解釈しやすいモデルになる。縮小マップの真ん中の平らな帯、あれがλで決まる「ゼロにする範囲」だよ。
🙋
じゃあ常にL1のほうが良さそうに聞こえますけど、L2の出番はあるんですか?
🎓
いや、それぞれ得意分野があるよ。L2は重みを「滑らかに」縮めるから、相関の強い特徴量がグループであるとき、その全員を均等に小さくして安定させる。L1はそういうとき相関グループから1本だけ残して他を0にしがちで、どれが残るかがデータの揺らぎで変わってしまう。だから「多くの変数が少しずつ効く」「変数同士が相関する」ならRidge、「少数の変数だけが効く」ならLasso。両方の良さが欲しければElastic Netで混ぜるんだ。
🙋
λの大きさはどう決めるんですか?大きければ大きいほど安全とか?
🎓
いや、大きすぎるとダメなんだ。λを上げると重みが縮んでモデルは単純になるけど、上げすぎると本当に必要な重みまで潰してしまって、データの構造を捉えられなくなる——これが「未学習」。逆にλが小さすぎると過学習。だから実務では交差検証で、λを対数スケールでいくつも試して、検証データの誤差が一番小さい値を選ぶ。「重みA vs λ」のグラフを見ると、λが大きくなるにつれL1の重みがどこかで0に着地して、L2は0に漸近するけど決して触れないのが分かるはずだ。

よくある質問

最大の違いは「重みをちょうど0にできるかどうか」です。L1正則化(Lasso)は軟しきい値関数 w_L1 = sign(w0)·max(|w0|−λ, 0) で重みを縮小し、|w0| が λ 以下の重みをちょうど0にします。これにより不要な特徴量が自動的に切り捨てられ、スパース(疎)なモデルが得られます。一方L2正則化(Ridge)は w_L2 = w0/(1+λ) で全ての重みを同じ割合で縮小しますが、決して厳密な0にはしません。L1は特徴選択、L2はなめらかな縮小、と覚えると分かりやすいです。
L1ペナルティ λ|w| は w=0 で微分が不連続(角がある)ためです。最適化では、重みを0から少し動かすと得られる損失低減より、L1ペナルティの増加(傾き λ)のほうが大きい限り、重みは0に張り付きます。直交設計の場合、この条件は |w0| ≤ λ と書け、軟しきい値関数 sign(w0)·max(|w0|−λ,0) になります。L2ペナルティ λw² は w=0 で微分が0になりなめらかなので、0に張り付ける力が働かず、比例縮小だけが起こります。
特徴量が多く、その中の少数だけが本当に効いていると考えられる場合はLasso(L1)が向きます。不要な特徴量の係数が0になり、モデルが解釈しやすくなります。逆に、多くの特徴量が少しずつ効いている、あるいは相関の強い特徴量グループがある場合はRidge(L2)が安定します。Lassoは相関の強い変数群から1本だけを残しがちなのに対し、Ridgeはグループ全体を均等に縮小するためです。両者のバランスを取りたいときは、L1とL2を併用するElastic Net を使います。
λは過学習と未学習のトレードオフを決めるハイパーパラメータで、交差検証(クロスバリデーション)で選ぶのが標準です。λを大きくすると重みが強く縮小され、モデルは単純になりますが、大きすぎるとデータの構造を捉えられず未学習(バイアス増)になります。λを小さくすると訓練データへの当てはまりは良くなりますが、過学習(バリアンス増)に陥ります。実務ではλを対数スケールで複数試し、検証データの誤差が最小になる値を選びます。本ツールでλを動かすと、重みがどう縮小・ゼロ化されるかが直感的に分かります。

実世界での応用

高次元データの特徴選択:遺伝子発現データやテキストの単語特徴のように、説明変数が数千〜数万あるのにサンプル数が少ない問題では、Lasso(L1)が定番です。本当に予測に効く少数の変数だけを残し、残りの係数を0にしてくれるため、「どの遺伝子が病気に関与するか」「どの単語が分類に効くか」を解釈できるモデルになります。本ツールの縮小マップは、まさにこの「λで決まるゼロ化の帯」を可視化しています。

多重共線性のあるモデルの安定化:センサーの値や経済指標のように、説明変数同士が強く相関する回帰では、正則化なしの最小二乗(OLS)は係数が暴れて不安定になります。Ridge(L2)は相関する変数群を均等に縮小して係数を安定させるため、予測の分散を下げられます。Lassoはこういう場面で相関グループから1本だけ残すため、選ばれる変数がデータの揺らぎで変わってしまう弱点があります。

ニューラルネットワークの重み減衰:ディープラーニングで広く使われる「Weight Decay(重み減衰)」は、L2正則化そのものです。各更新で重みを少しずつ0方向に引き寄せることで、巨大なネットワークが訓練データを丸暗記する過学習を防ぎます。L1を併用すれば、不要な接続の重みを0にしてネットワークを疎にし、推論を軽量化することもできます。

圧縮センシングと信号復元:少ない観測から元の信号を復元する圧縮センシングでは、「信号がスパース(ほとんどの成分が0)である」という仮定のもとでL1最小化が使われます。L1のゼロ化の性質が、本来0であるべき成分を正しく0と推定する役割を果たします。MRIの高速撮像や、レーダー・通信の信号処理など幅広い分野で応用されています。

よくある誤解と注意点

まず多いのが、「特徴量を標準化せずに正則化をかける」という誤りです。L1もL2も重みの大きさにペナルティを課すため、特徴量のスケールがバラバラだとペナルティが不公平になります。例えば「身長(cm)」と「年収(円)」を同じモデルに入れると、スケールの大きい変数は係数が小さく出やすく、不当に縮小を免れます。本ツールも「特徴量は標準化済み」を前提に w_L2=w₀/(1+λ) という単純な式を使っています。実データでは正則化の前に必ず各特徴量を平均0・分散1に標準化してください。

次に、「Lassoが選んだ変数=因果関係のある重要変数、と解釈する」こと。Lassoはあくまで予測誤差を下げるために係数を0/非0に振り分けているだけで、因果を保証しません。特に相関の強い変数群があると、Lassoはその中から「たまたま」1本を選び、残りを0にします。データを少し変えると選ばれる変数が入れ替わることも珍しくありません。変数選択の安定性が重要なら、ブートストラップで何度も推定して「いつも選ばれる変数」を確認する、あるいはElastic Netを使うのが安全です。

最後に、「λを大きくするほど良いモデルになる」という思い込み。正則化は過学習を抑える一方で、必ずバイアス(系統的なズレ)を導入します。λを上げすぎると、本当に効くべき重みまで縮小・ゼロ化されてしまい、モデルがデータの構造を捉えられない未学習に陥ります。本ツールでλを5に近づけると、重みAでさえL1で0になり、L2でも大きく潰れるのが見えます。最適なλは過学習と未学習のちょうど中間にあり、交差検証で検証誤差が最小になる点を選ぶのが正攻法です。

使い方ガイド

  1. 初期重みA・B・C(w0a, w0b, w0c)を−5.0~5.0の範囲で設定し、線形回帰モデルの出発点を決定
  2. 正則化強度λ(0.0~2.0)をスライダーで調整し、LassoとRidge両者の係数縮小挙動をリアルタイムで観察
  3. 左右のグラフでL1ノルム(菱形制約)とL2ノルム(円形制約)による最適解の移動軌跡を比較し、λが大きいほどゼロ圧縮と連続縮小の違いを確認

具体的な計算例

金融リスク予測モデルで初期重みw0a=3.2, w0b=−1.8, w0c=0.5のとき、λ=0.8でLassoを適用すると重みAは2.4に縮小(25%減少)、重みCはゼロに圧縮されます。同じλでRidgeを適用すると重みAは2.7、重みBは−1.5、重みCは0.3となり、全重みが連続的に縮小します。λ=1.5では、Lassoは3個中2個の係数がゼロになり平均収縮率68%を達成、Ridgeでも平均44%の縮小で過学習を抑制します。

実務での注意点

  1. テキスト分類や遺伝子解析など特徴選択が必須な場合はLassoを採用し、λ=1.0~1.5でスパース性(ゼロ重み)を意図的に導出
  2. 時系列回帰や画像認識の転移学習ではRidgeを優先し、λ=0.3~0.8で全特徴を保持しつつ多重共線性を軽減
  3. クロスバリデーション(5分割)で最適λを決定し、訓練誤差と検証誤差の乖離が最小となる値を本番運用に選択