矩陣求導術(下)


 原文鏈接:https://zhuanlan.zhihu.com/p/24863977

本文承接上篇 ,來講矩陣對矩陣的求導術。使用小寫字母x表示標量,粗體小寫字母\boldsymbol{x} 表示列向量,大寫字母X表示矩陣。矩陣對矩陣的求導采用了向量化的思路,常應用於二階方法求解優化問題。

首先來琢磨一下定義。矩陣對矩陣的導數,需要什么樣的定義?第一,矩陣F(p×q)對矩陣X(m×n)的導數應包含所有mnpq個偏導數\frac{\partial F_{kl}}{\partial X_{ij}},從而不損失信息;第二,導數與微分有簡明的聯系,因為在計算導數和應用中需要這個聯系;第三,導數有簡明的從整體出發的算法。我們先定義向量\boldsymbol{f}(p×1)對向量\boldsymbol{x}(m×1)的導數\frac{\partial \boldsymbol{f}}{\partial \boldsymbol{x}} = \begin{bmatrix} \frac{\partial f_1}{\partial x_1} & \frac{\partial f_2}{\partial x_1} & \cdots & \frac{\partial f_p}{\partial x_1}\\ \frac{\partial f_1}{\partial x_2} & \frac{\partial f_2}{\partial x_2} & \cdots & \frac{\partial f_p}{\partial x_2}\\ \vdots & \vdots & \ddots & \vdots\\ \frac{\partial f_1}{\partial x_m} & \frac{\partial f_2}{\partial x_m} & \cdots & \frac{\partial f_p}{\partial x_m}\\ \end{bmatrix}(m×p),有d\boldsymbol{f} = \frac{\partial \boldsymbol{f} }{\partial \boldsymbol{x} }^T d\boldsymbol{x} ;再定義矩陣的(按列優先)向量化\mathrm{vec}(X) = [X_{11}, \ldots, X_{m1}, X_{12}, \ldots, X_{m2}, \ldots, X_{1n}, \ldots, X_{mn}]^T(mn×1),並定義矩陣F對矩陣X的導數\frac{\partial F}{\partial X} = \frac{\partial \mathrm{vec}(F)}{\partial \mathrm{vec}(X)}(mn×pq)。導數與微分有聯系\mathrm{vec}(dF) = \frac{\partial F}{\partial X}^T \mathrm{vec}(dX)。幾點說明如下:

  1. 按此定義,標量f對矩陣X(m×n)的導數\frac{\partial f}{\partial X}是mn×1向量,與上篇的定義不兼容,不過二者容易相互轉換。為避免混淆,用記號\nabla_X f表示上篇定義的m×n矩陣,則有\frac{\partial f}{\partial X}=\mathrm{vec}(\nabla_X f)。雖然本篇的技術可以用於標量對矩陣求導這種特殊情況,但使用上篇中的技術更方便。讀者可以通過上篇中的算例試驗兩種方法的等價轉換。
  2. 標量對矩陣的二階導數,又稱Hessian矩陣,定義為\nabla^2_X f = \frac{\partial^2 f}{\partial X^2} = \frac{\partial \nabla_X f}{\partial X}(mn×mn),是對稱矩陣。對向量\frac{\partial f}{\partial X}或矩陣\nabla_X f求導都可以得到Hessian矩陣,但從矩陣\nabla_X f出發更方便。
  3. \frac{\partial F}{\partial X} = \frac{\partial\mathrm{vec} (F)}{\partial X} = \frac{\partial F}{\partial \mathrm{vec}(X)} = \frac{\partial\mathrm{vec}(F)}{\partial \mathrm{vec}(X)},求導時矩陣被向量化,弊端是這在一定程度破壞了矩陣的結構,會導致結果變得形式復雜;好處是多元微積分中關於梯度、Hessian矩陣的結論可以沿用過來,只需將矩陣向量化。例如優化問題中,牛頓法的更新\Delta X,滿足\mathrm{vec}(\Delta X) = -(\nabla^2_X f)^{-1}\mathrm{vec}(\nabla_X f)
  4. 在資料中,矩陣對矩陣的導數還有其它定義,比如\frac{\partial F}{\partial X} = \left[\frac{\partial F_{kl}}{\partial X}\right](mp×nq),它能兼容上篇中的標量對矩陣導數的定義,但微分與導數的聯系(dF等於\frac{\partial F}{\partial X}中每個m×n子塊分別與dX做內積)不夠簡明,不便於計算和應用。

 

