散布図上の10個のデータ点に対して、「一番よく当てはまる直線」y = ax + b を、勾配降下法を使って少しずつ調整しながら求めるインタラクティブな教材です。 直線を1本ずつ試すのではなく、傾き a と切片 b を毎回少しずつ更新していく様子と、誤差がどんどん小さくなっていく様子を同時に見ることができます。
ツールを開く →| 初期 a / 初期 b スライダー | 「リセット」時に適用される、傾きと切片の出発値を設定します。 |
|---|---|
| データ点 (x, y) | グラフ上でドラッグ、または表で数値入力してデータを編集できます。編集すると学習は自動的に最初からやり直されます。 |
| 1ステップ実行 / 5ステップ実行 | 勾配降下法の更新式を1回(または5回連続で)適用します。 |
| 自動実行 / 停止 | Δa, Δb が十分小さくなるまで更新を連続で繰り返します。「停止」でいつでも中断できます。 |
| リセット | a, b を初期値に戻し、繰り返し回数と誤差の推移グラフをクリアします。 |
| 現在の状態パネル | 繰り返し回数、現在の a・b・誤差2乗和 C、勾配 ∂C/∂a・∂C/∂b、直前の更新量 Δa・Δb を表示します。 |
データ点にぴったり重なる直線は普通ありません。そこで「各データ点と直線の縦方向のズレ(残差)を2乗して全部足したもの」を誤差として定義し、この誤差が一番小さくなるような直線を「最もよく当てはまる直線」とする考え方が最小二乗法です。
下の概念図は、5個の点と1本の直線、そして各点から直線までの縦方向の距離(点線)を示しています。この点線の長さを2乗して合計したものが C です。
∂C/∂a は「a を少しだけ増やしたとき、誤差 C がどれくらい・どちら向きに変化するか」を表します。b についても同様です。 この2つの勾配が、a と b をそれぞれどちら向きに、どれくらい動かせば誤差が減るかを教えてくれます。
a と b はそれぞれ、勾配と逆方向(誤差が減る方向)に更新されます。
ηa・ηb の役割: 学習の初期は勾配 ∂C/∂a や ∂C/∂b が非常に大きくなることがあります。もし単純に「勾配 × 一定の学習率」で更新すると、直線が暴れて発散してしまう危険があります。 ηa = 1/max(|∂C/∂a|, 500) という式は、勾配が500より小さいときは通常の学習率(1/500)として働き、勾配が500を超えるほど大きいときは更新量の大きさを1に制限するように自動調整されます(b 側は基準値が50)。 gradient_descent.html の「移動量を最大2に制限する」仕組みと同じ発想を、割り算の形で実現しています。
グラフ上の点をドラッグして大きく動かす(=外れ値を作る)と、直線がその点に引っ張られて傾きが変化する様子を確認できます。これは「2乗誤差」が、遠く離れた点のズレを特に大きく評価してしまう(誤差を2乗するため)という最小二乗法の性質を体験的に理解するのに役立ちます。
勾配降下法基礎 で扱った4次関数には、出発点によって行き着く先が変わる「極小値が複数ある」ケースがありました。 一方、この誤差関数 C = Σ(y−(ax+b))² は a, b についてお椀のような単純な形(凸関数)をしているため、初期値をどこに設定しても、勾配降下法は必ず同じ唯一の最小値(最も当てはまりの良い直線)にたどり着きます。初期値スライダーをいろいろ変えて「自動実行」を試し、最終的な a, b が毎回同じ値に収束することを確認してみてください。