在一些优化问题中,经常会出现选择向量或者矩阵来最优化某个目标函数的情况,要想从理论上求解这类优化,就需要正确计算目标函数关于向量或者矩阵的导数。比如多元回归模型中,要用最小二乘法估计回归系数,需要做以下的最优化:
βminQ=(Y−Xβ)2
然而现有的教材和论文都只是需要什么就临时查证推导一下,很少有系统地总结目标函数怎么对向量或矩阵求导的资料。这篇博文比较全面地整理了向量与矩阵的一些常用运算,以及怎么对这些常用运算求导的方法。有张量积和拉平算子就足以解决大部分领域的问题了,所以这篇博文不会涉及张量以及张量分析的内容。出于实用考虑本文考察的向量与矩阵的元素取值均为实数。
向量与矩阵的相关运算
加法和减法太简单了就不说了。本文向量默认都是列向量。以下运算中除了行列式或者使用了行列式的运算外,其他运算都能用在非方阵的情形。
矩阵的一元运算
矩阵的拉直算子
矩阵的拉直算子(Matrix Vec Operator)将矩阵按列拉直成一个列向量。
vec(A)=⎣⎢⎢⎢⎢⎡A.1A.2...A.n−1A.n⎦⎥⎥⎥⎥⎤∈Rn2
矩阵的迹
矩阵A的迹记为tr(A),按Einstein求和约定的记法,tr(A)=∑i=1nAii=Aii
矩阵的行列式
定义n元的置换运算:
σ=[1σ(1)2σ(2)......n−1σ(n−1)nσ(n)]
其含义是将指标1,2,...,n重新排列。置换运算的符号取决于将排列还原为1,2,...,n的顺序需要多少步,如果需要偶数步则符号为正。记所有n元置换运算的集合为Pn。定义矩阵A的行列式为:
det(A)=∣A∣=σ∈Pn∑sgn(σ)A1σ(1)A2σ(2)...Anσ(n)
伴随矩阵与矩阵的逆
矩阵A的迹记为adj(A)或者A∗,(A∗)ij=Mji,Mji是矩阵A的代数余子式,
Mji=σ∈Pn,σ(j)=i∑sgn(σ)A1σ(1)...Aj−1,σ(j−1)Aj+1,σ(j+1)...Anσ(n)
有一个比较明显的结论,先把计算行列式的各项分成含Aij的与不含Aij的
∣A∣=σ∈Pn,σ(i)=j∑sgn(σ)A1σ(1)A2σ(2)...Anσ(n)+σ∈Pn,σ(i)=j∑sgn(σ)A1σ(1)A2σ(2)...Anσ(n)
从而将行列式对Aij求导的结果是
∂Aij∂∣A∣=σ∈Pn,σ(i)=j∑sgn(σ)A1σ(1)...Aj−1,σ(j−1)Aj+1,σ(j+1)...Anσ(n)=Mij
矩阵的逆等于
A−1=∣A∣A∗
矩阵的二元运算
矩阵的乘法
矩阵的乘法被定义为对应的行和列分别相乘。假设A∈Rm×n,B∈Rn×m
AB=⎣⎢⎢⎢⎢⎡A1.B.1A2.B.1...A(m−1).B.1Am.B.1A1.B.2A2.B.2...A(m−1).B.2Am.B.2...............A1.B.(m−1)A2.B.(m−1)...A(m−1).B.(m−1)Am.B.(m−1)A1.B.mA2.B.m...A(m−1).B.mAm.B.m⎦⎥⎥⎥⎥⎤
用这个定义可以验证AA∗=∣A∣In,因此上面给出的矩阵的逆是符合逆的含义的。
Hadamard乘积
Hadamard乘积也是用处非常广的一种运算,它将两个形状一样的矩阵按对应位置元素进行乘积,并保持矩阵形状不变。
A∘B=⎣⎢⎢⎢⎢⎡A11B11A21B21...A(n−1)1B(n−1)1An1Bn1A12B12A22B22...A(n−1)2B(n−1)2An2Bn2...............A1(m−1)B1(m−1)A2(m−1)B2(m−1)...A(n−1)(m−1)B(n−1)(m−1)An(m−1)Bn(m−1)A1mB1mA2mB2m...A(n−1)mB(n−1)mAnmBnm⎦⎥⎥⎥⎥⎤
Kronecker积
矩阵的Kronecker积对矩阵的形状没有要求,假设A∈Rn×m,B∈Rp×q,则A⊗B∈np×mq
A⊗B=⎣⎢⎢⎢⎢⎡A11BA21B...A(n−1)1BAn1BA12BA22B...A(n−1)2BAn2B...............A1(m−1)BA2(m−1)B...A(n−1)(m−1)BAn(m−1)BA1mBA2mB...A(n−1)mBAnmB⎦⎥⎥⎥⎥⎤
数量对向量的导数
数量对列向量的导数
x∈Rn,y∈R,则
∂x∂y=[∂x1∂y∂x2∂y...∂xn−1∂y∂xn∂y]T
简单扩展一下就知道,如果x∈Rn,y∈Rn,则列向量对列向量的导数
∂x∂y=⎣⎢⎡∂x1∂y1...∂x1∂yn∂x2∂y1...∂x2∂yn.........∂xn−1∂yn−1...∂xn−1∂yn∂xn∂yn...∂xn∂yn⎦⎥⎤
显然∂y∂y=In。
对内积运算求导
x∈Rn,y∈Rn,z∈Rn,则
∂x∂(y,z)=[∂x1∂(y,z)∂x2∂(y,z)...∂xn−1∂(y,z)∂xn∂(y,z)]T
其中
∂xk∂(y,z)=∂xk∂yizi=∂xk∂yizi+yi∂xk∂zi
如果x=y,z为常数,则
∂yk∂(y,z)=∂yk∂yizi+yi∂yk∂zi=δkizi=zk
∂y∂(y,z)=[z1z2...zn−1zn]T=z
如果x=y=z,则
∂yk∂(y,y)=∂yk∂yiyi+yi∂yk∂yi=δkiyi+yiδik=2yk
∂y∂(y,y)=2[y1y2...yn−1yn]T=2y
一般性的结论为
∂x∂(y,z)=[∂x1∂yizi∂x2∂yizi...∂xn−1∂yizi∂xn∂yizi]T+[yi∂x1∂ziyi∂x2∂zi...yi∂xn−1∂ziyi∂xn∂zi]T=∂x∂yz+∂x∂zy
对矩阵与向量的乘积求导
假设A∈Rm×n,x∈Rn,记y=Ax
∂x∂Ax=⎣⎢⎡∂x1∂y1...∂x1∂ym∂x2∂y1...∂x2∂ym.........∂xn−1∂yn−1...∂xn−1∂ym∂xn∂yn...∂xn∂ym⎦⎥⎤
其中
∂xj∂yi=∂xj∂Aikxk=Aij
所以∂x∂Ax=A。
对二次型求导
考虑二次型xTAy,x∈Rm,A∈Rm×n,y∈Rn,记u=Ay,vT=xTA
∂x∂xTAy=∂x∂(x,u)=u=Ay
∂y∂xTAy=∂y∂(v,y)=v=ATx
如果A为方阵,且x=y,则
∂x∂xTAx=∂x∂(x,u)=Inu+∂x∂Axx=Inu+Ax=2Ax
矩阵对矩阵的导数
数量对矩阵的导数
假设a∈R,X∈Rm×n,定义
∂X∂a=⎣⎢⎢⎢⎢⎢⎢⎡∂X11∂a∂X21∂a...∂X(m−1)1∂a∂Xm1∂a∂X12∂a∂X22∂a...∂X(m−1)2∂a∂Xm2∂a...............∂X1(n−1)∂a∂X2(n−1)∂a...∂X(m−1)(n−1)∂a∂Xm(n−1)∂a∂X1n∂a∂X2n∂a...∂X(m−1)n∂a∂Xmn∂a⎦⎥⎥⎥⎥⎥⎥⎤
如果a=Xij,则
∂X∂Xij=Eij
其中Eij为只有第i行第j列是1,其他元素均为0矩阵。类似地,假设Y∈Rp×q,X∈Rm×n,可以定义矩阵对矩阵的导数
∂X∂Y=⎣⎢⎢⎢⎢⎢⎡∂X∂Y11∂X∂Y21...∂X∂Y(p−1)1∂X∂Yp1∂X∂Y12∂X∂Y22...∂X∂Y(p−1)2∂X∂Yp2...............∂X∂Y1(q−1)∂X∂Y2(q−1)...∂X∂Y(p−1)(q−1)∂X∂Yp(q−1)∂X∂Y1q∂X∂Y2q...∂X∂Y(p−1)q∂X∂Ypq⎦⎥⎥⎥⎥⎥⎤∈Rpm×qn
如果Y=X,
∂X∂X=⎣⎢⎢⎢⎢⎡E11E21...E(m−1)1Em1E12E22...E(m−1)2Em2...............E1(n−1)E2(n−1)...E(m−1)(n−1)Em(n−1)E1nE2n...E(m−1)nEmn⎦⎥⎥⎥⎥⎤
定义这个矩阵为E∈Rm2×n2。类似的可以计算出转置的导数
∂X∂XT=ET
对矩阵的一元运算求导
对拉直算子求导
∂X∂vec(X)=∂X∂⎣⎢⎢⎢⎢⎡X.1X.2...X.n−1X.n⎦⎥⎥⎥⎥⎤
其中
∂X∂X.j=∂X∂⎣⎢⎢⎢⎢⎡X1jX2j...X(m−1)jXmj⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡E1jE2j...E(m−1)jEmj⎦⎥⎥⎥⎥⎤=E.j
所以
∂X∂vec(X)=⎣⎢⎢⎢⎢⎡E.1E.2...E.n−1E.n⎦⎥⎥⎥⎥⎤
对矩阵的迹求导数
令a=tr(X),X是一个方阵
∂X∂a=⎣⎢⎢⎢⎢⎢⎢⎡∂X11∂a∂X21∂a...∂X(n−1)1∂a∂Xn1∂a∂X12∂a∂X22∂a...∂X(n−1)2∂a∂Xn2∂a...............∂X1(n−1)∂a∂X2(n−1)∂a...∂X(n−1)(n−1)∂a∂Xn(n−1)∂a∂X1n∂a∂X2n∂a...∂X(n−1)n∂a∂Xnn∂a⎦⎥⎥⎥⎥⎥⎥⎤
其中
∂Xij∂a=∂Xij∂tr(X)=∂Xij∂Xii=δij
所以
∂X∂tr(X)=In
有趣的是,tr(X)=In:X,所以对二点积求导感觉就像和对常数乘以变量的求导形式差不多。我们可以探究一下是不是真的有类似的性质。考虑
a=tr(XY)=X:Y
∂X∂a=⎣⎢⎢⎢⎢⎢⎢⎡∂X11∂a∂X21∂a...∂X(n−1)1∂a∂Xn1∂a∂X12∂a∂X22∂a...∂X(n−1)2∂a∂Xn2∂a...............∂X1(n−1)∂a∂X2(n−1)∂a...∂X(n−1)(n−1)∂a∂Xn(n−1)∂a∂X1n∂a∂X2n∂a...∂X(n−1)n∂a∂Xnn∂a⎦⎥⎥⎥⎥⎥⎥⎤
其中
∂Xij∂a=∂Xij∂tr(XY)=∂Xij∂Xi.Y.i=Yji+Xi.∂Xij∂Y.i
如果Y是常量,
∂X∂tr(XY)=YT
类似的
∂Y∂tr(XY)=XT
对矩阵的行列式求导数
之前已经推导了
∂Aij∂∣A∣=Mij=(A∗)ji
所以
∂A∂∣A∣=(A∗)T
对矩阵的二元运算求导
对矩阵的乘法求导
假设A是一个常量
∂B∂AB=∂B∂⎣⎢⎢⎢⎢⎡A1.B.1A2.B.1...A(m−1).B.1Am.B.1A1.B.2A2.B.2...A(m−1).B.2Am.B.2...............A1.B.(m−1)A2.B.(m−1)...A(m−1).B.(m−1)Am.B.(m−1)A1.B.mA2.B.m...A(m−1).B.mAm.B.m⎦⎥⎥⎥⎥⎤
定义l为元素全为1的列向量,J为元素全是1的矩阵,其中
∂B∂Ai.B.j=Ai.∂B∂B.j=ej⊗Ai.
所以
∂B∂AB=vec(In)T⊗vec(AT)
假设B是一个常量
∂A∂AB=∂A∂⎣⎢⎢⎢⎢⎡A1.B.1A2.B.1...A(m−1).B.1Am.B.1A1.B.2A2.B.2...A(m−1).B.2Am.B.2...............A1.B.(m−1)A2.B.(m−1)...A(m−1).B.(m−1)Am.B.(m−1)A1.B.mA2.B.m...A(m−1).B.mAm.B.m⎦⎥⎥⎥⎥⎤
其中
∂A∂Ai.B.j=Ai.∂B∂B.j=ei⊗B.j
所以
∂B∂AB=vec(In)T⊗vec(B)
对矩阵的Hadamard乘积求导
∂B∂A∘B=∂B∂⎣⎢⎢⎢⎢⎡A11B11A21B21...A(n−1)1B(n−1)1An1Bn1A12B12A22B22...A(n−1)2B(n−1)2An2Bn2...............A1(m−1)B1(m−1)A2(m−1)B2(m−1)...A(n−1)(m−1)B(n−1)(m−1)An(m−1)Bn(m−1)A1mB1mA2mB2m...A(n−1)mB(n−1)mAnmBnm⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡A11E11A21E21...A(n−1)1E(n−1)1An1En1A12E12A22E22...A(n−1)2E(n−1)2An2En2...............A1(m−1)E1(m−1)A2(m−1)E2(m−1)...A(n−1)(m−1)E(n−1)(m−1)An(m−1)En(m−1)A1mE1mA2mE2m...A(n−1)mE(n−1)mAnmEnm⎦⎥⎥⎥⎥⎤
所以
∂B∂A∘B=(A⊗J)∘E
对矩阵的张量积求导
∂B∂A⊗B=∂B∂⎣⎢⎢⎢⎢⎡A11BA21B...A(n−1)1BAn1BA12BA22B...A(n−1)2BAn2B...............A1(m−1)BA2(m−1)B...A(n−1)(m−1)BAn(m−1)BA1mBA2mB...A(n−1)mBAnmB⎦⎥⎥⎥⎥⎤=A⊗E
∂A∂A⊗B=∂A∂⎣⎢⎢⎢⎢⎡A11BA21B...A(n−1)1BAn1BA12BA22B...A(n−1)2BAn2B...............A1(m−1)BA2(m−1)B...A(n−1)(m−1)BAn(m−1)BA1mBA2mB...A(n−1)mBAnmB⎦⎥⎥⎥⎥⎤=E⊗B