Git Product home page Git Product logo

mini-sws's People

Contributors

zgbset avatar

Watchers

 avatar

mini-sws's Issues

机器学习中的数学理论1:三步搞定矩阵求导 - 知乎

机器学习中的数学理论 1:三步搞定矩阵求导 - 知乎

矩阵求导是一类贯穿机器学习,微分方程,概率统计,控制论,凸优化等诸多数学学科的极其重要的操作,遗憾的是,在许多工科专业大学阶段的课本中鲜有系统讲解这部分知识的章节,而许多论文默认读者已经具备了矩阵求导的能力,所以我们值得花时间好好讨论一下如何进行矩阵求导。本文的目的就是系统地梳理一遍矩阵求导的方法,在写作期间很多思路来自于许多很有意义的文章,不胜感激,在此一一列举出作者:


目录

1 求导定义与布局方式

1.1 矩阵求导术

1.2 分子布局和分母布局

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

2.1 定义法

2.2 微分法

2.3 迹函数对向量或矩阵的求导

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

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

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

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

4 矩阵对矩阵的求导术

5 向量对向量的求导术

本文符号定义


:标量

或者
: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:
,求
。其中

列向量,

矩阵,

列向量,
表示逐元素求指数,
是标量。

解: 根据上面的 Algorithms:

1. 先使用矩阵乘法法则求微分

2. 给
套上迹

3. 使用迹技巧做矩阵乘法交换:

根据
有:


根据导数与微分的联系
有:

例 3:
, 求
的最小二乘估计,即求
的零点。其中

列向量,

矩阵,

列向量,
是标量。

解: 依然是求标量对向量的导数。首先解决这个向量模的平方的问题:

根据上面的 Algorithms:

1. 先使用矩阵乘法法则求微分

2. 给
套上迹

根据导数与微分的联系
有:


,有:


,得到
的最小二乘估计为

例 4: 样本
,求方差
的最大似然估计。写成数学式是:
,求
的零点。其中

列向量,
是样本均值,

对称正定矩阵,
是标量,log 表示自然对数。

解: 本题可以转化成求
的问题。

根据上面的 Algorithms:

1. 先使用矩阵乘法法则求微分

但是要求出
需要用到之前讲解的几个关于矩阵微分的性质:

逆:

行列式:
,其中
表示 X 的伴随矩阵,在
可逆时又可以写作

第 1 项:

第 2 项:


2. 再给第二项套上迹

其中定义
为样本方差矩阵。

综上,

根据导数与微分的联系
有:


,其零点即
的最大似然估计为

例 5:
,求
。其中
是除一个元素为 1 外其它元素为 0 的
列向量,

矩阵,

列向量,
是标量;
表示自然对数,
,其中
表示逐元素求指数,
代表全 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 积是

举个例子:

  1. 转置:
    ,A 是 m×n 矩阵,其中
    (mn×mn) 是交换矩阵 (commutation matrix),将按列优先的向量化变为按行优先的向量化。例如

  2. 逐元素乘法:
    ,其中
    (mn×mn) 是用 A 的元素(按列优先)排成的对角阵。

矩阵的
积的性质是重要的矩阵等价变形的技巧,下面简单列举一些
积的性质:

1 假设

证明:


求导:

直接求导得到


,有
,用链式法则得到
。得证。

证明:

可以对
做向量化来证明。对
做向量化:

一方面:

另一方面:


。得证。

2 假设

从导数与微分的联系入手,
,可以推出链式法则

例 11:


维的矩阵,求

解: 根据上面的 Algorithms:

1. 先根据给定的
寻找

2. 将
向量化为
,使用矩阵等价变形和向量化的技巧化简。

3. 根据导数与微分的联系
有:

例 12:


矩阵,求

解: 首先求


,所以

此时相当于是:
,求

根据上面的 Algorithms:

1. 先根据给定的
寻找

2. 将
向量化为
,使用矩阵等价变形和向量化的技巧化简。

3. 根据导数与微分的联系
有:

结果是对称矩阵。在
是对称矩阵时,可简化为

