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

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

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

要点

  • スカラーの損失を何かで微分すると、結果はその何かと同じ形になります。
  • WW が 3×43\times4 なら勾配も 3×43\times 4 で、12個の偏微分を元の配置で並べた地図です。
  • 分母レイアウトは分母の番号を行にする n×mn \times m で、分子レイアウト(ヤコビアン)の転置です。
  • 深層学習ではスカラーの微分に分母レイアウト、ヤコビアンを明示するときは分子レイアウトを使います。
  • dL=tr(G⊤dX)\mathrm{d}L = \mathrm{tr}(G^\top \mathrm{d}X) の形に整理できれば、∂L/∂X=G\partial L/\partial X = G です。
対象textタスクmath

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

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

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

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

勾配は「同じ形の地図」

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

WW が 3×43\times4 の行列なら ∂L/∂W\partial L / \partial W も 3×43\times 4 で、その (i,j)(i,j) 成分は

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

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

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

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

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

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

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

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

覚える型は1つだけ

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

dL=tr(G⊤dX)\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(G⊤X)\mathrm{tr}(G^\top X) を成分で書くと ∑i,jGijXij\sum_{i,j} G_{ij}X_{ij}、つまり2つの表を平らに伸ばして取った内積そのものだからです。1変数の dL=g dx\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+1b⊤Y = 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 Y(YY と同じ N×doutN\times d_{\text{out}})は手元にあるとします。

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

この先にあるもの

§

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

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

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

運営: TechAthletes · 編集方針 · 出典の付け方 · 訂正の記録

コメント

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