如何理解矩陣對矩陣求導?

我在矩陣理論裡面沒有找到這個。按照wikipedia上的定義,可以把矩陣對矩陣的導數寫成一個超矩陣,但是我不懂得如何運用這個超矩陣。
具體到實際問題,因為最近在學機器學習中的BP神經網路,受不了求和嵌套,看著太亂了,編程的時候用求和嵌套會不可避免地使用循環,我非常排斥這個,所以想找到損失函數對權值theta的導數的矩陣表達。
在我的理解中
Cost=-(tr(y^{T}log(Output) +(1-y)^{T}log(1-Output) ))
Output=sigmoid(sigmoid(... sigmoid(X	heta^{(1)}) ...	heta^{(n-2)})	heta^{(n-1)} )


如果題主學過泛函分析,可能會更容易理解矩陣對矩陣的求導。

定義:假設XY為賦范向量空間,F: X
ightarrow Y是一個映射,那麼Fx_0 in X可導的意思是說存在一個有界線性運算元L in mathcal{L}(X, Y),使得對於任意的epsilon > 0都存在delta > 0,對於滿足x in X ackslash {x_0}, |x - x_0| < deltax都有frac{|F(x) - F(x_0) - L(x - x_0)|}{|x - x_0|} < epsilon.我們稱LFx_0點的導數。

取一些特殊情況,比如當X = mathbb R^n, Y = mathbb R的時候L就被稱作梯度;當X = mathbb{R}^n, Y = mathbb{R}^m的時候L被稱作雅可比,等等。從這個一般化的定義出發的好處是,我們可以更好的理解矩陣到矩陣映射的"導數",甚至是從一個函數空間到另一個函數空間的「導數"。

以上定義有一個等價的表述,往往計算起來更方便:對於距離x_0足夠近的點x,即lim_{x 
ightarrow x_0}frac{o(|x-x_0|)}{|x-x_0|} = 0,有
F(x) = F(x_0) + L(x - x_0) + o(|x - x_0|).
(註:此處L(x-x_0)應該理解為線性運算元Lx - x_0這個點的值,而不是L乘以x-x_0。不過在有限維空間所有線性運算元都可以用矩陣表述,Lx - x_0這個點的值便正好可以表述為矩陣與向量的乘積!這個notation正好巧妙的一致。)

例子:假設F(X) = X^TX是一個mathbb{R}^{m	imes n} 
ightarrow mathbb{ S}^n的映射,其中mathbb{S }^n為n維對稱陣的空間。那麼F的導數L就應該是mathbb{R}^{m	imes n} 
ightarrow mathbb{ S}^n的一個有界線性運算元。L究竟是什麼樣可以從定義出發計算:

egin{align} F(X+Delta X) - F(X) \ = (X+Delta X)^T(X+Delta X) - X^TX\ = X^TDelta X + Delta X^TX + o(|Delta X|) end{align}

所以我們有L(Delta X) = X^TDelta X + Delta X^TX,這個就是FX點的導數。L這個函數(有界線性運算元)可以用張量來表述,這裡就不詳細說了。

例子:最小二乘問題f(x) = frac{1}{2}|Ax-b|_2^2f是一個mathbb R^n 
ightarrow mathbb R的映射。

egin{align} f(x+Delta x) - f(x) \ = frac{1}{2}|A(x+Delta x) - b|^2 - frac{1}{2}|Ax - b|^2\ = frac{1}{2}|Ax - b + ADelta x|^2 - frac{1}{2}|Ax - b|^2\ = (Ax - b)^TADelta x + o(|Delta x|) end{align}

所以我們有L(Delta x) = (Ax - b)^TADelta x,這個就是fx點的導數。在這種情況下,L這個有界線性運算元可以用梯度來表述(recall Riesz表示定理):
L(Delta x) = langle 
abla f(x), Delta x 
angle = langle A^T(Ax - b), Delta x 
angle = (Ax-b)^TADelta x
所以梯度
abla f(x) = A^T(Ax - b)

