ひとことで言うと
病的曲率とは、損失地形が方向によって極端に異なる曲率を持つ状態です。勾配は最短経路ではなく、その地点で最も急な下り坂を指すため、狭い谷では谷底に沿って進まず左右に振れます。
スキー場に細長い溝がある状態です。斜面に直角には急ですが、溝に沿っては緩いため、まっすぐ滑る操作が左右の壁への往復になります。
なぜ必要か
学習率を大きくすると急な方向の更新が谷を飛び越えて発散し、小さくすると緩い方向にほとんど進みません。この板挟みが、損失が下がらない原因を「学習率だけ」と見誤るポイントです。RNNの勾配消失・爆発も、長い積が作る不安定さを解析する文脈で現れます。
| 観察 | 地形としての読み方 |
|---|---|
| 損失が上下する | 急な方向を横断している |
| 損失が少しずつしか下がらない | 緩い方向に律速されている |
仕組み
パラメータを 、損失を とし、ヘッセ行列の最大・最小固有値をそれぞれ とします。局所的な二次近似では、固有値が各方向の曲率です。
は条件数です。これが大きいほど谷が細長く、勾配の向きと谷底へ向かう向きの差が大きくなります。したがって単一の学習率では、急な方向の安定性と緩い方向の進みやすさを同時に満たしにくくなります。
試験でどう問われるか
| 問われ方 | 正解に寄る条件 | 引っかけ |
|---|---|---|
| 条件数の意味 | 曲率の最大値と最小値の比 | パラメータ数の比とする |
| 学習率との関係 | 大きいと発散、小さいと進行が遅い | 常に大きくすれば速い |
実装で確かめる
二次関数の等高線を考えると、係数の比が大きいほど谷が細くなります。これは病的曲率を最小のモデルで確認するコードです。
import numpy as np
H = np.diag([100.0, 1.0])
x = np.array([1.0, 1.0])
for _ in range(5):
grad = H @ x
x -= 0.01 * grad
print(x)
急な方向には が掛かるため、学習率 はその方向では境界に近く、もう一方では更新が小さいという差が見えます。
取り違えやすいもの
| 用語 | 切り分け |
|---|---|
| 勾配消失・爆発 | 曲率そのものではなく、勾配の伝播や更新量が縮小・増大する現象です。 |
| 勾配クリッピング | 爆発した勾配のノルムを制限する対処で、細長い地形の原因を消すものではありません。 |
| モメンタム | 過去の更新を利用し、谷の横振れを平均化しやすくします。 |
| 適応的手法 | 座標ごとに更新の大きさを調整し、方向ごとの曲率差に対応しやすくします。 |
想起チェック
条件数が大きい地形で学習率に何が起きるか
急な方向では発散しやすく、緩い方向では進みにくいため、1つの学習率を決めにくくなります。