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

[Quant 1.4] 矩阵微积分Matrix Calculus基础 (1)

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

资源是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


本来我想写一期RNN的笔记的。结果发现有一个很重要的部分的数学我已经忘的差不多了,而且知识点还很多,所以决定单独拿出来写一篇。


1. Vector到Scalar的函数梯度

假设我们现在有一个向量%5Cmathbf%7Bx%7D%20%5Cin%20%5Cmathbb%7BR%7D%5En,还有作用于%5Cmathbf%7Bx%7D的函数f%3A%20%5Cmathbb%7BR%7D%5En%20%5Crightarrow%20%5Cmathbb%7BR%7D。那么%5Cmathbf%7Bx%7Df作用在%5Cmathbf%7Bx%7D上的梯度就可以写成

%5Cmathbf%7Bx%7D%20%3D%20%0A%5Cbegin%7Bpmatrix%7D%0Ax_1%5C%5C%0Ax_2%5C%5C%0A%5Cvdots%5C%5C%0Ax_n%0A%5Cend%7Bpmatrix%7D

%5Cnabla_%5Cmathbf%7Bx%7D%20f%20%3D%20(%5Cfrac%7B%5Cpartial%20f%7D%7B%5Cpartial%20x_1%7D%20%5C%2C%20%5Cfrac%7B%5Cpartial%20f%7D%7B%5Cpartial%20x_2%7D%20%5Cldots%20%5Cfrac%7B%5Cpartial%20f%7D%7B%5Cpartial%20x_n%7D)%20

