JA EN
体系微分と最適化の数学
·無料·9分で読めます

AIのための微分 — 勾配は「どちらに動けば良くなるか」の矢印

極限の厳密な定義も、置換積分も要りません。学習の全体は「傾きを測って逆向きに進む」だけです。微分=倍率、勾配=傾きを並べたベクトル、連鎖律=倍率の掛け算。ヤコビアンとヘッセ行列は「何を表すか」だけを押さえ、論文の更新式を読み下します。

対象textタスクmath

ゴール: この式を読めるようにする

学習の話をする論文には、形を変えながら必ずこの1行が出てきます。

θt+1=θtηθL(θt)\theta_{t+1} = \theta_t - \eta\,\nabla_{\theta}\mathcal{L}(\theta_t)
(1)

この式が言っているのは要するに、いまのパラメータから、損失が最も増える向きの逆へ、少しだけ動くということです。θ\theta(シータ)はモデルの全パラメータ、tt は何ステップ目か、η\eta(イータ)は一歩の大きさ、L\mathcal{L} は損失、\nabla(ナブラ)がこの記事の主役です。記号を全部ふつうの言葉に置き換えると、この1行は 新しい設定 = いまの設定 −(一歩の大きさ)×(悪くなる向き) と読めます。

必要な微分の知識は、驚くほど少なくて済みます。極限の厳密な定義も、部分積分も、AIの論文にはまず出てきません。要るのは微分=傾きという1つの直感と、それを多変数に広げるための語彙だけです。

微分は「倍率」、それ以上でも以下でもない

dfdx(x)=limh0f(x+h)f(x)h\frac{df}{dx}(x) = \lim_{h \to 0}\frac{f(x+h) - f(x)}{h}

hh はごく小さい数、limh0\lim_{h\to 0} は「hh をどこまでも0に近づけたときの行き先」です。

この式が言っているのは要するに、入力を hh だけ動かしたら出力が何倍動くかということ。分子が「出力の変化」、分母が「入力の変化」で、その比です。傾き0.5なら、入力を0.01動かすと出力は0.005動く。微分とはこの局所的な倍率のことで、それ以上の意味はありません。

符号がすべてです。傾きが正なら、増やせば増える。負なら、増やせば減る。下げたければ傾きと逆へ動く——学習の全体はこれだけです。

偏微分: 他を固定して、1本だけ回す

つまみが1本なら話は簡単ですが、モデルのつまみは数百万から数十億本あります。そこで他のつまみを全部止めたまま、1本だけ動かして傾きを測る。これが偏微分で、dd の代わりに \partial(ラウンド・ディー)を書きます。

Lθi\frac{\partial L}{\partial \theta_i}

この式が言っているのは要するに、ii 番目のつまみだけをほんの少し回したとき、損失がどれだけ変わるか。上の \partial が「損失の変化」、下の \partial が「そのつまみの変化」、添字の ii が「何番目のつまみか」です。ミキサー卓のフェーダーを1本だけ上げて音の変化を聴く、あの作業です。難しさはありません。「他は動かさない」という約束が付いただけの傾きです。

勾配: 傾きを全部並べたベクトル

偏微分をつまみの本数ぶん計算して、順番に並べます。

θL=[Lθ1,  Lθ2,  ,  Lθn]\nabla_{\theta} L = \left[\frac{\partial L}{\partial \theta_1},\; \frac{\partial L}{\partial \theta_2},\; \ldots,\; \frac{\partial L}{\partial \theta_n}\right]
(2)

この式が言っているのは要するに、各つまみを1本ずつ回したときの効き目を、ただ順番に並べただけということ。角括弧が「並べた列」、中の1つ1つが「そのつまみの傾き」、nn は「つまみが何本あるか」です。難しい新概念ではなく、偏微分の一覧表です。パラメータが70億個なら、勾配も70億個の数が並んだベクトルになります。

並べると、単なる一覧表になかった性質が生まれます。

だから下りたければ逆向きに進む。冒頭の式(1)の先頭にマイナスが付いているのはこのためです。線形代数でベクトルを「意味を置く座標」と呼びましたが、勾配は同じ空間に置かれた矢印です。

FIG 1球が傾きを測って逆向きに転がります。学習率を上げていくと谷底を飛び越え、往復を始め、やがて発散します。式(1)の η を大きくするとはこういうことです

連鎖律: 倍率は掛け算でつながる

深層学習で唯一「技」と呼べるのが連鎖律です。

dzdx=dzdydydx\frac{dz}{dx} = \frac{dz}{dy}\cdot\frac{dy}{dx}
(3)

xx が変われば yy が変わり、yy が変われば zz が変わる、という3段の関係を考えています。

この式が言っているのは要するに、倍率は掛け算でつながるということ。xx を1動かすと yy が3動き、yy が1動くと zz が2動くなら、xx を1動かしたとき zz は6動く。噛み合った歯車の回転比と同じです。