例子:單層神經網路f(W) = frac{1}{2}|sigma(Wx) - y|^2_2f是一個mathbb{R}^{m 	imes n } 
ightarrow mathbb{ R }的映射。這裡sigma: mathbb{ R}^m 
ightarrow mathbb{ R}^m是一個elementwise的logistic function。算起來

egin{align}  f(W+Delta W) - f(W) \ = frac{1}{2}|sigma(Wx + Delta Wx) - y|_2^2 - frac{1}{2}|sigma(Wx) - y|_2^2\ = frac{1}{2}|sigma(Wx) + sigma(Wx)odot (mathbf 1_m - sigma(Wx)) odot Delta W x + o(|Delta W|) - y|_2^2 - frac{1}{2}|sigma(Wx) - y|_2^2\ = (sigma(Wx) - y)^T(sigma(Wx)odot (mathbf 1_m - sigma(Wx)) odot Delta W x) + o(|Delta W|) end{align}

其中odot為Hadamard乘積(elementwise乘積),mathbf 1_m為長度為m的元素均為1的向量。這裡我使用了一維logistic函數的導數公式。所以
L(Delta W) = (sigma(Wx) - y)^T(sigma(Wx)odot (mathbf 1_m - sigma(Wx)) odot Delta W x)
註:這個例子的倒數第二步到最後一步的計算影射了微積分中的一個重要的思想——鏈式法則(chain rule)。鏈式法則能夠成立的本質是ao(|x|)+bo(|x|) = o(|x|)o(|x|)o(|x|) = o(|x|^2)

最後,由於mathbb{R}^{m 	imes n}mathbb{R}^{mn}是同構的,所以可以通過vectorization把矩陣映射到mathbb{R}^{mn}中再進行計算,見 @SS Wang 的答案。


一個矩陣對矩陣求導的結果應該是一個 (2, 2) 型 4 階張量,其中含有 2 個協變維(對應因變數矩陣的兩維)和 2 個逆變維(對應自變數矩陣的兩維)。


函數值是矩陣、變數是矩陣。求導需要先做變換,把函數值、變數分別拉伸成向量。再計算函數值是向量、變數是向量的求導。結果是一個大矩陣。

形式化一些,把任意m	imes n的矩陣記作 A = [a_1 , a_2, ... , a_n]。該矩陣的vectorization是一個mn	imes 1的向量,記作 vec(A) = [a_1 ; a_2; ...; a_n]
對於任意矩陣X和Y,可以定義矩陣關於矩陣的求導為:frac{d: Y}{d: X} = frac{d: vec(Y)}{d: vec(X)}

舉個例子:

A和X是兩個矩陣,那麼frac{d: AX}{d: X} = frac{d: vec(AX)}{d: vec(X)} = frac{d: ((Iotimes A)vec(X))}{d: vec(X)} = (Iotimes A)^T = I otimes A^T
這裡 otimes 是Kronecker乘積(定義自己去看wiki吧),第二到三步是一個常見的vectorization的等式。


謝邀,如果題主是對BP不熟,就直接問BP吧,好像類似問題已經有很多。

矩陣A對矩陣B求導往往是指A = f(B)這種情況的求導,其實就是A的每個元素都看做一個函數,然後對B中所有變數求導


