欢迎光临散文网 会员登陆 & 注册

[Quant 1.5] 矩阵微积分Matrix Calculus基础 (2)

2022-07-28 08:47 作者:安平生一人好_  | 我要投稿

资源是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的函数梯度

假设有一个m%5Ctimes%20n的矩阵A,这个矩阵A是一个变量

A%20%3D%20%0A%5Cbegin%7Bpmatrix%7D%0AA_%7B11%7D%20%26%20%5Cldots%20%26%20A_%7B1n%7D%5C%5C%0A%5Cvdots%20%26%20%5Cddots%20%26%20%5Cvdots%5C%5C%0AA_%7Bm1%7D%20%26%20%5Cldots%20%26%20A_%7Bmn%7D%0A%5Cend%7Bpmatrix%7D

函数f%3A%20%5Cmathbb%7BR%7D%5E%7Bm%5Ctimes%20n%7D%20%5Crightarrow%20%5Cmathbb%7BR%7D的梯度就是

%5Cnabla_A%20f%20%3D%20%0A%5Cbegin%7Bpmatrix%7D%0A%5Cfrac%7B%5Cpartial%20f%7D%7B%5Cpartial%20A_%7B11%7D%7D%20%26%20%5Cldots%20%26%5Cfrac%7B%5Cpartial%20f%7D%7B%5Cpartial%20A_%7B1n%7D%7D%5C%5C%0A%5Cvdots%20%26%20%5Cddots%20%20%26%20%5Cvdots%20%5C%5C%0A%5Cfrac%7B%5Cpartial%20f%7D%7B%5Cpartial%20A_%7Bm1%7D%7D%20%26%20%5Cldots%20%26%20%5Cfrac%7B%5Cpartial%20f%7D%7B%5Cpartial%20A_%7Bmn%7D%7D%0A%5Cend%7Bpmatrix%7D



举个例子,假设现在的变量是一个2%5Ctimes%203的矩阵A。函数f%3A%20%5Cmathbb%7BR%7D%5E%7B2%5Ctimes3%7D%20%5Crightarrow%20%5Cmathbb%7BR%7D%20%5Cquad%20A%20%5Crightarrow%20A_%7B11%7D%5E2%20%2B2A_%7B13%7D%20-%20A_%7B23%7D%20%2B%201%20 的梯度就是:

%5Cnabla_A%20f%20%3D%20%0A%5Cbegin%7Bpmatrix%7D%0A2A_%7B11%7D%260%262%5C%5C%0A0%20%26%200%20%26%20-1%0A%5Cend%7Bpmatrix%7D



但是在现实生活中,我们很难遇到上面这种奇怪的%20%5Cmathbb%7BR%7D%5E%7Bm%5Ctimes%20n%7D%20%5Crightarrow%20%5Cmathbb%7BR%7D的函数。从函数形式上我们也能看出来,我们只是想做一个求导练习,这种函数不会出现在什么物理或者金融的应用上。而在线性代数的应用方面,尤其是AI,最常见的把Matrix转化为Scalar的函数就是trace函数,也就是一个%5Cmathbb%7BR%7D%5E%7Bn%20%5Ctimes%20n%7D矩阵对角线所有项的和。我这里先复习一下trace的基本性质:

Lineartitytr(aA%2BbB)%20%3D%20atr(A)%20%2B%20btr(B)

cyclic propertytr(ABC)%20%3D%20tr(CAB)%20%3D%20tr(BCA)

about trace of a producttr(A%5ETB)%3Dtr(B%5ETA)%20%3D%20%5Csum%5Climits_%7Bi%2Cj%7DA_%7Bij%7DB_%7Bij%7D

equality with sum of the eigenvaluestr(A)%20%3D%20%5Csum%5Climits%5En_i%20%5Clambda_i%20%5Cquad%20%5Clambda_i%20%5Ctext%7B's%20are%20eigenvalues%20of%20matrix%20A%20with%20multiplicity%7D


那么我们可能碰到的Matrix到Scalar的函数都可能长什么样呢,最简单的一个例子就是

f(A)%20%3D%20tr(A)

这个例子很直接,想想就知道%5Cnabla_A%20f%20%3D%20I,因为trace定义就是把对角线的项加到一起。


然后是二次的例子

f(A)%20%3D%20tr(A%5E2)

这个函数的梯度看起来不像上一个那么直接,貌似需要把矩阵写出来再相乘然后求偏导数。如果你觉得求梯度需要把矩阵的每一项设出来的时候,就可以试试AB公式!

df%20%3D%20dtr(A%5E2)

现在问自己一个问题:dtr(A%5E2)%5Cstackrel%7B%3F%7D%7B%3D%7Dtr(dA%5E2)%20%5C

毫无疑问这个等式是对的,两个矩阵先做差再取trace和先取trace再做差结果是一样的,因为trace本身是个线性函数。那么我们下面就可以在trace里面应用AB公式。