ニューラルネットは層を重ねた合成関数、つまり歯車が何十段も噛み合った装置です。だから入り口のつまみが出力にどう効くかは、途中の倍率を全部掛ければ求まります。この掛け算を出力側から順に実行する手続きが誤差逆伝播で、詳細は誤差逆伝播を1から解説にあります。

掛け算であることの帰結も見えます。途中の倍率が軒並み1より小さければ結果は指数的に0へ潰れ(勾配消失)、1より大きければ指数的に膨らむ(勾配爆発)。ReLU も残差接続も正規化層も、この掛け算の鎖を壊さないための道具です。

ヤコビアンとヘッセ行列: 何を表すかだけ

論文にはこの2つの名前がよく出ます。計算できる必要はなく、何の表なのかを知っていれば読めます。

ヤコビアンは、入力も出力もベクトルのとき、偏微分を総当たりで並べた表です。

Jij=fixjJ_{ij} = \frac{\partial f_i}{\partial x_j}

この式が言っているのは要するに、入力の jj 番目を動かしたとき出力の ii 番目がどれだけ動くかを、全組み合わせぶん並べたもの。勾配は「出力が1個のときのヤコビアン」の特別な場合です。逆伝播とは、このヤコビアンとベクトルの積を出力側から順に取っていく作業にほかなりません(実装は表を作らずに積だけを計算します)。

ヘッセ行列は、2階微分——つまり傾きの傾き——を並べた表です。

Hij=2LθiθjH_{ij} = \frac{\partial^2 L}{\partial \theta_i \partial \theta_j}

2\partial^2 は「傾きの傾き」、添字の iijj はつまみを2本選ぶ組み合わせです。1マスずつ読むなら、jj 番目のつまみを回したとき、ii 番目の方向の傾きがどれだけ変わるか。表全体が言っているのは要するに、谷の曲がり具合です。1階微分が「どちらへ下るか」なら、2階微分は「その下り坂がどれくらい急に曲がっているか」です。曲がりが分かれば理想的な歩幅も決まるので、原理的には学習率を自分で決められます。

なぜ実際には使われないのか。パラメータが nn 個ならヘッセ行列は n×nn \times n で、nn が10億なら保持すること自体が不可能です。Adam などの「つまみごとの学習率」は、ヘッセ行列ではなく勾配の二乗の移動平均で曲がり具合を粗く代用しています。

凸性: なぜ「凸だと嬉しい」のか

f(λx+(1λ)y)λf(x)+(1λ)f(y)f(\lambda x + (1-\lambda)y) \le \lambda f(x) + (1-\lambda)f(y)

λ\lambda は0から1の数で、左辺は「2点の間の点での関数の値」、右辺は「2点を直線で結んだときの高さ」です。

この式が言っているのは要するに、グラフ上の2点を結んだ線分が、必ずグラフより上を通るということ。器のような形、谷が1つしかない形です。

凸だと何が嬉しいか。局所最小がそのまま大域最小になる。つまり傾きが0の場所に着いたら、そこが答えだと断言できます。初期値も乱数の種も結果を変えません。線形回帰やロジスティック回帰はここに属し、だから「必ず同じ答えが出る」と言えます。

深層学習の損失は凸ではありません。谷はいくつもあり、鞍点(ある方向には下るが別の方向には上る点)や、傾きがほぼ消えた平坦領域が大量にあります。初期値やデータの順番で結果が変わるのはそのためで、同じ設定で2回学習して差が出ても異常ではありません。それでも実用上うまくいくことが観測されており、実務では「大域最適に着いたか」ではなく「検証データで十分な性能が出たか」で判断します(過学習と評価設計)。

FIG 22つのつまみが作る損失の地形。勾配は等高線に直角に、最も急な向きを指します。細長い谷では経路がジグザグに震え、モーメンタムがそれを打ち消す様子を確かめてください

実務で効く3つのポイント

1. 微分できない点があっても学習は動く ReLU は0で折れていて、そこに傾きは定義されません。実装は0か1を便宜的に返します。ちょうど0に当たる確率は無視できるほど小さく、「厳密には微分不可能」を理由に手を止める必要はありません。

2. 勾配ノルムを見る習慣を持つ 勾配の長さ(norm)は学習の健康診断です。跳ね上がっていれば爆発、ほぼ0なら消失か平坦領域。損失だけを見ていると、この2つの区別がつきません。

3. 自動微分は連鎖律の自動化にすぎない PyTorch や JAX がやっているのは、順伝播で作った計算グラフに連鎖律を機械的に当てることです。detach()no_grad() は「ここで鎖を切る」宣言だと読めば、勾配が流れない事故の原因を追えます。

まとめ

次は、モデルの出力そのものを別の言葉——確率——で読み直します(AIのための確率・統計)。損失関数がなぜあの形なのか、という問いへの答えがそこにあります。

コメント

コメントにはログインが必要です