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