%5Cbegin%7Balign%7D%0Adf%20%26%3D%20dtr(A%5E2)%5C%5C%0A%26%3Dtr(dA%5E2)%5C%5C%0A%26%3D%20tr(dA%5Ccdot%20A%2BA%5Ccdot%20dA)%5C%5C%0A%26%3D%20tr(dA%5Ccdot%20A)%2Btr(A%5Ccdot%20dA)%5C%5C%0A%26%3D2tr(AdA)%20%5Cquad%20%5Ctext%7B(by%20cyclic%20property)%7D%0A%5Cend%7Balign%7D

做到这里我们卡住了,因为我们无法从最后一行的trace函数中分离出dA,因此没法直接看出函数f的梯度。所以我们需要一个定理来夸过这一步。这个定理在后面关于trace的Matrix到Scalar函数的求梯度问题也经常用到。

f是关于矩阵A的函数,如果有等式df%20%3D%20tr(M%5ETdA),那么%5Cnabla_A%20f%20%3D%20M%5ET

这个证明我就先不在这写了,先功利的记下这个公式。所以上面的微分就可以写成df%20%3D%20tr((2A%5ET)%5ETdA),所以就有

%5Cbegin%7Balign%7D%0A%5Cnabla_A%20f%20%26%3D%202A%5ET%0A%5Cend%7Balign%7D


第三个例子:

f(A)%20%3D%20(Ax-b)%5ET(Ax-b)

似曾相识的例子,只不过这个函数的变量是矩阵A。我们再次用一下AB公式

df%20%3D%20d(Ax-b)%5ET%20%5Ccdot%20(Ax-b)%20%2B%20(Ax-b)%5ET%20d(Ax-b)%20

等式右边的两项都是Scalar,所以每一项的转置都等于它本身。我们把等号右边第一项取转置,发现这两项都是一样的

%5Cbegin%7Balign%7D%0Adf%20%26%3D%202(Ax-b)%5ETd(Ax-b)%5C%5C%0A%26%3D%202(Ax-b)%5ET(dA)x%20%5Cquad%20(%E5%9B%A0%E4%B8%BA%E8%BF%99%E6%98%AF%E4%B8%AAscalar%EF%BC%8C%E6%89%80%E4%BB%A5%E5%AE%83%E7%9A%84trace%E7%AD%89%E4%BA%8E%E5%AE%83%E6%9C%AC%E8%BA%AB)%5C%5C%0A%26%3Dtr(2(Ax-b)%5ET(dA)x)%5C%5C%0A%26%3Dtr(2x(Ax-b)%5ET(dA))%20%5Cquad%20%5Ctext%7B(cyclic%20property)%7D%5C%5C%0A%26%3Dtr((2(Ax-b)x)%5ETdA)%0A%5Cend%7Balign%7D%0A

套用上面的定理,我们得到了

%5Cbegin%7Balign%7D%0A%5Cnabla_A%20f%20%26%3D%202(Ax-b)%5ETx%0A%5Cend%7Balign%7D%0A


4. 矩阵微积分中的链式法则Chain rule

终于写到这第四个标题了😅,这个链式法则就是我当初要写个专栏的原因。RNN和DNN一样要做backward propogation,但是当变量含有向量或者矩阵的时候,我们需要求Loss在矩阵参数或者向量参数上的梯度。这一篇里面的数学就都能用上了。


我这里还是用了自己的习惯,那就是所有的向量变量都是列变量,所以所有梯度都是行变量。我知道这不是标准的,但我暂时不能理解要求梯度是列变量的好处在哪里,真的很麻烦。如果我以后知道了原因我会回来改的。。


我们先来关注Vector到Vector的复合函数求导:

%5Cbegin%7Balign%7D%0Ag%26%3A%5Cmathbb%7BR%7D%5En%20%5Crightarrow%5Cmathbb%7BR%7D%5Em%5C%5C%0Af%26%3A%5Cmathbb%7BR%7D%5Em%20%5Crightarrow%5Cmathbb%7BR%7D%5Ep%5C%5C%0Ax%26%5Cin%20%5Cmathbb%7BR%7D%5En%0A%5Cend%7Balign%7D

求复合函数h(x)%20%3D%20f(g(x))%5Cquad%20%5Cmathbb%7BR%7D%5En%20%5Crightarrow%20%5Cmathbb%7BR%7D%5Ep的梯度。梯度公式其实很简单,和微积分中学过的是很类似的。

%5Cnabla_x%20h%20%3D%20%5Cnabla_%7Bg(x)%7Df%20%5Ccdot%20%5Cnabla_xg

一切都是对应的,因为h%5Cmathbb%7BR%7D%5En%20%5Crightarrow%20%5Cmathbb%7BR%7D%5Ep,所以%5Cnabla_x%20h%20%5Cin%20%5Cmathbb%7BR%7D%5E%7Bp%20%5Ctimes%20n%7D。而

