矩阵微分和矩阵求导几乎是求解优化问题不可避免的必学内容,这一方面的内容老实说我很难完全掌握。这里记录一下一些常用的矩阵微分求导的规范和技巧。

符号约定和布局规范

首先微分(differential)是在自变量微小变化下造成的因变量的微小变化,而导数(derivative)则是这种变化的速率。联系导数和微分的方程式叫做微分方程(differential equation)。比如函数y=f(x)y=\mathrm{f}(x)xx的微小变化用符号dxdx表示,导致的yy的微小变化用dydy表示,xx的变化引起的yy的变化的速率用yx\frac{\partial y}{\partial x}表示,函数f(x)\mathrm{f}(x)的微分方程就是:

dy=yxdx\begin{equation} dy=\frac{\partial y}{\partial x} dx \end{equation}

矩阵微分/导数同函数微分/导数基本一致,只不过现在输入输出都是矩阵(向量也是矩阵的一种)的表现形式,比如y=f(x)\mathbf{y} = \mathrm{f}(\mathbf{x})。这里用加粗大写字母表示矩阵,例如A\mathbf{A};用加粗小写字母表示向量,例如a\mathbf{a};用不加粗小写字母表示标量,例如aa

矩阵微分求导的难点在于没有固定的布局规范,导致有些文章和教材看起来互相冲突。比如对于yx\frac{\partial \mathbf{y}}{\partial \mathbf{x}},其中yRm×1\mathbf{y} \in \mathbb{R}^{m \times 1}xRn×1\mathbf{x} \in \mathbb{R}^{n \times 1},向量对向量的导数用矩阵形式可以有两种表示布局方案:

  • 分子布局(numerator layout),这种布局要求y\mathbf{y}是按列排的,x\mathbf{x}是按行排列的(即xT\mathbf{x}^T),最终输出yxRm×n\frac{\partial \mathbf{y}}{\partial \mathbf{x}} \in \mathbb{R}^{m \times n},我觉得可以简单理解为与分子上矩阵元素相关的输出排列规则不变(跟原来一致),而与分母上矩阵元素相关输出排列规则应当是原来元素的转置。
  • 分母布局(denominator layout),这种布局要求y\mathbf{y}是按行排的(即yT\mathbf{y}^T),x\mathbf{x}是按列排列的,最终输出yxRn×m\frac{\partial \mathbf{y}}{\partial \mathbf{x}} \in \mathbb{R}^{n \times m},正好跟分子布局相反。

为了方便推导和记忆,我选择采用分子布局,那么矩阵间导数的形式应当是这样的:

yyyRm×1\mathbf{y} \in \mathbb{R}^{m \times 1}YRm×n\mathbf{Y} \in \mathbb{R}^{m \times n}
xxyx\frac{\partial y}{\partial x}yxRm×1\frac{\partial \mathbf{y}}{\partial x} \in \mathbb{R}^{m \times 1}YxRm×n\frac{\partial \mathbf{Y}}{\partial x} \in \mathbb{R}^{m \times n}
xRp×1\mathbf{x} \in \mathbb{R}^{p \times 1}yxR1×p\frac{\partial y}{\partial \mathbf{x}} \in \mathbb{R}^{1 \times p}yxRm×p\frac{\partial \mathbf{y}}{\partial \mathbf{x}} \in \mathbb{R}^{m \times p}
XRp×q\mathbf{X} \in \mathbb{R}^{p \times q}yXRq×p\frac{\partial y}{\partial \mathbf{X}} \in \mathbb{R}^{q \times p}

微分规则

矩阵求导常需要用到sum rule、product rule和chain rule,其中链式法则不适用于matrix-by-scalar或scalar-by-matrix的形式,所以直接复合函数求导蛮麻烦的。wiki上说可以先用微分的规则求微分,然后再转换成导数的形式。

sum rules:

