[Quant 1.5] 矩阵微积分Matrix Calculus基础 (2)
资源是MIT 2020年的一节网课,教授是Alan Edelman
https://www.youtube.com/watch?v=oGZK3yGF-6k
我在B站没找到搬运的资源,所以要看这个视频需要🪜
还有一个问答的链接,我下面也提到了
https://math.stackexchange.com/questions/3724359/does-there-exist-a-gradient-chain-rule-for-this-case
我没有把两个专栏放在一起是因为B站要求专栏图片不能超过100个。而公式还算图片,我写公式写的太多了,所以两部分分开发了。

3. Matrix到Scalar的函数梯度
假设有一个的矩阵A,这个矩阵A是一个变量
函数的梯度就是

举个例子,假设现在的变量是一个的矩阵A。函数
的梯度就是:

但是在现实生活中,我们很难遇到上面这种奇怪的的函数。从函数形式上我们也能看出来,我们只是想做一个求导练习,这种函数不会出现在什么物理或者金融的应用上。而在线性代数的应用方面,尤其是AI,最常见的把Matrix转化为Scalar的函数就是trace函数,也就是一个
矩阵对角线所有项的和。我这里先复习一下trace的基本性质:
- Lineartity:
- cyclic property:
- about trace of a product:
- equality with sum of the eigenvalues:

那么我们可能碰到的Matrix到Scalar的函数都可能长什么样呢,最简单的一个例子就是
这个例子很直接,想想就知道,因为trace定义就是把对角线的项加到一起。

然后是二次的例子
这个函数的梯度看起来不像上一个那么直接,貌似需要把矩阵写出来再相乘然后求偏导数。如果你觉得求梯度需要把矩阵的每一项设出来的时候,就可以试试AB公式!
现在问自己一个问题:。
毫无疑问这个等式是对的,两个矩阵先做差再取trace和先取trace再做差结果是一样的,因为trace本身是个线性函数。那么我们下面就可以在trace里面应用AB公式。
做到这里我们卡住了,因为我们无法从最后一行的trace函数中分离出,因此没法直接看出函数
的梯度。所以我们需要一个定理来夸过这一步。这个定理在后面关于trace的Matrix到Scalar函数的求梯度问题也经常用到。
是关于矩阵A的函数,如果有等式
,那么
这个证明我就先不在这写了,先功利的记下这个公式。所以上面的微分就可以写成,所以就有

第三个例子:
似曾相识的例子,只不过这个函数的变量是矩阵A。我们再次用一下AB公式
等式右边的两项都是Scalar,所以每一项的转置都等于它本身。我们把等号右边第一项取转置,发现这两项都是一样的
套用上面的定理,我们得到了

4. 矩阵微积分中的链式法则Chain rule
终于写到这第四个标题了😅,这个链式法则就是我当初要写个专栏的原因。RNN和DNN一样要做backward propogation,但是当变量含有向量或者矩阵的时候,我们需要求Loss在矩阵参数或者向量参数上的梯度。这一篇里面的数学就都能用上了。
我这里还是用了自己的习惯,那就是所有的向量变量都是列变量,所以所有梯度都是行变量。我知道这不是标准的,但我暂时不能理解要求梯度是列变量的好处在哪里,真的很麻烦。如果我以后知道了原因我会回来改的。。
我们先来关注Vector到Vector的复合函数求导:
求复合函数的梯度。梯度公式其实很简单,和微积分中学过的是很类似的。
一切都是对应的,因为是
,所以
。而
所以右边的两个gradient矩阵(也就是Jacobian)相乘起来和左边的矩阵维度是一样的。因为法则简单,我就不针对这个chain rule举例子了。但是有另一个例子需要思考一下。

其中是一个element-wise函数(例如sigmoid函数),它作用于自变量矩阵/向量的每一项。因为element-wise函数针对矩阵的操作有别与矩阵乘法这类线性操作,我们不能像之前一样用Jacobian相乘的方式来获得这个函数
的梯度。
一个笨拙的方式思考一下,向量变化
后使得
的自变量变化
,所以
输出的变化是
关于向量
的每一项的导数值再乘以
。这正对应着矩阵叉乘。所以可以得到
我们从这个公式是无法获得Jacobian的,由于全微分中有矩阵叉乘。我们知道矩阵点乘是有结合律的,但是叉乘和点乘不能结合。因此我们要把上面等式中的一些矩阵和向量设出来,看看有没有更好的表示方法来看出来Jacobian。
假设,我们设出矩阵
和向量
是一个
的向量,我们要研究它的第
项
因为累加的角标是
,所以我们可以把前面含
的
放到
里面去
考虑到所有的,等式右边相当于什么?相当于把矩阵
的每一行都乘以
的对应项,得到新的矩阵之后,再和
做矩阵乘法。这样我们就能把之前的叉乘转化为点乘,再通过结合律,就可以得到Jacobian了。
所以
验证一下,这个Jacobian确实是一个的矩阵,任务完成!
我这一篇写的很细,希望如果以后有人能用到这篇文章的话,即使基础相对薄弱也能看懂。令一点就是我隐约觉得这篇里面有些地方我自己的理解可能也会有问题,后续发现了会更新的。