在機器學習中的矩陣向量求導(三) 矩陣向量求導之微分法中,我們討論了使用微分法來求解矩陣向量求導的方法。但是很多時候,求導的自變數和因變數直接有複雜的多層鏈式求導的關係,此時微分法使用起來也有些麻煩。需要一些簡潔的方法。
本文我們討論矩陣向量求導鏈式法則,使用該法則很多時候可以幫我們快速求出導數結果。
本文的標量對向量的求導,標量對矩陣的求導使用分母佈局, 向量對向量的求導使用分子佈局。如果遇到其他資料求導結果不同,請先確認佈局是否一樣。
1. 向量對向量求導的鏈式法則
首先我們來看看向量對向量求導的鏈式法則。假設多個向量存在依賴關係,比如三個向量$\mathbf{x} \to \mathbf{y} \to \mathbf{z}$存在依賴關係,則我們有下面的鏈式求導法則:$$\frac{\partial \mathbf{z}}{\partial \mathbf{x}} = \frac{\partial \mathbf{z}}{\partial \mathbf{y}}\frac{\partial \mathbf{y}}{\partial \mathbf{x}}$$
該法則也可以推廣到更多的向量依賴關係。但是要注意的是要求所有有依賴關係的變數都是向量,如果有一個$\mathbf{Y}$是矩陣,,比如是$\mathbf{x} \to \mathbf{Y} \to \mathbf{z}$, 則上式並不成立。
從矩陣維度相容的角度也很容易理解上面的鏈式法則,假設$\mathbf{x} , \mathbf{y} ,\mathbf{z}$分別是$m,n.p$維向量,則求導結果$\frac{\partial \mathbf{z}}{\partial \mathbf{x}}$是一個$p \times m$的雅克比矩陣,而右邊$\frac{\partial \mathbf{z}}{\partial \mathbf{y}}$是一個$p \times n$的雅克比矩陣,$\frac{\partial \mathbf{y}}{\partial \mathbf{x}}$是一個$n \times m$的矩陣,兩個雅克比矩陣的乘積維度剛好是$p \times m$,和左邊相容。
2. 標量對多個向量的鏈式求導法則
在我們的機器學習演算法中,最終要優化的一般是一個標量損失函式,因此最後求導的目標是標量,無法使用上一節的鏈式求導法則,比如2向量,最後到1標量的依賴關係:$\mathbf{x} \to \mathbf{y} \to z$,此時很容易發現維度不相容。
假設$\mathbf{x} , \mathbf{y} $分別是$m,n$維向量, 那麼$\frac{\partial z}{\partial \mathbf{x}}$的求導結果是一個$m \times 1$的向量, 而$\frac{\partial z}{\partial \mathbf{y}}$是一個$n \times 1$的向量,$\frac{\partial \mathbf{y}}{\partial \mathbf{x}}$是一個$n \times m$的雅克比矩陣,右邊的向量和矩陣是沒法直接乘的。
但是假如我們把標量求導的部分都做一個轉置,那麼維度就可以相容了,也就是:$$(\frac{\partial z}{\partial \mathbf{x}})^T = (\frac{\partial z}{\partial \mathbf{y}})^T\frac{\partial \mathbf{y}}{\partial \mathbf{x}} $$
但是畢竟我們要求導的是$(\frac{\partial z}{\partial \mathbf{x}})$,而不是它的轉置,因此兩邊轉置我們可以得到標量對多個向量求導的鏈式法則:$$\frac{\partial z}{\partial \mathbf{x}} = (\frac{\partial \mathbf{y}}{\partial \mathbf{x}} )^T\frac{\partial z}{\partial \mathbf{y}}$$
如果是標量對更多的向量求導,比如$\mathbf{y_1} \to \mathbf{y_2} \to ...\to \mathbf{y_n} \to z$,則其鏈式求導表示式可以表示為:$$\frac{\partial z}{\partial \mathbf{y_1}} = (\frac{\partial \mathbf{y_n}}{\partial \mathbf{y_{n-1}}} \frac{\partial \mathbf{y_{n-1}}}{\partial \mathbf{y_{n-2}}} ...\frac{\partial \mathbf{y_2}}{\partial \mathbf{y_1}})^T\frac{\partial z}{\partial \mathbf{y_n}}$$
這裡我們給一個最常見的最小二乘法求導的例子。最小二乘法優化的目標是最小化如下損失函式:$$l=(X\theta - y)^T(X\theta - y)$$
我們優化的損失函式$l$是一個標量,而模型引數$\theta$是一個向量,期望L對$\theta$求導,並求出導數等於0時候的極值點。我們假設向量$z = X\theta - y$, 則$l=z^Tz$, $\theta \to z \to l$存在鏈式求導的關係,因此:$$\frac{\partial l}{\partial \mathbf{\theta}} = (\frac{\partial z}{\partial \theta} )^T\frac{\partial l}{\partial \mathbf{z}} = X^T(2z) =2X^T(X\theta - y)$$
其中最後一步轉換使用瞭如下求導公式:$$\frac{\partial X\theta - y}{\partial \theta} = X$$ $$\frac{\partial z^Tz}{\partial z} = 2z$$
這兩個式子我們在前幾篇裡已有求解過,現在可以直接拿來使用了,非常方便。
當然上面的問題使用微分法求導數也是非常簡單的,這裡只是給出鏈式求導法的思路。
3. 標量對多個矩陣的鏈式求導法則
下面我們再來看看標量對多個矩陣的鏈式求導法則,假設有這樣的依賴關係:$\mathbf{X} \to \mathbf{Y} \to z$,那麼我們有:$$\frac{\partial z}{\partial x_{ij}} = \sum\limits_{k,l}\frac{\partial z}{\partial Y_{kl}} \frac{\partial Y_{kl}}{\partial X_{ij}} =tr((\frac{\partial z}{\partial Y})^T\frac{\partial Y}{\partial X_{ij}})$$
這裡大家會發現我們沒有給出基於矩陣整體的鏈式求導法則,主要原因是矩陣對矩陣的求導是比較複雜的定義,我們目前也未涉及。因此只能給出對矩陣中一個標量的鏈式求導方法。這個方法並不實用,因為我們並不想每次都基於定義法來求導最後再去排列求導結果。
雖然我們沒有全域性的標量對矩陣的鏈式求導法則,但是對於一些線性關係的鏈式求導,我們還是可以得到一些有用的結論的。
我們來看這個常見問題:$A,X,B,Y$都是矩陣,$z$是標量,其中$z= f(Y), Y=AX+B$,我們要求出$\frac{\partial z}{\partial X}$,這個問題在機器學習中是很常見的。此時,我們並不能直接整體使用矩陣的鏈式求導法則,因為矩陣對矩陣的求導結果不好處理。
這裡我們迴歸初心,使用定義法試一試,先使用上面的標量鏈式求導公式:$$\frac{\partial z}{\partial x_{ij}} = \sum\limits_{k,l}\frac{\partial z}{\partial Y_{kl}} \frac{\partial Y_{kl}}{\partial X_{ij}}$$
我們再來看看後半部分的導數:$$ \frac{\partial Y_{kl}}{\partial X_{ij}} = \frac{\partial \sum\limits_s(A_{ks}X_{sl})}{\partial X_{ij}} = \frac{\partial A_{ki}X_{il}}{\partial X_{ij}} =A_{ki}\delta_{lj}$$
其中$\delta_{lj}$在$l=j$時為1,否則為0.
那麼最終的標籤鏈式求導公式轉化為:$$\frac{\partial z}{\partial x_{ij}} = \sum\limits_{k,l}\frac{\partial z}{\partial Y_{kl}} A_{ki}\delta_{lj} = \sum\limits_{k}\frac{\partial z}{\partial Y_{kj}} A_{ki}$$
即矩陣$A^T$的第i行和$\frac{\partial z}{\partial Y} $的第j列的內積。排列成矩陣即為:$$\frac{\partial z}{\partial X} = A^T\frac{\partial z}{\partial Y}$$
總結下就是:$$z= f(Y), Y=AX+B \to \frac{\partial z}{\partial X} = A^T\frac{\partial z}{\partial Y}$$
這結論在$\mathbf{x}$是一個向量的時候也成立,即:$$z= f(\mathbf{y}), \mathbf{y}=A\mathbf{x}+\mathbf{b} \to \frac{\partial z}{\partial \mathbf{x}} = A^T\frac{\partial z}{\partial \mathbf{y}}$$
如果要求導的自變數在左邊,線性變換在右邊,也有類似稍有不同的結論如下,證明方法是類似的,這裡直接給出結論:$$z= f(Y), Y=XA+B \to \frac{\partial z}{\partial X} = \frac{\partial z}{\partial Y}A^T$$ $$z= f(\mathbf{y}), \mathbf{y}=X\mathbf{a}+\mathbf{b} \to \frac{\partial z}{\partial \mathbf{X}} = \frac{\partial z}{\partial \mathbf{y}}a^T$$
使用好上述四個結論,對於機器學習尤其是深度學習裡的求導問題可以非常快的解決,大家可以試一試。
4. 矩陣向量求導小結
矩陣向量求導在前面我們討論三種方法,定義法,微分法和鏈式求導法。在同等情況下,優先考慮鏈式求導法,尤其是第三節的四個結論。其次選擇微分法、在沒有好的求導方法的時候使用定義法是最後的保底方案。
基本上大家看了系列裡這四篇後對矩陣向量求導就已經很熟悉了,對於機器學習中出現的矩陣向量求導問題已足夠。這裡還沒有講到的是矩陣對矩陣的求導,還有矩陣對向量,向量對矩陣求導這三種形式,這個我們在系列的下一篇,也是最後一篇簡單討論一下,如果大家只是關注機器學習的優化問題,不涉及其他應用數學問題的,可以不關注。
(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com)