矩阵求导
参考
zhuanlan.zhihu.com/p/273729929
main idea
-
函数的输出如果不是标量,那么求导就是对他的每一个输出分别求,于是问题退化成了输出是标量、输入是矩阵的求导,不用太纠结,因为只要位置映射的对就可以了
-
关于矩阵XX求导,求导完的结果和XX的形状是一样的。
-
定义方法求导
- 假设f:Rm×n→Rf:R^{mtimes n} rightarrow R 那么求导结果是一个m×nm times n 的矩阵,第ii行第jj列表示ff关于xijx_{ij}的求导结果。
- 根据这个定义,导数的运算法则全都适用。包括函数的和差积商、数乘、复合。对常数求是0矩阵
4 定义法两个基本题目
eg1. f(X)=∣X∣f(X)=|X|, XX是n×nntimes n的矩阵,求∂f∂Xfrac{partial f}{partial X}
按照定义,对每个位置分别求导
∂f∂X=[∂∣X∣∂x11∂∣X∣∂x12…∂∣X∣∂x1n∂∣X∣∂x21∂∣X∣∂x22…∂∣X∣∂x2n………∂∣X∣∂xn1∂∣X∣∂xn2…∂∣X∣∂xnn]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}
对于∂∣X∣∂xijfrac{partial |X|}{partial x_{ij}} 按照他所在的行展开计算行列式,则可变化为 Ai1xi1+…+Aijxij+…+Ainxin∂xij=Aijfrac{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}
所以这个导数就是伴随矩阵X∗X^*,伴随矩阵、原矩阵和逆矩阵有如下关系:XX∗=X∗X=∣X∣IXX^*=X^*X=|X|I
所以可以进一步化为∂f∂X=∣X∣X−1frac{partial f}{partial X}=|X|X^{-1}
利用全微分 + trace的方法求导
-
这种方法的核心思想是引入了trace,引入trace的好处是只关注矩阵的对角线,因此很多操作在只看trace的情况下是成立的。这为化简提供了便利。
-
全微分在矩阵条件下和实值变量情况下是一样的,为XX的各个分量的偏导数*该分量的微分最后求和
例如 df(X)=∂f∂x11dx11+…+∂f∂xmndxmndf(X)=frac{partial f}{partial x_{11}}dx_{11}+…+frac{partial f}{partial x_{mn}}dx_{mn}
他可以进一步写成 df(X)=tr(∂f∂XTdX)df(X)=tr(frac{partial f}{partial X^T}dX) 这其实是矩阵trace的一个性质,如果两个矩阵形状相同,那第一个转置乘第二个再求trace恰好就是对应位置元素相乘再求和。
-
上面的写法有一个好处,当我们试图求∂f∂Xfrac{partial f}{partial X} 的时候,可以先求∂f∂XTfrac{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)就是∂f∂XTfrac{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. 求∂aTXXTb∂Xfrac{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. 求dX−1dX^{-1},XX是n×nntimes n的矩阵
XX−1=IXX^{-1}=I 两侧取微分 dX−1=−X−1dXX−1dX^{-1}=-X^{-1}dXX^{-1}
这个如果求微分的话,是矩阵对矩阵求微分,用到克罗内克积,很复杂。克罗内克积用⊗otimes表示,含义为第一个矩阵的每一个元素和第二个矩阵相乘,结果是一个分块矩阵。记住dX/dX=I⊗IdX/dX=Iotimes I 结果是一个n2×n2n^2times n^2的矩阵。
对于对称矩阵求导的处理
如果求导的矩阵是对称的,那么其实上面求出的导数并不彻底,因为对称位置的变量是相同的,他们可以进一步看作是关于某个参数t的函数,所以根据链式求导法则还得再求一次。
因此分为两个步骤,第一步是按照上面求法求出A=∂f∂XTA=frac{partial f}{partial X^T},这个求解过程中不要使用任何对称的性质。
在此基础上,得到A′=A+A−tr(ATI)A’=A+A-tr(A^TI) 。这样相当于把对称位置的导数变成了∂fxij+∂fxjifrac{partial f}{x_{ij}}+frac{partial f}{x_{ji}}