在機器學習中的矩陣向量求導(二) 矩陣向量求導之定義法中,我們討論了定義法求解矩陣向量求導的方法,但是這個方法對於比較複雜的求導式子,中間運算會很複雜,同時排列求導出的結果也很麻煩。因此我們需要其他的一些求導方法。本文我們討論使用微分法來求解標量對向量的求導,以及標量對矩陣的求導。
本文的標量對向量的求導,以及標量對矩陣的求導使用分母佈局。如果遇到其他資料求導結果不同,請先確認佈局是否一樣。
1. 矩陣微分
在高數裏面我們學習過標量的導數和微分,他們之間有這樣的關係:$df =f'(x)dx$。如果是多變量的情況,則微分可以寫成:$$df=\sum\limits_{i=1}^n\frac{\partial f}{\partial x_i}dx_i = (\frac{\partial f}{\partial \mathbf{x}})^Td\mathbf{x}$$
從上次我們可以發現標量對向量的求導和它的向量微分有一個轉置的關係。
現在我們再推廣到矩陣。對於矩陣微分,我們的定義爲:$$df=\sum\limits_{i=1}^m\sum\limits_{j=1}^n\frac{\partial f}{\partial X_{ij}}dX_{ij} = tr((\frac{\partial f}{\partial \mathbf{X}})^Td\mathbf{X})$$
其中第二步使用了矩陣跡的性質,即跡函數等於主對角線的和。即$$tr(A^TB) = \sum\limits_{i,j}A_{ij}B_{ij}$$
從上面矩陣微分的式子,我們可以看到矩陣微分和它的導數也有一個轉置的關係,不過在外面套了一個跡函數而已。由於標量的跡函數就是它本身,那麼矩陣微分和向量微分可以統一表示,即:$$df= tr((\frac{\partial f}{\partial \mathbf{X}})^Td\mathbf{X})\;\; \;df= tr((\frac{\partial f}{\partial \mathbf{x}})^Td\mathbf{x})$$
2. 矩陣微分的性質
我們在討論如何使用矩陣微分來求導前,先看看矩陣微分的性質:
1)微分加減法:$d(X+Y) =dX+dY, d(X-Y) =dX-dY$
2) 微分乘法:$d(XY) =(dX)Y + X(dY)$
3) 微分轉置:$d(X^T) =(dX)^T$
4) 微分的跡:$dtr(X) =tr(dX)$
5) 微分哈達馬乘積: $d(X \odot Y) = X\odot dY + dX \odot Y$
6) 逐元素求導:$d \sigma(X) =\sigma'(X) \odot dX$
7) 逆矩陣微分:$d X^{-1}= -X^{-1}dXX^{-1}$
8) 行列式微分:$d |X|= |X|tr(X^{-1}dX)$
有了這些性質,我們再來看看如何由矩陣微分來求導數。
3. 使用微分法求解矩陣向量求導
由於第一節我們已經得到了矩陣微分和導數關係,現在我們就來使用微分法求解矩陣向量求導。
若標量函數$f$是矩陣$X$經加減乘法、逆、行列式、逐元素函數等運算構成,則使用相應的運算法則對$f$求微分,再使用跡函數技巧給$df$套上跡並將其它項交換至$dX$左側,那麼對於跡函數裏面在$dX$左邊的部分,我們只需要加一個轉置就可以得到導數了。
這裏需要用到的跡函數的技巧主要有這麼幾個:
1) 標量的跡等於自己:$tr(x) =x$
2) 轉置不變:$tr(A^T) =tr(A)$
3) 交換率:$tr(AB) =tr(BA)$,需要滿足$A,B^T$同維度。
4) 加減法:$tr(X+Y) =tr(X)+tr(Y), tr(X-Y) =tr(X)-tr(Y)$
5) 矩陣乘法和跡交換:$tr((A\odot B)^TC)= tr(A^T(B \odot C))$,需要滿足$A,B,C$同維度。
我們先看第一個例子,我們使用上一篇定義法中的一個求導問題:$$y=\mathbf{a}^T\mathbf{X}\mathbf{b}, \frac{\partial y}{\partial \mathbf{X}}$$
首先,我們使用微分乘法的性質對$f$求微分,得到:$$dy = d\mathbf{a}^T\mathbf{X}\mathbf{b} + \mathbf{a}^Td\mathbf{X}\mathbf{b} + \mathbf{a}^T\mathbf{X}d\mathbf{b} = \mathbf{a}^Td\mathbf{X}\mathbf{b}$$
第二步,就是兩邊套上跡函數,即:$$dy =tr(dy) = tr(\mathbf{a}^Td\mathbf{X}\mathbf{b}) = tr(\mathbf{b}\mathbf{a}^Td\mathbf{X})$$
其中第一到第二步使用了上面跡函數性質1,第三步到第四步用到了上面跡函數的性質3.
根據我們矩陣導數和微分的定義,跡函數裏面在$dX$左邊的部分$\mathbf{b}\mathbf{a}^T$,加上一個轉置即爲我們要求的導數,即:$$\frac{\partial f}{\partial \mathbf{X}} = (\mathbf{b}\mathbf{a}^T)^T =ab^T$$
以上就是微分法的基本流程,先求微分再做跡函數變換,最後得到求導結果。比起定義法,我們現在不需要去對矩陣中的單個標量進行求導了。
再來看看$$y=\mathbf{a}^Texp(\mathbf{X}\mathbf{b}), \frac{\partial y}{\partial \mathbf{X}}$$
$$dy =tr(dy) = tr(\mathbf{a}^Tdexp(\mathbf{X}\mathbf{b})) = tr(\mathbf{a}^T (exp(\mathbf{X}\mathbf{b}) \odot d(\mathbf{X}\mathbf{b}))) = tr((\mathbf{a} \odot exp(\mathbf{X}\mathbf{b}) )^T d\mathbf{X}\mathbf{b}) = tr(\mathbf{b}(\mathbf{a} \odot exp(\mathbf{X}\mathbf{b}) )^T d\mathbf{X}) $$
其中第三步到第4步使用了上面跡函數的性質5. 這樣我們的求導結果爲:$$\frac{\partial y}{\partial \mathbf{X}} =(\mathbf{a} \odot exp(\mathbf{X}\mathbf{b}) )b^T $$
以上就是微分法的基本思路。
4. 跡函數對向量矩陣求導
由於微分法使用了跡函數的技巧,那麼跡函數對對向量矩陣求導這一大類問題,使用微分法是最簡單直接的。下面給出一些常見的跡函數的求導過程,也順便給大家熟練掌握微分法的技巧。
首先是$\frac{\partial tr(AB)}{\partial A} = B^T, \frac{\partial tr(AB)}{\partial B} =A^T$,這個直接根據矩陣微分的定義即可得到。
再來看看$\frac{\partial tr(W^TAW)}{\partial W}$:$$d(tr(W^TAW)) = tr(dW^TAW +W^TAdW) = tr(dW^TAW)+tr(W^TAdW) = tr((dW)^TAW) + tr(W^TAdW) = tr(W^TA^TdW) + tr(W^TAdW) = tr(W^T(A+A^T)dW) $$
因此可以得到:$$\frac{\partial tr(W^TAW)}{\partial W} = (A+A^T)W$$
最後來個更加複雜的跡函數求導:$\frac{\partial tr(B^TX^TCXB)}{\partial X} $: $$d(tr(B^TX^TCXB)) = tr(B^TdX^TCXB) + tr(B^TX^TCdXB) = tr((dX)^TCXBB^T) + tr(BB^TX^TCdX) = tr(BB^TX^TC^TdX) + tr(BB^TX^TCdX) = tr((BB^TX^TC^T + BB^TX^TC)dX)$$
因此可以得到:$$\frac{\partial tr(B^TX^TCXB)}{\partial X}= (C+C^T)XBB^T$$
5. 微分法求導小結
使用矩陣微分,可以在不對向量或矩陣中的某一元素單獨求導再拼接,因此會比較方便,當然熟練使用的前提是對上面矩陣微分的性質,以及跡函數的性質熟練運用。
還有一些場景,求導的自變量和因變量直接有複雜的多層鏈式求導的關係,此時微分法使用起來也有些麻煩。如果我們可以利用一些常用的簡單求導結果,再使用鏈式求導法則,則會非常的方便。因此下一篇我們討論向量矩陣求導的鏈式法則。
(歡迎轉載,轉載請註明出處。歡迎溝通交流: [email protected])