公众号关注 “ML_NLP
设为 “星标”,重磅干货,第一时间送达!
作者丨科技猛兽@知乎
来源丨https://zhuanlan.zhihu.com/p/262751195
编辑丨极市平台
矩阵求导是一类贯穿机器学习,微分方程,概率统计,控制论,凸优化等诸多数学学科的极其重要的操作,遗憾的是,在许多工科专业大学阶段的课本中鲜有系统讲解这部分知识的章节,而许多论文默认读者已经具备了矩阵求导的能力,所以我们值得花时间好好讨论一下如何进行矩阵求导。本文的目的就是系统地梳理一遍矩阵求导的方法,在写作期间很多思路来自于许多很有意义的文章,不胜感激,在此一一列举出作者:
长躯鬼侠:矩阵求导术(上)

https://zhuanlan.zhihu.com/p/24709748
刘建平Pinard - 博客园

https://www.cnblogs.com/pinard/

目录

1 求导定义与布局方式
1.1 矩阵求导术
1.2 分子布局和分母布局
2 标量对矩阵的求导术的基本思想
2.1 定义法
2.2 微分法
2.3 迹函数对向量或矩阵的求导
3 标量对矩阵的求导术的链式法则
3.1 向量对向量求导的链式法则
3.2 标量对多个向量的链式求导法则
3.3 标量对多个矩阵的链式求导法则
4 矩阵对矩阵的求导术

本文符号定义

:标量

或者 
:n维向量

: 
维的矩阵

:标量

或者 
:m维向量

: 
维的矩阵

1 求导定义与布局方式

1.1 矩阵求导术
在高等数学里面,我们已经学过了标量对标量的求导,比如标量 对标量 的求导,可以表示为 。也学过一个m维向量 对标量 的求导,结果也是个m维向量 。这个m维向量的每一维就是向量 的每一维分别对标量 的导数。
所以我们推测:不论是向量也好,矩阵也好,对向量求导也好,对矩阵求导也好,结果都可以转化成标量之间的求导,最后把结果按照一定的方式拼接起来,以向量或者矩阵的形式表达出来而已。
根据求导的自变量和因变量是标量,向量还是矩阵,我们有9种可能的矩阵求导定义,如下:
其中前2种标量对标量的求导以及向量对标量的求导高数中已经介绍,我们着重讨论剩下的7种情况。
1.2 分子布局和分母布局
依旧使用一个m维向量 对标量 的求导,结果也是个m维向量 来举例,我们很确定 是一个m维向量,可问题是:它究竟应该表示成行向量,还是表示成列向量呢?
答案是:都可以。求导的本质是把导数信息,即求导的结果排列起来,至于是按行排列还是按列排列都是可以的。但是这样也有问题,在我们机器学习算法法优化过程中,如果行向量或者列向量随便写,那么结果就不唯一,所以为了解决这个问题,我们引入求导布局的概念。
  • 分子布局:导数的维度以分子为主。
  • 分母布局:导数的维度以分母为主。
向量对标量求导(表第2项):
比如上面的 (单独提到 或者 均按照列向量讨论),如果按照分子布局,结果就会是m维列向量,与分子维度一致。如果按照分母布局,结果就会是m维行向量。
标量对向量求导(表第4项):
比如 ,注意这次自变量是列向量,因变量是标量了。如果按照分子布局,结果就会是m维行向量。如果按照分母布局,结果就会是m维列向量,与分母维度一致。
标量对矩阵求导(表第7项):
比如,标量 对矩阵 求导,那么如果按分母布局,则求导结果的维度和矩阵 的维度 是一致的。如果是分子布局,则求导结果的维度为 。
矩阵对标量求导(表第3项):
比如,矩阵 对标量 求导,那么如果按分子布局,则求导结果的维度和矩阵 的维度 是一致的。如果是分母布局,则求导结果的维度为 。
向量对向量求导(表第5项):
比如, 维的向量 对 维的向量 求导,一共有 个标量对标量的求导。求导的结果一般是排列为一个矩阵。那么如果按分子布局,则结果矩阵的第一个维度以分子为准,即结果是个 维的矩阵:
如果按分母布局,则结果矩阵的第一个维度以分子为准,即结果是个 维的矩阵:
结论:分子布局和分母布局的结果相差一个转置。
在机器学习的算法推导里,通常遵循以下布局的规范:
  • 如果向量或者矩阵对标量求导,则以分子布局为准。
  • 如果标量对向量或者矩阵求导,则以分母布局为准。
  • 对于向量对对向量求导,有些分歧,一般以分子布局的雅克比矩阵为主。
