矩阵求导术的故事

\mathbf{a_{m\times1}}, \mathbf{X_{m\times n}},\mathbf{b}_{n\times 1}转自知乎,感谢大神长躯鬼侠

1. 标量对矩阵的求导

2.矩阵对矩阵的求导

作为一个数学渣渣,那些能把复杂难懂的数学公式和过程讲的简单易懂的人是我的本命。在机器学习中存在许多求导过程,在论文中推导也是很重要的一环。我花了3天时间阅读并学习了以上两个奇术。为了能完整消化并掌握,我内容写到这里,权当笔记。

一.  标量对矩阵求导

矩阵导数可以和微分联系起来。微分是矩阵导数和微分矩阵的内积。

df = \sum_{i=1}^{m}\sum_{j=1}^{n}\frac{\partial f}{\partial \mathbf{X}_{i,j}}d\mathbf{X}_{i,j}=tr(\frac{\partial f^{T}}{\partial\mathbf{ X}}d\mathbf{X})

tr在这里为矩阵的迹,它的值是对角线上的元素之和,即两个矩阵对应元素相乘之和。

因此在求解标量对矩阵的导数时,先把df求出来,即先求矩阵微分,转换为迹 因为标量的迹等于标量,通过迹把其他元素都挪到d\mathbf{\mathbf{X}}的右边,即可求出标量对矩阵的导数转置\frac{\partial f^{T}}{\partial \mathbf{X}}

在求解中会遇到一些复杂的复合函数,因此规定了一些运算规则。包括矩阵微分的计算规则和迹的计算规则。

1. 矩阵微分的计算规则

1) 加减法  d(\mathbf{X}\pm \mathbf{Y}) = d\mathbf{X} \pm d\mathbf{Y}  

   乘法      d(\mathbf{XY}) = \mathbf{X}d\mathbf{Y} + (d\mathbf{X})\mathbf{Y}

   转置      d(\mathbf{\mathbf{X}}^{T}) = (d\mathbf{X})^{T}

2) 逆        d\mathbf{X}^{-1} = -\mathbf{X}^{-1}d\mathbf{XX}^{-1}     对 \mathbf{XX}^{-1}=I两侧求导可以推出

3)行列式  d\left | \mathbf{X} \right | = tr(\mathbf{X}^{\#}d\mathbf{X})     \mathbf{X}^{\#}是伴随矩阵,是代数余子式构成的矩阵的转置。\mathbf{X}^{\#}\mathbf{X}=|\mathbf{X}|E

                 推导过程:d|\mathbf{X}| = \sum_{i=1}^{m}\sum_{j=1}^{n}c_{i,j}dx_{i,j}

4) 逐元素乘法  d(\mathbf{A}\odot \mathbf{B} )=\mathbf{A}\odot d\mathbf{B} + d\mathbf{A}\odot \mathbf{B}    \odot运算是两个相同大小的矩阵对应元素相乘。主要用到的原因是导数与元素出来是对应元素相乘。

5)逐元素函数  d\sigma (\mathbf{X}) = \sigma(\mathbf{X}){}' \odot d\mathbf{X}

2. 迹的运算规则

1)加减     tr(\mathbf{A}\pm\mathbf{ B}) =tr(\mathbf{A}) \pm tr(\mathbf{B})

2) 乘        tr(\boldsymbol{AB}) = tr(\mathbf{BA})

3)  转置     tr(\mathbf{A}^{T}) = tr(\mathbf{A})

 4) 标量     a = tr(a)    此处用处很多,大部分第一二步就可以用了

  5)逐元素乘法   tr(\mathbf{A}^{T}(\mathbf{B}\odot \mathbf{C})) = tr((\mathbf{A}\odot\mathbf{ B})^{T} \mathbf{C})       没有推导,但等式两边都等于 \sum_{i=1}^{i=m}\sum_{j=1}^{j=n}A_{i,j}B_{i,j}C_{i,j}    ,这一运算用于2(5)通常在将逐元素函数后为了把d\mathbf{X}分离出来。