然后來建立運算法則。仍然要利用導數與微分的聯系\mathrm{vec}(dF) = \frac{\partial F}{\partial X}^T \mathrm{vec}(dX),求微分的方法與上篇相同,而從微分得到導數需要一些向量化的技巧:

  1. 線性:\mathrm{vec}(A+B) = \mathrm{vec}(A) + \mathrm{vec}(B)
  2. 矩陣乘法:\mathrm{vec}(AXB) = (B^T \otimes A) \mathrm{vec}(X),其中\otimes表示Kronecker積,A(m×n)與B(p×q)的Kronecker積是A\otimes B = [A_{ij}B](mp×nq)。此式證明見張賢達《矩陣分析與應用》第107-108頁。
  3. 轉置:\mathrm{vec}(A^T) = K_{mn}\mathrm{vec}(A),A是m×n矩陣,其中K_{mn}(mn×mn)是交換矩陣(commutation matrix)。
  4. 逐元素乘法:\mathrm{vec}(A\odot X) = \mathrm{diag}(A)\mathrm{vec}(X),其中\mathrm{diag}(A)(mn×mn)是用A的元素(按列優先)排成的對角陣。

 

觀察一下可以斷言,若矩陣函數F是矩陣X經加減乘法、行列式、逆、逐元素函數等運算構成,則使用相應的運算法則對F求微分,再做向量化並使用技巧將其它項交換至vec(dX)左側,即能得到導數。

再談一談復合:假設已求得\frac{\partial F}{\partial Y},而Y是X的函數,如何求\frac{\partial F}{\partial X}呢?從導數與微分的聯系入手,\mathrm{vec}(dF) = \frac{\partial F}{\partial Y}^T\mathrm{vec}(dY) = \frac{\partial F}{\partial Y}^T\frac{\partial Y}{\partial X}^T\mathrm{vec}(dX) ,可以推出鏈式法則\frac{\partial F}{\partial X} = \frac{\partial Y}{\partial X}\frac{\partial F}{\partial Y}

 

和標量對矩陣的導數相比,矩陣對矩陣的導數形式更加復雜,從不同角度出發常會得到形式不同的結果。有一些Kronecker積和交換矩陣相關的恆等式,可用來做等價變形:

  1. (A\otimes B)^T = A^T \otimes B^T
  2. \mathrm{vec}(\boldsymbol{ab}^T) = \boldsymbol{b}\otimes\boldsymbol{a}
  3. (A\otimes B)(C\otimes D) = (AC)\otimes (BD)。可以對F = D^TB^TXAC求導來證明,一方面,直接求導得到\frac{\partial F}{\partial X} = (AC) \otimes (BD);另一方面,引入Y = B^T X A,有\frac{\partial F}{\partial Y} = C \otimes D, \frac{\partial Y}{\partial X} = A \otimes B,用鏈式法則得到\frac{\partial F}{\partial X} = (A\otimes B)(C \otimes D)
  4. K_{mn} = K_{nm}^T, K_{mn}K_{nm} = I
  5. K_{pm}(A\otimes B) K_{nq} = B\otimes A,A是m×n矩陣,B是p×q矩陣。可以對AXB^T做向量化來證明,一方面,\mathrm{vec}(AXB^T) = (B\otimes A)\mathrm{vec}(X);另一方面,\mathrm{vec}(AXB^T) = K_{pm}\mathrm{vec}(BX^TA^T) = K_{pm}(A\otimes B)\mathrm{vec}(X^T) = K_{pm}(A\otimes B) K_{nq}\mathrm{vec}(X)

 

接下來演示一些算例。

例1:F = AX,X是m×n矩陣,求\frac{\partial F}{\partial X}

解:先求微分:dF=AdX,再做向量化,使用矩陣乘法的技巧,注意在dX右側添加單位陣:\mathrm{vec}(dF) = \mathrm{vec}(AdX) = (I_n\otimes A)\mathrm{vec}(dX),對照導數與微分的聯系得到\frac{\partial F}{\partial X} = I_n\otimes A^T

特例:如果X退化為向量, \boldsymbol{f} = A \boldsymbol{x} ,則根據向量的導數與微分的關系 d\boldsymbol{f} = \frac{\partial \boldsymbol{f}}{\partial \boldsymbol{x}}^T d\boldsymbol{x},得到 \frac{\partial \boldsymbol{f}}{\partial \boldsymbol{x}} = A^T 。

 

例2:f = \log |X| ,X是n×n矩陣,求\nabla_X f\nabla^2_X f

解:使用上篇中的技術可求得\nabla_X f = X^{-1T} 。為求\nabla^2_X f,先求微分:d\nabla_X f = -(X^{-1}dXX^{-1})^T,再做向量化,使用轉置和矩陣乘法的技巧\mathrm{vec}(d\nabla_X f)= -K_{nn}\mathrm{vec}(X^{-1}dX X^{-1}) = -K_{nn}(X^{-1T}\otimes X^{-1})\mathrm{vec}(dX),對照導數與微分的聯系,得到\nabla^2_X f = -K_{nn}(X^{-1T}\otimes X^{-1}),注意它是對稱矩陣。在X是對稱矩陣時,可簡化為\nabla^2_X f = -X^{-1}\otimes X^{-1}

 

例3:F = A\exp(XB),A是l×m,X是m×n,B是n×p矩陣,exp()為逐元素函數,求\frac{\partial F}{\partial X}

解:先求微分:dF = A(\exp(XB)\odot (dXB)),再做向量化,使用矩陣乘法的技巧:\mathrm{vec}(dF) = (I_p\otimes A)\mathrm{vec}(\exp(XB)\odot (dXB)),再用逐元素乘法的技巧:\mathrm{vec}(dF) = (I_p \otimes A) \mathrm{diag}(\exp(XB))\mathrm{vec}(dXB),再用矩陣乘法的技巧:\mathrm{vec}(dF) = (I_p\otimes A)\mathrm{diag}(\exp(XB))(B^T\otimes I_m)\mathrm{vec}(dX),對照導數與微分的聯系得到\frac{\partial F}{\partial X} = (B\otimes I_m)\mathrm{diag}(\exp(XB))(I_p\otimes A^T)

 

例4【一元logistic回歸】:l = -y \boldsymbol{x}^T \boldsymbol{w} + \log(1 + \exp(\boldsymbol{x}^T\boldsymbol{w})),求\nabla_\boldsymbol{w} l\nabla^2_\boldsymbol{w} l。其中y是取值0或1的標量,\boldsymbol{x},\boldsymbol{w}是向量。

解:使用上篇中的技術可求得\nabla_\boldsymbol{w} l = \boldsymbol{x}(\sigma(\boldsymbol{x}^T\boldsymbol{w}) - y),其中\sigma(a) = \frac{\exp(a)}{1+\exp(a)}為sigmoid函數。為求\nabla^2_\boldsymbol{w} l,先求微分:d\nabla_\boldsymbol{w} l = \boldsymbol{x} \sigma'(\boldsymbol{x}^T\boldsymbol{w})\boldsymbol{x}^T d\boldsymbol{w} ,其中\sigma'(a) = \frac{\exp(a)}{(1+\exp(a))^2}為sigmoid函數的導數,對照導數與微分的聯系,得到\nabla_w^2 l = \boldsymbol{x}\sigma'(\boldsymbol{x}^T\boldsymbol{w})\boldsymbol{x}^T

