00 矩阵求导

5,009 阅读3分钟

矩阵求导

参考 zhuanlan.zhihu.com/p/273729929

main idea

  • 函数的输出如果不是标量,那么求导就是对他的每一个输出分别求,于是问题退化成了输出是标量、输入是矩阵的求导,不用太纠结,因为只要位置映射的对就可以了

  • 关于矩阵XX求导,求导完的结果和XX的形状是一样的。

  • 定义方法求导

    • 假设fRm×nRf:R^{m\times n} \rightarrow R 那么求导结果是一个m×nm \times n 的矩阵,第ii行第jj列表示ff关于xijx_{ij}的求导结果。
    • 根据这个定义,导数的运算法则全都适用。包括函数的和差积商、数乘、复合。对常数求是0矩阵

4 定义法两个基本题目

eg1. f(X)=Xf(X)=|X|XXn×nn\times n的矩阵,求fX\frac{\partial f}{\partial X}

​ 按照定义,对每个位置分别求导

fX=[Xx11Xx12...Xx1nXx21Xx22...Xx2n.........Xxn1Xxn2...Xxnn]\frac{\partial f}{\partial X} =\begin{bmatrix} \frac{\partial |X|}{\partial x_{11}}\frac{\partial |X|}{\partial x_{12}}&...&\frac{\partial |X|}{\partial x_{1n}}\\ \frac{\partial |X|}{\partial x_{21}}\frac{\partial |X|}{\partial x_{22}}&...&\frac{\partial |X|}{\partial x_{2n}}\\ ...&...&...\\ \frac{\partial |X|}{\partial x_{n1}}\frac{\partial |X|}{\partial x_{n2}}&...&\frac{\partial |X|}{\partial x_{nn}}\\ \end{bmatrix}

对于Xxij\frac{\partial |X|}{\partial x_{ij}} 按照他所在的行展开计算行列式,则可变化为 Ai1xi1+...+Aijxij+...+Ainxinxij=Aij\frac{A_{i1}x_{i1}+...+A_{ij}x_{ij}+...+A_{in}x_{in}}{\partial x_{ij}}=A_{ij} 其中AijA_{ij}为代数余子式(有符号)。所以按照定义,求导后就是

[A11A12...A1n............An1An2...Ann]\begin{bmatrix} A_{11}&A_{12}&...&A_{1n} \\ ...&...&...&...\\A_{n1}&A_{n2}&...&A_{nn}\end{bmatrix}

所以这个导数就是伴随矩阵XX^*,伴随矩阵、原矩阵和逆矩阵有如下关系:XX=XX=XIXX^*=X^*X=|X|I

所以可以进一步化为fX=XX1\frac{\partial f}{\partial X}=|X|X^{-1}

利用全微分 + trace的方法求导

  • 这种方法的核心思想是引入了trace,引入trace的好处是只关注矩阵的对角线,因此很多操作在只看trace的情况下是成立的。这为化简提供了便利。

  • 全微分在矩阵条件下和实值变量情况下是一样的,为XX的各个分量的偏导数*该分量的微分最后求和

    例如 df(X)=fx11dx11+...+fxmndxmndf(X)=\frac{\partial f}{\partial x_{11}}dx_{11}+...+\frac{\partial f}{\partial x_{mn}}dx_{mn}

    他可以进一步写成 df(X)=tr(fXTdX)df(X)=tr(\frac{\partial f}{\partial X^T}dX) 这其实是矩阵trace的一个性质,如果两个矩阵形状相同,那第一个转置乘第二个再求trace恰好就是对应位置元素相乘再求和。

  • 上面的写法有一个好处,当我们试图求fX\frac{\partial f}{\partial X} 的时候,可以先求fXT\frac{\partial f}{\partial X^T} 再转置。而后者求法,则可以先求df(X)df(X)。但是直接求微分无法出现trace符号,但标量函数的全微分是一个标量,它的trace等于自身,因此df(X)=tr(df(X))df(X)=tr(df(X))

因此,矩阵求导可以利用全微分的性质(和求导一样)进行一系列化简,化成df(X)=tr(g(X)dX)df(X)=tr(g(X)dX)的形式,那么g(X)g(X)就是fXT\frac{\partial f}{\partial X^T},已经有人证明了这个的唯一性。再转置回来就得到了导数。

  • tr的性质

    • tr(A)=tr(A'),tr(AB')=tr(BA') 转置不变
    • tr(AB)=tr(BA), tr(ABC)=tr(CAB)=tr(BCA) 转着乘
    • 线性性

eg2. 求aTXXTbX\frac{\partial a^TXX^Tb}{\partial X}
d(aTXXTb)=tr(d(aTXXTb))=tr(aTd(XXT)b)=tr(aTdXXTb)+tr(aTXdXTb)d(a^TXX^Tb)=tr(d(a^TXX^Tb))=tr(a^Td(XX^T)b)=tr(a^TdXX^Tb) + tr(a^TXdX^Tb) 利用性质2,把dX放在最右面,把前面凑成导数转置:
d(aTXXTb)=tr(aTdXXTb)+tr(aTXdXTb)=tr(XTbaTdX)+tr(baTXdXT)d(a^TXX^Tb)=tr(a^TdXX^Tb) + tr(a^TXdX^Tb)=tr(X^Tba^TdX)+tr(ba^TXdX^T)
对第二项,联合运用转置和交换率,得d(aTXXTb)=tr(XTbaTdX)+tr(XTabTdX)=tr((XTbaT+XTabT)dX)d(a^TXX^Tb)=tr(X^Tba^TdX)+tr(X^Tab^TdX)=tr((X^Tba^T+X^Tab^T)dX) 所以导数就是(XTbaT+XTabT)T=abTX+baTX(X^Tba^T+X^Tab^T)^T=ab^TX+ba^TX

eg3. 求dX1dX^{-1}XXn×nn\times n的矩阵

XX1=IXX^{-1}=I 两侧取微分 dX1=X1dXX1dX^{-1}=-X^{-1}dXX^{-1}

​ 这个如果求微分的话,是矩阵对矩阵求微分,用到克罗内克积,很复杂。克罗内克积用\otimes表示,含义为第一个矩阵的每一个元素和第二个矩阵相乘,结果是一个分块矩阵。记住dX/dX=IIdX/dX=I\otimes I 结果是一个n2×n2n^2\times n^2的矩阵。

对于对称矩阵求导的处理

如果求导的矩阵是对称的,那么其实上面求出的导数并不彻底,因为对称位置的变量是相同的,他们可以进一步看作是关于某个参数t的函数,所以根据链式求导法则还得再求一次。

因此分为两个步骤,第一步是按照上面求法求出A=fXTA=\frac{\partial f}{\partial X^T},这个求解过程中不要使用任何对称的性质。

在此基础上,得到A=A+Atr(ATI)A'=A+A-tr(A^TI) 。这样相当于把对称位置的导数变成了fxij+fxji\frac{\partial f}{x_{ij}}+\frac{\partial f}{x_{ji}}