矩阵求导法则与性质

首先声明,本篇文章大部分内容来自于网络,具体参考在下面参考小节中给出,我只是将他们进行整理并加上自己的理解。

第一节主要介绍了矩阵向量求导的定义、分子分母布局以及常用的默认布局。第二节主要介绍了如何使用定义法求矩阵向量的导数。第三节主要介绍了如何使用微分法来求解标量对向量的求导,以及标量对矩阵的求导,该节包含了机器学习以及深度学习中的常见的求导过程。第四节主要介绍了矩阵向量求导链式法则,对于推导深度学习中的BP具有很大的帮助。而第五节主要介绍了矩阵对矩阵求导,这部分主要作为扩展内容,在机器学习领域很少用到。最后一节将常用的公式进行了总结,方便查阅。

介绍矩阵求导法则,以及常用的求导公式、迹函数、行列式求导结论。在介绍之前,我们对本文的符号统一一下:

  • 对于标量,统一用小写斜体字母表示,例如$f,x,y$
  • 对于向量,统一用小写正体字母表示,例如$\mathrm y,\mathrm x$
  • 对于矩阵,统一用大写正体字母表示,例如$\mathrm X$,矩阵的大小统一用 $m \times n$表示($m$行$n$列矩阵)

更进一步,为了便于描述,后面如果没有指明,则求导的自变量用$x$表示标量,$\mathrm{x}$表示n维向量,$\mathrm{X}$表示$m \times n$维度的矩阵,求导的因变量用$y$表示标量,$\mathrm{y}$表示m维向量,$\mathrm{Y}$表示$p \times q$维度的矩阵。

求导定义与求导布局

矩阵向量求导引入

在高等数学里面,我们已经学过了标量对标量的求导,比如标量$y$对标量$x$的求导,可以表示为$\frac{\partial y}{\partial x}$。

有些时候,我们会有一组标量$y_i,i=1,2,…,m$来对一个标量$x$的求导,那么我们会得到一组标量求导的结果:$\frac{\partial y_i}{\partial x}, i=1,2.,,,m$。

如果我们把这组标量写成向量的形式,即得到维度为m的一个向量$\mathrm{y}$对一个标量$x$的求导,那么结果也是一个m维的向量:$\frac{\partial \mathrm{y}}{\partial x}$。

可见,所谓向量对标量的求导,其实就是向量里的每个分量分别对标量求导,最后把求导的结果排列在一起,按一个向量表示而已。类似的结论也存在于标量对向量的求导,向量对向量的求导,向量对矩阵的求导,矩阵对向量的求导,以及矩阵对矩阵的求导等。

总而言之,所谓的向量矩阵求导本质上就是多元函数求导,仅仅是把把函数的自变量,因变量以及标量求导的结果排列成了向量矩阵的形式(当然这种排列是人为指定的),方便表达与计算,更加简洁而已。

矩阵向量求导定义

根据求导的自变量和因变量是标量,向量还是矩阵,我们有9种可能的矩阵求导定义,如下:

自变量\因变量标量$y$向量$\mathrm y$矩阵$\mathrm Y$
标量$x$$\frac{\partial y}{\partial x}$$\frac{\partial \mathrm{y}}{\partial x}$$\frac{\partial \mathrm{Y}}{\partial x}$
向量$\mathrm x$$\frac{\partial y}{\partial \mathrm{x}}$$\frac{\partial \mathrm{y}}{\partial \mathrm{x}}$$\frac{\partial \mathrm{Y}}{\partial \mathrm{x}}$
矩阵$\mathrm X$$\frac{\partial y}{\partial \mathrm{X}}$$\frac{\partial \mathrm{y}}{\partial \mathrm{X}}$$\frac{\partial \mathrm{Y}}{\partial \mathrm{X}}$

这9种里面,标量对标量的求导高数里面就有,不需要我们单独讨论。

现在我们来看一个例子,维度为$m$的一个向量$\mathrm y$对一个标量$x$求导,那么结果也是一个$m$维的向量:$\frac{\partial \mathrm{y}}{\partial x}$。这是我们表格里面向量对标量求导的情况。这里有一个问题没有讲到,就是这个m维的求导结果排列成的m维向量到底应该是列向量还是行向量?

这个问题的答案是:行向量或者列向量皆可!毕竟我们求导的本质只是把标量求导的结果排列起来,至于是按行排列还是按列排列都是可以的。但是这样也有问题,在我们机器学习算法法优化过程中,如果行向量或者列向量随便写,那么结果就不唯一,乱套了。

为了解决这个问题,我们引入求导布局的概念。

分子布局与分母布局

为了解决矩阵向量求导的结果不唯一,我们引入求导布局。最基本的求导布局有两个:分子布局(numerator layout)和分母布局(denominator layout )。

