last_modified: 2026-01-10
生成AIによる自動生成記事に関する免責事項:
本記事は、Petersen & Pedersen著 The Matrix Cookbook (Nov 15, 2012 edition) のPage 15の内容(公式134〜142)を骨子とし、数理的な証明と応用例を大幅に加筆して再構成した解説記事です。筆者の学習目的で生成したものです。正確な内容は必ず一次情報で確認してください。
1. 序論:構造が生む「微分の歪み」を補正する#
Page 14 の最後で触れた「構造化行列の微分」について、Page 15 では具体的な計算手法と公式が提示されます。
行列の成分同士に拘束条件(対称性 Xij=Xji や対角性 Xij=0(i=j) など)がある場合、単純な全微分は通用しません。本ページでは、連鎖律(Chain Rule) を用いてこの問題を一般化し、特に実用性の高い 対称行列 と 対角行列 の微分公式を導出します。これらは、正規分布の最尤推定やニューラルネットワークのパラメータ最適化において必須の知識です。
2. 構造行列と連鎖律 (Eq. 134–137)#
まずは、あらゆる構造化行列に対応できる汎用的なフレームワークを定義します。
2.1 構造行列 Sij の定義 (Eq. 134)#
行列 A の成分 Aij を微小変化させたとき、行列全体がどう変化するかを表す行列を定義します。
【公式】
∂Aij∂A=Sij(134)
【解説】
- 構造なし(一般行列): Aij だけが 1 で他は 0。つまり Sij=Jij(シングルエントリ行列)。
- 対称行列: Aij を動かすと Aji も動く。つまり Sij=Jij+Jji (ただし i=j の時は重複しないよう調整が必要)。
2.2 行列関数の連鎖律 (Eq. 135–137)#
関数 g(U) (ただし U=f(X))を X で微分するための一般公式です。
【公式】
∂Xij∂g(U)=Tr[(∂U∂g(U))T∂Xij∂U](137)
【解説】
これは Page 14 Eq. 133 の再掲・詳細化です。
「求めたい勾配」は、「構造を無視した勾配 ∂U∂g」と「構造を表す微分 ∂Xij∂U」の内積(トレース)として計算されます。これがすべての構造化行列微分の基礎となります。
3. 対称行列の微分 (Symmetric Matrix)#
機械学習で最も頻出する構造化行列です。分散共分散行列、距離行列、カーネル行列などはすべて対称行列です。
3.1 対称化の一般公式 (Eq. 138)#
【公式】
dAdf=[∂A∂f]+[∂A∂f]T−diag[∂A∂f](138)
ここで [∂A∂f] は、対称性を無視して計算した「仮の勾配(Naive Gradient)」です。
【導出のロジック】
対称行列の構造行列は Sij=Jij+Jji−JijJij です(対角成分のダブルカウントを防ぐため)。
これを連鎖律に代入すると、
- Jij の寄与 → そのままの勾配 G
- Jji の寄与 → 転置された勾配 GT
- −JijJij の寄与 → 対角成分の引き算 −diag(G)
となり、Eq. 138 が導かれます。
3.2 具体的な適用例 (Eq. 139–141)#
【例1: トレースの微分】
∂X∂Tr(AX)=A+AT−(A∘I)(139)
- Naive: Tr(AX) の X 微分は AT です(Page 12 Eq. 100)。
- Symmetric Correction: 公式 Eq. 138 に G=AT を代入します。
AT+(AT)T−diag(AT)=AT+A−diag(A)
原典の (A∘I) は diag(A) と同じ意味(アダマール積で対角成分を残す)です。
【例2: 行列式の微分】
∂X∂det(X)=det(X)(2X−1−(X−1∘I))(140)
- Naive: det(X) の微分は det(X)X−T です(Page 8 Eq. 49)。X は対称なので X−1 と書けます。
- Correction: G=det(X)X−1 とすると、
G+GT−diag(G)=det(X)(X−1+X−1−diag(X−1))
よって 2X−1−(X−1∘I) となります。
【例3: 対数行列式の微分】
∂X∂lndet(X)=2X−1−(X−1∘I)(141)
- ガウス分布の対数尤度関数などで頻出する式です。Eq. 140 を det(X) で割るだけで得られます。
4. 対角行列の微分 (Diagonal Matrix)#
ニューラルネットワークのScaling層や、独立成分分析などで現れます。
4.1 対角化の公式 (Eq. 142)#
【公式】
∂X∂Tr(AX)=A∘I(142)
【解説】
行列 X が対角行列である場合、非対角成分 Xij(i=j) は定数 0 であり、変数ではありません。
したがって、微分(感度)を持つのは対角成分 Xii だけです。
- Naive: Tr(AX) の微分は AT。
- Diagonal Correction: 変数に対応する成分(対角成分)だけを残し、他を 0 にします(マスク処理)。
AT∘I=diag(A)
(A の対角成分は AT の対角成分と同じなので、単に A の対角成分を取り出す操作になります)。
5. 結論#
Page 15 は、理論と実装の乖離を埋めるための重要なページです。
- 「対称行列の勾配は A+AT」ではない: しばしば 2A や A+AT と略されますが、厳密には対角成分の重複を引く必要があります(A+AT−diag(A))。
- 連鎖律の威力: Eq. 137 の考え方さえあれば、どんな特殊な構造を持つ行列(三角行列、ブロック行列など)でも、自分で微分公式を導くことができます。
次の最終ページ(Page 16)に向けて、行列微分の主要なトピックはここでほぼ完結します。
参考文献#
- Petersen, K. B., & Pedersen, M. S. (2012). The Matrix Cookbook. Technical University of Denmark. (Page 15, Eqs 134-142)
- Magnus, J. R., & Neudecker, H. (2019). Matrix Differential Calculus. (Symmetric matrix derivatives)
補足:Eq. 138 の直感的理解(スイッチの配線図)#
対称行列の微分公式がなぜ「対角成分を引く」のか、スイッチと電球のアナロジーで復習しましょう。
dAdf=自分G+ペアGT−重複補正diag(G)
-
非対角成分 (i=j):
- スイッチ Aij を押すと、自分 (ij) とペア (ji) の2つの電球が点灯します。
- 感度 = Gij+Gji
- これは公式の G+GT の部分で正しく計算されます。
-
対角成分 (i=j):
- スイッチ Aii を押すと、自分 (ii) の電球しか点灯しません(ペアは自分自身)。
- 単純に G+GT を計算すると、Gii+Gii=2Gii となり、感度を2倍に過大評価してしまいます。
- そこで、−diag(G) を引くことで、重複カウントを解消 します (2Gii−Gii=Gii)。
この「引き算」こそが、対称行列の微分を正しく実装するための鍵なのです。
補足:連鎖律 (Eq. 137) の具体的な使い方ガイド#
Eq. 137 は、行列の合成関数 g(f(X)) を微分するための「万能接着剤」です。抽象的に見えますが、以下の3ステップのアルゴリズムとして捉えると、機械的に計算できるようになります。
【連鎖律の3ステップ・レシピ】
- 外側の微分 (∂g/∂U): U をただの変数だと思って g(U) を微分する。
- 内側の微分 (∂U/∂Xij): X の成分 Xij が変化したとき、U がどう変化するか(構造行列)を求める。
- トレースで接着: 上記2つを掛け合わせてトレースを取る。
実践例1:基本公式の再導出 (Tr(AX) の微分)#
あえて Eq. 137 を使って、基本公式 ∂X∂Tr(AX)=AT を導いてみましょう。この式が正しく機能することの確認です。
設定:
- 関数: g(U)=Tr(U)
- 中身: U=AX
Step 1: 外側の微分
g(U)=Tr(U) なので、微分は単位行列です。
Aouter=∂U∂g=I
Step 2: 内側の微分 (Xij による U の変化)
U=AX の成分 Xij だけを 1 増やしたとき、U はどう変化するか?
Xij に掛かっている係数は、行列 A の第 i 列目です。
∂Xij∂U=AJij
(ここで Jij は (i,j) 成分だけが 1 の行列。AJij は「A の第 i 列を第 j 列に置いた行列」のような疎行列になります)
Step 3: トレースで接着
Eq. 137 に代入します。
∂Xij∂g=Tr[(Aouter)T⋅(AJij)]=Tr[I⋅AJij]=Tr(AJij)
Tr(AJij) は、行列 AJij の対角成分の和です。
AJij の対角成分 (k,k) は ∑mAkm(Jij)mk。Jij は (i,j) のみ 1 なので、m=i,k=j のときだけ値が残ります。
つまり、対角和は Aji になります。
∂Xij∂g=Aji⟹∂X∂g=AT
正しく公式が導かれました。
実践例2:少し複雑な合成関数 (線形変換のノルム)#
ニューラルネットワークの層 (Y=WX+b) の誤差逆伝播などでよく見る形です。
設定:
- 目的関数: g(U)=∥U∥F2=Tr(UTU)
- 中身: U=WX
- 求めたいもの: ∂X∂g
Step 1: 外側の微分
g(U)=Tr(UTU) の微分は、Page 13 Eq. 115 より 2U です。
∂U∂g=2U=2WX
Step 2: 内側の微分
先ほどと同様、U=WX なので、
∂Xij∂U=WJij
Step 3: トレースで接着
∂Xij∂g=Tr[(2WX)T⋅(WJij)]=Tr[2XTWTWJij]
ここでトレースの性質 Tr(MJij)=Mji (行列 M の (j,i) 成分)を使います。
M=2XTWTW とすると、
∂Xij∂g=(2XTWTW)ji=(2WTWX)ij
成分 (i,j) が (2WTWX)ij になるということは、行列全体では:
∂X∂g=2WTWX
まとめ#
Eq. 137 の本質は、**「偏微分の成分計算 (Xij) を、トレース演算 (Tr) に置き換えて、行列のまま処理する」**点にあります。
- ∂Xij∂U の部分に、構造(対称性など)や変換(AXなど)の情報が集約されます。
- これにより、複雑な合成関数でも「外側の微分」と「内側の微分」を別々に計算して、最後にガチャンと組み合わせるだけで勾配が得られます。