例1 f =\mathbf{ a^{T}Xb}  求  \frac{\partial f^{T}}{\partial \mathbf{X}}. 其中  \mathbf{a_{m\times1}}, \mathbf{X_{m\times n}},\mathbf{b}_{n\times 1}.

解:先求微分

     df = d\mathbf{a}^{T}\mathbf{X}\mathbf{b} = \mathbf{a}^{T}d\mathbf{X}\mathbf{b}    

     使用迹运算,由于f是标量,那么df也是标量。那么根据标量的迹运算可得

      \\ df = tr(df)\\ =tr( \mathbf{a}^{T}d\mathbf{X}\mathbf{b})\\ = tr(\mathbf{b} \mathbf{a}^{T}d\mathbf{X})\\ =tr( (\mathbf{a}\mathbf{b}^{T})^{T}d\mathbf{X})\\ =tr(\frac{\partial f^{T}}{\partial \mathbf{X}}d\mathbf{X})
      在迹中把d\mathbf{X}挪到了最右,其中只在第一个等号和第三个等号分别使用了标量的迹运算和矩阵乘法的迹运算(交换相等)。

      则  \frac{\partial f}{\partial \mathbf{X}} = \mathbf{a}\mathbf{b}^T.

 

例2  f =\mathbf{ a^{T}exp(Xb)}求  \frac{\partial f^{T}}{\partial \mathbf{X}}其中\mathbf{a_{m\times1}}, \mathbf{X_{m\times n}},\mathbf{b}_{n\times 1}

解:先令\mathbf{h}=\mathbf{X}\mathbf{b}

       求微分

       \\ df = d(\mathbf{a}^{T}exp(\mathbf{h})) = \mathbf{a}^{T}(exp(\mathbf{h})\odot d\mathbf{h})

      根据标量迹法则

      \\ df = tr(df) = tr(\mathbf{a}^{T}(exp(\mathbf{h})\odot d\mathbf{h})) = tr((\mathbf{a}\odot exp(\mathbf{h}))^{T}d\mathbf{h})

       第一个等号用到了标量迹法则,第二个等号用到了矩阵微分的逐项函数求导法则,第三个等号用到了迹运算的逐项乘法法则。

        则,\frac{\partial f}{\partial \mathbf{h}} =\mathbf{a}\odot exp(\mathbf{h})

      继续,

    \\ df = tr(df) \\ = tr((\mathbf{a}\odot exp(\mathbf{h}))^{T}d\mathbf{h})\\ =tr(\frac{\partial{f^{T}}}{\partial \mathbf{h}}d\mathbf{h}) \\ = tr(\frac{\partial{f^{T}}}{\partial \mathbf{h}}(d\mathbf{X})\mathbf{b} )\\ = tr(\mathbf{b}\frac{\partial{f^{T}}}{\partial \mathbf{h}}(d\mathbf{X}) )\\ = tr((\frac{\partial{f}}{\partial \mathbf{h}}\mathbf{b}^{T})^{T}(d\mathbf{X}) )

   因此,\frac{\partial f}{\partial \mathbf{X}} =(\mathbf{a}\odot exp(\mathbf{h}))\mathbf{b}^{T}

例3  f = tr(\mathbf{Y}^T\mathbf{M}\mathbf{Y}),  \mathbf{Y}=\sigma (\mathbf{WX})\mathbf{W}_{l\times m},\mathbf{X}_{m\times n},\mathbf{M}_{l\times l}, \mathbf{M}为对称矩阵  \frac{\partial f^{T}}{\partial \mathbf{X}}

