矩阵求导知识点总结
(一)前言与感谢
- 以前就对矩阵求导有心理阴影,到底要不要转置,哪个矩阵放在前面,哪个矩阵放在后面,链式法则怎么搞,由产生此类一系列让人头大的问题。其中,最令人智熄的是经常网上的一些算法公式推导是错误的,因为矩阵维数根本不匹配,而这些无良的发布者可能根本就没有手推过,天天搞复制黏贴大法,很多时候都是大量重复错误的内容,污染网络学习环境。最近读了一些材料,感觉变得清晰了许多,因此想通过本文总结,一次性梳理清楚。是时候搞定矩阵求导了!
- 在此,必须感谢为这个问题写下详细分析文章的人,尤其是参考资料[1,2,7,8,9]中的作者,他们是很用心的站在初学者的角度来考虑这些问题。的确如某位博主所言,我也认为矩阵微分是属于三不管区域,无论是数学分析、高等代数还是优化课程,前两者的老师觉得此问题不属于知识主线,不必系统地教,后一类课程的老师觉得这本质上还属于线性代数+微积分的内容,应该在基础课程内搞定,因此造就了当前有些尴尬的局面,话不多说赶紧开始!
- 注:本文主要是做一个梳理,具体的证明过程都可在参考资料中找到
(二)符号与求导布局$(Layout)$的规定
- 符号规定
- $L$:标量
- $\mathbf{x}$:$n$维向量
- $\mathbf{y}$:$m$维向量
- $\mathbf{X}$:大小为$m×n$的矩阵
- 分母布局$(Denominator$ $Layout)$
- 标量$L$对向量$\mathbf{x}$求导得到的是$n$维向量,其中$(\frac{\partial{L}}{\partial{\mathbf{x}}})_{i}=\frac{\partial{L}}{\partial{\mathbf{x_i}}}$
- 标量对矩阵$\mathbf{X}$得到的是大小为$m×n$的矩阵,其中$(\frac{\partial{L}}{\partial{\mathbf{X}}})_{ij}=\frac{\partial{L}}{\partial{\mathbf{x_{ij}}}}$
- 向量$\mathbf{y}$对向量$\mathbf{x}$求导得到的是矩阵,其行数与$\mathbf{x}$的维数保持一致,其中$(\frac{\partial{\mathbf{y}}}{\partial{\mathbf{x}}})_{ij}=\frac{\partial{\mathbf{y}_j}}{\partial{\mathbf{x_i}}}$
- 注:全文默认为上述这种分母布局,另外还有一种分子布局,参看参考材料[2,8],事实上大多数的转置异常问题根本上来说是由于没有统一求导布局所导致的,同时不同的材料内可能布局不同,并无标准,因此在阅读文献时应当先弄清楚作者采用的哪一种
(三)几个重要的向量对向量求导结论(利用定义容易验证)
- $\frac{\partial{\mathbf{x}}}{\partial{\mathbf{x}}}=\mathbf{I}$
- 设向量$\mathbf{z}=f(\mathbf{x})$,则$\frac{\partial{\mathbf{Az}}}{\partial{\mathbf{x}}}=\frac{\partial{\mathbf{f}}}{\partial{\mathbf{x}}}A^T$,特别地:$\frac{\partial{\mathbf{Ax}}}{\partial{\mathbf{x}}}=A^T$
- 设向量$\mathbf{z}=g(\mathbf{x})$,则$\frac{\partial{\mathbf{z^TA}}}{\partial{\mathbf{x}}}=\frac{\partial{\mathbf{g}}}{\partial{\mathbf{x}}}A$,特别地:$\frac{\partial{\mathbf{x^TA}}}{\partial{\mathbf{x}}}=A$
- 设$f$为按元素运算的函数,则$\frac{\partial{f(\mathbf{X})}}{\partial{\mathbf{x}}}=diag(f'(\mathbf{x}))$
(四)标量求导的迹方法$(Trace$ $Method)$
- 思想:由于$dL=\sum_{i=1}^m \sum_{j=1}^n \frac{\partial{L}}{\partial{\mathbf{X_{ij}}}} d \mathbf{X_{ij}}=tr(( \frac{\partial{L}}{\partial{\mathbf{X}}})^Td \mathbf{X})$,故全微分$dL$是导数$ \frac{\partial{L}}{\partial{\mathbf{X}}}$与微分矩阵$d\mathbf{X}$的内积,因此只要凑到这种形式下,等价于找到了标量$L$对$\mathbf{X}$的导数
- 回顾一下关于迹的重要性质,这在之后凑微分矩阵是非常重要的,其中第五条中的$\odot$表示$Hadamard$乘积
- $L=tr(L)$
- $tr(\mathbf{X}^T)=tr(\mathbf{X})$
- $tr(\mathbf{X+Y})=tr(\mathbf{X})+tr(\mathbf{Y})$
- $tr(\mathbf{XY})=tr(\mathbf{YX})$
- $tr(A^T(B\odot C))=tr((A\odot B)^T C)$,其中$\mathbf{X},\mathbf{Y},\mathbf{Z}$为大小相等的矩阵
- 将全微分的常用公式列在下方,详细说明可在参考材料[1,4,5]中找到,其中第七条中$\sigma$表示逐元素标量运算
- $dL=0$
- $d(\alpha \mathbf{X})=\alpha d\mathbf{X}$
- $d(\mathbf{X}+\mathbf{Y})=d\mathbf{X}+d\mathbf{Y}$
- $d(tr(\mathbf{X}))=tr(d\mathbf{X})$
- $d(\mathbf{X}\mathbf{Y})=(d\mathbf{X})\mathbf{Y}+\mathbf{X}d\mathbf{Y}$
- $d(\mathbf{X}\odot \mathbf{Y})=(d\mathbf{X})\odot \mathbf{Y}+\mathbf{X}\odot d\mathbf{Y}$
- $d\sigma(\mathbf{X})=\sigma'(X)\odot d\mathbf{X}$(此条经常与迹性质中的第五条结合使用)
- $d\mathbf{X}^{-1}=-\mathbf{X}^{-1}(d\mathbf{X})\mathbf{X}^{-1}$
- $d\vert \mathbf{X}\vert = \vert \mathbf{X} \vert tr(\mathbf{X}^{-1}d\mathbf{X})$
- $d \ln \vert \mathbf{X}\vert = tr(\mathbf{X}^{-1}d\mathbf{X})$
- $d\mathbf{X}^T = (d\mathbf{X})^T$
(五)乘法法则$(Product$ $Rule)$
- 若$\mathbf{x}\in R^{p},\mathbf{y}=f(\mathbf{x})\in R^q,\mathbf{z}=g(\mathbf{x})\in R^{q}$,则$\frac{\partial{\mathbf{y}^T\mathbf{z}}}{\partial{\mathbf{x}}}=\frac{\partial{\mathbf{y}}}{\partial{\mathbf{x}}}\mathbf{z}+\frac{\partial{\mathbf{z}}}{\partial{\mathbf{x}}}\mathbf{y} \in R^p$
- 若$\mathbf{x}\in R^{p},y=f(\mathbf{x})\in R,\mathbf{z}=g(\mathbf{x})\in R^{q}$,则$\frac{\partial{y\mathbf{z}}}{\partial{\mathbf{x}}}=\frac{\partial{y}}{\partial{\mathbf{x}}}\mathbf{z}^T+\frac{\partial{\mathbf{z}}}{\partial{\mathbf{x}}}y \in R^{p×q}$
(六)链式法则$(Chain$ $Rule)$
- 向量对向量求导(此种情况显然还包含了标量对向量求导和向量对标量求导)
- 设多个向量之间存在依赖关系:$\mathbf{a} \Rightarrow \mathbf{b} \Rightarrow ... \Rightarrow \mathbf{x} \Rightarrow \mathbf{y} \Rightarrow \mathbf{z}$
- 计算方法:$\frac{\partial{\mathbf{z}}}{\partial{\mathbf{a}}}=\frac{\partial{\mathbf{b}}}{\partial{\mathbf{a}}}\frac{\partial{\mathbf{c}}}{\partial{\mathbf{b}}}...\frac{\partial{\mathbf{y}}}{\partial{\mathbf{w}}}\frac{\partial{\mathbf{z}}}{\partial{\mathbf{y}}}$
- 标量对矩阵求导
- 若矩阵$\mathbf{X}\in R^{p×q}$,矩阵$\mathbf{Y}=g(\mathbf{X})\in R^{s×t}$,标量$z=f(\mathbf{\mathbf{Y}})\in R$,则$\frac{\partial{z}}{\partial{\mathbf{X_{ij}}}}=tr((\frac{\partial{z}}{\partial{\mathbf{Y}}})^T\frac{\partial{\mathbf{Y}}}{\partial{\mathbf{X_{ij}}}})$
- 由上所述,若链式关系中存在有矩阵对矩阵求导,则难以直接写出标量对矩阵的导数,下面则给出常用的线性关系下的"链式"求导
- 若存在关系:$\mathbf{X}\Rightarrow \mathbf{Y}=\mathbf{AX}+\mathbf{B} \Rightarrow L=f(\mathbf{Y})$,则$\frac{\partial{L}}{\partial{\mathbf{X}}}=A^T\frac{\partial{L}}{\partial{\mathbf{Y}}}$
- 注$1$:若关系中改为$\mathbf{Y}=\mathbf{XA}+\mathbf{B} $,则计算结果变为$\frac{\partial{L}}{\partial{\mathbf{X}}}=\frac{\partial{L}}{\partial{\mathbf{Y}}}A^T$ 注$2$:在左乘$\mathbf{A}$且$\mathbf{x}$为向量时,则也同样结论成立
- 当$\mathbf{x}\Rightarrow \mathbf{y}=\mathbf{Ax}+\mathbf{b} \Rightarrow L=f(\mathbf{y})$时,有$\frac{\partial{L}}{\partial{\mathbf{x}}}=A^T\frac{\partial{L}}{\partial{\mathbf{y}}}$成立
- 注:此时由于链式法则不再成立,往往通过上文介绍的迹方法来求标量对矩阵的导数
- 矩阵对矩阵求导
- 有上面介绍的结果可以看到,对于矩阵(或向量)对矩阵求导并不具有向量对向量求导的链式法则形式
- 这与矩阵的$Kronecker$积有关,详细关于矩阵对矩阵求导的内容可查看[10]中的详细叙述,本文不展开
(七)一些常见技巧
- 当目标值内多处含有自变量,可以每次只对一处求导数,最后将这些量相加,具体案例详见[7]中的第28页
- 几种变化手段:
- 一维下标求和则考虑写成内积的形式
- 二维下标求和则考虑写成$tr$的形式
- 向量模长的平方则考虑内积运算,即$\sum_{i}x_i^2=\mathbf{x}^T\mathbf{x}$
- 矩阵的$Frobenius$范数则考虑写成$tr$的形式,即$\Vert \mathbf{X}\Vert_{F}^2=tr(\mathbf{X}\mathbf{X}^T)$
(八)实例
【例1】求$\frac{\partial^2\mathbf{x}^T\mathbf{A}\mathbf{x}}{\partial{\mathbf{x}}\partial{\mathbf{x}^T}}$
【解】原式$=\frac{\partial}{\partial\mathbf{x}}(\mathbf{I}\mathbf{A}\mathbf{x}+\mathbf{A}^T\mathbf{x})=\mathbf{A^T}+\mathbf{A}$
【例2】求$\frac{\partial\vert{X}^T{A}{X}\vert}{\partial{X}}$
【解】由于$df=tr(df)\\=tr(\vert X^TAX\vert(X^TAX)^{-1}d(X^TAX))\\=tr(\vert X^TAX\vert (X^TAX)^{-1}(dX^T)(AX))+tr(\vert X^TAX\vert (X^TAX)^{-1}(X^TA) dX)\\=tr((\vert X^TAX\vert AX(X^TAX)^{-1}+\vert X^TAX\vert A^TX(X^TA^TX)^{-1})dX^T)$
因此原式$=\vert X^TAX\vert(AX(X^TAX)^{-1}+A^TX(X^TA^TX)^{-1})$
【例3】设$L=-\mathbf{y}^T\ln(\frac{exp(\mathbf{a})}{\mathbf{1}^Texp(\mathbf{a})})$,求$\frac{\partial{L}}{\partial{\mathbf{a}}}$
【解】令$\mathbf{r}=\exp(\mathbf{a}),\mathbf{s}=\frac{\mathbf{r}}{\mathbf{1}^T\mathbf{r}},\mathbf{t}=\ln{\mathbf{s}},L=-\mathbf{y}^T\mathbf{t}$
此时$\frac{\partial{L}}{\partial{\mathbf{a}}}=\frac{\partial{\mathbf{r}}}{\partial{\mathbf{a}}}\frac{\partial{\mathbf{s}}}{\partial{\mathbf{r}}}\frac{\partial{\mathbf{t}}}{\partial{\mathbf{s}}}\frac{\partial{L}}{\partial{\mathbf{t}}}=diag(\exp(\mathbf{a}))(\frac{1}{\mathbf{1}^T\mathbf{r}}\mathbf{I}-\frac{1}{(\mathbf{1}^T\mathbf{r})^2}\mathbf{1}\mathbf{r}^T)diag(\frac{\mathbf{1}}{\mathbf{s}})(-\mathbf{y})$
最后将变量逐个代入即得到结果,这里如果限制$\mathbf{y}$是$onehot$向量,则可验证其等价于[1]中的多元$Logistic$回归结果
参考材料:
- 长躯鬼侠. 矩阵求导术(上), (https://zhuanlan.zhihu.com/p/24709748)
- 刘建平. 机器学习中的矩阵向量求导, (https://www.cnblogs.com/pinard/)
- Kaare Brandt Petersen, Michael Syskind Pedersen. "The Matrix Cookbook", 2008
- Thomas P. Minka. "Old and New Matrix Algebra Useful for Statistics", 2000
- Searle Shayle R. "Matrix Algebra Useful for Statistics", 1982
- Jan R. Magnus, Heinz Neudecker. "Matrix Differential Calculus with Applications in Statistics and Econometrics", 2007
- "Matrix Vector Derivatives for Machine Learning", (作者邮箱:ruanchong_ruby@163.com)
- 维基百科. Matrix calculus, (https://en.wikipedia.org/wiki/Matrix_calculus)
- 邱锡鹏. 神经网络与深度学习, (https://nndl.github.io/)
- 长躯鬼侠. 矩阵求导术(下), (https://zhuanlan.zhihu.com/p/24863977)
附:上述材料[3-7]的下载连接(密码: pcct)