%5Cbegin%7Balign%7D%0A%5Cnabla_%7Bg(x)%7Df%20%26%5Cin%20%5Cmathbb%7BR%7D%5E%7Bp%5Ctimes%20m%7D%5C%5C%0A%5Cnabla_xg%20%26%5Cin%20%5Cmathbb%7BR%7D%5E%7Bm%5Ctimes%20n%7D%0A%5Cend%7Balign%7D

所以右边的两个gradient矩阵(也就是Jacobian)相乘起来和左边的矩阵维度是一样的。因为法则简单,我就不针对这个chain rule举例子了。但是有另一个例子需要思考一下。


f(x)%20%3D%20h(Wx-b)

其中h是一个element-wise函数(例如sigmoid函数),它作用于自变量矩阵/向量的每一项。因为element-wise函数针对矩阵的操作有别与矩阵乘法这类线性操作,我们不能像之前一样用Jacobian相乘的方式来获得这个函数f的梯度。


一个笨拙的方式思考一下,向量x变化dx后使得h的自变量变化Wdx,所以h输出的变化是h(Wx-b)关于向量Wx-b的每一项的导数值再乘以Wdx。这正对应着矩阵叉乘。所以可以得到

df%20%3D%20h'.(W%5Cmathbf%7Bx%7D-b)%20%5Ctimes%20(Wd%5Cmathbf%7Bx%7D)

我们从这个公式是无法获得Jacobian的,由于全微分中有矩阵叉乘。我们知道矩阵点乘是有结合律的,但是叉乘和点乘不能结合。因此我们要把上面等式中的一些矩阵和向量设出来,看看有没有更好的表示方法来看出来Jacobian。


假设f%EF%BC%9A%5Cmathbb%7BR%7D%5En%20%5Crightarrow%20%5Cmathbb%7BR%7D%5Em,我们设出矩阵W和向量%5Cmathbf%7Bx%7D

W%20%3D%20%0A%5Cbegin%7Bpmatrix%7D%0AW_%7B11%7D%20%26%20%5Cldots%20%26W_%7B1n%7D%5C%5C%0A%5Cvdots%20%26%20%5Cddots%20%26%20%5Cvdots%5C%5C%0AW_%7Bm1%7D%20%26%20%5Cldots%20%26%20W_%7Bmn%7D%0A%5Cend%7Bpmatrix%7D%0A%0A%5Cquad%0A%0A%5Cmathbf%7Bx%7D%20%3D%0A%5Cbegin%7Bpmatrix%7D%0Ax_1%5C%5C%0A%5Cvdots%5C%5C%0Ax_n%0A%5Cend%7Bpmatrix%7D%0A%0A%5Cquad%20%0A%0Ad%5Cmathbf%7Bx%7D%20%3D%20%0A%5Cbegin%7Bpmatrix%7D%0Adx_1%5C%5C%0A%5Cvdots%5C%5C%0Adx_n%0A%5Cend%7Bpmatrix%7D

df是一个m%5Ctimes%201的向量,我们要研究它的第i

(df)_i%20%3D%20%20h'((W%5Cmathbf%7Bx%7D-b)_i)(%5Csum%5Climits_%7Bj%3D1%7D%5E%7Bn%7DW_%7Bij%7Ddx_j)

因为%5Csum累加的角标是j,所以我们可以把前面含ih'((W%5Cmathbf%7Bx%7D-b)_i)放到%5Csum里面去

(df)_i%20%3D%20%20%5Csum%5Climits_%7Bj%3D1%7D%5E%7Bn%7Dh'((W%5Cmathbf%7Bx%7D-b)_i)W_%7Bij%7Ddx_j

考虑到所有的i,等式右边相当于什么?相当于把矩阵W%5Cin%5Cmathbb%7BR%7D%5E%7Bm%5Ctimes%20n%7D的每一行都乘以h'((W%5Cmathbf%7Bx%7D-b))%5Cin%20%5Cmathbb%7BR%7D%5E%7Bm%5Ctimes1%7D的对应项,得到新的矩阵之后,再和d%5Cmathbf%7Bx%7D做矩阵乘法。这样我们就能把之前的叉乘转化为点乘,再通过结合律,就可以得到Jacobian了。

df%20%3D%20diag(h'(W%5Cmathbf%7Bx%7D-b))%5Ccdot%20Wd%5Cmathbf%7Bx%7D

所以

%5Cnabla_%5Cmathbf%7Bx%7D%20f%20%3D%20J%20%3D%20diag(h'(W%5Cmathbf%7Bx%7D-b))%5Ccdot%20W

验证一下,这个Jacobian确实是一个m%20%5Ctimes%20n的矩阵,任务完成!


我这一篇写的很细,希望如果以后有人能用到这篇文章的话,即使基础相对薄弱也能看懂。令一点就是我隐约觉得这篇里面有些地方我自己的理解可能也会有问题,后续发现了会更新的。



[Quant 1.5] 矩阵微积分Matrix Calculus基础 (2)的评论 (共 条)

分享到微博请遵守国家法律