对于分子布局来说,我们求导结果的维度以分子为主,比如对于我们上面对标量求导的例子,结果的维度和分子的维度是一致的。也就是说,如果向量$\mathrm y$是一个$m$维列向量,那么求导结果$\frac{\partial \mathrm{y}}{\partial x}$也是一个$m$维列向量。如果向量$\mathrm y$是一个$m$为行向量,那么求导结果$\frac{\partial \mathrm{y}}{\partial x}$也是一个$m$维行向量。

对于分母布局来说,我们求导结果的维度以分母为主,比如对于我们上面对标量求导的例子,如果向量$\mathrm y$是一个$m$维列向量,那么求导结果$\frac{\partial \mathrm{y}}{\partial x}$是一个$m$维行向量。如果向量$\mathrm y$是一个$m$为行向量,那么求导结果$\frac{\partial \mathrm{y}}{\partial x}$是一个$m$维列向量。

上面例子中,分母是一个标量,维度就是1,按理说根本不存在以分子维度(因为标量只有一个维度)为主的因素。这里可以理解为此时以分子的转置为主。

可见,对于分子布局和分母布局的结果来说,两者相差一个转置。

再举一个例子,标量$y$对矩阵$ \mathrm{X}$求导,那么如果按分母布局,则求导结果的维度和矩阵$X$的维度$m \times n$是一致的。如果是分子布局,则求导结果的维度为$n \times m$。

这样,对于标量对向量或者矩阵求导,向量或者矩阵对标量求导这4种情况,对应的分子布局和分母布局的排列方式已经确定了。

稍微麻烦点的是向量对向量的求导,本文只讨论列向量对列向量的求导,其他的行向量求导只是差一个转置而已。比如$m$维列向量$\mathrm{y}$对$n$维列向量$\mathrm{x}$求导。它的求导结果在分子布局和分母布局各是什么呢?对于这2个向量求导,那么一共有$m \times n$个标量对标量的求导。求导的结果一般是排列为一个矩阵。如果是分子布局,则矩阵的第一个维度以分子为准,即结果是一个$m \times n$的矩阵,如下:

上边这个按分子布局的向量对向量求导的结果矩阵,我们一般叫做雅克比 (Jacobian)矩阵。有的资料上会使用$ \frac{\partial \mathrm{y}}{\partial \mathrm{x^T}}$来定义雅克比矩阵,意义是一样的。

如果是按分母布局,则求导的结果矩阵的第一维度会以分母为准,即结果是一个$n \times m$的矩阵,如下:

上边这个按分母布局的向量对向量求导的结果矩阵,我们一般叫做梯度矩阵。有的资料上会使用$ \frac{\partial \mathrm{y^T}}{\partial \mathrm{x}}$来定义梯度矩阵,意义是一样的。

有了布局的概念,我们对于上面5种求导类型,可以各选择一种布局来求导。但是对于某一种求导类型,不能同时使用分子布局和分母布局求导。

但是在机器学习算法原理的资料推导里,我们并没有看到说正在使用什么布局,也就是说布局被隐含了,这就需要自己去推演,比较麻烦。但是一般来说我们会使用一种叫混合布局的思路,即

  • 如果是向量或者矩阵对标量求导,则使用分子布局为准
  • 如果是标量对向量或者矩阵求导,则以分母布局为准
  • 对于向量对对向量求导,有些分歧,刘建平大牛的所有文章中会以分子布局的雅克比矩阵为主。

具体总结如下:

自变量\因变量标量$y$列向量$\mathrm y$矩阵$\mathrm Y$
标量$x$/$\frac{\partial \mathrm{y}}{\partial x}$
分子布局:m维列向量(默认布局)
分母布局:m维行向量
$\frac{\partial \mathrm{Y}}{\partial x}$
列向量$\mathrm x$$\frac{\partial y}{\partial \mathrm{x}}$
分子布局:n维行向量
分母布局:n维列向量(默认布局)
$\frac{\partial \mathrm{y}}{\partial \mathrm{x}}$
分子布局:$m \times n$雅克比矩阵(默认布局)
分母布局:$n \times m$梯度矩阵
/
矩阵$\mathrm X$$\frac{\partial y}{\partial \mathrm{X}}$

分子布局:$n \times m$矩阵

分母布局:$m \times n$矩阵(默认布局)
//

上面表格中,对于分子布局,若分子为标量,也就是维度为1,那么第一维度会以分母的转置维度为准;对于分母布局,若分母为标量,也就是维度为1,那么第一维度会以分子的转置维度为准。因为上面说过,所谓的向量矩阵求导本质上就是多元函数求导,仅仅是把把函数的自变量,因变量以及标量求导的结果排列成了向量矩阵的形式(当然这种排列是人为指定的),方便表达与计算,更加简洁而已。

矩阵向量求导之定义法

上面讨论了向量矩阵求导的9种定义与求导布局的概念。本节我们就讨论下其中的标量对向量求导,标量对矩阵求导, 以及向量对向量求导这三种场景的基本求解思路。