总结如下:

2 标量对矩阵的求导术的基本思想

2.1 定义法
在进行标量对矩阵的求导时我们默认按照分母布局,即求导的结果与矩阵的维度一致。比如 ,其中 是标量, 是m维向量, 是n维向量, 是 维的矩阵。
如果求 ,则结果是也应当是 维的矩阵。这个矩阵里面的每一个元素应该是标量 对 里面的每个元素 的导数。因为结果是分母布局,所以:
所以最后的结果应该长成这个样子:
是 维的矩阵。
当然,上面的做法相当于是硬生生把标量对矩阵的求导拆成了一堆标量对标量的求导,再把这些结果按照分母布局给组合了起来。这种方法可以称为定义法,但是它只适用于表达式不复杂,你能展开的情况。就像上面的
但如果表达式很复杂,你没法展开成分量的形式,那就没法转化成标量对标量的求导,这种方法就不再适用了。定义法所遵循的逐元素求导破坏了整体性。求导时不宜拆开矩阵,而是要找一个从整体出发的算法。即下面的微分法。
2.2 微分法
  • 在高等数学的一元微积分中,导数(标量对标量的导数)与微分有联系:
  • 在多元微积分中,梯度(标量对向量的导数)也与微分有联系:
这里第一个等号是全微分公式,第二个等号表达了梯度与微分的联系。
全微分是梯度向量与微分向量的内积;受此启发,我们将矩阵导数与微分建立联系。在这之前要先了解一个关于矩阵迹的性质:
对尺寸相同的矩阵 ,,即是矩阵A,B的内积
  • 把多元微积分中的梯度与微分之间的联系扩展到矩阵,则有:
其中tr代表迹(trace)是方阵对角线元素之和,最后一步的变换是根据上面的矩阵迹的性质。
全微分是导数与微分矩阵的内积。
从上面矩阵微分的式子,我们可以看到矩阵微分和它的导数也有一个转置的关系,不过在外面套了一个迹函数而已。由于标量的迹函数就是它本身,那么矩阵微分和向量微分可以统一表示,即:
得到这2个式子的作用是什么?
答:这2个式子里面的 和 ,正是我们要求的标量对矩阵/向量的导数
换句话说,假定题目给任意一个函数 (就比如说),求它对于里面的某个矩阵 的导数。
我们只需要先想方设法搞出来 ,那么再套上迹 ,则 就可以得到了。
这就是微分法求对矩阵导数的基本思想,算法如下:

1. 根据给定的 寻找 。
2. 给 套上迹 。等号左边因为 是个标量,所以不受影响,等号右边根据迹的技巧进行化简。
3. 等号右边化简之后先找到 ,根据导数与微分的联系得到 。
根据上述Algorithms,理论上对于任何求对矩阵导数的问题可以三步搞定。
但只有基本思想还远远不够,因为要搞出来 ,你还需要掌握一些矩阵微分的操作,如下面常用的矩阵微分运算法则所示,这些法则更详细的解读可以参考张贤达教授的《矩阵分析与应用》
  • 常用的矩阵微分运算法则:
  1. 加减法:
  2. 矩阵乘法:
  3. 转置:
  4. 迹:。
  5. 逐元素乘法:,表示尺寸相同的矩阵 逐元素相乘。
  6. 逆:。此式可在两侧求微分来证明。
  7. 行列式:,其中表示X的伴随矩阵,在 可逆时又可以写作。
  8. 逐元素函数:,是逐元素标量函数运算, 是逐元素求导数。
例如:
除此之外,微分法求对矩阵导数的基本思想的很重要的一步是给 套上迹 ,所以,矩阵的迹技巧(trace trick)也非常重要,下面列举一些:
  • 迹技巧(trace trick):
