バイアス・バリアンス トレードオフ シミュレーター 戻る
機械学習

バイアス・バリアンス トレードオフ シミュレーター

機械学習の汎化誤差を「バイアス²・バリアンス・ノイズ」の3つに分解して可視化するツールです。多項式モデルの次数を変えると、学習不足(高バイアス)と過学習(高バリアンス)のトレードオフ、そして総誤差がU字型になる様子がリアルタイムで分かります。

パラメータ設定
真の関数
データの背後にある正解の曲線
多項式モデルの次数
モデルの複雑さ。低いと学習不足、高いと過学習
1データセットの点数
各学習データに含まれる観測点の数
ノイズ標準偏差
観測値に乗るガウスノイズの大きさ σ
データセット数
期待値を取るために生成する独立な学習データの数
計算結果
バイアス²
バリアンス
既約誤差(ノイズ)
期待総誤差
モデル次数
状態
モデルのフィット — アンサンブルとばらつき

太い基準線が真の関数、細い曲線群がデータセットごとの当てはめ(広がり=バリアンス)、太い線が平均予測(真の関数との差=バイアス)。散布点は強調中の1データセットです。

バイアス・バリアンス分解 vs 次数
モデルのばらつき — 真の関数・平均予測・予測の±1σ
理論・主要公式

$$\mathbb{E}\big[(y-\hat f)^2\big]=\underbrace{(\,\overline{\hat f}-f\,)^2}_{\text{バイアス}^2}+\underbrace{\mathbb{E}\big[(\hat f-\overline{\hat f})^2\big]}_{\text{バリアンス}}+\underbrace{\sigma^2}_{\text{ノイズ}}$$

テスト点での期待二乗誤差は、バイアス²・バリアンス・既約誤差(ノイズ分散 σ²)の3つに分解できる。$\hat f$ は学習したモデル、$\overline{\hat f}$ はデータセットを変えたときの平均予測、$f$ は真の関数。

$$\text{Bias}^2=\frac{1}{N}\sum_x\big(\overline{\hat f}(x)-f(x)\big)^2,\qquad \text{Var}=\frac{1}{N}\sum_x\mathbb{E}_D\big[(\hat f_D(x)-\overline{\hat f}(x))^2\big]$$

テストグリッド上で平均したバイアス²とバリアンス。$\hat f_D$ はデータセット $D$ で学習したモデル。

モデルの複雑さを上げるとバイアスは下がりバリアンスは上がる。両者のトレードオフにより、期待総誤差は複雑さに対してU字型を描き、その最小点が最良の汎化性能を与える。

バイアス・バリアンス トレードオフとは

🙋
機械学習で「過学習に気をつけろ」ってよく言われるんですけど、そもそも過学習って何が悪いんですか?データにぴったり合うなら良いことのような気がして…
🎓
いい疑問だね。ポイントは「手元のデータに合う」ことと「まだ見ていないデータでも当たる」ことは別物、ということなんだ。過学習したモデルは、学習データに乗っている偶然のノイズまで一生懸命なぞってしまう。だから訓練誤差はゼロに近づくのに、新しいデータでは大外しする。このツールで次数を12に上げてみて。細い曲線群がぐちゃぐちゃに暴れるだろう?あれが「データが変わると予測が大きくブレる」状態だよ。
🙋
本当だ、曲線が毎回まったく違う形になってますね。逆に次数を1にすると、こんどは全部ほぼ同じ直線になりました。これはこれで良くないんですか?
🎓
そう、そこが面白いところ。次数1の直線はデータが変わってもほとんどブレない——つまりバリアンスは小さい。でも正弦波みたいなうねった真の関数を直線で表すのは土台無理だ。平均予測が真の曲線から大きくズレているだろう?その系統的なズレが「バイアス」。単純すぎるモデルは安定しているけど、根本的に当たらない。これを学習不足(アンダーフィット)と呼ぶんだ。
🙋
なるほど…単純すぎるとバイアスが大きくて、複雑すぎるとバリアンスが大きい。じゃあ、その真ん中に「ちょうどいい」次数があるってことですか?
🎓
まさにそれがバイアス・バリアンス トレードオフだよ。下の「分解 vs 次数」グラフを見て。バイアス²は右肩下がり、バリアンスは右肩上がり、その合計(総誤差)はU字を描くだろう?U字の底が最良の汎化性能を出す次数だ。デフォルトの正弦波なら、次数3〜5あたりが谷になっているはず。複雑にすればするほど良い、というのは幻想なんだ。
🙋
U字の底が一番低くなっても、誤差がゼロにはならないんですね。グラフが下に張り付かないのはなぜですか?
🎓
それが3つ目の成分、既約誤差だ。観測データ自体にノイズ σ が乗っているから、どんな完璧なモデルでも誤差を σ² より下げることはできない。これはモデルの問題じゃなくてデータの問題。だから総誤差のU字は σ² の高さに「下駄」を履いている。左のノイズ標準偏差を0にすると、その下駄が消えてU字が地面まで届くのが見えるよ。
🙋
実務だと、どうやって「ちょうどいい複雑さ」を見つけるんですか?毎回このグラフを描けるわけじゃないですよね。
🎓
現場では真の関数を知らないから、交差検証を使うんだ。データを分割して、片方で学習・片方でテストする操作を繰り返し、テスト誤差が最小になる複雑さを選ぶ。バリアンスが高そうなら正則化を強めたりデータを増やしたり、バイアスが高そうなら特徴量を足したりモデルを複雑にする。このツールは「真の関数を知っている神の視点」で何が起きているかを見せてくれる練習台、というわけさ。

