JA EN
体系微分と最適化の数学
·★ 会員·16分で読めます

行列微分を1から — 逆伝播の数式を自分で導く

∂L/∂W = XᵀG の Xᵀ はどこから来たのか。行列微分は公式集の暗記ではなく、「トレースの中で dX を右端に回す」という1つの型です。分母レイアウトの形合わせから、線形層とsoftmax+交差エントロピーの勾配導出、倍精度での数値勾配チェックまで。

対象textタスクmath

つまみが表になると、微分も表になる

スープが塩辛いとき犯人の調味料を疑う話は誤差逆伝播を1から解説で扱いました。あそこで追いかけたつまみは数個でしたが、現実のニューラルネットは1枚の層だけで数十万個のつまみを持ちます。しかもそれは一列に並んだ数ではなく、行と列を持つ表、つまり行列の形をしています。

学校で習った微分は「数を入れたら数が出る関数」の話でした。ところが深層学習で微分したい相手は、「表を入れたら1つの数(損失)が出る関数」です。この形の微分を行列微分(matrix calculus)と呼びます。

目的は公式集の暗記ではなく、backward の式を自分で導けて検算できるようになることです。L/W=XG\partial L/\partial W = X^\top G を「そういうもの」と受け入れているうちは、自作の層で形が合わない瞬間に手が止まります。

勾配は「同じ形の地図」

いちばん大事な事実から言います。スカラーの損失を何かで微分すると、結果はその何かと同じ形になります。

WW3×43\times4 の行列なら L/W\partial L / \partial W3×43\times 4 で、その (i,j)(i,j) 成分は

(LW)ij=LWij\left(\frac{\partial L}{\partial W}\right)_{ij} = \frac{\partial L}{\partial W_{ij}}
(1)

つまり「WWiijj 列のつまみをほんの少し回すと、損失 LL が何倍の勢いで動くか」という、ごく普通の偏微分です。それを、つまみと同じ座席表どおりに置き直しただけ。3×43\times4 の勾配とは、12個の偏微分を元の配置で並べた地図です。新しい概念は増えていません。

では何が難しいのか。「1個ずつ計算するのが現実的でない」ことです。WW4096×40964096\times4096 なら成分は1600万個あります。行列のまま一発で書き下す技術が要る。それが行列微分です。

分母レイアウト — 転置がひっくり返る理由

教科書を2冊開くと、同じ量の定義が転置している。これが行列微分でいちばん時間を溶かす罠ですが、原因は難しい数学ではなく並べ方の流儀が2つあることだけです。

ベクトル yymm 成分)をベクトル xxnn 成分)で微分した結果を考えます。中身は m×nm\times n 個の偏微分 yi/xj\partial y_i / \partial x_j で、どちらの流儀でも同じものです。違うのは並べ方。

深層学習が採っているのは折衷です。スカラーを何かで微分するときは分母レイアウト(勾配は元と同じ形)、ヤコビアンを明示的に書くときは分子レイアウト。混ざっても破綻しないのは、フレームワークが外に出すのが常に「スカラー損失の勾配」だからです。

覚え方は1つで足ります。形が合う方が正解XGX^\top GGXG^\top X のどちらだったか思い出せなくても、WW と同じ形になる方を選べば当たる。転置の向きを暗記しようとするのが、いちばん報われない努力です。

覚える型は1つだけ

成分ごとに k\sum_k を書き下す導出は、添字が3つを超えると必ず間違えます。実務で使うのは微分形式(differential)という道具で、型はこれだけです。損失の微小変化を

dL=tr(GdX)\mathrm{d}L = \mathrm{tr}(G^\top \mathrm{d}X)
(2)

の形に整理できたら、L/X=G\partial L/\partial X = G。ここで dX\mathrm{d}X は「XX をほんの少し動かしたときの、その動かし方」(XX と同じ形の行列)、tr\mathrm{tr} は対角成分の和(トレース)です。要するに損失の揺れを「動かし方との内積」の形に書き直せたら、その相手が勾配、と言っているだけです。

なぜトレースが出るのか。tr(GX)\mathrm{tr}(G^\top X) を成分で書くと i,jGijXij\sum_{i,j} G_{ij}X_{ij}、つまり2つの表を平らに伸ばして取った内積そのものだからです。1変数の dL=gdx\mathrm{d}L = g\,\mathrm{d}x(傾き×動かした量)を成分の多い版に持ち上げると掛け算が内積になる。それをトレースという記法で書いただけで、身構える必要はありません。

FIG 1つまみが1個ならこの絵で終わり。行列微分がやるのは、この「傾きを測って逆向きに進む」を、つまみが100万個ある空間で、表の形を保ったまま同時に行うこと

3つの規則と、「トレースを回す」

型に流し込むために使う規則は3つしかありません。

3つ目が導出の心臓です。dX\mathrm{d}X が式の真ん中に埋まっていても、トレースの中では順番をぐるりと回して右端へ持ってこられます。右端に出して tr((何か)dX)\mathrm{tr}\big((\text{何か})^\top\, \mathrm{d}X\big) の形にできたら、その「何か」が答えの勾配です。行列微分の導出とは、式を睨んで dX\mathrm{d}X を右端へ追いやる作業にすぎません。

線形層の勾配を、自分で導く

いちばん出てくる線形層(全結合層)の順伝播はこれです。

Y=XW+1bY = XW + \mathbf{1}b^\top

XX は入力で N×dinN\times d_{\text{in}}NN はバッチのサンプル数)、WW は重みで din×doutd_{\text{in}}\times d_{\text{out}}bb はバイアスで doutd_{\text{out}} 次元、1\mathbf 1 は全成分1の NN 次元縦ベクトルで bb を全サンプルにコピーする役です。上流から降りてきた勾配 G=L/YG = \partial L/\partial YYY と同じ N×doutN\times d_{\text{out}})は手元にあるとします。

つまり「 の揺れは、 の揺れ・ の揺れ・ の揺れの3つが足し合わさったもの」というだけです。あとは3項に分けて、それぞれ を右端に回します。 の項はもう右端にいます。

この先にあるもの

§

ここから先は会員限定です

解説記事371本・教科書26章・学生モード48単元・論文精読6本が、月額¥490ですべて読み放題になります。新しい解説は毎日3本ずつ増えます。いつでも解約でき、解約後も期間の終わりまで読めます。

会員の方はログインすると続きが表示されます

コメント

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