标量的迹等于自己:。
转置:。
线性:。
交换律:,其中与尺寸相同。两侧都等于 。
矩阵乘法/逐元素乘法交换:,其中尺寸相同。两侧都等于。
以上就是微分法求对矩阵导数的方法,在实际操作时万不可随意套用微积分中标量导数的结论,比如认为对 的导数为 ,这是没有根据的。
下面举2个很经典的例子:
例1:,求。其中是列向量,是矩阵,是列向量,是标量。
解:根据上面的Algorithms:
1. 先使用矩阵乘法法则求微分 :
这里的是常量,,故有:
2. 给 套上迹 :
3. 使用迹技巧做矩阵乘法交换。根据有:
根据导数与微分的联系
有:
与一开始所用的定义法结果吻合。
例2:,求。其中是列向量,是矩阵,是列向量,exp表示逐元素求指数,是标量。
解:根据上面的Algorithms:
1. 先使用矩阵乘法法则求微分
2. 给套上迹
3. 使用迹技巧做矩阵乘法交换:
根据有:
根据导数与微分的联系有:
例3:, 求的最小二乘估计,即求的零点。其中是列向量,是矩阵,是列向量,是标量。
解:依然是求标量对向量的导数。首先解决这个向量模的平方的问题:
根据上面的Algorithms:
1. 先使用矩阵乘法法则求微分
2. 给套上迹
根据导数与微分的联系有:
令,有:
,得到的最小二乘估计为。
例4:样本,求方差的最大似然估计。写成数学式是:,求的零点。其中是列向量,是样本均值,是对称正定矩阵,是标量,log表示自然对数。
解:本题可以转化成求的问题。
根据上面的Algorithms:
1. 先使用矩阵乘法法则求微分
但是要求出 需要用到之前讲解的几个关于矩阵微分的性质:
逆:

行列式:
,其中
表示X的伴随矩阵,在 
可逆时又可以写作
第1项:
第2项:
2. 再给第二项套上迹 :
其中定义为样本方差矩阵。
综上,。
根据导数与微分的联系有:
,其零点即的最大似然估计为。
例5:,求。其中是除一个元素为1外其它元素为0的列向量,是矩阵,是列向量,是标量;log表示自然对数,,其中表示逐元素求指数,代表全1向量。
解:首先把 展开,注意逐元素log满足等式,以及满足。得到:
根据上面的Algorithms:
1. 先使用矩阵乘法法则求微分
根据迹技巧:
矩阵乘法/逐元素乘法交换:,其中尺寸相同。两侧都等于。
所以:
2. 给套上迹
根据导数与微分的联系有:
2.3 迹函数对向量或矩阵的求导
迹函数对对向量矩阵求导这一大类问题,其实更简单,因为它省去了Algorithms中的第1,2步,相当于已经帮你套上了 。
例6:求 对于矩阵 的导数。
解:直接假设 ,按照Algorithms一步一步来:
1. 先使用矩阵乘法法则求微分
矩阵 相当于常数,故有:
根据导数与微分的联系有:
例7:求 对于矩阵 的导数。
解:直接假设 ,按照Algorithms一步一步来:
1. 先使用矩阵乘法法则求微分
我们一项一项化简:
第1项 里面有个烦人的 ,想办法把它化简掉,根据迹的转置不变性交换律有:
第2项 
所以:
根据导数与微分的联系有:

3 标量对矩阵的求导术的链式法则

