行列微分を1から — 逆伝播の数式を自分で導く
∂L/∂W = XᵀG の Xᵀ はどこから来たのか。行列微分は公式集の暗記ではなく、「トレースの中で dX を右端に回す」という1つの型です。分母レイアウトの形合わせから、線形層とsoftmax+交差エントロピーの勾配導出、倍精度での数値勾配チェックまで。
つまみが表になると、微分も表になる
スープが塩辛いとき犯人の調味料を疑う話は誤差逆伝播を1から解説で扱いました。あそこで追いかけたつまみは数個でしたが、現実のニューラルネットは1枚の層だけで数十万個のつまみを持ちます。しかもそれは一列に並んだ数ではなく、行と列を持つ表、つまり行列の形をしています。
学校で習った微分は「数を入れたら数が出る関数」の話でした。ところが深層学習で微分したい相手は、「表を入れたら1つの数(損失)が出る関数」です。この形の微分を行列微分(matrix calculus)と呼びます。
目的は公式集の暗記ではなく、backward の式を自分で導けて検算できるようになることです。 を「そういうもの」と受け入れているうちは、自作の層で形が合わない瞬間に手が止まります。
勾配は「同じ形の地図」
いちばん大事な事実から言います。スカラーの損失を何かで微分すると、結果はその何かと同じ形になります。
が の行列なら も で、その 成分は
つまり「 の 行 列のつまみをほんの少し回すと、損失 が何倍の勢いで動くか」という、ごく普通の偏微分です。それを、つまみと同じ座席表どおりに置き直しただけ。 の勾配とは、12個の偏微分を元の配置で並べた地図です。新しい概念は増えていません。
では何が難しいのか。「1個ずつ計算するのが現実的でない」ことです。 が なら成分は1600万個あります。行列のまま一発で書き下す技術が要る。それが行列微分です。
分母レイアウト — 転置がひっくり返る理由
教科書を2冊開くと、同じ量の定義が転置している。これが行列微分でいちばん時間を溶かす罠ですが、原因は難しい数学ではなく並べ方の流儀が2つあることだけです。
ベクトル ( 成分)をベクトル ( 成分)で微分した結果を考えます。中身は 個の偏微分 で、どちらの流儀でも同じものです。違うのは並べ方。
- 分子レイアウト: 分子()の番号を行にする。。ふつう「ヤコビアン」と呼ぶ形
- 分母レイアウト: 分母()の番号を行にする。。分子レイアウトの転置
深層学習が採っているのは折衷です。スカラーを何かで微分するときは分母レイアウト(勾配は元と同じ形)、ヤコビアンを明示的に書くときは分子レイアウト。混ざっても破綻しないのは、フレームワークが外に出すのが常に「スカラー損失の勾配」だからです。
覚え方は1つで足ります。形が合う方が正解。 と のどちらだったか思い出せなくても、 と同じ形になる方を選べば当たる。転置の向きを暗記しようとするのが、いちばん報われない努力です。
覚える型は1つだけ
成分ごとに を書き下す導出は、添字が3つを超えると必ず間違えます。実務で使うのは微分形式(differential)という道具で、型はこれだけです。損失の微小変化を
の形に整理できたら、。ここで は「 をほんの少し動かしたときの、その動かし方」( と同じ形の行列)、 は対角成分の和(トレース)です。要するに損失の揺れを「動かし方との内積」の形に書き直せたら、その相手が勾配、と言っているだけです。
なぜトレースが出るのか。 を成分で書くと 、つまり2つの表を平らに伸ばして取った内積そのものだからです。1変数の (傾き×動かした量)を成分の多い版に持ち上げると掛け算が内積になる。それをトレースという記法で書いただけで、身構える必要はありません。
3つの規則と、「トレースを回す」
型に流し込むために使う規則は3つしかありません。
- 積の微分:
- 転置は素通り:
- トレースは回せる: 、
3つ目が導出の心臓です。 が式の真ん中に埋まっていても、トレースの中では順番をぐるりと回して右端へ持ってこられます。右端に出して の形にできたら、その「何か」が答えの勾配です。行列微分の導出とは、式を睨んで を右端へ追いやる作業にすぎません。
線形層の勾配を、自分で導く
いちばん出てくる線形層(全結合層)の順伝播はこれです。
は入力で ( はバッチのサンプル数)、 は重みで 、 はバイアスで 次元、 は全成分1の 次元縦ベクトルで を全サンプルにコピーする役です。上流から降りてきた勾配 ( と同じ )は手元にあるとします。
コメント
コメントにはログインが必要です