本文來自 仙守 的CSDN 博客
https://blog.csdn.net/shouhuxianjian/article/details/46624207?utm_source=copy
Notes on Matrix Calculus
矩陣微積分會涉及到對矩陣函數(shù)操作的規(guī)則。例如,假設(shè)將一個m×n 的矩陣 X 映射到一個p×q 的矩陣 Y 中。而我們期望獲得的導(dǎo)數(shù)表達式如下:

對于所有的 i,j 和k,l 來說,這里主要的困難在于如何將對矩陣內(nèi)的元素對應(yīng)的求導(dǎo),我們在矩陣計算(1)中最后有關(guān)矩陣對矩陣的求導(dǎo),可是如果矩陣過大,那就非人力可以為之了,所以,為了更好的計算,就需要將矩陣的求導(dǎo)上升到一個較高的抽象的層面。
在矩陣微積分中,最常用的就是vec操作和Kronecker乘積:vec操作就是會將一個矩陣按照它的列進行向量化(因為習(xí)慣上使用列為主,而不是行為主)。例如:向量化下面的矩陣:

得到的vec操作結(jié)果為:

而兩個矩陣的Kronecker乘積為:矩陣A,B,這里A是m×n大小的,而B是p×q大小的,那么定義的乘積為:

也就是得到的結(jié)果為mp×nq大小的矩陣。而在vec操作和Kronecker乘積之間有個很重要的關(guān)系就是:

在求導(dǎo)矩陣微積分結(jié)果中,該式子發(fā)揮著舉足輕重的作用。(個人:按照矩陣乘法規(guī)則,這里的X應(yīng)該是個n×p 的矩陣)
另一個需要用到的矩陣操作和vec操作的聯(lián)系很緊密,定義

為將

轉(zhuǎn)換成

的矩陣:

這里





所以:

也就是說:

這是很直觀的結(jié)果,不過也可以理解成:

也就是說其實這里


其實是一個置換矩陣(permutation matrix),即它是由0 和1 組成的,在每一行每一列只有一個1。當(dāng)左乘另一個矩陣的時候,它會將那個矩陣的行進行重排序(或者


這可以通過引入一個任意n×q矩陣C來驗證:


通過上面的結(jié)論,立即得到下面的結(jié)果:

這里有個技巧,可以發(fā)現(xiàn):


。當(dāng)涉及到標(biāo)量的導(dǎo)數(shù)的時候,該結(jié)果可以進一步簡化。
現(xiàn)在說回正題,定義一個函數(shù)導(dǎo)數(shù)的映射


例如,最簡單的導(dǎo)數(shù)為:

使用這個定義,當(dāng)遵守矩陣的一致性原則的時候,通常針對導(dǎo)數(shù)的規(guī)則也是適用的。得到下面這個加法規(guī)則:

這里


都是標(biāo)量。當(dāng)滿足一致性原則的時候,鏈?zhǔn)揭?guī)則也適用于矩陣乘法。給定兩個函數(shù):

和

,該復(fù)合函數(shù)的導(dǎo)數(shù)為:

這里滿足矩陣乘法一致性,因而表達式

表示為一個n×p的矩陣右乘一個m×n的矩陣(原句:postmultipy an n × p matrix by an m×n matrix)。為了定義一個乘積規(guī)則,考慮表達式

,這里

。導(dǎo)數(shù)通過下面的式子得到的結(jié)果為一個1×n的向量:

注意除了

乘以

和

乘以

之外,沒有其他方式可以確保一致性(個人:不懂這句的話,那就忽略它)。一個更通用的乘積規(guī)則定義如下。
該乘積規(guī)則對于二次函數(shù)來說會很有用的:

當(dāng)A是對稱矩陣的時候,可以得到結(jié)果為:

。上面這些規(guī)則是定義向量的導(dǎo)數(shù)的,定義矩陣關(guān)于矩陣的導(dǎo)數(shù)是通過將矩陣向量化來完成的。所以

也就等于

。所以這里就需要用到vec操作和Kronecker乘積了??紤]

關(guān)于A(而不是上面關(guān)于x 的)的微分:


接下來可以定義一個更通用的乘法規(guī)則。假設(shè)

和

,那么

。使用vec操作和Kronecker乘積的關(guān)系得到下面的式子:

從而寫成更通用的形式:

當(dāng)A為m×n 的矩陣的時候,

的導(dǎo)數(shù)為:

所以,結(jié)果為:

接著,可以進一步簡化,注意到:

結(jié)果為;

該乘法規(guī)則同樣可以用于矩陣逆的求導(dǎo):

因為

的結(jié)果等于

,所以它的導(dǎo)數(shù)等于0,因此:

對于一個行列式的導(dǎo)數(shù)來說,也能找到個合適的表達式。假設(shè)A 是一個nn 的矩陣,其中

。該行列式可以寫成A矩陣的伴隨矩陣,

,的第 i 行乘以A 的第i 列的形式:

因為

的第 i 行的元素不會受到A的第i 列的影響,所以可以得到:

為了得到關(guān)于A的所有元素的導(dǎo)數(shù),可以將關(guān)于A的每一列的偏導(dǎo)數(shù)連接起來:

下面得到的就是一個直接結(jié)果(個人:這里用到了高數(shù)的求導(dǎo)法則,有興趣可以回去看看對lnx 的求導(dǎo)):

矩陣分化的結(jié)果可以使我們能夠計算某一類平衡問題的解的導(dǎo)數(shù)。例如,假設(shè)x 為一個線性互補問題(a linear complementarity problem,LCP(M,q))的解:

x 的第 i 個元素既可以等于0,又可以等于

的第 i 個元素。定義一個對角矩陣D ,使得:

接著,該解可以寫成

,這里

。從而:

而且:

在矩陣求導(dǎo)中,Kronecker乘積使用是十分廣泛的,所以如何計算Kronecker乘積自身的導(dǎo)數(shù)也是個不容跨過的問題,即:

和

。因為Kronecker乘積的每個元素都涉及到A矩陣中的一個元素乘以B矩陣中另一個元素,所以

的導(dǎo)數(shù)必須是由0和以某種方式重排序的B 的元素組成的。相似的,導(dǎo)數(shù)

也是由0和以某種方式重排序的A 的元素組成的。

可以寫成如下形式:

這里:

寫成更緊湊的形式為:

相似的,

可以寫成如下形式:

這里:

寫成更緊湊的形式為:

注意到,如果A是一個行向量(m=1)或者說B 是一個列向量(q=1),那么

,所以可以忽略掉。 為了說明這些關(guān)系的用處,考慮

關(guān)于x (一個n 維向量)的二階導(dǎo)數(shù):

所以:

另一個例子是:

通常來說,特別是在統(tǒng)計應(yīng)用中,遇到的矩陣都是對稱的。所以,當(dāng)想要求關(guān)于一個對稱矩陣的第 (i,j )個元素的導(dǎo)數(shù),而剛好第(j,i)個導(dǎo)數(shù)是常量的時候是沒有意義的。通常來說,我們更喜歡先將對稱矩陣的對角線上部或者下部刪除(個人:因為對稱的話一半是重復(fù)的),然后對其進行向量化,最后再對其進行處理。vech操作通常是刪除上部,然后逐列進行向量化的:

或者可以表示成通過對

元素的選擇的形式,所以可以寫成:

這里

是一個

矩陣,其中都是0和1,在每一行中只有一個1。vech操作同樣可以用在下三角矩陣;不需要去求關(guān)于下三角矩陣的上部的導(dǎo)數(shù)(因為可以通過一個上三角矩陣的轉(zhuǎn)置來完成)(個人:這句話有點不理解,略過不影響全文理解)。vech操作在對稱和三角矩陣的計算機存儲方面也是很重要的。為了說明在矩陣微積分應(yīng)用中的vech操作,考慮一個nn的對稱矩陣C ,然后定義成下三角形式,L:

使用之前類似的方法,可以得到:

使用鏈?zhǔn)揭?guī)則:

反轉(zhuǎn)這個表達式就能得到

。和矩陣求導(dǎo)相關(guān)的問題就是矩陣映射到矩陣的函數(shù)的泰勒展開的問題。一種考慮矩陣求導(dǎo)的方式是使用多維數(shù)組的形式。一個nmpq矩陣可以同樣被認為是一個mnpq 的4維數(shù)組。在MATLAB中的“reshape”函數(shù)就是執(zhí)行這樣的轉(zhuǎn)換的。其中各個元素的順序并沒有變,只是元素的索引方式變了。
關(guān)于函數(shù)

在

上的第d 階的泰勒展開式可以以下面的形式計算得到:

到目前為止介紹的技術(shù)可以用來計算普通的”特殊“函數(shù)的導(dǎo)數(shù)。首先,考慮一個方陣A 的非負整數(shù)冪

。使用鏈?zhǔn)揭?guī)則來進行遞歸求導(dǎo):

這里同樣可以表示成 i 項的和:

該結(jié)果可以用來計算矩陣指數(shù)函數(shù)的導(dǎo)數(shù),將其表示成泰勒展開式的形式:

所以:

同樣,可以用來計算矩陣的自然對數(shù):

幾個操作的總結(jié):
假設(shè)A 是mn的矩陣,B是pq 的矩陣,X 以適當(dāng)形式定義(原文:X is defined comformably。個人:就是主要關(guān)注的是A B ,X只是形式,怎么符合常規(guī)的矩陣計算,就怎么定義)


微分結(jié)果的總結(jié):
假設(shè)A 是mn的矩陣,B是pq 的矩陣,x 是n*1 的向量,X 合適的定義:


