AIのための微分 — 勾配は「どちらに動けば良くなるか」の矢印
極限の厳密な定義も、置換積分も要りません。学習の全体は「傾きを測って逆向きに進む」だけです。微分=倍率、勾配=傾きを並べたベクトル、連鎖律=倍率の掛け算。ヤコビアンとヘッセ行列は「何を表すか」だけを押さえ、論文の更新式を読み下します。
ゴール: この式を読めるようにする
学習の話をする論文には、形を変えながら必ずこの1行が出てきます。
この式が言っているのは要するに、いまのパラメータから、損失が最も増える向きの逆へ、少しだけ動くということです。(シータ)はモデルの全パラメータ、 は何ステップ目か、(イータ)は一歩の大きさ、 は損失、(ナブラ)がこの記事の主役です。記号を全部ふつうの言葉に置き換えると、この1行は 新しい設定 = いまの設定 −(一歩の大きさ)×(悪くなる向き) と読めます。
必要な微分の知識は、驚くほど少なくて済みます。極限の厳密な定義も、部分積分も、AIの論文にはまず出てきません。要るのは微分=傾きという1つの直感と、それを多変数に広げるための語彙だけです。
微分は「倍率」、それ以上でも以下でもない
はごく小さい数、 は「 をどこまでも0に近づけたときの行き先」です。
この式が言っているのは要するに、入力を だけ動かしたら出力が何倍動くかということ。分子が「出力の変化」、分母が「入力の変化」で、その比です。傾き0.5なら、入力を0.01動かすと出力は0.005動く。微分とはこの局所的な倍率のことで、それ以上の意味はありません。
符号がすべてです。傾きが正なら、増やせば増える。負なら、増やせば減る。下げたければ傾きと逆へ動く——学習の全体はこれだけです。
偏微分: 他を固定して、1本だけ回す
つまみが1本なら話は簡単ですが、モデルのつまみは数百万から数十億本あります。そこで他のつまみを全部止めたまま、1本だけ動かして傾きを測る。これが偏微分で、 の代わりに (ラウンド・ディー)を書きます。
この式が言っているのは要するに、 番目のつまみだけをほんの少し回したとき、損失がどれだけ変わるか。上の が「損失の変化」、下の が「そのつまみの変化」、添字の が「何番目のつまみか」です。ミキサー卓のフェーダーを1本だけ上げて音の変化を聴く、あの作業です。難しさはありません。「他は動かさない」という約束が付いただけの傾きです。
勾配: 傾きを全部並べたベクトル
偏微分をつまみの本数ぶん計算して、順番に並べます。
この式が言っているのは要するに、各つまみを1本ずつ回したときの効き目を、ただ順番に並べただけということ。角括弧が「並べた列」、中の1つ1つが「そのつまみの傾き」、 は「つまみが何本あるか」です。難しい新概念ではなく、偏微分の一覧表です。パラメータが70億個なら、勾配も70億個の数が並んだベクトルになります。
並べると、単なる一覧表になかった性質が生まれます。
- 勾配は、損失が最も急に増える向きを指す
- 勾配の長さは、その急さの大きさ
だから下りたければ逆向きに進む。冒頭の式(1)の先頭にマイナスが付いているのはこのためです。線形代数でベクトルを「意味を置く座標」と呼びましたが、勾配は同じ空間に置かれた矢印です。
連鎖律: 倍率は掛け算でつながる
深層学習で唯一「技」と呼べるのが連鎖律です。
が変われば が変わり、 が変われば が変わる、という3段の関係を考えています。
この式が言っているのは要するに、倍率は掛け算でつながるということ。 を1動かすと が3動き、 が1動くと が2動くなら、 を1動かしたとき は6動く。噛み合った歯車の回転比と同じです。
ニューラルネットは層を重ねた合成関数、つまり歯車が何十段も噛み合った装置です。だから入り口のつまみが出力にどう効くかは、途中の倍率を全部掛ければ求まります。この掛け算を出力側から順に実行する手続きが誤差逆伝播で、詳細は誤差逆伝播を1から解説にあります。
掛け算であることの帰結も見えます。途中の倍率が軒並み1より小さければ結果は指数的に0へ潰れ(勾配消失)、1より大きければ指数的に膨らむ(勾配爆発)。ReLU も残差接続も正規化層も、この掛け算の鎖を壊さないための道具です。
ヤコビアンとヘッセ行列: 何を表すかだけ
論文にはこの2つの名前がよく出ます。計算できる必要はなく、何の表なのかを知っていれば読めます。
ヤコビアンは、入力も出力もベクトルのとき、偏微分を総当たりで並べた表です。
この式が言っているのは要するに、入力の 番目を動かしたとき出力の 番目がどれだけ動くかを、全組み合わせぶん並べたもの。勾配は「出力が1個のときのヤコビアン」の特別な場合です。逆伝播とは、このヤコビアンとベクトルの積を出力側から順に取っていく作業にほかなりません(実装は表を作らずに積だけを計算します)。
ヘッセ行列は、2階微分——つまり傾きの傾き——を並べた表です。
は「傾きの傾き」、添字の と はつまみを2本選ぶ組み合わせです。1マスずつ読むなら、 番目のつまみを回したとき、 番目の方向の傾きがどれだけ変わるか。表全体が言っているのは要するに、谷の曲がり具合です。1階微分が「どちらへ下るか」なら、2階微分は「その下り坂がどれくらい急に曲がっているか」です。曲がりが分かれば理想的な歩幅も決まるので、原理的には学習率を自分で決められます。
なぜ実際には使われないのか。パラメータが 個ならヘッセ行列は で、 が10億なら保持すること自体が不可能です。Adam などの「つまみごとの学習率」は、ヘッセ行列ではなく勾配の二乗の移動平均で曲がり具合を粗く代用しています。
凸性: なぜ「凸だと嬉しい」のか
は0から1の数で、左辺は「2点の間の点での関数の値」、右辺は「2点を直線で結んだときの高さ」です。
この式が言っているのは要するに、グラフ上の2点を結んだ線分が、必ずグラフより上を通るということ。器のような形、谷が1つしかない形です。
凸だと何が嬉しいか。局所最小がそのまま大域最小になる。つまり傾きが0の場所に着いたら、そこが答えだと断言できます。初期値も乱数の種も結果を変えません。線形回帰やロジスティック回帰はここに属し、だから「必ず同じ答えが出る」と言えます。
深層学習の損失は凸ではありません。谷はいくつもあり、鞍点(ある方向には下るが別の方向には上る点)や、傾きがほぼ消えた平坦領域が大量にあります。初期値やデータの順番で結果が変わるのはそのためで、同じ設定で2回学習して差が出ても異常ではありません。それでも実用上うまくいくことが観測されており、実務では「大域最適に着いたか」ではなく「検証データで十分な性能が出たか」で判断します(過学習と評価設計)。
実務で効く3つのポイント
1. 微分できない点があっても学習は動く ReLU は0で折れていて、そこに傾きは定義されません。実装は0か1を便宜的に返します。ちょうど0に当たる確率は無視できるほど小さく、「厳密には微分不可能」を理由に手を止める必要はありません。
2. 勾配ノルムを見る習慣を持つ 勾配の長さ(norm)は学習の健康診断です。跳ね上がっていれば爆発、ほぼ0なら消失か平坦領域。損失だけを見ていると、この2つの区別がつきません。
3. 自動微分は連鎖律の自動化にすぎない
PyTorch や JAX がやっているのは、順伝播で作った計算グラフに連鎖律を機械的に当てることです。detach() や no_grad() は「ここで鎖を切る」宣言だと読めば、勾配が流れない事故の原因を追えます。
まとめ
- 微分は局所的な倍率。符号を見て、傾きと逆へ動くのが学習のすべて
- 偏微分は「他を固定して1本だけ回した傾き」、勾配はそれを全つまみぶん並べたベクトル
- 勾配は最も急に増える向きを指し、長さがその急さ。だから更新式にはマイナスが付く
- 連鎖律は倍率の掛け算。掛け算だから勾配消失・爆発が起き、ReLU や残差接続はその鎖を守る道具
- ヤコビアンは偏微分の総当たり表、ヘッセ行列は曲がり具合の表。大きすぎて実際には近似で代用する
- 凸なら局所最小=大域最小。深層学習は非凸で、だから検証データでの性能が唯一の判定基準になる
次は、モデルの出力そのものを別の言葉——確率——で読み直します(AIのための確率・統計)。損失関数がなぜあの形なのか、という問いへの答えがそこにあります。
コメント
コメントにはログインが必要です