解:先求微分

       \\ df = tr(d(\mathbf{Y}^{T}\mathbf{M}\mathbf{Y})) \\ = tr((d\mathbf{Y})^{T}\mathbf{M}\mathbf{Y} ) + tr(\mathbf{Y}^{T}\mathbf{M}d\mathbf{Y}) \\ = tr(\mathbf{Y}^T\mathbf{M}^Td\mathbf{Y}) + tr(\mathbf{Y}^{T}\mathbf{M}d\mathbf{Y})\\ = tr(2\mathbf{Y}^T\mathbf{M}d\mathbf{Y}) \\ = tr((2\mathbf{M}^T\mathbf{Y})^{T}d\mathbf{Y})

     第2和第3个等号用了迹运算乘法和加减法法则,第2个等号用了迹运算转置法则。

     因此,

     \frac{\partial f}{\partial \mathbf{Y}} = 2\mathbf{M}^{T}\mathbf{Y}

     继续,TODO

     \\ df = tr(d(\mathbf{Y}^{T}\mathbf{M}\mathbf{Y})) \\ = tr((2\mathbf{M}^T\mathbf{Y})^{T}d\mathbf{Y})\\ = tr(\frac{\partial f^{T}}{\partial \mathbf{Y}}d \mathbf{Y})\\ = tr(\frac{\partial f^{T}}{\partial \mathbf{Y}}d \mathbf{W}\mathbf{X}) \\ = tr(\mathbf{X}\frac{\partial f^{T}}{\partial \mathbf{Y}}d \mathbf{W})\\ = tr((\frac{\partial f}{\partial \mathbf{Y}}\mathbf{X}^{T})^{T}d \mathbf{W})\\ = tr(\frac{\partial f^{T}}{\partial \mathbf{W}}d \mathbf{W})

  \frac{\partial f}{\partial \mathbf{W}} =\frac{\partial f}{\partial \mathbf{Y}} \mathbf{X}^{T}

    

 

      

 

 

二.  矩阵对矩阵求导

若矩阵函数\mathbf{F}_{m\times n}对矩阵\mathbf{X}_{p\times q}  求导,则求导结果为\begin{bmatrix} \frac{\partial {F}_{1,1}}{\partial X_{1,1}} & \frac{\partial F_{1,2}}{\partial X_{1,1}} & \cdots & \frac{\partial F_{m,n}}{\partial X_{1,1}} \\ \frac{\partial F_{1,1}}{\partial X_{1,2}} & \frac{\partial F_{1,2}}{\partial X_{1,2}} & \cdots & \frac{\partial F_{m,n}}{\partial X_{1,2}} \\ \vdots & \vdots & \ddots \\ \vdots \frac{\partial F_{1,1}}{\partial X_{p,q}} & \frac{\partial F_{1,2}}{\partial X_{p,q}} & \cdots & \frac{\partial F_{m,n}}{\partial X_{p,q}} \\ \end{bmatrix}_{mn\times pq}, 其实就是\frac{\partial \mathbf{F}}{\partial \mathbf{X}} = \frac{\partial vec(\mathbf{F})}{\partial vec(\mathbf{X})}

vec是向量化运算,将矩阵按列优先展开,vec(\mathbf{X}) = [X_{1,1},X_{2,1},\cdots ,X_{p,1},\cdots , X_{1,q},\cdots ,X_{p,q}].

则矩阵微分d\mathbf{F} = \sum_{i=1}^{m}\sum_{j=1}^{n}\sum_{g=1}^{p}\sum_{k=1}^{q} \frac{\partial F_{i,j}}{\partial X_{g,k}} dX_{g,k}=\frac{\partial \mathbf{F}^{T}}{\partial \mathbf{X}}d\mathbf{X}

那么vec(d\mathbf{F}) = \frac{\partial \mathbf{F}^T}{\partial \mathbf{X}}vec(d\mathbf{X}).

