機器學習中的矩陣向量求導(四) 矩陣向量求導鏈式法則

    在機器學習中的矩陣向量求導(三) 矩陣向量求導之微分法中,咱們討論了使用微分法來求解矩陣向量求導的方法。可是不少時候,求導的自變量和因變量直接有複雜的多層鏈式求導的關係,此時微分法使用起來也有些麻煩。須要一些簡潔的方法。html

    本文咱們討論矩陣向量求導鏈式法則,使用該法則不少時候能夠幫咱們快速求出導數結果。算法

    本文的標量對向量的求導,標量對矩陣的求導使用分母佈局, 向量對向量的求導使用分子佈局。若是遇到其餘資料求導結果不一樣,請先確認佈局是否同樣。機器學習

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$,和左邊相容。post

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}} $$htm

    可是畢竟咱們要求導的是$(\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}}$$blog

     若是是標量對更多的向量求導,好比$\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) 

相關文章
相關標籤/搜索