对于本节中的标量对向量或矩阵求导这两种情况,如前文所说,以分母布局为默认布局。向量对向量求导,以分子布局为默认布局。如遇到其他文章中的求导结果和本节不同,请先确认使用的求导布局是否一样。另外,由于机器学习中向量或矩阵对标量求导的场景很少见,本系列不会单独讨论这两种求导过程。

用定义法求解标量对向量求导

标量对向量求导,严格来说是实值函数对向量的求导。即定义实值函数$f: R^{n} \to R$,自变量$\mathrm{x}$是n维向量,而输出$y$是标量。对于一个给定的实值函数,如何求解$\frac{\partial y}{\partial \mathrm{x}}$呢?

首先我们想到的是基于矩阵求导的定义来做,由于所谓标量对向量的求导,其实就是标量对向量里的每个分量分别求导,最后把求导的结果排列在一起,按一个向量表示而已。那么我们可以将实值函数对向量的每一个分量来求导,最后找到规律,得到求导的结果向量。

首先我们来看一个简单的例子:$y=\mathrm{a}^T\mathrm{x}$,求解$\frac{\partial \mathrm{a}^T\mathrm{x}}{\partial \mathrm{x}}$

根据定义,我们先对$\mathrm{x}$的第i个分量进行求导,这是一个标量对标量的求导,如下:

可见,对向量的第i个分量的求导结果就等于向量$\mathrm{a}$的第i个分量。由于我们是分母布局,最后所有求导结果的分量组成的是一个n维列向量。那么其实就是向量$\mathrm{a}$。也就是说:

同样的思路,我们也可以直接得到:

给一个简单的测试,大家看看自己能不能按定义法推导出:

再来看一个复杂一点点的例子:$y=\mathrm{x}^T\mathrm{A}\mathrm{x}$,求解$\frac{\partial \mathrm{x}^T\mathrm{A}\mathrm{x}}{\partial \mathrm{x}}$。

我们对$\mathrm{x}$的第k个分量$x_k$进行求导如下:

这个第k个分量的求导结果稍微复杂些了,仔细观察一下,第一部分是矩阵$\mathrm{A}$的第k列转置后和$x$相乘得到,第二部分是矩阵$\mathrm{A}$的第k行和$x$相乘得到,排列好就是:

从上面可以看出:

  • 定义法求导对于简单的实值函数是很容易的
  • 但是复杂的实值函数就算求出了任意一个分量的导数,要排列出最终的求导结果还挺麻烦的

因此我们需要找到其他的简便一些的方法来整体求导,而不是每次都先去针对任意一个分量,再进行排列。

标量对向量求导的一些基本法则

在我们寻找一些简单的方法前,我们简单看下标量对向量求导的一些基本法则,这些法则和标量对标量求导的过程类似。

1)常量对向量的求导结果为0。

2)线性法则:如果$f,g$都是实值函数,$c_1,c_2$为常数,则:

3) 乘法法则:如果$f,g$都是实值函数,则:

要注意的是如果不是实值函数,则不能这么使用乘法法则。

4) 除法法则:如果$f,g$都是实值函数,且$g(\mathrm{x}) \neq 0$,则:

用定义法求解标量对矩阵求导

现在我们来看看定义法如何解决标量对矩阵的求导问题。其实思路和上一小节的标量对向量的求导是类似的,只是最后的结果是一个和自变量同型的矩阵。

我们还是以一个例子来说明。$y=\mathrm{a}^T\mathrm{X}\mathrm{b}$,求解$\frac{\partial \mathrm{a}^T\mathrm{X}\mathrm{b}}{\partial \mathrm{X}}$。其中,$\mathrm{a}$是$m$维列向量,$\mathrm{b}$是$n$维列向量,$\mathrm{X}$是$m \times n$的矩阵。

我们对矩阵$\mathrm{X}$的任意一个位置的$X_{ij}$求导,如下:

即求导结果在$(i,j)$位置的求导结果是$\mathrm{a}$向量第i个分量和$\mathrm{b}$第j个分量的乘积,将所有的位置的求导结果排列成一个$m \times n$的矩阵,即为$ab^T$,这样最后的求导结果为:

简单的求导的确不难,但是如果是比较复杂的标量对矩阵求导,比如$y=\mathrm{a}^Texp(\mathrm{X}\mathrm{b})$,对任意标量求导容易,排列起来还是蛮麻烦的,也就是我们遇到了和标量对向量求导一样的问题,定义法比较适合解决简单的问题,复杂的求导需要更简便的方法。这个方法我们在下一大节来讲。

同时,标量对矩阵求导也有和第二节对向量求导类似的基本法则,这里就不累述了。

用定义法求解向量对向量求导

这里我们也同样给出向量对向量求导的定义法的具体例子。

先来一个简单的例子: $\mathrm{y} = \mathrm{A} \mathrm{x} $,其中$ \mathrm{A}$为$n \times m$的矩阵。$\mathrm{x}, \mathrm{y}$分别为$m,n$维向量。需要求导$\frac{\partial \mathrm{A}\mathrm{x}}{\partial \mathrm{x}}$,根据定义,结果应该是一个$n \times m$的矩阵。