本节我们讨论矩阵向量求导链式法则,使用该法则很多时候可以帮我们快速求出导数结果。
标量对向量的求导,标量对矩阵的求导使用分母布局, 向量对向量的求导使用分子布局。
有的时候并不需要使用链式法则,比如下面的例子:
例8:,求。其中是矩阵,是矩阵,是矩阵,是对称矩阵,是逐元素函数,是标量。
解:我们可以先求出,再使用一些手段来得到 。
根据上面的Algorithms:
1. 先使用矩阵乘法法则求微分
根据导数与微分的联系有:
为求,写出
而 ,故有:
根据导数与微分的联系有:
但是很多时候,求导的自变量和因变量直接有复杂的多层链式求导的关系,此时微分法使用起来也有些麻烦。需要一些简洁的方法。
3.1 向量对向量求导的链式法则
假设多个向量存在依赖关系,比如三个向量 
存在依赖关系,则我们有下面的链式求导法则:
从维度的角度我们也可以验证上述做法的合理性:等号左侧是一个 维的矩阵。
等号右侧是一个 维的矩阵和一个 维的矩阵的积,所以维度是相容的。
但是要注意的是要求所有有依赖关系的变量都是向量,如果有一个 是矩阵,比如是 , 则上式并不成立。
3.2标量对多个向量的链式求导法则
在机器学习算法中,最终要优化的一般是一个标量损失函数,因此最后求导的目标是标量,无法使用上一节的链式求导法则,比如2个向量 和1个标量 有依赖关系: ,此时很容易发现维度不相容。
但可以确定的是:
服从分母布局,是个 维的向量。
服从分母布局,是个 维的向量。
服从分子布局,是个 维的矩阵。
我们发现,按照我们定义的布局方式(忘了请再看一遍第1节),变成了:
上述原则可以推广到依赖关系链更加复杂的情况,比如我们有依赖关系:
变成了:
注意,这个链式法则只适用于依赖关系为: 的情形,对于例8的情况并不适用。
例9:, 求的最小二乘估计,即求的零点。其中是列向量,是矩阵,是列向量,是标量。
解:这道题我们再用链式法则做一遍:
依然是求标量对向量的导数。首先解决这个向量模的平方的问题:
令 ,则 
根据 :
这里需要注意 ,因为这属于向量对向量求导,遵循分子布局,结果应是一个矩阵。
3.3 标量对多个矩阵的链式求导法则
标量对多个矩阵的链式求导法则,假设有这样的依赖关系: ,那么我们有:
矩阵对矩阵的求导是比较复杂的定义,留到下一节专门讨论。所以这里暂时只给出了对矩阵中一个标量的链式求导方法,即如何求解 。而没有给出如何求整体 。
而对于 的求解,对于一些线性关系的链式求导,我们还是可以得到一些有用的结论的,比如下面这个例子:
例10:,其中 都是矩阵, 是标量。我们要求出 ,这个问题在机器学习中是很常见的。此时,我们并不能直接整体使用矩阵的链式求导法则,因为矩阵对矩阵的求导结果不好处理。
解:不使用 ,而使用定义法求解,定义法要求我们逐个求出 ,再按照一定的顺序把它们排列组合起来。
这里请注意这个 , ,所以:
这里 。
故有:
所以:
同理,若 ,则:
可以使用维度来检验相容性。

4 矩阵对矩阵的求导术

前面我们研究的内容可以用下表来概括:
本节要研究的是矩阵对矩阵的求导,即表中的空白部分。
之前我们定义了向量对向量的导数,如果让它遵循分母布局,则它是 维的矩阵。
那矩阵 对矩阵 的导数应该如何定义?
首先根据定义法的思想,应包含所有 个偏导数,我们首先对这2个矩阵 和 向量化:
此时,你手里的2个矩阵变成了2个向量: :维度 ;:维度 
接下来我们就可以按照之前的做法,求向量对向量的导数了。
这样,矩阵对矩阵的导数就转化为了向量对向量的导数:
,维度是 ,遵循分母布局。
按此定义,的定义会产生歧义,假设矩阵 :
  • 如果按照标量对矩阵求导的原则,结果的维度应该是 。
  • 如果按照矩阵对矩阵求导的原则,结果的维度应该是 。
为避免混淆,用记号表示上篇定义的 矩阵,则有。
再次强调本节使用的是分母布局,机器学习和优化中的梯度矩阵采用此定义。而控制论等领域中的 矩阵采用分子布局,向量(维度 )对向量 (维度 )的导数定义是,对应的导数与微分的联系是。
同样通过向量化定义矩阵 对矩阵 的导数,有。两种布局下的导数互为转置。
  • 分子布局 的维度是 ,导数与微分的联系:
  • 分母布局 的维度是 ,导数与微分的联系:
标量对矩阵的二阶导数,又称Hessian矩阵,定义为,维度是 ,是对称矩阵。
微分法求矩阵对矩阵导数的基本思想,算法如下:

1. 根据给定的 寻找 。
2. 将 向量化为 ,使用矩阵等价变形和向量化的技巧化简。
3. 等号右边化简之后先找到 ,根据分母布局导数与微分的联系得到 。
根据上述Algorithms,理论上对于任何求矩阵对矩阵导数的问题可以三步搞定。
但只有基本思想还远远不够,因为要化简 ,你还需要掌握一些矩阵等价变形的技巧和一些向量化的技巧,如下面向量化的技巧所示,这些法则更详细的解读可以参考张贤达教授的《矩阵分析与应用》
  • 向量化的技巧:
  1. 线性:。
2. 矩阵乘法:,其中表示 积, 与 的Kronecker积是。
举个例子:
3. 转置:,A是m×n矩阵,其中(mn×mn)是交换矩阵(commutation matrix),将按列优先的向量化变为按行优先的向量化。例如。
4. 逐元素乘法:,其中(mn×mn)是用A的元素(按列优先)排成的对角阵。
矩阵的 积的性质是重要的矩阵等价变形的技巧,下面简单列举一些 积的性质:
1 假设 :
  • 当且仅当 或 。