h(x)=f(x)+g(x)dh(x)=df(x)+dg(x)\begin{equation} \begin{split} h(x) &= f(x) + g(x)\\ dh(x) &= df(x) + dg(x)\\ \end{split} \end{equation}

product rules:

h(x)=f(x)g(x)dh(x)=df(x)g(x)+f(x)dg(x)\begin{equation} \begin{split} h(x) &= f(x)g(x)\\ dh(x) &= df(x)g(x) + f(x)dg(x)\\ \end{split} \end{equation}

chain rules:

h(x)=f(g(x))dh(x)=f(g(x+dx))f(g(x))=f(g(x)+dg(x))f(g(x))=df(y)y=g(x),dy=dg(x)\begin{equation} \begin{split} h(x) &= f(g(x))\\ dh(x) &= f(g(x+dx)) - f(g(x))\\ &= f(g(x)+dg(x)) - f(g(x))\\ &= df(y)|_{y=g(x),dy=dg(x)}\\ \end{split} \end{equation}

trace tricks:

a=tr(a)tr(A)=tr(AT)tr(A+B)=tr(A)+tr(B)tr(ABC)=tr(BCA)=tr(CAB)\begin{equation} \begin{split} a &= \mathrm{tr}(a)\\ \mathrm{tr}(\mathbf{A}) &= \mathrm{tr}(\mathbf{A}^T)\\ \mathrm{tr}(\mathbf{A}+\mathbf{B}) &= \mathrm{tr}(\mathbf{A}) + \mathrm{tr}(\mathbf{B})\\ \mathrm{tr}(\mathbf{A}\mathbf{B}\mathbf{C}) &= \mathrm{tr}(\mathbf{B}\mathbf{C}\mathbf{A})\\ &= \mathrm{tr}(\mathbf{C}\mathbf{A}\mathbf{B})\\ \end{split} \end{equation}

kronecker product rules:

A(B+C)=AB+AC(kA)B=A(kB)=k(AB)(AB)C=A(BC)(AB)(CD)=(AC)(BD)(AB)(CD)=(AC)(BD)(AB)1=A1B1(AB)T=ATBTtr(AB)=tr(A)tr(B)\begin{equation} \begin{split} \mathbf{A}\otimes(\mathbf{B}+\mathbf{C}) &= \mathbf{A}\otimes\mathbf{B} + \mathbf{A}\otimes\mathbf{C}\\ (k\mathbf{A})\otimes\mathbf{B} &= \mathbf{A}\otimes(k\mathbf{B})=k(\mathbf{A}\otimes\mathbf{B})\\ (\mathbf{A}\otimes\mathbf{B})\otimes\mathbf{C} &= \mathbf{A}\otimes(\mathbf{B}\otimes\mathbf{C})\\ (\mathbf{A}\otimes\mathbf{B})(\mathbf{C}\otimes\mathbf{D}) &= (\mathbf{A}\mathbf{C})\otimes(\mathbf{B}\mathbf{D})\\ (\mathbf{A}\otimes\mathbf{B})\circ(\mathbf{C}\otimes\mathbf{D}) &= (\mathbf{A}\circ\mathbf{C})\otimes(\mathbf{B}\circ\mathbf{D})\\ (\mathbf{A}\otimes\mathbf{B})^{-1} &= \mathbf{A}^{-1} \otimes \mathbf{B}^{-1}\\ (\mathbf{A}\otimes\mathbf{B})^{T} &= \mathbf{A}^{T} \otimes \mathbf{B}^{T}\\ \mathrm{tr}(\mathbf{A}\otimes\mathbf{B}) &= \mathrm{tr}(\mathbf{A})\mathrm{tr}(\mathbf{B})\\ \end{split} \end{equation}

hadamard product rules:

AB=BAA(B+C)=AB+AC(kA)B=A(kB)=k(AB)(AB)C=A(BC)\begin{equation} \begin{split} \mathbf{A}\circ\mathbf{B} &= \mathbf{B}\circ\mathbf{A}\\ \mathbf{A}\circ(\mathbf{B}+\mathbf{C}) &= \mathbf{A}\circ\mathbf{B} + \mathbf{A}\circ\mathbf{C}\\ (k\mathbf{A})\circ\mathbf{B} &= \mathbf{A}\circ(k\mathbf{B})=k(\mathbf{A}\circ\mathbf{B})\\ (\mathbf{A}\circ\mathbf{B})\circ\mathbf{C} &= \mathbf{A}\circ(\mathbf{B}\circ\mathbf{C})\\ \end{split} \end{equation}

总结矩阵常用的微分规则如下:

说明表达式微分结果
A\mathbf{A}不是X\mathbf{X}的函数d(A)d\left(\mathbf{A}\right)0\mathbf{0}
aa不是X\mathbf{X}的函数d(aX)d(a\mathbf{X})adXad\mathbf{X}
d(XY)d(\mathbf{X} \otimes \mathbf{Y})(dX)Y+X(dY)(d\mathbf{X}) \otimes \mathbf{Y} + \mathbf{X} \otimes (d\mathbf{Y})
d(XY)d(\mathbf{X} \circ \mathbf{Y})(dX)Y+X(dY)(d\mathbf{X}) \circ \mathbf{Y} + \mathbf{X} \circ (d\mathbf{Y})
d(XT)d(\mathbf{X}^T)(dX)T(d\mathbf{X})^T
共轭转置d(XH)d(\mathbf{X}^H)(dX)H(d\mathbf{X})^H
d(X1)d(\mathbf{X}^{-1})X1(dX)X1-\mathbf{X}^{-1}(d\mathbf{X})\mathbf{X}^{-1}
nn是正整数d(Xn)d(\mathbf{X}^n)i=0n1Xi(dX)Xn1i\sum_{i=0}^{n-1} \mathbf{X}^i(d\mathbf{X})\mathbf{X}^{n-1-i}
d(eX)d(e^{\mathbf{X}})01eaX(dX)e(1a)Xda\int_0^1 e^{a\mathbf{X}}(d\mathbf{X}) e^{(1-a)\mathbf{X}}da
d(log(X))d(\mathrm{log}(\mathbf{X}))0(X+zI)1(dX)(X+zI)1dz\int_0^{\infty} (\mathbf{X}+z\mathbf{I})^{-1}(d\mathbf{X})(\mathbf{X}+z\mathbf{I})^{-1}dz
d(tr(X))d(\mathrm{tr}(\mathbf{X}))tr(dX)\mathrm{tr}(d\mathbf{X})
d(det(X))d(\det(\mathbf{X}))det(X)tr(X1dX)\det(\mathbf{X})\mathrm{tr}(\mathbf{X}^{-1}d\mathbf{X})
d(log(det(X)))d(\log(\det(\mathbf{X})))tr(X1dX)\mathrm{tr}(\mathbf{X}^{-1}d\mathbf{X})

微分-导数转换

在获得表达式的微分形式后,可以按如下规则进行导数形式的转化:

微分形式导数形式
dy=adxdy=adxyx=a\frac{\partial y}{\partial x}=a
dy=aTdxdy=\mathbf{a}^Td\mathbf{x}yx=aT\frac{\partial y}{\partial \mathbf{x}}=\mathbf{a}^T
dy=tr(AdX)dy=\mathrm{tr}(\mathbf{A}d\mathbf{X})yX=A\frac{\partial y}{\partial \mathbf{X}}=\mathbf{A}
dy=adxd\mathbf{y}=\mathbf{a}dxyx=a\frac{\partial \mathbf{y}}{\partial x}=\mathbf{a}
dy=Adxd\mathbf{y}=\mathbf{A} d\mathbf{x}yx=A\frac{\partial \mathbf{y}}{\partial \mathbf{x}}=\mathbf{A}
dY=Adxd\mathbf{Y}=\mathbf{A}dxYx=A\frac{\partial \mathbf{Y}}{\partial x}=\mathbf{A}