暴走した勾配が学習を一発で壊す仕組みと、それを救う「上限」。
SRC·52
Source
ほとんどの一歩はそっと押す。だが異常な一歩が、数週間を消し去る。
学習とは、坂を下る何百万もの小さな一歩だ。だが時おりあるバッチが途方もない勾配を生む——たった一回の巨大な一歩がモデルを地図の外へ放り出し、数週間の前進を一回の更新で台無しにする。学習はまるごと死ぬ。必要なのは、より良い一歩ではない。まれに暴れるその一歩を縛る綱だ。
なぜ暴発するのか——1より大きい傾きを十分な数だけ掛け合わせるからだ。
マイクのハウリングのように:スピーカーがマイクを、マイクがスピーカーを煽り、一巡ごとに大きくなり、ついに部屋が悲鳴をあげる。誤差逆伝播も深い層で同じことをする——層ごとに傾きを一つ掛ける。どれも1をわずかに超えるだけでも、50個が掛け合わさって怪物になる:λ=1.5で50層なら、ささやきが≈6億にふくれ上がる。
巨大な勾配は、巨大な跳躍——地図の外へ。
引きすぎたパチンコのように:ほどよく引けば石は的に当たる。むやみに引き絞れば石は丘の向こうへ飛び去り、二度と戻らない。踏み出す一歩は、学習率と勾配の長さの積だ。その長さが何百万にも暴発すれば、モデルは損失の地形そのものの外へ飛び出す——無意味へ、NaNへ。
まず、勾配ぜんたいの大きさを測る。
上限をかける前に、何百万もの成分をもつベクトルの大きさを表す一つの数が要る。箱の対角線のように:各辺を二乗して足し、平方根をとる——すると別々の辺がすべて一本のまっすぐな長さに畳み込まれる。それが勾配のノルムだ:何百万の数が寄り集まろうと、一歩ぜんたいのただ一つの長さ。
解決策:長さに上限をかけ、向きはそのまま。
暴れ馬の手綱を引くように:手綱を引いて荒れた疾走を安全な駆け足に戻す——それでも馬はまさに狙った方へ走る。ノルムによるクリッピングは勾配にこれをする:しきい値の下ならそのまま、超えたらその上限まで縮める。向きは同じ、歩幅だけ短く。降下は依然として坂下を指す——ただ、もう跳びかかれない。
雑な親戚:数を一つずつ抑え、狙いを曲げる。
もっと安上がりな手もある:各成分を±vで抑え込む。柵を平らに切りそろえるように:きれいな傾斜で登っていた杭の列を、てっぺんで水平に切ると、もう以前のようには傾かない——「高すぎるものは無し」を課した代わりに、形を失った。数を一つずつ抑えれば学習は救われるが、ひそかに勾配の向きを正しい筋からねじ曲げる。ノルムなら向きを保ち、値なら向きを単純さと引き換えにする。
これで最悪の一歩も、既知の上限につながれる。
空中ブランコの下の安全ネットのように:曲芸師が最難関の技に挑めるのは、しくじったその一度をネットが受け止めてくれるからだ。クリッピングのあとは、一歩が学習率と上限の積を決して超えない——暴れる勾配は致命的な跳躍ではなく、しっかりとした一押しになる。勾配がなぜ暴発したかは直さない。ただ、暴発したその一度を生き延びさせるだけだ。
最も荒々しい修正を黙らせた。あれは警告だったのか?
あれほど暴れる勾配は、モデルが叫んでいたのだ——データか、学習率か、構造か、何かがひどく狂っていると。クリッピングは聞き入れない。ただ叫びを礼儀正しい一押しに変えて、学習を続けさせるだけ。私たちは足場を保った。🌱 だが、まれで激しいその信号に上限をかけるとき、私たちは不調を治しているのか——それとも、ただ聞こえなくしているだけなのか?
タップ →↑スワイプで詳しく↓スワイプで終了クリックまたは → で次へ↑ で詳しくesc で終了