來自:http://www4.ncsu.edu/~pfackler/ 下面的《Notes on Matrix Calculus》,這是Paul l. Fackler 在2005年9月27日寫的矩陣微積分筆記
Notes on Matrix Calculus
矩陣微積分會涉及到對矩陣函數操作的規則。例如,假設將一個m×n 的矩陣 X 映射到一個p×q 的矩陣 Y 中。而我們期望獲得的導數表達式如下:
對於所有的 i,j 和k,l 來說,這裏主要的困難在於如何將對矩陣內的元素對應的求導,我們在矩陣計算(1)中最後有關矩陣對矩陣的求導,可是如果矩陣過大,那就非人力可以爲之了,所以,爲了更好的計算,就需要將矩陣的求導上升到一個較高的抽象的層面。
在矩陣微積分中,最常用的就是vec操作和Kronecker乘積:vec操作就是會將一個矩陣按照它的列進行向量化(因爲習慣上使用列爲主,而不是行爲主)。例如:向量化下面的矩陣:
得到的vec操作結果爲:
而兩個矩陣的Kronecker乘積爲:矩陣A,B,這裏A是m×n大小的,而B是p×q大小的,那麼定義的乘積爲:
也就是得到的結果爲mp×nq大小的矩陣。而在vec操作和Kronecker乘積之間有個很重要的關係就是:
在求導矩陣微積分結果中,該式子發揮着舉足輕重的作用。(個人:按照矩陣乘法規則,這裏的X 應該是個n×p 的矩陣)
另一個需要用到的矩陣操作和vec操作的聯繫很緊密,定義爲將轉換成的矩陣:
這裏矩陣的大小爲mn×mn。具有一些特別的屬性,首先是它的定義:如果應用在了一個m×n矩陣的vec操作的結果上,然後在上面再加一個應用,那麼原始向量化的矩陣的結果爲:
所以:
也就是說:
這是很直觀的結果,不過也可以理解成:
也就是說其實這裏是一個正交矩陣。
矩陣操作其實是一個置換矩陣(permutation matrix),即它是由0 和1 組成的,在每一行每一列只有一個1。當左乘另一個矩陣的時候,它會將那個矩陣的行進行重排序(或者和其右乘來重排矩陣的列)。
該轉置矩陣同樣與Kronecker乘積相關聯,假設矩陣A,B 如上面一樣的定義:
這可以通過引入一個任意n×q矩陣 C來驗證:
這裏暗示着。因爲C 是一個任意矩陣,所以必須要適應任意的情況。
通過上面的結論,立即得到下面的結果::
這裏有個技巧,可以發現:。所以如果A 是一個1×n 的矩陣,那麼。當涉及到標量的導數的時候,該結果可以進一步簡化。
現在說回正題,定義一個函數導數的映射作爲一個m×n 矩陣的偏導:
例如,最簡單的導數爲:
使用這個定義,當遵守矩陣的一致性原則的時候,通常針對導數的規則也是適用的。得到下面這個加法規則:
這裏和都是標量。當滿足一致性原則的時候,鏈式規則也適用於矩陣乘法。給定兩個函數:和,該複合函數的導數爲:
這裏滿足矩陣乘法一致性,因而表達式表示爲一個n×p的矩陣右乘一個m×n的矩陣(原句:postmultipy an n × p matrix by an
m×n matrix)。爲了定義一個乘積規則,考慮表達式,這裏。導數通過下面的式子得到的結果爲一個1×n的向量:
注意除了乘以和乘以之外,沒有其他方式可以確保一致性(個人:不懂這句的話,那就忽略它)。一個更通用的乘積規則定義如下。
該乘積規則對於二次函數來說會很有用的:
當A是對稱矩陣的時候,可以得到結果爲:。
上面這些規則是定義向量的導數的,定義矩陣關於矩陣的導數是通過將矩陣向量化來完成的。所以也就等於。所以這裏就需要用到vec操作和Kronecker乘積了。考慮關於A(而不是上面關於x 的)的微分:
(一個m×n的矩陣A 關於自身的導數結果爲)。
接下來可以定義一個更通用的乘法規則。假設和,那麼。使用vec操作和Kronecker乘積的關係得到下面的式子:
從而寫成更通用的形式:
當A爲m×n 的矩陣的時候,的導數爲:
所以,結果爲:
接着,可以進一步簡化,注意到:
結果爲;
該乘法規則同樣可以用於矩陣逆的求導:
因爲的結果等於,所以它的導數等於0,因此:
對於一個行列式的導數來說,也能找到個合適的表達式。假設A 是一個n*n 的矩陣,其中。該行列式可以寫成A矩陣的伴隨矩陣,,的第 i 行乘以A 的第i 列的形式:
因爲的第 i 行的元素不會受到A 的第i 列的影響,所以可以得到:
爲了得到關於A的所有元素的導數,可以將關於A的每一列的偏導數連接起來:
下面得到的就是一個直接結果(個人:這裏用到了高數的求導法則,有興趣可以回去看看對lnx 的求導):
矩陣分化的結果可以使我們能夠計算某一類平衡問題的解的導數。例如,假設x 爲一個線性互補問題(a linear complementarity problem,)的解:
x 的第 i 個元素既可以等於0,又可以等於的第 i 個元素。定義一個對角矩陣D ,使得:
接着,該解可以寫成,這裏。從而:
而且:
在矩陣求導中,Kronecker乘積使用是十分廣泛的,所以如何計算Kronecker乘積自身的導數也是個不容跨過的問題,即:和。因爲Kronecker乘積的每個元素都涉及到A矩陣中的一個元素乘以B矩陣中另一個元素,所以的導數必須是由0和以某種方式重排序的B 的元素組成的。相似的,導數也是由0和以某種方式重排序的A 的元素組成的。
可以寫成如下形式:
這裏:
寫成更緊湊的形式爲:
相似的,可以寫成如下形式:
這裏:
寫成更緊湊的形式爲:
注意到,如果A是一個行向量(m=1)或者說B 是一個列向量(q=1),那麼,所以可以忽略掉。
爲了說明這些關係的用處,考慮關於x (一個n 維向量)的二階導數:
所以:
另一個例子是:
通常來說,特別是在統計應用中,遇到的矩陣都是對稱的。所以,當想要求關於一個對稱矩陣的第 (i,j )個元素的導數,而剛好第(j,i)個導數是常量的時候是沒有意義的。通常來說,我們更喜歡先將對稱矩陣的對角線上部或者下部刪除(個人:因爲對稱的話一半是重複的),然後對其進行向量化,最後再對其進行處理。vech操作通常是刪除上部,然後逐列進行向量化的:
或者可以表示成通過對元素的選擇的形式,所以可以寫成:
這裏是一個矩陣,其中都是0和1,在每一行中只有一個1。vech操作同樣可以用在下三角矩陣;不需要去求關於下三角矩陣的上部的導數(因爲可以通過一個上三角矩陣的轉置來完成)(個人:這句話有點不理解,略過不影響全文理解)。vech操作在對稱和三角矩陣的計算機存儲方面也是很重要的。
爲了說明在矩陣微積分應用中的vech操作,考慮一個n*n的對稱矩陣C ,然後定義成下三角形式,L:
使用之前類似的方法,可以得到:
使用鏈式規則:
反轉這個表達式就能得到。
和矩陣求導相關的問題就是矩陣映射到矩陣的函數的泰勒展開的問題。一種考慮矩陣求導的方式是使用多維數組的形式。一個nm*pq矩陣可以同樣被認爲是一個m*n*p*q 的4維數組。在MATLAB中的“reshape”函數就是執行這樣的轉換的。其中各個元素的順序並沒有變,只是元素的索引方式變了。
關於函數在上的第d 階的泰勒展開式可以以下面的形式計算得到:
到目前爲止介紹的技術可以用來計算普通的”特殊“函數的導數。首先,考慮一個方陣A 的非負整數冪。使用鏈式規則來進行遞歸求導:
這裏同樣可以表示成 i 項的和:
該結果可以用來計算矩陣指數函數的導數,將其表示成泰勒展開式的形式:
所以:
同樣,可以用來計算矩陣的自然對數:
幾個操作的總結:
假設A 是m*n的矩陣,B是p*q 的矩陣,X 以適當形式定義(原文:X is defined comformably。個人:就是主要關注的是A B ,X只是形式,怎麼符合常規的矩陣計算,就怎麼定義)
微分結果的總結:
假設A 是m*n的矩陣,B是p*q 的矩陣,x 是n*1 的向量,X 合適的定義:
參考資料:
[1] http://www.psi.toronto.edu/matrix/intro.html#Intro
[2] http://www.psi.toronto.edu/matrix/calculus.html
[3]http://www.stanford.edu/~dattorro/matrixcalc.pdf
[4] http://www.colorado.edu/engineering/CAS/courses.d/IFEM.d/IFEM.AppD.d/IFEM.AppD.pdf
[5] http://www4.ncsu.edu/~pfackler/MatCalc.pdf
[6] http://center.uvt.nl/staff/magnus/wip12.pdf
[7] 新浪博客http://blog.sina.com.cn/s/blog_61c0518f0100f6wu.html[8] 維基百科https://en.wikipedia.org/wiki/Matrix_calculus#Numerator-layout_notation