推廣:樣本(\boldsymbol{x}_1, y_1), \dots, (\boldsymbol{x}_n,y_n)l = \sum_{i=1}^N \left(-y_i \boldsymbol{x}_i^T\boldsymbol{w} + \log(1+\exp(\boldsymbol{x_i}^T\boldsymbol{w}))\right),求\nabla_w l\nabla^2_w l。有兩種方法,方法一:先對每個樣本求導,然后相加;方法二:定義矩陣X = \begin{bmatrix}\boldsymbol{x}_1^T \\ \vdots \\ \boldsymbol{x}_n^T \end{bmatrix},向量\boldsymbol{y} = \begin{bmatrix}y_1 \\ \vdots \\ y_n\end{bmatrix},將l寫成矩陣形式l = -\boldsymbol{y}^T X\boldsymbol{w} + \boldsymbol{1}^T\log(\boldsymbol{1} + \exp(X\boldsymbol{w})),進而可以求得\nabla_\boldsymbol{w} l = X^T(\sigma(X\boldsymbol{w}) - \boldsymbol{y})\nabla_w^2 l = X^T\text{diag}(\sigma'(X\boldsymbol{w}))X

 

例5【多元logistic回歸】:l = -\boldsymbol{y}^T\log \text{softmax}(W\boldsymbol{x}) = -\boldsymbol{y}^TW\boldsymbol{x} + \log(\boldsymbol{1}^T\exp(W\boldsymbol{x})),求\nabla_W l\nabla^2_W l

解:上篇例3中已求得\nabla_W l = (\text{softmax}(W\boldsymbol{x})-\boldsymbol{y})\boldsymbol{x}^T。為求\nabla^2_W l,先求微分:定義\boldsymbol{a} = W\boldsymbol{x}d\text{softmax}(\boldsymbol{a}) = \frac{\exp(\boldsymbol{a})\odot d\boldsymbol{a}}{\boldsymbol{1}^T\exp(\boldsymbol{a})} - \frac{\exp(\boldsymbol{a}) (\boldsymbol{1}^T(\exp(\boldsymbol{a})\odot d\boldsymbol{a}))}{(\boldsymbol{1}^T\exp(\boldsymbol{a}))^2},這里需要化簡去掉逐元素乘法,第一項中\exp(\boldsymbol{a})\odot d\boldsymbol{a} = \text{diag}(\exp(\boldsymbol{a})) d\boldsymbol{a} ,第二項中\boldsymbol{1}^T(\exp(\boldsymbol{a})\odot d\boldsymbol{a}) = \exp(\boldsymbol{a})^Td\boldsymbol{a},故有d\text{softmax}(\boldsymbol{a}) = \text{softmax}'(\boldsymbol{a})d\boldsymbol{a},其中\text{softmax}'(\boldsymbol{a}) = \frac{\text{diag}(\exp(\boldsymbol{a}))}{\boldsymbol{1}^T\exp(\boldsymbol{a})} - \frac{\exp(\boldsymbol{a})\exp(\boldsymbol{a})^T}{(\boldsymbol{1}^T\exp(\boldsymbol{a}))^2} ,代入有d\nabla_W l = \text{softmax}'(\boldsymbol{a})d\boldsymbol{a}\boldsymbol{x}^T = \text{softmax}'(W\boldsymbol{x})dW \boldsymbol{x}\boldsymbol{x}^T,做向量化並使用矩陣乘法的技巧,得到\nabla^2_W l = (\boldsymbol{x}\boldsymbol{x}^T) \otimes \text{softmax}'(W\boldsymbol{x})

 

最后做個總結。我們發展了從整體出發的矩陣求導的技術,導數與微分的聯系是計算的樞紐,標量對矩陣的導數與微分的聯系是df = \mathrm{tr}(\nabla_X^T f dX),先對f求微分,再使用跡技巧可求得導數,特別地,標量對向量的導數與微分的聯系是df = \nabla_{\boldsymbol{x}}f^T d\boldsymbol{x};矩陣對矩陣的導數與微分的聯系是\mathrm{vec}(dF) = \frac{\partial F}{\partial X}^T \mathrm{vec}(dX),先對F求微分,再使用向量化的技巧可求得導數,特別地,向量對向量的導數與微分的聯系是d\boldsymbol{f} = \frac{\partial \boldsymbol{f}}{\partial \boldsymbol{x}}^Td\boldsymbol{x}

 

 

參考資料:

  1. 張賢達. 矩陣分析與應用. 清華大學出版社有限公司, 2004.
  2. Fackler, Paul L. "Notes on matrix calculus." North Carolina State University(2005).
  3. Petersen, Kaare Brandt, and Michael Syskind Pedersen. "The matrix cookbook." Technical University of Denmark 7 (2008): 15.
  4. HU, Pili. "Matrix Calculus: Derivation and Simple Application." (2012).


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM