1. 程式人生 > >機器學習中的矩陣向量求導(五) 矩陣對矩陣的求導

機器學習中的矩陣向量求導(五) 矩陣對矩陣的求導

    在矩陣向量求導前4篇文章中,我們主要討論了標量對向量矩陣的求導,以及向量對向量的求導。本文我們就討論下之前沒有涉及到的矩陣對矩陣的求導,還有矩陣對向量,向量對矩陣求導這幾種形式的求導方法。

    本文所有求導佈局以分母佈局為準,為了適配矩陣對矩陣的求導,本文向量對向量的求導也以分母佈局為準,這和前面的文章不同,需要注意。

    本篇主要參考了張賢達的《矩陣分析與應用》和長軀鬼俠的矩陣求導術

1. 矩陣對矩陣求導的定義

    假設我們有一個$p \times q$的矩陣$F$要對$m \times n$的矩陣$X$求導,那麼根據我們第一篇求導的定義,矩陣$F$中的$pq$個值要對矩陣$X$中的$mn$個值分別求導,那麼求導的結果一共會有$mnpq$個。那麼求導的結果如何排列呢?方法有很多種。

    最直觀可以想到的求導定義有2種:

    第一種是矩陣$F$對矩陣$X$中的每個值$X_{ij}$求導,這樣對於矩陣$X$每一個位置(i,j)求導得到的結果是一個矩陣$\frac{\partial F}{\partial X_{ij}}$,可以理解為矩陣$X$的每個位置都被替換成一個$p \times q$的矩陣,最後我們得到了一個$mp \times nq$的矩陣。

    第二種和第一種類似,可以看做矩陣$F$中的每個值$F_{kl}$分別對矩陣$X$求導,這樣矩陣$F$每一個位置(k,l)對矩陣$X$求導得到的結果是一個矩陣$\frac{\partial F_{kl}}{\partial X}$, 可以理解為矩陣$F$的每個位置都被替換成一個$m \times n$的矩陣,最後我們得到了一個$mp \times nq$的矩陣。

    這兩種定義雖然沒有什麼問題,但是很難用於實際的求導,比如類似我們在機器學習中的矩陣向量求導(三) 矩陣向量求導之微分法中很方便使用的微分法求導。

    目前主流的矩陣對矩陣求導定義是對矩陣先做向量化,然後再使用向量對向量的求導。而這裡的向量化一般是使用列向量化。也就是說,現在我們的矩陣對矩陣求導可以表示為:$$\frac{\partial F}{\partial X} = \frac{\partial vec(F)}{\partial vec(X)}$$

    對於矩陣$F$,列向量化後,$vec(F)$的維度是$pq \times 1$的向量,同樣的,$vec(X)$的維度是$mn \times 1$的向量。最終求導的結果,這裡我們使用分母佈局,得到的是一個$mn \times pq$的矩陣。

2. 矩陣對矩陣求導的微分法

    按第一節的向量化的矩陣對矩陣求導有什麼好處呢?主要是為了使用類似於前面講過的微分法求導。回憶之前標量對向量矩陣求導的微分法裡,我們有:$$df= tr((\frac{\partial f}{\partial \mathbf{X}})^Td\mathbf{X})$$

    這裡矩陣對矩陣求導我們有:$$vec(dF) =\frac{\partial vec(F)^T}{\partial vec(X)} vec(dX) = \frac{\partial F^T}{\partial X} vec(dX)$$

    和之前標量對矩陣的微分法相比,這裡的跡函式被矩陣向量化代替了。

    矩陣對矩陣求導的微分法,也有一些法則可以直接使用。主要集中在矩陣向量化後的運演算法則,以及向量化和克羅內克積之間的關係。關於矩陣向量化和克羅內克積,具體可以參考張賢達的《矩陣分析與應用》,這裡只給出微分法會用到的常見轉化性質, 相關證明可以參考張的書。

    矩陣向量化的主要運演算法則有:

    1) 線性性質:$vec(A+B) =vec(A) +vec(B)$

    2) 矩陣乘法:$vec(AXB)= (B^T \bigotimes A)vec(X)$,其中$\bigotimes$是克羅內克積。

    3) 矩陣轉置:$vec(A^T) =K_{mn}vec(A)$,其中$A$是$m \times n$的矩陣,$K_{mn}$是$mn \times mn$的交換矩陣,用於矩陣列向量化和行向量化之間的轉換。

    4) 逐元素乘法:$vec(A \odot X) = diag(A)vec(X)$, 其中$diag(A)$是$mn \times mn$的對角矩陣,對角線上的元素是矩陣$A$按列向量化後排列出來的。

    克羅內克積的主要運演算法則有:

    1) $(A \bigotimes B)^T = A^T \bigotimes B^T$

    2) $vec(ab^T) = b \bigotimes a$

    3) $(A \bigotimes B)(C \bigotimes D )=AC \bigotimes BD$

    4) $K_{mn} = K_{nm}^T, K_{mn}K_{nm}=I$

    使用上面的性質,求出$vec(dF)$關於$ vec(dX)$的表示式,則表示式左邊的轉置即為我們要求的$\frac{\partial vec(F)}{\partial vec(X)} $,或者說$\frac{\partial F}{\partial X} $

3. 矩陣對矩陣求導例項

    下面我們給出一個使用微分法求解矩陣對矩陣求導的例項。

    首先我們來看看:$\frac{\partial AXB}{\partial X}$, 假設A,X,B都是矩陣,X是$m \times n$的矩陣。

    首先求$dF$, 和之前第三篇的微分法類似,我們有: $$dF =AdXB$$

    然後我們兩邊列向量化(之前的微分法是套上跡函式), 得到:$$vec(dF) = vec(AdXB) = (B^T \bigotimes A)vec(dX)$$

    其中,第二個式子使用了上面矩陣向量化的性質2。

    這樣,我們就得到了求導結果為:$$\frac{\partial AXB}{\partial X} =  (B^T \bigotimes A)^T = B \bigotimes A^T$$

    利用上面的結果我們也可以得到:$$\frac{\partial AX}{\partial X} =  I_n \bigotimes A^T$$$$\frac{\partial XB}{\partial X} =  B \bigotimes I_m$$

    來個複雜一些的:$\frac{\partial Aexp(BXC)D}{\partial X}$

    首先求微分得到:$$dF =A [dexp(BXC)]D = A[exp(BXC) \odot (BdXC)]D  $$

    兩邊矩陣向量化,我們有:$$vec(dF) = (D^T \bigotimes A) vec[exp(BXC) \odot (BdXC)]  =  (D^T \bigotimes A) diag(exp(BXC))vec(BdXC) =  (D^T \bigotimes A) diag(exp(BXC))(C^T\bigotimes B)vec(dX) $$

    其中第一個等式使用了矩陣向量化性質2,第二個等式使用了矩陣向量化性質4, 第三個等式使用了矩陣向量化性質2。

    這樣我們最終得到:$$\frac{\partial Aexp(BXC)D}{\partial X} = [(D^T \bigotimes A) diag(exp(BXC))(C^T\bigotimes B)]^T = (C \bigotimes B^T) diag(exp(BXC)) (D\bigotimes A^T )$$

4. 矩陣對矩陣求導小結

    由於矩陣對矩陣求導的結果包含克羅內克積,因此和之前我們講到的其他型別的矩陣求導很不同,在機器學習演算法優化中中,我們一般不在推導的時候使用矩陣對矩陣的求導,除非只是做定性的分析。如果遇到矩陣對矩陣的求導不好繞過,一般可以使用機器學習中的矩陣向量求導(四) 矩陣向量求導鏈式法則中第三節最後的幾個鏈式法則公式來避免。

    到此機器學習中的矩陣向量求導系列就寫完了,希望可以幫到對矩陣求導的推導過程感到迷茫的同學