例 13:


矩阵,

矩阵,

矩阵,
为逐元素函数,求

解: 根据上面的 Algorithms:

1. 先根据给定的
寻找

2. 将
向量化为
,使用矩阵等价变形和向量化的技巧化简:

3. 根据导数与微分的联系
有:

例 14:
,求

。其中
是取值 0 或 1 的标量,

列向量。

解:

首先要分清楚要求的东西是什么对什么的导数:
是个标量对向量的导数,遵循分母布局。

所以:


是个向量对向量的导数,遵循分母布局。

先求微分:

其中,
为 sigmoid 函数的导数。

根据向量对向量的导数与微分的联系是:
有:

例 15: 样本

,求

解:

首先要分清楚要求的东西是什么对什么的导数:
是个标量对向量的导数,遵循分母布局。

定义矩阵
,向量
,将
写成矩阵形式:

首先求
的微分:

这里没法直接求
,因为
里面的东西是向量,没法直接求导,所以我们根据定义法,把向量的每一项分别求导,再组合起来:

我们把上式第 2 项拆成:

假设对其中一项:
中的
取微分,结果为:


所以对中间这一项的导数是:

根据定义法对第 2 项整体的导数是:

得到:

所以:

再求
:属于向量对向量求导。

根据上面的 Algorithms:

1. 先根据给定的
寻找

根据向量对向量的导数与微分的联系是:
有:

例 16:
,求

。其中其中
是除一个元素为 1 外其它元素为 0 的
列向量,

矩阵,

列向量,
是标量。

解: 例 5 中已经求得了:

再求
的过程就相当于是矩阵对矩阵的求导。

根据上面的 Algorithms:

1. 先根据给定的
寻找

定义

,有:


定义矩阵
,是个对称矩阵,则:

2. 将
向量化为
,使用矩阵等价变形和向量化的技巧化简:

3. 根据导数与微分的联系
有:


5 向量对向量的求导术

到这里只剩下一种情况就是向量对向量的求导,但是其实不需要再细讲,因为它可以看作是矩阵对矩阵求导的一种特殊情况。只是此时的矩阵的某一维度是 1 而已。所以可以有相似的算法。

如果使用的是分母布局,机器学习和优化中的梯度矩阵采用此定义。而控制论等领域中的
矩阵采用分子布局,向量
(维度
) 对向量
(维度
) 的导数定义是
,对应的导数与微分的联系是

同理若采用分母布局,向量
(维度
) 对向量
(维度
) 的导数与微分的联系是

向量对向量的导数与微分的联系是:
(分子布局)。

向量对向量的导数与微分的联系是:
(分母布局)。

1. 根据给定的
寻找

2. 将
向量化为
,这步不用做,因为
本身就是向量。
3. 等号右边化简之后先找到
,根据分母布局导数与微分的联系
得到

例 17: 在神经网络的前向传播中一般有
,式中
都是
维向量,

维向量,

维矩阵,
是激活函数,求

解: 根据上面的 Algorithms:

1. 根据给定的
寻找

2. 将
向量化为
,这步不用做,因为
本身就是向量。

3. 等号右边化简之后先找到
,根据分母布局导数与微分的联系
得到

所以:

总结

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

1. 根据给定的
寻找

2. 给
套上迹
。等号左边因为
是个标量,所以不受影响,等号右边根据迹的技巧进行化简。
3. 等号右边化简之后先找到
根据导数与微分的联系
得到

矩阵对矩阵的导数与微分的联系是:

1. 根据给定的
寻找

2. 将
向量化为
,使用矩阵等价变形和向量化的技巧化简。
3. 等号右边化简之后先找到
,根据分母布局导数与微分的联系
得到

向量对向量的导数与微分的联系是:
(分子布局)。

向量对向量的导数与微分的联系是:
(分母布局)。

1. 根据给定的
寻找

2. 将
向量化为
,这步不用做,因为
本身就是向量。
3. 等号右边化简之后先找到
,根据分母布局导数与微分的联系
得到

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.