证明:
对求导:
直接求导得到。
令,有,用链式法则得到。得证。
  • ,A是 矩阵,B是 矩阵。
证明:
对做向量化:
。得证。
2 假设 :
  • 若 对称,则 对称。
  • 若 可逆,则 可逆,且有 。
  • 若 , 是对应的特征向量; , 是对应的特征向量,则 , 是对应的特征向量。
可以对做向量化来证明,一方面,;另一方面,
从导数与微分的联系入手,,可以推出链式法则。
例11:, 是 维的矩阵,求。
解:根据上面的Algorithms:
1. 先根据给定的 寻找 。
2. 将 向量化为 ,使用矩阵等价变形和向量化的技巧化简。
3. 根据导数与微分的联系有:
例12:, 是 矩阵,求和。
解:首先求 。
,所以 。
此时相当于是: ,求 。
根据上面的Algorithms:
1. 先根据给定的寻找
2. 将向量化为,使用矩阵等价变形和向量化的技巧化简。
3. 根据导数与微分的联系有:
结果是对称矩阵。在是对称矩阵时,可简化为。
例13:, 是 矩阵, 是 矩阵, 是 矩阵, 为逐元素函数,求。
解:根据上面的Algorithms:
1. 先根据给定的寻找
2. 将向量化为,使用矩阵等价变形和向量化的技巧化简:
3. 根据导数与微分的联系有:
例14:,求和。其中是取值0或1的标量,是列向量。
解:
首先要分清楚要求的东西是什么对什么的导数: 是个标量对向量的导数,遵循分母布局。
所以:。
是个向量对向量的导数,遵循分母布局。
先求微分:
其中,为sigmoid函数的导数。
根据向量对向量的导数与微分的联系是:有:
例15:
样本,,求和。
解:
首先要分清楚要求的东西是什么对什么的导数: 是个标量对向量的导数,遵循分母布局。
定义矩阵,向量,将写成矩阵形式:
首先求 的微分:
这里没法直接求 ,因为 里面的东西是向量,没法直接求导,所以我们根据定义法,把向量的每一项分别求导,再组合起来,得到:
所以:
再求 :属于向量对向量求导。
根据上面的Algorithms:
1. 先根据给定的寻找
根据向量对向量的导数与微分的联系是:有:
例16:,求和。其中其中是除一个元素为1外其它元素为0的列向量,是矩阵,是列向量,是标量。
解:例5中已经求得了:
再求 的过程就相当于是矩阵对矩阵的求导。
根据上面的Algorithms:
1. 先根据给定的寻找
定义
,有:
定义矩阵
,是个对称矩阵,则:
2. 将向量化为,使用矩阵等价变形和向量化的技巧化简:
3. 根据导数与微分的联系有:

总结

标量对矩阵/向量的导数与微分的联系是:。

1. 根据给定的 
寻找 

2. 给 
套上迹 
。等号左边因为 
是个标量,所以不受影响,等号右边根据迹的技巧进行化简。

3. 等号右边化简之后先找到 

根据导数与微分的联系
得到 
向量对向量的导数与微分的联系是:。
矩阵对矩阵的导数与微分的联系是:。

1. 根据给定的寻找
2. 将向量化为,使用矩阵等价变形和向量化的技巧化简。
3. 等号右边化简之后先找到,根据分母布局导数与微分的联系得到
下载1:四件套
在机器学习算法与自然语言处理公众号后台回复“四件套”
即可获取学习TensorFlow,Pytorch,机器学习,深度学习四件套!

下载2:仓库地址共享
在机器学习算法与自然语言处理公众号后台回复“代码”
即可获取195篇NAACL+295篇ACL2019有代码开源的论文。开源地址如下:https://github.com/yizhen20133868/NLP-Conferences-Code
重磅!机器学习算法与自然语言处理交流群已正式成立
群内有大量资源,欢迎大家进群学习!
额外赠送福利资源!邱锡鹏深度学习与神经网络,pytorch官方中文教程,利用Python进行数据分析,机器学习学习笔记,pandas官方文档中文版,effective java(中文版)等20项福利资源
获取方式:进入群后点开群公告即可领取下载链接
注意:请大家添加时修改备注为 [学校/公司 + 姓名 + 方向]
例如 —— 哈工大+张三+对话系统。
号主,微商请自觉绕道。谢谢!
继续阅读
阅读原文