矩阵微积分会涉及到对矩阵函数操作的规则。例如,假设将一个m×n 的矩阵 X 映射到一个p×q 的矩阵 Y 中。而我们期望获得的导数表达式如下:
对于所有的 i,j 和k,l 来说,这里主要的困难在于如何将对矩阵内的元素对应的求导,我们在矩阵计算(1)中最后有关矩阵对矩阵的求导,可是如果矩阵过大,那就非人力可以为之了,所以,为了更好的计算,就需要将矩阵的求导上升到一个较高的抽象的层面。
在矩阵微积分中,最常用的就是vec操作和Kronecker乘积:vec操作就是会将一个矩阵按照它的列进行向量化(因为习惯上使用列为主,而不是行为主)。例如:向量化下面的矩阵:
得到的vec操作结果为:
而两个矩阵的Kronecker乘积为:矩阵A,B,这里A是m×n大小的,而B是p×q大小的,那么定义的乘积为:
也就是得到的结果为mp×nq大小的矩阵。而在vec操作和Kronecker乘积之间有个很重要的关系就是:
在求导矩阵微积分结果中,该式子发挥着举足轻重的作用。(个人:按照矩阵乘法规则,这里的X 应该是个n×p 的矩阵)
另一个需要用到的矩阵操作和vec操作的联系很紧密,定义为将
转换成
的矩阵:
这里矩阵的大小为mn×mn。
具有一些特别的属性,首先是它的定义:如果
应用在了一个m×n矩阵的vec操作的结果上,然后在上面再加一个
应用,那么原始向量化的矩阵的结果为:
所以:
也就是说:
这是很直观的结果,不过也可以理解成:
也就是说其实这里是一个正交矩阵。
矩阵操作其实是一个置换矩阵(permutation matrix),即它是由0 和1 组成的,在每一行每一列只有一个1。当左乘另一个矩阵的时候,它会将那个矩阵的行进行重排序(或者
和其右乘来重排矩阵的列)。
该转置矩阵同样与Kronecker乘积相关联,假设矩阵A,B 如上面一样的定义:
这可以通过引入一个任意n×q矩阵 C来验证:
这里暗示着。因为C 是一个任意矩阵,所以必须要适应任意的情况。
通过上面的结论,立即得到下面的结果::
这里有个技巧,可以发现:。所以如果A 是一个1×n 的矩阵,那么
。当涉及到标量的导数的时候,该结果可以进一步简化。
现在说回正题,定义一个函数导数的映射作为一个m×n 矩阵的偏导:
例如,最简单的导数为:
使用这个定义,当遵守矩阵的一致性原则的时候,通常针对导数的规则也是适用的。得到下面这个加法规则:
这里和
都是标量。当满足一致性原则的时候,链式规则也适用于矩阵乘法。给定两个函数:
和
,该复合函数的导数为:
这里满足矩阵乘法一致性,因而表达式表示为一个n×p的矩阵右乘一个m×n的矩阵(原句:postmultipy an n × p matrix by an
m×n matrix)。为了定义一个乘积规则,考虑表达式,这里
。导数通过下面的式子得到的结果为一个1×n的向量:
注意除了乘以
和
乘以
之外,没有其他方式可以确保一致性(个人:不懂这句的话,那就忽略它)。一个更通用的乘积规则定义如下。
该乘积规则对于二次函数来说会很有用的:
当A是对称矩阵的时候,可以得到结果为:。
上面这些规则是定义向量的导数的,定义矩阵关于矩阵的导数是通过将矩阵向量化来完成的。所以也就等于
。所以这里就需要用到vec操作和Kronecker乘积了。考虑
关于A(而不是上面关于x 的)的微分:
(一个m×n的矩阵A 关于自身的导数结果为)。
接下来可以定义一个更通用的乘法规则。假设和
,那么
。使用vec操作和Kronecker乘积的关系得到下面的式子:
从而写成更通用的形式:
当A为m×n 的矩阵的时候,的导数为:
所以,结果为:
接着,可以进一步简化,注意到:
结果为;
该乘法规则同样可以用于矩阵逆的求导:
因为的结果等于
,所以它的导数等于0,因此:
对于一个行列式的导数来说,也能找到个合适的表达式。假设A 是一个n*n 的矩阵,其中。该行列式可以写成A矩阵的伴随矩阵,
,的第 i 行乘以A 的第i 列的形式:
因为的第 i 行的元素不会受到A 的第i 列的影响,所以可以得到:
为了得到关于A的所有元素的导数,可以将关于A的每一列的偏导数连接起来:
下面得到的就是一个直接结果(个人:这里用到了高数的求导法则,有兴趣可以回去看看对lnx 的求导):
矩阵分化的结果可以使我们能够计算某一类平衡问题的解的导数。例如,假设x 为一个线性互补问题(a linear complementarity problem,)的解:
x 的第 i 个元素既可以等于0,又可以等于的第 i 个元素。定义一个对角矩阵D ,使得:
接着,该解可以写成,这里
。从而:
而且:
在矩阵求导中,Kronecker乘积使用是十分广泛的,所以如何计算Kronecker乘积自身的导数也是个不容跨过的问题,即:和
。因为Kronecker乘积的每个元素都涉及到A矩阵中的一个元素乘以B矩阵中另一个元素,所以
的导数必须是由0和以某种方式重排序的B 的元素组成的。相似的,导数
也是由0和以某种方式重排序的A 的元素组成的。
可以写成如下形式:
这里:
写成更紧凑的形式为:
相似的,可以写成如下形式:
这里:
写成更紧凑的形式为:
注意到,如果A是一个行向量(m=1)或者说B 是一个列向量(q=1),那么,所以可以忽略掉。
为了说明这些关系的用处,考虑关于x (一个n 维向量)的二阶导数:
所以:
另一个例子是:
通常来说,特别是在统计应用中,遇到的矩阵都是对称的。所以,当想要求关于一个对称矩阵的第 (i,j )个元素的导数,而刚好第(j,i)个导数是常量的时候是没有意义的。通常来说,我们更喜欢先将对称矩阵的对角线上部或者下部删除(个人:因为对称的话一半是重复的),然后对其进行向量化,最后再对其进行处理。vech操作通常是删除上部,然后逐列进行向量化的:
或者可以表示成通过对元素的选择的形式,所以可以写成:
这里是一个
矩阵,其中都是0和1,在每一行中只有一个1。vech操作同样可以用在下三角矩阵;不需要去求关于下三角矩阵的上部的导数(因为可以通过一个上三角矩阵的转置来完成)(个人:这句话有点不理解,略过不影响全文理解)。vech操作在对称和三角矩阵的计算机存储方面也是很重要的。
为了说明在矩阵微积分应用中的vech操作,考虑一个n*n的对称矩阵C ,然后定义成下三角形式,L:
使用之前类似的方法,可以得到:
使用链式规则:
反转这个表达式就能得到。
和矩阵求导相关的问题就是矩阵映射到矩阵的函数的泰勒展开的问题。一种考虑矩阵求导的方式是使用多维数组的形式。一个nm*pq矩阵可以同样被认为是一个m*n*p*q 的4维数组。在MATLAB中的“reshape”函数就是执行这样的转换的。其中各个元素的顺序并没有变,只是元素的索引方式变了。
关于函数在
上的第d 阶的泰勒展开式可以以下面的形式计算得到:
到目前为止介绍的技术可以用来计算普通的”特殊“函数的导数。首先,考虑一个方阵A 的非负整数幂。使用链式规则来进行递归求导:
这里同样可以表示成 i 项的和:
该结果可以用来计算矩阵指数函数的导数,将其表示成泰勒展开式的形式:
所以:
同样,可以用来计算矩阵的自然对数:
几个操作的总结:
假设A 是m*n的矩阵,B是p*q 的矩阵,X 以适当形式定义(原文:X is defined comformably。个人:就是主要关注的是A B ,X只是形式,怎么符合常规的矩阵计算,就怎么定义)
微分结果的总结:
假设A 是m*n的矩阵,B是p*q 的矩阵,x 是n*1 的向量,X 合适的定义:
参考资料:
[1] http://www.psi.toronto.edu/matrix/intro.html#Intro
[2] http://www.psi.toronto.edu/matrix/calculus.html
[3]http://www.stanford.edu/~dattorro/matrixcalc.pdf
[4] http://www.colorado.edu/engineering/CAS/courses.d/IFEM.d/IFEM.AppD.d/IFEM.AppD.pdf
[5] http://www4.ncsu.edu/~pfackler/MatCalc.pdf
[6] http://center.uvt.nl/staff/magnus/wip12.pdf
[7] 新浪博客http://blog.sina.com.cn/s/blog_61c0518f0100f6wu.html[8] 维基百科https://en.wikipedia.org/wiki/Matrix_calculus#Numerator-layout_notation