先求矩阵$\mathrm A$的第i行和向量$\mathrm x$的内积对向量$\mathrm x$的第j分量求导,用定义法求解过程如下:

可见矩阵 $\mathrm{A}$的第i行和向量的内积对向量的第j分量求导的结果就是矩阵 $\mathrm{A}$的$(i,j)$位置的值。排列起来就是一个矩阵了,由于我们分子布局,所以排列出的结果是$ \mathrm{A}$,而不是 $\mathrm{A}^T$。

定义法矩阵向量求导的局限

使用定义法虽然已经求出一些简单的向量矩阵求导的结果,但是对于复杂的求导式子,则中间运算会很复杂,同时求导出的结果排列也是很头痛的。下一大节我们讨论使使用矩阵微分和迹函数的方法来求解矩阵向量求导。

矩阵向量求导之微分法

定义法求解矩阵向量求导的方法对于比较复杂的求导式子,中间运算会很复杂,同时排列求导出的结果也很麻烦。因此我们需要其他的一些求导方法。本节我们讨论使用微分法来求解标量对向量的求导,以及标量对矩阵的求导。

本节的标量对向量的求导,以及标量对矩阵的求导使用分母布局。如果遇到其他资料求导结果不同,请先确认布局是否一样。

矩阵微分

在高数里面我们学习过标量的导数和微分,他们之间有这样的关系:$df =f’(x)dx$。如果是多变量的情况,则微分可以写成:

从上次我们可以发现标量对向量的求导它的向量微分有一个转置的关系。

现在我们再推广到矩阵。对于矩阵微分,我们的定义为:

其中第二步使用了矩阵迹的性质,即迹函数等于主对角线的和。即

从上面矩阵微分的式子,我们可以看到矩阵微分和它的导数也有一个转置的关系,不过在外面套了一个迹函数而已。由于标量的迹函数就是它本身,那么矩阵微分和向量微分可以统一表示,即:

矩阵微分的性质

我们在讨论如何使用矩阵微分来求导前,先看看矩阵微分的性质:

1)微分加减法:$d(\mathrm X+ \mathrm Y) =d\mathrm X+d \mathrm Y, d(\mathrm X- \mathrm Y) =d\mathrm X-d \mathrm Y$

2) 微分乘法:$d(\mathrm X \mathrm Y) =(d\mathrm X) \mathrm Y + \mathrm X(d \mathrm Y)$;$d(\mathrm X\mathrm Y\mathrm Z) =(d\mathrm X)\mathrm Y\mathrm Z + X(d\mathrm Y)\mathrm Z+ \mathrm X\mathrm Y(d\mathrm Z)$

3) 微分转置:$d(\mathrm X^T) =(d\mathrm X)^T$

4) 微分的迹:$dtr(\mathrm X) =tr(d\mathrm X)$

5) 微分哈达马乘积: $d(\mathrm X \odot \mathrm Y) = \mathrm X\odot d \mathrm Y + d\mathrm X \odot \mathrm Y$

6) 逐元素求导:$d \sigma(\mathrm X) =\sigma’(\mathrm X) \odot d\mathrm X$,$\sigma (\mathrm X)=[\sigma (\mathrm X_{ij})]$是逐元素标量函数运算,$\sigma’(\mathrm X)=[\sigma’ (\mathrm X_{ij})]$是逐元素求导数运算。例如:

7) 逆矩阵微分:$d \mathrm X^{-1}= -\mathrm X^{-1}d\mathrm X\mathrm X^{-1}$。此式可在$\mathrm X \mathrm X ^{-1}=I$两侧微分来证明。

8) 行列式微分:$d |\mathrm X|= tr(\mathrm X^$表示$\mathrm X$的伴随矩阵;在$\mathrm X$可逆时又可以写作$d |\mathrm X|= |\mathrm X|tr(\mathrm X^{-1}d\mathrm X)$。此式可用Laplace展开来证明,详见张贤达《矩阵分析与应用》第279页。

有了这些性质,我们再来看看如何由矩阵微分来求导数。

所谓哈达马乘积也就是两个维度相同的矩阵按像素相乘。

使用微分法求解矩阵向量求导

由于上一小节我们已经得到了矩阵微分和导数关系,现在我们就来使用微分法求解矩阵向量求导。

标量函数$f$是矩阵$\mathrm X$经加减乘法、逆、行列式、逐元素函数等运算构成,则使用相应的运算法则对$f$求微分,再使用迹函数技巧给$df$套上迹并将其它项交换至$dX$左侧,那么对于迹函数里面在$dX$左边的部分,我们只需要加一个转置就可以得到导数了。

这里需要用到的迹函数的技巧主要有这么几个:

1) 标量的迹等于自己:$tr(x) =x$