よくある質問

バイアスは「モデルが平均的にどれだけ真の関数から外れているか」を表す系統的な誤差です。直線で正弦波を近似するように、モデルが単純すぎて本質的な形を表せないときに大きくなります。バリアンスは「学習データが変わると予測がどれだけ揺れるか」を表すばらつきです。高次多項式のようにモデルが複雑すぎると、データのノイズまで追いかけてしまい、データセットごとに予測が大きく変わります。汎化誤差はこの2つに、消せないノイズ(既約誤差)を足したものになります。
モデルの次数(複雑さ)を上げるとバイアスは下がりますが、その代わりバリアンスが上がります。次数が低すぎると真の形を捉えられず学習不足(アンダーフィット)になり、次数が高すぎると学習データのノイズに過剰適合して過学習(オーバーフィット)になります。期待される汎化誤差はバイアス²+バリアンス+ノイズで、複雑さに対してU字型を描きます。訓練誤差は複雑にするほど下がり続けますが、テスト誤差はある最適点で最小になり、その先は逆に悪化します。これが「複雑なモデルほど良いわけではない」理由です。
既約誤差は観測データそのものに含まれるランダムなノイズの分散 σ² で、どんなに優れたモデルを使っても取り除けない誤差の下限です。本シミュレーターでは観測値 y を「真の関数 f(x) + 標準偏差 noiseLv のガウスノイズ」として生成しているため、既約誤差はちょうど noiseLv² になります。たとえモデルが真の関数 f(x) を完璧に当てられても、テスト点の観測値はノイズの分だけ必ずずれるため、平均二乗誤差は σ² 以下にはなりません。モデル選択で減らせるのはバイアスとバリアンスだけで、ノイズはデータの質を上げるしかありません。
実務では交差検証(クロスバリデーション)でテスト誤差が最小になるモデルの複雑さを探します。バイアスが高い(学習不足の)ときは、特徴量を増やす・モデルを複雑にする・正則化を弱める、といった対策を取ります。バリアンスが高い(過学習の)ときは、データを増やす・正則化(L2/L1、ドロップアウト)を強める・モデルを単純にする・アンサンブルやバギングで予測を平均化する、といった対策が有効です。データ量を増やすとバリアンスは下がりますがバイアスには効かない点に注意してください。

実世界での応用

モデル選択とハイパーパラメータ調整:決定木の深さ、ニューラルネットの層数・幅、サポートベクターマシンのカーネルパラメータ——どれも「複雑さ」を制御するつまみであり、本質的にはバイアスとバリアンスのトレードオフを動かしています。交差検証でテスト誤差のU字の底を探す作業は、まさにこのツールが描く分解曲線の谷を、真の関数を知らないまま推定する営みです。

