2.3 勾配降下法
坂を下って最適解を探す
この回で分かること
- 勾配降下法 が「坂の傾きを見て、下る向きに少しずつ進む」方法であることを説明できる
- 更新の式を使って、パラメータを1歩分動かす計算ができる
- 学習率 の大きさの影響と、ミニバッチ・局所解・乱数による学習結果のばらつきを説明できる
直感で理解する
霧の深い山で、谷底(いちばん低い所)を探すことを考えてみましょう。遠くは見えませんが、足元の地面がどちらに傾いているかは分かります。そこで「足元が下っている向きに一歩進む」をくり返せば、やがて谷底にたどり着けます。これが 勾配降下法 です。
機械学習では、山の高さが損失(2.2 の MSE)、地図の上の位置がパラメータにあたります。損失が最も小さくなる位置を、坂の傾き(勾配)を手がかりに探すのです。2.2 の直線は式で一度に求まりましたが、ニューラルネットワークのように式では解けないモデルでも、この方法なら探せます。
2.2 の空走距離の例で、切片を b = 0.47 に固定し、傾き a だけを探してみます。計算を見やすくするため、速度は 10 km/h 単位で表します(時速40km なら 4.0)。すると、いちばん良い傾きは約2.0 になります。
スタートの a = 0 では坂が急なので、1歩で a ≈ 1.28 まで大きく進みます。谷底に近づくと坂がゆるやかになって歩幅も小さくなり、5歩で a ≈ 1.98 とほぼ谷底に落ち着きます。
数式で確かめる
① 更新の式
← は「左のものを右の値で置き換える」という意味です(記号表)。\(\partial L / \partial \theta\) は、θ を少しだけ動かしたときの損失 L の変化の割合、つまり坂の傾きです(0.2 の偏微分)。傾きが正(右上がり)なら θ を減らし、負(右下がり)なら θ を増やすので、いつも下る向きに進みます。η(イータ)は 学習率 で、1歩の大きさを決めます。
② 例で1歩ずつ計算する
MSE を a で微分すると、傾きは次の式になります。
a = 0 のとき、この値は約 −64.2(右下がりの急な坂)です。学習率 η = 0.02 なら、
次の a = 1.28 では傾きが約 −22.9 なので、a ← 1.28 + 0.02 × 22.9 ≈ 1.74。これをくり返します。パラメータが複数あるときは、それぞれの偏微分を並べた勾配 \(\nabla L\)(0.2)を使って、すべてのパラメータを同時に動かします。
③ 学習率の選び方
同じ a = 0 から、学習率だけを変えて進めた結果です(いちばん良い値は a ≈ 1.99)。
| 学習率 η | 1歩後 | 2歩後 | 3歩後 | 10歩後 | 様子 |
|---|---|---|---|---|---|
| 0.005 | 0.32 | 0.59 | 0.82 | 1.65 | 小さすぎて、なかなか進まない |
| 0.02 | 1.28 | 1.74 | 1.90 | 1.99 | ちょうど良い |
| 0.05 | 3.21 | 1.25 | 2.45 | 1.98 | 行き過ぎて、左右に揺れながら近づく |
| 0.07 | 4.49 | −1.14 | 5.92 | −17.1 | 行き過ぎがどんどん大きくなる(発散) |
学習率が大きすぎると、谷を飛び越えて反対側の坂に行き、揺れたり、どんどん遠ざかったり(発散)します。小さすぎると安全ですが、時間がかかります。実際の学習では、はじめは大きめにして、だんだん小さくするといった工夫をします。
④ ミニバッチ(確率的勾配降下法)
データが数百万枚の画像になると、1歩ごとに全データで傾きを計算するのは重すぎます。そこで、毎回ランダムに選んだ一部のデータ(ミニバッチ、たとえば32枚)だけで傾きを見積もって進みます。これを 確率的勾配降下法(SGD)と呼びます。傾きの見積もりにはばらつきがありますが、1歩が軽いので、全体としては速く谷底に近づけます。データ全体を1周することを、1エポック と数えます。
⑤ 谷がたくさんある地形(局所解)
線形回帰の損失はきれいなお椀の形で、谷底は1つだけです。ところがニューラルネットワークの損失は、谷や平らな所がたくさんある複雑な地形になります。周りの中では最も低いけれど、全体で最も低いとは限らない谷を 局所解 と呼びます。どの谷に落ち着くかは、スタート地点(パラメータの初期値)やミニバッチの選ばれ方(乱数)で変わります。そのため、同じデータ・同じ設定で学習しても、少しずつ違うモデルができることがあります。
自動運転との接点
- 認識AIの学習はこのくり返し:カメラ画像から物体を見つけるモデルなどは、数百万〜数十億のパラメータを、ミニバッチの勾配降下法で何十万歩も動かして作られます。
- 学習は毎回同じ結果になるとは限らない:初期値や乱数で、できるモデルが少しずつ変わります。安全の説明では、どのデータ・設定・乱数の種で学習したかを記録し(構成管理)、何回か学習し直して性能のばらつきを確かめることが大切です。→ 5.9 AIコンポーネントの安全、5.10 セーフティケース
- 損失が下がる ≠ 安全になる:損失はデータ全体の平均的なずれです。数の少ない危険な場面(夜間の歩行者など)のずれは、平均に埋もれやすくなります。重要な場面に重みを付ける、場面ごとに分けて評価する、といった工夫が要ります。→ 2.7 評価指標
- いつ学習を止めるか:訓練データでの損失が下がり続けても、新しいデータでの性能は途中から悪くなることがあります。学習に使わないデータで性能を見ながら、止めどきを決めます。→ 2.6 過学習と正則化
まとめ
- 勾配降下法は、損失の傾き(勾配)を見て、下る向きに少しずつパラメータを動かし、損失が最も小さい所を探す方法
- 更新は「θ ← θ − η × 傾き」。学習率 η が小さすぎると遅く、大きすぎると揺れたり発散したりする
- 大量のデータではミニバッチで進める(SGD)。複雑なモデルでは初期値や乱数で結果が変わるので、記録と複数回の確認が大切
確認クイズ
Q1. 損失の傾き ∂L/∂θ が正(右上がり)のとき、θ は増やす?減らす?
減らします。右上がりなら、左(θ を減らす向き)に進むと損失が下がるからです。更新の式の「−」が、この向きを決めています。
Q2. θ = 2、傾き = 4、学習率 η = 0.1 のとき、1歩後の θ は?
θ ← 2 − 0.1 × 4 = 1.6 です。
Q3. 学習を始めたら、損失が下がるどころか、どんどん大きくなりました。まず疑うべきことは?
学習率が大きすぎることです。谷を飛び越えるたびに反対側の高い所へ行ってしまい、発散しています。学習率を小さくして試します。
Q4. 同じデータ・同じ設定で2回学習したら、検出率 91.2% と 90.5% のモデルができました。なぜ?安全上どうする?
パラメータの初期値やミニバッチの選ばれ方が乱数で決まるため、落ち着く谷が少し変わるからです。どのデータ・設定・乱数で学習したかを記録し、複数回の学習で性能のばらつきを確かめたうえで、ばらつきも含めて評価します。
もっと知りたい人へ
- 次の回:2.4 ロジスティック回帰
- 関連:0.2 数式の読み方(微分・勾配)、2.2 線形回帰と損失関数
- 用語集:勾配降下法、学習率、確率的勾配降下法・ミニバッチ・エポック、局所解
- 解説動画:YouTube(約5分)(静止画のスライドと音声で要点を説明。英語版の記事には英語の動画があります)