我个人习惯让%5Cmathbf%7Bx%7D做列向量,因为后面的d%5Cmathbf%7Bx%7D也是个列向量,因此%5Cnabla_%5Cmathbf%7Bx%7D%20f是一个行向量 (为什么梯度是行向量呢?详见https://math.stackexchange.com/questions/3724359/does-there-exist-a-gradient-chain-rule-for-this-case)。

上面是我们在微积分课程中学过的求偏导/梯度,我们举一个简单的例子

f(x_1%2Cx_2)%3D%202x_1%20%2B%20x_2

那么它的梯度就可以写成

%5Cnabla%20f%20%3D%20(%5Cfrac%7B%5Cpartial%20f%7D%7B%5Cpartial%20x_1%7D%2C%5Cfrac%7B%5Cpartial%20f%7D%7B%5Cpartial%20x_2%7D)%20%3D(2%2C1)%5ET

这里面%5Cnabla%20f%20是一个1%5Ctimes%202的行向量。梯度也可以用全微分的形式表现出来

df%20%3D%202dx_1%20%2B%20dx_2



但是在矩阵微积分中,有些函数的变量可以写成整体的矩阵或者向量的形式,而不是把他们中每一个单个的项拿出来做变量。换句话说,上面的函数表达式在矩阵微积分中就可以写成

f(%5Cmathbf%7Bx%7D)%20%3D%20(2%2C1)%5ET%20%5Ccdot%5Cmathbf%7Bx%7D%20

它的梯度也可以写成

%5Cnabla_%5Cmathbf%7Bx%7D%20f%20%3D%20(2%2C1)%5ET

全微分的形式就可以写成

df%20%3D%20(2%2C1)%5ET%20%5Ccdot%20d%5Cmathbf%7Bx%7D

这里面的d%5Cmathbf%7Bx%7D和上面的%5Cmathbf%7Bx%7D一样,需要理解成列向量

d%5Cmathbf%7Bx%7D%20%3D%20(dx_1%2Cdx_2)%20%3D%20%0A%5Cbegin%7Bpmatrix%7D%0Adx_1%5C%5C%0Adx_2%0A%5Cend%7Bpmatrix%7D


我们可以证明,对于f%3A%20%5Cmathbb%7BR%7D%5En%20%5Crightarrow%20%5Cmathbb%7BR%7D%20%5Cquad%20%5Cmathbf%7Bx%7D%20%5Crightarrow%20c%5ET%20%5Ccdot%20%5Cmathbf%7Bx%7D%2Bb,它的梯度可以写成以下两种形式中的任何一种

%5Cbegin%7Balign%7D%0A%5Cnabla_%7B%5Cmathbf%7Bx%7D%7D%20f%20%26%3D%20c%5ET%5C%5C%0Adf%20%26%20%3D%20c%5ET%5Ccdot%20d%5Cmathbf%7Bx%7D%0A%5Cend%7Balign%7D


再看另一个例子:

f(%5Cmathbf%7Bx%7D)%20%3D%20%5Cmathbf%7Bx%7D%5ET%5Cmathbf%7Bx%7D

想要求这个函数的梯度,我们需要先介绍一个公式(下面称它为AB公式)。这个公式不仅好记而且管用,后面在求matrix到scalar的函数梯度的时候也经常用:

d(AB)%20%3D%20dA%5Ccdot%20B%20%2B%20A%5Ccdot%20dB

其中A%2C%20B是矩阵,因此也可以是向量。我们把f代入到这个公式里面去,得到梯度的全微分形式:

%5Cbegin%7Balign%7D%0Adf%20%26%3D%20(d%5Cmathbf%7Bx%7D%5ET)%5Ccdot%5Cmathbf%7Bx%7D%20%2B%20%5Cmathbf%7Bx%7D%5ET%20%5Ccdot%20d%5Cmathbf%7Bx%7D%5C%5C%0A%26%20%3D%202%5Cmathbf%7Bx%7D%5ET%5Ccdot%20d%5Cmathbf%7Bx%7D%0A%5Cend%7Balign%7D

因为第一行相加的两项都是scalar,取转置之后数值不变。把第一项取转置之后就和第二项相等了。所以梯度也可以写成

%5Cnabla_%5Cmathbf%7Bx%7D%20f%20%3D%202%5Cmathbf%7Bx%7D%5ET


当然,不是所有的%5Cmathbb%7BR%7D%5En%20%5Crightarrow%20%5Cmathbb%7BR%7D的函数都可以写成向量的形式。这种情况下还是要用微积分里面学到的最原本的公式(开头的公式)来求梯度。在机器学习里面会出现的Vector到Scalar的函数梯度,我们掌握上面两种情况还有AB公式就够用了。



2. Vector到Vector的函数梯度

假设我们的自变量向量长度为n

%5Cmathbf%7Bx%7D%20%3D%20%0A%5Cbegin%7Bpmatrix%7D%0Ax_1%5C%5C%0Ax_2%5C%5C%0A%5Cvdots%5C%5C%0Ax_n%0A%5Cend%7Bpmatrix%7D

函数%5Cmathbf%7Bf%7D%3A%20%5Cmathbb%7BR%7D%5En%20%5Crightarrow%20%5Cmathbb%7BR%7D%5Em%20%5Cquad%20%5Cmathbf%7Bx%7D%20%5Crightarrow%20%5Cmathbf%7Bf%7D(%5Cmathbf%7Bx%7D)可以展开为

%5Cmathbf%7Bf%7D(%5Cmathbf%7Bx%7D)%20%3D%20%0A%5Cbegin%7Bpmatrix%7D%0Af_1(%5Cmathbf%7Bx%7D)%5C%5C%0Af_2(%5Cmathbf%7Bx%7D)%5C%5C%0A%5Cvdots%5C%5C%0Af_m(%5Cmathbf%7Bx%7D)%0A%5Cend%7Bpmatrix%7D

Element-wise,这个函数的梯度要写成

%5Cnabla_%5Cmathbf%7Bx%7D%20%5Cmathbf%7Bf%7D%20%3D%20%0A%5Cbegin%7Bpmatrix%7D%0A%5Cfrac%7B%5Cpartial%20f_1%7D%7B%5Cpartial%20x_1%7D%20%26%20%5Cldots%20%26%20%5Cfrac%7B%5Cpartial%20f_1%7D%7B%5Cpartial%20x_n%7D%20%5C%5C%0A%5Cvdots%20%26%20%5Cddots%20%26%20%5Cvdots%5C%5C%0A%5Cfrac%7B%5Cpartial%20f_m%7D%7B%5Cpartial%20x_1%7D%20%26%20%5Cldots%20%26%20%5Cfrac%7B%5Cpartial%20f_m%7D%7B%5Cpartial%20x_n%7D%0A%5Cend%7Bpmatrix%7D

这个矩阵就是微积分里面也讲过的Jacobian matrix,它十分重要,在多元积分换元的时候也要用到。Vector到Vector函数的梯度就是Jacobian matrix。


此外,值得注意的一点是,Vector到Vector函数%5Cmathbf%7Bf%7D%3A%5Cmathbb%7BR%7D%5En%20%5Crightarrow%20%5Cmathbb%7BR%7D%5Em的梯度(即Jacobian矩阵)的维度是m%5Ctimes%20n。特别的,当m%3D1的时候,梯度就是一个1%5Ctimes%20n%0A的矩阵,即行向量,这一点我在Vector到Scaler函数的梯度中提到过。


对于一般形式的Vector到Vector函数,我们只需要一个接着一个求偏导,把这个m%5Ctimes%20n的矩阵填满就行了。但是,有些Vector到Vector函数是可以整体表达成矩阵乘法形式的,例如多元线性函数。

例如函数

%5Cbegin%7Balign%7D%0A%5Cmathbf%7Bf%7D(%5Cmathbf%7Bx%7D)%20%26%3D%20A%5Cmathbf%7Bx%7D%2Bb%5C%5C%0A%26%3D%0A%5Cbegin%7Bpmatrix%7D%0AA_%7B11%7D%20%26%20A_%7B12%7D%5C%5C%0AA_%7B21%7D%20%26%20A_%7B22%7D%0A%5Cend%7Bpmatrix%7D%0A%0A%5Cbegin%7Bpmatrix%7D%0Ax_1%5C%5C%0Ax_2%0A%5Cend%7Bpmatrix%7D%0A%2B%0A%5Cbegin%7Bpmatrix%7D%0Ab_1%5C%5C%0Ab_2%0A%5Cend%7Bpmatrix%7D%5C%5C%0A%26%3D%0A%5Cbegin%7Bpmatrix%7D%0AA_%7B11%7Dx_1%20%2B%20A_%7B12%7Dx_2%20%2Bb_1%5C%5C%0AA_%7B21%7Dx_1%20%2B%20A_%7B22%7Dx_2%20%2B%20b_2%0A%5Cend%7Bpmatrix%7D%0A%5Cend%7Balign%7D

这里面的A_%7B11%7Dx_1%20%2B%20A_%7B12%7Dx_2%20%2Bb_1对应的就是一般形式中的f_1(%5Cmathbf%7Bx%7D)A_%7B21%7Dx_1%20%2B%20A_%7B22%7Dx_2%20%2Bb_2则对应f_2(%5Cmathbf%7Bx%7D)。我们应用一下Jacobian的公式,可以得到

%5Cnabla_%5Cmathbf%7Bx%7D%20%5Cmathbf%7Bf%7D%20%3D%20%0A%5Cbegin%7Bpmatrix%7D%0AA_%7B11%7D%20%26%20A_%7B12%7D%5C%5C%0AA_%7B21%7D%20%26%20A_%7B22%7D%0A%0A%5Cend%7Bpmatrix%7D

以此类推,对于%5Cmathbf%7Bf%7D(%5Cmathbf%7Bx%7D)%20%3D%20A%5Cmathbf%7Bx%7D%20%2B%20b,其梯度可以写成

%5Cnabla_%5Cmathbf%7Bx%7D%20%5Cmathbf%7Bf%7D%20%3D%20A

或者

d%5Cmathbf%7Bf%7D%20%3D%20Ad%5Cmathbf%7Bx%7D


上面的例子就是Vector到Vector的多元线性函数可以写成矩阵乘法形式的例子,接下来再介绍一个例子,这个实际上是Vector到Scalar,但是需要怎们学了上面的例子之后才能做

f(%5Cmathbf%7Bx%7D)%20%3D%20(A%5Cmathbf%7Bx%7D-b)%5ET(A%5Cmathbf%7Bx%7D-b)

这里我们可以使用AB公式。AB公式就像分步求导法则一样的:当我们不知道函数整体如何求道,但是知道函数是两个容易求道的函数的乘积,那么我们就可以使用AB公式

%5Cbegin%7Balign%7D%0Adf%20%26%3D%20(d(A%5Cmathbf%7Bx%7D-b)%5ET)(A%5Cmathbf%7Bx%7D-b)%2B(A%5Cmathbf%7Bx%7D-b)%5ETd(A%5Cmathbf%7Bx%7D-b)%5C%5C%0A%26%20%3D%20d%5Cmathbf%7Bx%7D%5ETA%5ET(A%5Cmathbf%7Bx%7D-b)%2B(A%5Cmathbf%7Bx%7D-b)%5ETAd%5Cmathbf%7Bx%7D%0A%5Cend%7Balign%7D

因为d%5Cmathbf%7Bx%7D%5ETA%5ET(A%5Cmathbf%7Bx%7D-b)是scalar,所以它的转置就是它本身,所以

df%3D%202(A%5Cmathbf%7Bx%7D-b)%5ETAd%5Cmathbf%7Bx%7D

%5Cnabla_%5Cmathbf%7Bx%7Df%20%3D%202(A%5Cmathbf%7Bx%7D-b)%5ETA%20

多说一句,这里因为f是一个凸函数,所以求导之后让导函数=0可以求出来全局最大值或者最小值(这里是最小值)。最后反推出来的%5Cmathbf%7Bx%7D就有两种解释:第一个是方程A%5Cmathbf%7Bx%7D%3Db当b不在col(A)中的情况下的最优近似解;另一个是关于样本数据矩阵A的最小二乘法线性回归系数。


第三个例子其实还是一个Vector到Scalar的例子,但是也要用这里第一个例子的结果:

f(%5Cmathbf%7Bx%7D)%20%3D%20%5Cmathbf%7Bx%7D%5ETA%5Cmathbf%7Bx%7D

再次运用AB公式

%5Cbegin%7Balign%7D%0Adf%20%26%3D%20(d%5Cmathbf%7Bx%7D%5ET)A%5Cmathbf%7Bx%7D%20%2B%20%5Cmathbf%7Bx%7D%5ET(dA%5Cmathbf%7Bx%7D)%5C%5C%0A%26%3D%5Cmathbf%7Bx%7D%5ETA%5ETd%5Cmathbf%7Bx%7D%2B%5Cmathbf%7Bx%7D%5ETAd%5Cmathbf%7Bx%7D%5C%5C%0A%26%3D%5Cmathbf%7Bx%7D%5ET(A%5ET%2BA)d%5Cmathbf%7Bx%7D%0A%5Cend%7Balign%7D%0A%0A

也就是说

%5Cnabla_%5Cmathbf%7Bx%7Df%20%3D%20%5Cmathbf%7Bx%7D%5ET(A%5ET%2BA)

注意,这里我可能跟大多数教材的习惯不一样。因为我默认%5Cmathbf%7Bx%7D是一个列向量,所以梯度应该是一个行向量。很多地方喜欢把这个结果写成它的转置的形式。大家可以依照自己的习惯来记忆。



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

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