那么,求矩阵对矩阵的导数就比较简单了。先对矩阵函数F求微分,将微分结果进行向量化运算,分离出vec(d\mathbf{X}),将其他项挪到左边。即可求出\frac{\partial \mathbf{F}}{\partial \mathbf{X}}. 这个过程和标量对矩阵求导十分相似。

在运算过程中涉及一些向量化运算和Kronecker积的运算,运算规则如下。

1. 向量化运算

 1)加减法  vec(\mathbf{A}\pm \mathbf{B}) = vec(\mathbf{A}) \pm vec(\mathbf{B})

 2) 向量乘法       vec(\boldsymbol{}{ab}^{T}) = \mathbf{b}\otimes \mathbf{a},  \bigotimes是 Kronecker积。

  3)  矩阵乘法      vec(\mathbf{AXB}) = \mathbf{B}^T\otimes \mathbf{A} vec(\mathbf{X})\mathbf{A}_{m\times n},\mathbf{X}_{n\times p},\mathbf{B}_{p\times q}

                          证明如下:

                          \mathbf{X} = [\mathbf{x_{1}}, \cdots,\mathbf{x_{q}}]\mathbf{x_{i}}p \times 1的向量。 \mathbf{e_{1}},\mathbf{\cdots,e_{q}},是单位矩阵I_{q\times q}的其中第i列。则\mathbf{X} = \sum_{i=1}^{q}\mathbf{x}_{i}\mathbf{e}_{i}^T

                          vec(AXB) = vec(A\sum_{i=1}^{q}x_{i}e_{i}^TB) \\\, \! = \sum_{i=1}^{q}vec(Ax_{i}e_{i}^TB) \\ =\sum_{i=1}^{q}vec((Ax_{i})(B^Te_{i})^T) \\ =\sum_{i=1}^{q}(B^{T}e_{i})\otimes (Ax_{i})\\ =( B^{T}\otimes A) \sum_{i=1}^{q}(e_{i}\otimes x_{i}) \\ =(B^{T}\otimes A)\sum_{i=1}^{q}vec(x_{i}e_{i}^{T}) \\ =(B^{T}\otimes A)vec(\sum_{i=1}^{q} x_{i}e_{i}^{T}) \\ \Lambda = (B^{T}\otimes A) vec(X)

    4)转置         vec(A^T) = K_{mn}vec(A),   K_{mn}  是一个 mn\times mn的交换矩阵,可以把按列优先展开的向量换成按行优先展开。

                         交换矩阵的特性:

                          K_{mn} = K_{nm}^{T} \\ K_{mn}K_{nm}=I

   5)  逐项乘法

        vec(A\odot B) = diag(A)vec(B),  diag(A)是一个mn \times mn对角矩阵,对角线上的元素依次为矩阵A的按列展开,其他元素为0

2.  Kronecker 积运算

   1)转置  (A\otimes B)^T = A^T\otimes B^T

   2)   交换

         K_{pm}( A\otimes B)K_{qn} = B\otimes A,  Am*n的矩阵,Bp*q的矩阵

         证明:

                vec(AXB^T) = B\otimes A

                \\ vec(\mathbf{\mathbf{AXB}}^{T}) = (\mathbf{B}\otimes \mathbf{A}) vec(\mathbf{\mathbf{X}})= \mathbf{K}_{pm}vec((\mathbf{AXB}^{T})^{T}) = \mathbf{K}_{pm}vec(\mathbf{BX}^{T}\mathbf{A}^{T}) = \boldsymbol{K}_{pm}(\mathbf{A}\otimes \mathbf{B})vec(\mathbf{X}^{T}) = K_{pm}(\mathbf{A}\otimes \mathbf{B})\mathbf{K}_{nq}vec(\mathbf{X}) \\ \\ \mathbf{B}\otimes \mathbf{A}=\mathbf{K}_{pm}(\mathbf{A}\otimes \mathbf{B})\mathbf{K}_{qn}

 

 

 

 

 

 

                   

      

 

你可能感兴趣的:(数学基础)