我天,現有的答案複雜到了讓我懷疑自己到底懂不懂的程度。。。
來舉個栗子吧:AB = C
left[
egin{array}{cc}
a_1  a_2 \
a_3  a_4
end{array}

ight]  left[ 
egin{array}{cc}
b_1  b_2 \
b_3  b_4
end{array}

ight] = left[ 
egin{array}{cc}
c_1  c_2 \
c_3  c_4
end{array}

ight]
其中
left{
egin{array}{c}
c_1 = a_1b_1 +a_2b_3 \
c_2 = a_1b_2 + a_2b_4 \ 
c_3 = a_3b_1 + a_4b_3 \
c_4 = a_3b_2 + a_4b_4
end{array} 
ight.
那麼

dfrac{partial C}{partial A} Rightarrow 
left{
egin{array}{c}
partial c_1 / partial a_1 = b_1 \
partial c_1 / partial a_2 = b_3 \
partial c_1 / partial a_3 = 0 \
partial c_1 / partial a_4 = 0 \
partial c_2 / partial a_1 = b_2\
vdots \
partial c_4 / partial a_4 = b_4
end{array}

ight.

C中每一個元素,對於A中每一個元素進行求導。轉化成標量的形式就好理解了吧~

至於把以上16個標量求導寫成4	imes 4的矩陣也好還是16維的向量也好,大多是為了形式(理論)上的美觀,或是方便對求導結果的後續使用,亦或是方便編程實現,其本質不變。


很不錯的博客
閑話矩陣求導


如果為了理解BP而來理解矩陣求導的話,我覺得是走了彎路。理解BP最好的方法就是按照標量寫起來,求導。其實單純理解BP非常簡單,時刻記住是用鏈式法則就行了。記得當年老闆給畫了2個圖,導致現在BP的詳細推導求解都還熟記於心。矩陣的方式只是加快了運算速度和簡潔性,所以我覺得還是先從標量來理解要好點。至於最後如何轉成矩陣的表達方式,到是另外一件事情。


神經網路而論,不會有太複雜的求導操作。
除了像『沒有交換律』這種特殊規則,之外,矩陣的運算和數基本差不多。
比如F = AB,對F求A的偏導,結果就是B,對F求B的偏導,結果就是A。就這麼 簡單。


你在互聯網上搜或者在很多教材上找矩陣求導,他會直接丟給你一堆求導法則,比如什麼單變數對向量,向量對向量,矩陣對向量,矩陣對單變數,矩陣對矩陣等等各種排列組合的結果的求導組合,其實我個人是很不認同上來就丟給你這麼一堆東西的。

個人理解,其實無論什麼對什麼求導,首先它得有它的數學意義而不是上來就是公式。不管是矩陣也好,向量也罷,假如A對B求導,A中有m個元素(如果是矩陣就是a*b=m,向量就是m維向量,m為1就是單變數,甚至可以是張量,a*b*c=m,a*b*c*d=m等等),B中有n個元素。那麼A對B求導就應該有m*n個元素,即A中每個元素對B中每個元素的偏導數。現在有了這些個元素,至於這些元素要以什麼樣的形式擺放(就如你到處都能看到的教材或資料中的什麼單變數對向量求導是行向量,向量對單變數求導是列向量,向量對向量求導是矩陣等等),其實就是要找到一種符合直覺的利於計算的(比如在矩陣/向量求導中便於使用chain rule計算導數等)統一的定義就行。剛好矩陣本身就定義了一種很符合需求的運算元,所以就有了你看到的各種矩陣求導所定義的形式。(其實你如果不滿意,你大可自己嘗試定義一種對上述m*n個元素的放置方式,使得你的定義能滿足你的一切計算需求。不過我相信你很難找到一種比目前定義更好的定義方式)


求導規則參考:http://files.cnblogs.com/files/leoleo/matrix_rules.pdf,很詳細


給個直覺化的說法吧,矩陣的求導 類比於統計學中均差和均方差,分段加權移動平滑。搞來搞去也就是M和N,變數固定的話,形式就不重要了。動態變換率才是重要的。例如擬合下降的速率不滿意,就要再來一次。

看,我說了一大堆然而什麼也沒有說耶。。。。。:)


對矩陣求導,其實就是對每個分量求導。沒有什麼特殊的。只是有些帶有特殊形式,計算起來比較方便。


推薦閱讀:

微分號 d 有何意義?
如何高效地自學大學數學課本?
柯西對極限的定義引入 ε 精確描述,意義何在? 為什麼這種精確的數學描述很重要?
請推薦英文微積分、數學分析基礎教材?
數學中有哪些典型的不變數?研究不變數的意義是什麼?

TAG:機器學習 | 線性代數 | 神經網路 | 高等數學 | 矩陣論 |