2) 转置不变:$tr( \mathrm A^T) =tr( \mathrm A)$

3) 交换率:$tr( \mathrm A \mathrm B) =tr( \mathrm B \mathrm A)$,需要满足$ \mathrm A, \mathrm B^T$同维度。

4) 加减法:$tr(\mathrm X+ \mathrm Y) =tr(\mathrm X)+tr( \mathrm Y), tr(\mathrm X- \mathrm Y) =tr(\mathrm X)-tr( \mathrm Y)$

5) 矩阵乘法和迹交换:$tr(( \mathrm A\odot \mathrm B)^T \mathrm C)= tr( \mathrm A^T( \mathrm B \odot \mathrm C))$,需要满足$ \mathrm A、 \mathrm B、 \mathrm C$同维度。

先看第一个例子,我们使用上一篇定义法中的一个求导问题:

首先,我们使用微分乘法的性质对$f$求关于$\mathrm X$微分,得到:

在这一步,从第一个等号到第二个等号主要是用了上面矩阵微分性质(2)。从第二个等号到第三个等号主要是因为微分$d(\mathrm a^T)$以及$d \mathrm b$因变量部分不是自变量的函数($\mathrm a$和$\mathrm b$作为因变量都不包含$\mathrm X$),因此导数为0。

高等数学中说得:函数$y=f(x)$在点$x_0$可微的充分必要条件是函数$f(x)$在点$x_0$可导,且当$f(x)$在点$x_0$可微时,其微分一定是:

从中可以看出,微分也是针对变量的,如果是常量的微分,那么变化值就是0。在求导过程中,除了要求导的部分为变量,其余部分均为已知常量。

第二步,就是两边套上迹函数,即:

其中第一到第二个等号使用了上面迹函数性质1。第三到第四个等号用到了上面迹函数的性质3,也就是$\mathrm b^T = \mathrm a^T d \mathrm X$。

最后,根据我们矩阵导数和微分的定义,迹函数里面在$d \mathrm X$左边的部分$\mathrm{b}\mathrm{a}^T$,加上一个转置即为我们要求的导数,即:

以上就是微分法的基本流程,先求微分再做迹函数变换,最后得到求导结果。比起定义法,我们现在不需要去对矩阵中的单个标量进行求导了。

再来看看

上面第二个到第三个等号使用上面矩阵微分性质6(也就是$\sigma$函数为$exp$函数,对$\mathrm X \mathrm b$逐元素求导),其中第三到第四个等号使用了上面迹函数的性质5。从第四个到第五个等号使用了上面迹函数的性质3(因为这里只关注求导,所以对于$\mathrm A$和$\mathrm B^T$同维度的问题并没有强调,实际使用的时候要保证相容),这样我们的求导结果为:

以上就是微分法的基本思路。

迹函数对向量矩阵求导

由于微分法使用了迹函数的技巧,那么迹函数对对向量矩阵求导这一大类问题,使用微分法是最简单直接的。下面给出一些常见的迹函数的求导过程,也顺便给大家熟练掌握微分法的技巧。

首先是$\frac{\partial tr(\mathrm A\mathrm B)}{\partial \mathrm A} = \mathrm B^T, \frac{\partial tr(\mathrm A\mathrm B)}{\partial \mathrm B} =\mathrm A^T$,这个直接根据矩阵微分的定义即可得到。

再来看看$\frac{\partial tr(\mathrm W^T\mathrm A\mathrm W)}{\partial \mathrm W}$:

因此可以得到:

最后来个更加复杂的迹函数求导:$\frac{\partial tr(B^TX^TCXB)}{\partial X} $:

因此可以得到:

微分法求导小结

使用矩阵微分,可以在不对向量或矩阵中的某一元素单独求导再拼接,因此会比较方便,当然熟练使用的前提是对上面矩阵微分的性质,以及迹函数的性质熟练运用。

还有一些场景,求导的自变量和因变量直接有复杂的多层链式求导的关系,此时微分法使用起来也有些麻烦。如果我们可以利用一些常用的简单求导结果,再使用链式求导法则,则会非常的方便。因此下一节我们讨论向量矩阵求导的链式法则。

矩阵向量求导链式法则

使用微分法来求解矩阵向量求导的方法。但是很多时候,求导的自变量和因变量直接有复杂的多层链式求导的关系,此时微分法使用起来也有些麻烦。需要一些简洁的方法。

本节我们讨论矩阵向量求导链式法则,使用该法则很多时候可以帮我们快速求出导数结果。

本节的标量对向量的求导,标量对矩阵的求导使用分母布局, 向量对向量的求导使用分子布局。如果遇到其他资料求导结果不同,请先确认布局是否一样。

向量对向量求导的链式法则

首先我们来看看向量对向量求导的链式法则。假设多个向量存在依赖关系,比如三个向量$\mathbf{x} \to \mathbf{y} \to \mathbf{z}$存在依赖关系,则我们有下面的链式求导法则:

该法则也可以推广到更多的向量依赖关系。但是要注意的是要求所有有依赖关系的变量都是向量,如果有一个$\mathbf{Y}$是矩阵,比如是$\mathbf{x} \to \mathbf{Y} \to \mathbf{z}$, 则上式并不成立。

从矩阵维度相容的角度也很容易理解上面的链式法则,假设$\mathbf{x} , \mathbf{y} ,\mathbf{z}$分别是$m,n.p$维向量,则求导结果$\frac{\partial \mathbf{z}}{\partial \mathbf{x}}$是一个$p \times m$的雅克比矩阵,而右边$\frac{\partial \mathbf{z}}{\partial \mathbf{y}}$是一个$p \times n$的雅克比矩阵,$\frac{\partial \mathbf{y}}{\partial \mathbf{x}}$是一个$n \times m$的矩阵,两个雅克比矩阵的乘积维度刚好是$p \times m$,和左边相容。

标量对多个向量的链式求导法则

我们的机器学习算法中,最终要优化的一般是一个标量损失函数,因此最后求导的目标是标量,无法使用上一节的链式求导法则,比如由2个向量,最后得到1个标量的依赖关系:$\mathbf{x} \to \mathbf{y} \to z$,此时很容易发现维度不相容。

假设$\mathbf{x} , \mathbf{y} $分别是$m,n$维向量,那么$\frac{\partial z}{\partial \mathbf{x}}$的求导结果是一个$m \times 1$的向量,而$\frac{\partial z}{\partial \mathbf{y}}$是一个$n \times 1$的向量,$\frac{\partial \mathbf{y}}{\partial \mathbf{x}}$是一个$n \times m$的雅克比矩阵,右边的向量和矩阵是没法直接乘的。

但是假如我们把标量求导的部分都做一个转置,那么维度就可以相容了,也就是:

但是毕竟我们要求导的是$(\frac{\partial z}{\partial \mathbf{x}})$,而不是它的转置,因此两边转置我们可以得到标量对多个向量求导的链式法则:

如果是标量对更多的向量求导,比如$\mathbf{y_1} \to \mathbf{y_2} \to …\to \mathbf{y_n} \to z$,则其链式求导表达式可以表示为:

这里我们给一个最常见的最小二乘法求导的例子。最小二乘法优化的目标是最小化如下损失函数:

我们优化的损失函数$l$是一个标量,而模型参数$\theta$是一个向量,期望L对$\theta$求导,并求出导数等于0时候的极值点。我们假设向量$\mathrm z = \mathrm X\theta - \mathrm y$,则$l=\mathrm z^T \mathrm z$, $\theta \to \mathrm z \to l$存在链式求导的关系,因此:

其中这一步转换使用了如下求导公式:

这两个式子我们在前几篇里已有求解过,现在可以直接拿来使用了,非常方便。

当然上面的问题使用微分法求导数也是非常简单的,这里只是给出链式求导法的思路。

标量对多个矩阵的链式求导法则

下面我们再来看看标量对多个矩阵的链式求导法则,假设有这样的依赖关系:$\mathbf{X} \to \mathbf{Y} \to z$,那么我们有:

这里大家会发现我们没有给出基于矩阵整体的链式求导法则,主要原因是矩阵对矩阵的求导是比较复杂的定义,我们目前也未涉及。因此只能给出对矩阵中一个标量的链式求导方法。这个方法并不实用,因为我们并不想每次都基于定义法来求导最后再去排列求导结果。

虽然我们没有全局的标量对矩阵的链式求导法则,但是对于一些线性关系的链式求导,我们还是可以得到一些有用的结论的。

我们来看这个常见问题:$\mathrm A,\mathrm X,\mathrm B,\mathrm Y$都是矩阵,$z$是标量,其中$z= f(\mathrm Y), \mathrm Y=\mathrm A\mathrm X+\mathrm B$,我们要求出$\frac{\partial z}{\partial \mathrm X}$,这个问题在机器学习中是很常见的。此时,我们并不能直接整体使用矩阵的链式求导法则,因为矩阵对矩阵的求导结果不好处理。

这里我们回归初心,使用定义法试一试,先使用上面的标量链式求导公式:

我们再来看看后半部分的导数:

其中$\delta_{lj}$在$l=j$时为1,否则为0。 对上面式子进行解释:因为$\mathrm Y_{kl}$由$\mathrm A$的第k行与$\mathrm X$的第l列相乘得到,所以有$\mathrm Y_{kl}=\sum\limits_s( \mathrm A_{ks} \mathrm X_{sl})$,而等式后面只有当$s=i,l=j$时,其对$\mathrm X_{ij}$求导才有值,也就是最终求导结果为$\mathrm A_{ki}$。

那么最终的标签链式求导公式转化为:

即矩阵$ \mathrm A^T$的第i行和$\frac{\partial z}{\partial \mathrm Y} $的第j列的内积。排列成矩阵即为:

