machine learning Word Count: 2.2k(words) Read Count: 11(minutes)
矩阵微分和矩阵求导几乎是求解优化问题不可避免的必学内容,这一方面的内容老实说我很难完全掌握。这里记录一下一些常用的矩阵微分求导的规范和技巧。
符号约定和布局规范
首先微分(differential)是在自变量微小变化下造成的因变量的微小变化,而导数(derivative)则是这种变化的速率。联系导数和微分的方程式叫做微分方程(differential equation)。比如函数y=f(x),x的微小变化用符号dx表示,导致的y的微小变化用dy表示,x的变化引起的y的变化的速率用∂x∂y表示,函数f(x)的微分方程就是:
dy=∂x∂ydx
矩阵微分/导数同函数微分/导数基本一致,只不过现在输入输出都是矩阵(向量也是矩阵的一种)的表现形式,比如y=f(x)。这里用加粗大写字母表示矩阵,例如A;用加粗小写字母表示向量,例如a;用不加粗小写字母表示标量,例如a。
矩阵微分求导的难点在于没有固定的布局规范,导致有些文章和教材看起来互相冲突。比如对于∂x∂y,其中y∈Rm×1,x∈Rn×1,向量对向量的导数用矩阵形式可以有两种表示布局方案:
- 分子布局(numerator layout),这种布局要求y是按列排的,x是按行排列的(即xT),最终输出∂x∂y∈Rm×n,我觉得可以简单理解为与分子上矩阵元素相关的输出排列规则不变(跟原来一致),而与分母上矩阵元素相关输出排列规则应当是原来元素的转置。
- 分母布局(denominator layout),这种布局要求y是按行排的(即yT),x是按列排列的,最终输出∂x∂y∈Rn×m,正好跟分子布局相反。
为了方便推导和记忆,我选择采用分子布局,那么矩阵间导数的形式应当是这样的:
| y | y∈Rm×1 | Y∈Rm×n |
---|
x | ∂x∂y | ∂x∂y∈Rm×1 | ∂x∂Y∈Rm×n |
x∈Rp×1 | ∂x∂y∈R1×p | ∂x∂y∈Rm×p | |
X∈Rp×q | ∂X∂y∈Rq×p | | |
微分规则
矩阵求导常需要用到sum rule、product rule和chain rule,其中链式法则不适用于matrix-by-scalar或scalar-by-matrix的形式,所以直接复合函数求导蛮麻烦的。wiki上说可以先用微分的规则求微分,然后再转换成导数的形式。
sum rules:
h(x)dh(x)=f(x)+g(x)=df(x)+dg(x)
product rules:
h(x)dh(x)=f(x)g(x)=df(x)g(x)+f(x)dg(x)
chain rules:
h(x)dh(x)=f(g(x))=f(g(x+dx))−f(g(x))=f(g(x)+dg(x))−f(g(x))=df(y)∣y=g(x),dy=dg(x)
trace tricks:
atr(A)tr(A+B)tr(ABC)=tr(a)=tr(AT)=tr(A)+tr(B)=tr(BCA)=tr(CAB)
kronecker product rules:
A⊗(B+C)(kA)⊗B(A⊗B)⊗C(A⊗B)(C⊗D)(A⊗B)∘(C⊗D)(A⊗B)−1(A⊗B)Ttr(A⊗B)=A⊗B+A⊗C=A⊗(kB)=k(A⊗B)=A⊗(B⊗C)=(AC)⊗(BD)=(A∘C)⊗(B∘D)=A−1⊗B−1=AT⊗BT=tr(A)tr(B)
hadamard product rules:
A∘BA∘(B+C)(kA)∘B(A∘B)∘C=B∘A=A∘B+A∘C=A∘(kB)=k(A∘B)=A∘(B∘C)
总结矩阵常用的微分规则如下:
说明 | 表达式 | 微分结果 |
---|
A不是X的函数 | d(A) | 0 |
a不是X的函数 | d(aX) | adX |
| d(X⊗Y) | (dX)⊗Y+X⊗(dY) |
| d(X∘Y) | (dX)∘Y+X∘(dY) |
| d(XT) | (dX)T |
共轭转置 | d(XH) | (dX)H |
| d(X−1) | −X−1(dX)X−1 |
n是正整数 | d(Xn) | ∑i=0n−1Xi(dX)Xn−1−i |
| d(eX) | ∫01eaX(dX)e(1−a)Xda |
| d(log(X)) | ∫0∞(X+zI)−1(dX)(X+zI)−1dz |
| d(tr(X)) | tr(dX) |
| d(det(X)) | det(X)tr(X−1dX) |
| d(log(det(X))) | tr(X−1dX) |
微分-导数转换
在获得表达式的微分形式后,可以按如下规则进行导数形式的转化:
微分形式 | 导数形式 |
---|
dy=adx | ∂x∂y=a |
dy=aTdx | ∂x∂y=aT |
dy=tr(AdX) | ∂X∂y=A |
dy=adx | ∂x∂y=a |
dy=Adx | ∂x∂y=A |
dY=Adx | ∂x∂Y=A |