正則化の設計:リッジ回帰のλ、Lasso、ニューラルネットのweight decayやドロップアウトは、いずれもモデルの実効的な複雑さを下げてバリアンスを抑える道具です。本シミュレーターも数値安定化のために微小なリッジ(λ=1e-6)を入れていますが、λを大きくすればバイアスが増えバリアンスが減る——正則化の効果そのものを再現できます。過学習しているときに「λを上げる」のは、U字の右側から底へ戻す操作にあたります。

データ収集の意思決定:「データをもっと集めるべきか、モデルを変えるべきか」は現場で頻出の問いです。バリアンスが支配的なら、データを増やすほど予測のばらつきが減り効果的です。一方バイアスが支配的なら、いくらデータを足しても誤差は頭打ちで、特徴量設計やモデルの見直しが必要です。本ツールでデータ点数を増やすとバリアンスだけが下がる挙動が、この判断の根拠を直感的に示します。

アンサンブル学習の理解:バギングやランダムフォレストは、多数のモデルの予測を平均することでバリアンスを下げる手法です。これは本シミュレーターの「平均予測」がデータセットごとの暴れた曲線よりずっと真の関数に近い、という事実そのものです。逆にブースティングは弱学習器を足し合わせてバイアスを下げる方向に働きます。アンサンブルの設計思想はバイアス・バリアンス分解で明快に説明できます。

よくある誤解と注意点

まず最大の誤解が、「訓練誤差が小さい=良いモデル」という思い込みです。複雑なモデルは学習データに対していくらでも誤差を下げられ、次数を点数まで上げれば訓練誤差はほぼゼロにできます。しかしそれは過学習であり、汎化誤差(テスト誤差)は逆に増えます。評価すべきは常に「見ていないデータでの誤差」です。訓練誤差とテスト誤差が大きく乖離していたら、それは過学習の典型的なサインです。本ツールが計算しているのは一貫してテストグリッド上の汎化誤差であって、訓練誤差ではありません。

次に、「データを増やせば何でも解決する」という過信です。データ量を増やすとバリアンスは確実に下がりますが、バイアスにはほとんど効きません。直線モデルで正弦波を近似している限り、観測点を100倍に増やしても平均予測は真の曲線に近づきません。学習不足の状態でひたすらデータを集めるのは、コストばかりかかって誤差が下がらない典型的な失敗です。まずバイアスとバリアンスのどちらが支配的かを見極め、それに応じた対策を選ぶ必要があります。

最後に、「バイアス・バリアンス分解は実データでそのまま計算できる」という誤解です。本シミュレーターはバイアスとバリアンスを別々に出していますが、これは真の関数 f(x) を知っていて、独立なデータセットを何個も生成できる「神の視点」だからこそ可能なことです。現実のタスクでは真の関数は不明で、データセットは1つしかありません。だから実務では分解そのものではなく、交差検証によるテスト誤差の推定でトレードオフを間接的に扱います。本ツールはあくまで、その背後で何が起きているかを理解するための学習用モデルだと捉えてください。

使い方ガイド

  1. モデル次数スライダー(degNum)を1~10の範囲で調整し、多項式の複雑度を設定する
  2. サンプルサイズ(nNum)を10~500のデータ点数で指定し、訓練データの規模を変更する
  3. ノイズレベル(noiseNum)を0.1~5.0の標準偏差で設定し、観測雑音を導入する
  4. データセット数(dsNum)を5~100の反復回数で増減させて分解の安定性を確認する
  5. 「実行」ボタンを押すと、バイアス²・バリアンス・既約誤差が自動計算される

具体的な計算例

次数3の多項式モデルで、n=100サンプル、ノイズσ=1.0、データセット50回反復の場合、バイアス²≈0.15、バリアンス≈0.42、既約誤差≈1.00となり、期待総誤差は1.57となります。次数を6に上げると(過学習域)、バイアス²≈0.05に低下しますが、バリアンス≈3.20に急増し、総誤差は4.25に悪化します。一方、次数1(学習不足)ではバイアス²≈8.50が支配的となり総誤差は9.50に達します。

実務での注意点