总结下就是:

这结论在$\mathbf{x}$是一个向量的时候也成立,即:

如果要求导的自变量在左边,线性变换在右边,也有类似稍有不同的结论如下,证明方法是类似的,这里直接给出结论:

使用好上述四个结论,对于机器学习尤其是深度学习里的求导问题可以非常快的解决,大家可以试一试。

矩阵向量求导小结

矩阵向量求导在前面我们讨论三种方法,定义法,微分法和链式求导法。在同等情况下,优先考虑链式求导法,尤其是第三节的四个结论。其次选择微分法、在没有好的求导方法的时候使用定义法是最后的保底方案。

基本上大家看了系列里这四篇后对矩阵向量求导就已经很熟悉了,对于机器学习中出现的矩阵向量求导问题已足够。这里还没有讲到的是矩阵对矩阵的求导,还有矩阵对向量,向量对矩阵求导这三种形式,这个我们在系列的下一篇,也是最后一篇简单讨论一下,如果大家只是关注机器学习的优化问题,不涉及其他应用数学问题的,可以不关注。

矩阵对矩阵的求导

在前面几个小节中,我们主要讨论了标量对向量矩阵的求导,以及向量对向量的求导。本节我们就讨论下之前没有涉及到的矩阵对矩阵的求导,还有矩阵对向量,向量对矩阵求导这几种形式的求导方法。

本节所有求导布局以分母布局为准,为了适配矩阵对矩阵的求导,本节向量对向量的求导也以分母布局为准,这和前面的小节不同,需要注意。

矩阵对矩阵求导的定义

假设我们有一个$p \times q$的矩阵$\mathrm F$要对$m \times n$的矩阵$\mathrm X$求导,那么根据我们第一篇求导的定义,矩阵$\mathrm F$中的$pq$个值要对矩阵$\mathrm X$中的$mn$个值分别求导,那么求导的结果一共会有$mnp*q$个。那么求导的结果如何排列呢?方法有很多种。

最直观可以想到的求导定义有2种:

第一种是矩阵$\mathrm F$对矩阵$\mathrm X$中的每个值$\mathrm X_{ij}$求导,这样对于矩阵$\mathrm X$每一个位置(i,j)求导得到的结果是一个矩阵$\frac{\partial \mathrm F}{\partial \mathrm X_{ij}}$,可以理解为矩阵$\mathrm X$的每个位置都被替换成一个$p \times q$的矩阵,最后我们得到了一个$mp \times nq$的矩阵。

第二种和第一种类似,可以看做矩阵$\mathrm F$中的每个值$\mathrm F_{kl}$分别对矩阵$X$求导,这样矩阵$\mathrm F$每一个位置(k,l)对矩阵$\mathrm X$求导得到的结果是一个矩阵$\frac{\partial \mathrm F_{kl}}{\partial \mathrm X}$, 可以理解为矩阵$\mathrm F$的每个位置都被替换成一个$m \times n$的矩阵,最后我们得到了一个$mp \times nq$的矩阵。

这两种定义虽然没有什么问题,但是很难用于实际的求导,比如类似我们在机器学习中的矩阵向量求导(三) 矩阵向量求导之微分法中很方便使用的微分法求导。

目前主流的矩阵对矩阵求导定义是对矩阵先做向量化,然后再使用向量对向量的求导。而这里的向量化一般是使用列向量化。也就是说,现在我们的矩阵对矩阵求导可以表示为:

对于矩阵$\mathrm F$,列向量化后,$vec(\mathrm F)$的维度是$pq \times 1$的向量,同样的,$vec(\mathrm X)$的维度是$mn \times 1$的向量。最终求导的结果,这里我们使用分母布局,得到的是一个$mn \times pq$的矩阵。

矩阵对矩阵求导的微分法

按第一节的向量化的矩阵对矩阵求导有什么好处呢?主要是为了使用类似于前面讲过的微分法求导。回忆之前标量对向量矩阵求导的微分法里,我们有:

这里矩阵对矩阵求导我们有:

和之前标量对矩阵的微分法相比,这里的迹函数被矩阵向量化代替了。

矩阵对矩阵求导的微分法,也有一些法则可以直接使用。主要集中在矩阵向量化后的运算法则,以及向量化和克罗内克积之间的关系。关于矩阵向量化和克罗内克积,具体可以参考张贤达的《矩阵分析与应用》,这里只给出微分法会用到的常见转化性质, 相关证明可以参考张的书。

矩阵向量化的主要运算法则有:

1) 线性性质:$vec(\mathrm A+\mathrm B) =vec(\mathrm A) +vec(\mathrm B)$

2) 矩阵乘法:$vec(\mathrm A\mathrm X \mathrm B)= (\mathrm B^T \bigotimes \mathrm A)vec(\mathrm X)$,其中$\bigotimes$是克罗内克积。

