论文信息
核心问题
这篇文章讨论的问题很集中:如何把向量导数(vector derivative)的概念推广到矩阵导数(matrix derivative)。
作者提出两种定义:
- 宽定义(broad definition)
- 窄定义(narrow definition)
然后比较这两种定义,并明确支持窄定义(narrow definition)。
简要总结
作者认为,矩阵导数不应该只是“把所有偏导数排成某个大矩阵”这么简单。更重要的是,这个导数对象要保留普通导数(derivative)原本的结构含义,也就是:
- 一行最好对应一个函数(function)
- 一列最好对应一个变量(variable)
如果只是把偏导数随意重排,那么虽然信息没有丢,但“导数是什么”这件事本身会变得模糊。因此作者认为,窄定义(narrow definition)比宽定义(broad definition)更合理,也更方便使用。
文章主旨
- 宽定义(broad definition):只要求把所有偏导数都收集起来,但不严格要求这些偏导数如何排列。
- 窄定义(narrow definition):要求排列方式保留导数结构,每一行对应某个函数对全部变量的偏导,每一列对应全部函数对某个变量的偏导。
- 作者观点:窄定义(narrow definition)更贴近 Jacobian 和 Hessian 的标准理解,因此更自然。
矩阵对矩阵求导的一般形式
假设我们存在矩阵 X∈Rp×q 和函数 A(X)∈Rm×n,在矩阵对矩阵求导(matrix-to-matrix derivative)里,采用窄定义(narrow definition)时,最自然的写法是
∂vec(X)T∂vec(A).
这样做的好处是:它本质上就是一个向量对向量求导(vector-to-vector derivative)的 Jacobian。
Remark. 分母写成 vec(X)T,表示我们把矩阵变量先转成行向量坐标,再按标准 Jacobian 的方式组织偏导数。
向量化(vec)公式
根据窄定义(narrow definition),矩阵求导需要先对矩阵做向量化,本文默认 vec 表示按列展开(column-wise stacking)。下面介绍两种矩阵向量化展开的一般结论:
- 若 A∈Rm×n,B∈Rn×p,则
vec(AB)=(Ip⊗A)vec(B)=(BT⊗Im)vec(A).
- 若 A∈Rm×n,B∈Rn×r,C∈Rr×p,则
vec(A(BC))=(Ip⊗A)vec(BC)=(Ip⊗A)(CT⊗In)vec(B)=(CT⊗A)vec(B).
Remark. 最后一步利用 Kronecker 积(Kronecker product)的乘法规则 (M⊗N)(P⊗Q)=(MP)⊗(NQ)。
乘积法则(product rule)
设 A=A(X)∈Rm×r,B=B(X)∈Rr×p,则
∂vec(X)T∂vec(AB)=(BT⊗Im)∂vec(X)T∂vec(A)+(Ip⊗A)∂vec(X)T∂vec(B).
一个简短推导如下。先从普通微分公式出发:
d(AB)=dA⋅B+A⋅dB.
对两边做向量化,得到
dvec(AB)=vec(dA⋅B)+vec(A⋅dB)=(BT⊗Im)dvec(A)+(Ip⊗A)dvec(B).
再写成
dvec(A)=∂vec(X)T∂vec(A)dvec(X),dvec(B)=∂vec(X)T∂vec(B)dvec(X),
代回上式,并比较 dvec(X) 前面的系数,就得到上面的结论。
链式法则(chain rule)
同样地,矩阵对矩阵的求导也满足链式法则。若 B=B(X),而 A=A(B),则
∂vec(X)T∂vec(A)=∂vec(B)T∂vec(A)∂vec(X)T∂vec(B).
例如当
B(X)=CXD,A(B)=EBF,
则
∂vec(X)T∂vec(B)=DT⊗C,∂vec(B)T∂vec(A)=FT⊗E,
因此
∂vec(X)T∂vec(A)=(FT⊗E)(DT⊗C).
Remark. 这和普通向量链式法则完全类似,只是把中间变量从向量换成了矩阵,并通过 vec 重新写成 Jacobian 乘法。
例子
下面给出两个我曾在论文证明中出现过的两个例子。统一设 F∈RK×K,b∈RK,ui,wj∈RK,并且 F 可逆。其中 F 和 b 是自变量。
1. θi(γ;Z)=NFTui
由向量化(vec)公式,我们有
θi=N(IK⊗uiT)vec(F),
因此
∂vec(F)T∂θi=N(IK⊗uiT),∂bT∂θi=0K×K.
Remark. 这里对 b 的导数为零,是因为原式中根本不含参数 b。
2. aj(γ;Z)=JF−1wj+b
方法一
同样地,根据向量化公式我们有
aj=J(wjT⊗IK)vec(F−1)+b.
接下来的关键是弄清楚
∂vec(F)T∂vec(F−1)
是怎么来的。注意到
F−1F=IK.
因此,
d(F−1)F+F−1d(F)=0.
我们有
d(F−1)=−F−1(dF)F−1
对两边做向量化(vectorization),得到
dvec(F−1)=−vec(F−1(dF)F−1)=−(F−T⊗F−1)dvec(F).
最后可以得到
∂vec(F)T∂vec(F−1)=−(F−T⊗F−1).
带入原式得到最终结果
∂vec(F)T∂aj=−J(wjT⊗IK)(F−T⊗F−1)=−J((F−1wj)T⊗F−1),
以及
∂bT∂aj=IK.
Permutation matrix 的例子
需要注意的是,以下两个求导结果是不同的:
∂vec(F)T∂vec(FT)=∂vec(F)T∂vec(F)=IK2.
原因在于我们对分子的矩阵做了转置,因此分子和分母的展开顺序已经不一致。此时左边的结果不再是单位矩阵,而是一个置换矩阵(permutation matrix)。置换矩阵最典型的用途,就是在分子和分母的展开顺序(stacking convention)不一致时,把它们重新对齐。
在这里,最常见的是交换矩阵(commutation matrix) KKK。若 F∈RK×K,则
vec(FT)=KKKvec(F),∂vec(F)T∂vec(FT)=KKK.
Remark. permutation matrix 的作用不是引入新信息,而是重排已有坐标。当分子和分母的 vec 顺序不一致时,可以先乘一个 KKK 把它们转到同一坐标系。此外,permutation matrix 对 Kronecker 积也有“换位”作用。若 A,B∈RK×K,则
KKK(A⊗B)=(B⊗A)KKK,
等价地,
KKK(A⊗B)KKK=B⊗A.
这说明交换矩阵可以把 Kronecker 积中的两个因子互换,但代价是要同时调整左右两侧的展开顺序。