这篇文章介绍了深度学习中会用到的矩阵微积分,帮助我们更好的理解深度学习。
文章里面介绍的内容来自于https://explained.ai/matrix-calculus/index.html,感谢原作者,在这里我只是个搬运工。如有问题请指教,谢谢!
目录
引言 常用微积分介绍
首先我们先来回顾一下微积分的基本法则。
规则 | 对 | 示例 | |
常量 | |||
乘以常量 | |||
幂 | |||
加法 | |||
减法 | |||
乘法 | |||
链式法则 |
对于,我们常用
或者
代表
向量微积分和偏导介绍
神经网络中的函数往往不会只是一元函数,这里我们来看一下例如
的多元函数。
对于偏导,我们通常用代替
。
例子:
假设,那么:
我们把下面公式成为向量的梯度:
所以,梯度就是它的偏导数的向量。梯度是向量微积分的一部分,它处理将n个标量参数映射到单个标量的函数。现在,让我们同时考虑多个函数的导数。
矩阵微积分
假设,
我们可以得出它们的梯度:,
梯度向量构成了一个特定标量函数的所有偏导数。如果我们有两个函数,我们也可以通过叠加梯度将它们的梯度组织成一个矩阵。
当我们这样做时,我们得到了Jacobian 矩阵(或者仅仅是Jacobian),其中梯度是行。
Jacobian矩阵
在上面我们介绍了一个Jacobian矩阵的特例,下面我们将更详细的介绍什么是Jacobian矩阵。
对于多元函数,其中
代表向量:
对于多个标量值函数,我们可以将它们组合成一个向量,就像我们对参数所做的那样。令是n标量的函数(就像x是n标量),所以
可以展开如下:
例如,我们可以用如下公式来代表,
:
其中分别代表
。
下面介绍的例子,例如
:
所以我们有了的函数和参数。通俗来讲,Jacobian有
的偏导(有一些地方得出来的形式可能有所区别,是下式矩阵的转置):
其中,每一个是n维的水平向量。
下面以方框来直观的表示偏导的维度:
对于,
,
来说:
向量对应元素二元运算的导数
题目可能有点儿绕口,意思就是说第一个向量和第二个向量的第一个元素做运算,第一个向量和第二个向量的第二个元素做运算,……
例如就是对应元素做运算。
我们假对应元素二元运算为:,其中
。
代表任意对应元素运算符(例如+),而不是函数组合运算符。展开
,得到以下公式:
根据上面学的Jacobian,我们可以得出偏导:
链式法则
当我们在计算复杂函数的导数时,只用上面学的知识可能不能求出导数了,这是我们会使用链式法则。
1. 单变量链式法则
如果有一个函数,我们令
,则:
下面让试着我们计算的导数吧!
1. 引入中间变量。令(
的简写):
2. 计算导数。
3. 合并
4. 替换
可以看到计算过程非常的简单,接下来我们再来计算一个更为复杂的函数:
1. 引入中间变量。令(
的简写):
2. 计算导数。
3. 合并
4. 替换
2. 单变量全导数链式法则
我们的单变量链式法则的适用性有限,因为所有中间变量都必须是单变量的函数。但是,它演示了链式法则的核心机制,即把中间子表达式的所有导数乘出来。但是,要处理更一般的表达式,比如,我们需要扩充基本的链式法则。
我们使:
让我们试试会发生什么。如果尝试并且
,根据之前我们学习的,得到
,显然与正确答案
不一样。
因为有多个参数,所以应该引入偏微分。让我们盲目的加入偏微分来看看会得到什么:
有错误!的计算是错误的,因为它违反了偏导数的关键规则:当对x做偏导的时候,其它的变量应该与x相互独立。然而我们可以看到:
,明显是与x有关系的。
正确的全导数的法则是:
使用这个公式,我们得出正确的答案:
我们称一下公式为单变量全导数链式法则:
总导数假设所有变量都是相互依赖的,而偏导数假设除x外所有变量都是常数。
例子
让我们看看嵌套子表达式,例如。我们引入三个中间变量:
偏导为:
例子
例如。我们引入两个中间变量:
偏导为:
3. 向量链式法则
到目前为止,我们已经对全导数练市法则已经有了一定的了解,现在我们来讨论向量链式法则。
假设,展开后:
让我们引入两个中间变量,和
对应每一个
,所以
:
的导数是垂直向量,每个元素是用单变量全导数法则求解出来的:
如果我们分离,把
分离出一个向量,我们会得到一个矩阵乘以一个向量
这意味着雅可比矩阵是另外两个雅可比矩阵的乘积,it's cool!让我们来看看结果:
我们得到了相同的结果!
所以,向量链式法则的公式为:
比较一下单元素链式法则,可以发现基本一样。
为了让多元向量也适用于该公式,我们只需要改变
为
。
其中,,
,
,最后矩阵的大小为
(
的矩阵乘以
的矩阵)