3) 矩阵转置:$vec(\mathrm A^T) =\mathrm K_{mn}vec(\mathrm A)$,其中$\mathrm A$是$m \times n$的矩阵,$\mathrm K_{mn}$是$mn \times mn$的交换矩阵,用于矩阵列向量化和行向量化之间的转换。

4) 逐元素乘法:$vec(\mathrm A \odot \mathrm X) = diag(\mathrm A)vec(\mathrm X)$, 其中$diag(\mathrm A)$是$mn \times mn$的对角矩阵,对角线上的元素是矩阵$\mathrm A$按列向量化后排列出来的。

克罗内克积的主要运算法则有:

1) $(\mathrm A \bigotimes \mathrm B)^T = \mathrm A^T \bigotimes \mathrm B^T$

2) $vec(ab^T) = b \bigotimes a$

3) $(\mathrm A \bigotimes \mathrm B)(\mathrm C \bigotimes \mathrm D )=\mathrm A \mathrm C \bigotimes \mathrm B \mathrm D$

4) $\mathrm K_{mn} =\mathrm K_{nm}^T, \mathrm K_{mn} \mathrm K_{nm}=\mathrm I$

使用上面的性质,求出$vec(d\mathrm F)$关于$ vec(d\mathrm X)$的表达式,则表达式左边的转置即为我们要求的$\frac{\partial vec(\mathrm F)}{\partial vec(\mathrm X)} $,或者说$\frac{\partial \mathrm F}{\partial \mathrm X} $

矩阵对矩阵求导实例

下面我们给出一个使用微分法求解矩阵对矩阵求导的实例。

首先我们来看看:$\frac{\partial \mathrm A \mathrm X \mathrm B}{\partial \mathrm X}$,假设 $\mathrm A, \mathrm X, \mathrm B$都是矩阵,$\mathrm X$是$m \times n$的矩阵。

首先求$d \mathrm F$,和之前第三篇的微分法类似,我们有:

然后我们两边列向量化(之前的微分法是套上迹函数),得到:

其中,第二个式子使用了上面矩阵向量化的性质2。

这样,我们就得到了求导结果为:

利用上面的结果我们也可以得到:

来个复杂一些的:$\frac{\partial \mathrm Aexp(\mathrm B \mathrm X \mathrm C)\mathrm D}{\partial \mathrm X}$

首先求微分得到:

两边矩阵向量化,我们有:

其中第一个等式使用了矩阵向量化性质2,第二个等式使用了矩阵向量化性质4, 第三个等式使用了矩阵向量化性质2。

这样我们最终得到:

矩阵对矩阵求导小结

由于矩阵对矩阵求导的结果包含克罗内克积,因此和之前我们讲到的其他类型的矩阵求导很不同,在机器学习算法优化中中,我们一般不在推导的时候使用矩阵对矩阵的求导,除非只是做定性的分析。如果遇到矩阵对矩阵的求导不好绕过,一般可以使用机器学习中的矩阵向量求导(四) 矩阵向量求导链式法则中第三节最后的几个链式法则公式来避免。

常用结论

实值函数相对于实向量的梯度

设$f(\mathrm x) = \mathrm x = [x_1,…,x_n]^T$

其中,vec表示向量化矩阵,按列将矩阵表示为向量,具体可见Wikipedia。

另外,还有一些常用的,总结如下

1) $f(\mathrm x) = \mathrm A\mathrm x$,则

2) $f(\mathrm x) = \mathrm x^T\mathrm A\mathrm x$,则

3) $f(\mathrm x) = \mathrm a^T\mathrm x$,则

4) $f(\mathrm x) = \mathrm x^T\mathrm A\mathrm y$,则

5)

6) 矩阵微分也满足线性法则、乘积法则。

7) 矩阵的逆的微分

迹函数

迹函数相对于矩阵的梯度

矩阵微分算子和迹算子的可交换性

常见性质

1)

2)

3)

4)

5)

行列式

行列式相对于矩阵的梯度

微分形式

常见性质

1)

2)

3)

二范数求导

例如二范数$J=\frac{1}{2}||\mathrm a^L-\mathrm y||_2^2$,对$\mathrm a^L$求导,其中$\mathrm a^L$与$\mathrm y$均为$m$列向量。

则展开$J$可得:

对该式子对$a_1^L$求导,得到$a_1^L-y_1$,同理可对该式子对$a_i^L$分别求导得到$a_i^L-y_i$,所以$J$对$a^L$求导,结果为$a^L-y$。

参考

矩阵求导法则与性质
机器学习-矩阵求导
机器学习中的矩阵向量求导(一) 求导定义与求导布局
机器学习中的矩阵向量求导(二) 矩阵向量求导之定义法
机器学习中的矩阵向量求导(三) 矩阵向量求导之微分法
机器学习中的矩阵向量求导(四) 矩阵向量求导链式法则
机器学习中的矩阵向量求导(五) 矩阵对矩阵的求导
矩阵求导术(上)

------ 本文结束------
坚持原创技术分享,您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道