機械学習で必ずと言っていいほど出てくる行列微分.これ,苦手な方も多いのではないでしょうか.僕も苦手でしたが,あるパターンを見つけたので共有したいと思います.もしかしたら当たり前なのかもしれませんが....
まず,以下の式を理解する.
[AB]_{ij} = \sum_{k=1}^c A_{ik} B_{kj}
ただし,Aは$m \times c$行列で,Bは$c \times n$行列.こう書くと普通Aはm行c列の行列をさし,Bはc行n列の行列をさします.使うのはほぼこの式だけです.ちなみに普通行列とベクトルは太字で書きますが,この記事では普通に書きます.あと,sumには添字のみを表記することにします.
じゃあ例題として,$tr(X^TBX)$を扱ってみましょう.trはtraceでただの対角成分の和なので何も怖くありません.まずは対象を成分で全て書き表します.
\begin{align*}
tr(X^TBX)
&= \sum_{i} [X^TBX]_{ii} \\
&= \sum_{i} \sum_{j} [X^T]_{ij} [BX]_{ji} \\
&= \sum_{i} \sum_{j} \sum_{k} [X^T]_{ij} B_{jk} X_{ki} \\
&= \sum_{i} \sum_{j} \sum_{k} X_{ji} B_{jk} X_{ki} \\
&= \sum_{i} \sum_{j} \sum_{k} B_{jk} X_{ji} X_{ki} \\
\end{align*}
最初の式を使って展開しただけです.ではこれを$X_{\ell\ell'}$で微分してみましょう.ここで,添字は式中の記号とは区別した方がいいです.
ここが最大のポイントなのですが,$B_{jk} X_{ji} X_{ki}$だけに注目して,各添字の組み合わせが$(\ell, \ell')$になる時だけを考えます.なぜならそれ以外は微分すれば消えるからです.ここでは,
- $j = \ell, i = \ell'$
- $k = \ell, i = \ell'$
の場合だけ考えれば良いです.
まず1の場合ですが,注目している項は$B_{\ell k} X_{\ell\ell'} X_{k\ell'}$になります.ここに出てくる添字の中で,$(\ell, \ell')$以外の添字についてはsumをとります.なので,$\sum_{k} B_{\ell k} X_{\ell\ell'} X_{k\ell'}$を考えます.ここから$X_{\ell \ell'}$を取り除きます.そうすると,残るのは$\sum_{k} B_{\ell k} X_{k\ell'}$になりますよね.そしてこれは最初の式で変形すると,$[BX]_{\ell \ell'}$となります.
2についても同様です.この場合,注目している項は$B_{j\ell} X_{j\ell'} X_{\ell\ell'}$となり,$j$が残っているのでsumをとって,$\sum_{j} B_{j\ell} X_{j\ell'} X_{\ell\ell'}$を考えます.ここから$X_{\ell\ell'}$を取り除くと,$\sum_{j} B_{j\ell} X_{j\ell'} $が残ります.これを最初の式で変形すると,$[B^T X]_{\ell\ell'}$となります.
これらを足せば,
\frac{\partial}{\partial X_{\ell \ell'}} tr(X^T B X) = [BX]_{\ell \ell'} + [B^T X]_{\ell \ell'}
となります.行列の形で書くと,
\frac{\partial}{\partial X} tr(X^T B X) = BX + B^T X
となります.そうですこれが,微分したものになっています.
今回は自分がやっている行列微分の方法を紹介してみました.まぁ実際にはmatrix cookbookなんかをみればたいていの微分は書いてあるのですが.