绝大多数网络上对深度学习公式的推导教程notation混乱,而专门介绍Matrix Calculus的材料可能又过于繁杂。其实在深度学习中用到的矩阵微积分并不艰深,看完之后你就可以愉快的进行各种推导了。本文仅作为优秀资源的搬运总结,有余力的同学可以阅读The Matrix Calculus You Need For Deep Learning。
链式法则(Chain Rule)
首先我们介绍单变量链式法则,在本科的微积分课程中大家应该都得到了很好的训练。
例如要计算
的导数,我们可以分解成
,然后分别计算
,然后再相乘得到
。但是考虑下面的例子
,我们是否也能利用链式法则呢?这里我们需要对链式法则做一点改变,也就是下面要介绍的全微分链式法则(total-derivative chain rule)。
2. 全微分链式法则(total-derivative chain rule)
在这个例子中,令
。我们把这个简单的式子写成f(x,u)是为了强调这是关于x和u两个变量的函数,但其实u也是x的函数,所以我们不能只考虑y对u的偏导,还需要考虑u对x的偏导:
。
总结来说,全微分链式法则有如下的表达:
,这里所有的u都是中间变量。
有同学会疑惑为什么要弄的这么复杂,尤其是在上一个例子中一眼就可以看出结果。但是实际上我们用到了微分的线性性,所以直接将两个微分相加。然而这里我们需要统一地运用链式法则,只有这样才能让机器能够计算更加复杂的函数的微分。
3. 向量的链式法则
看完了单变量,我们再将链式法则拓展到向量中。首先我们需要明确一下notation。
3.1 梯度(gradient) / 雅可比矩阵(Jacobian)
梯度大家应该都熟悉了,就是用向量将一个标量函数对各自变量的偏导数表示出来。
而如果函数不再是标量函数,而是向量函数(把向量映射到向量),那么我们需要把各个返回值的gradient都表示出来,这就是雅可比矩阵:
划重点:本文中用的雅可比矩阵的numerator layout,在这种形式下,每个因变量的梯度都作为矩阵的行。如果一个向量函数有n个自变量,m个因变量,那么J是一个m*n的矩阵。牢牢记住你的layout方式对后续的推导非常重要,很多别的文章采用的是denominator layout,也就是这里J的转置。
3.2 向量链式法则
首先我们来看一个例子:
。这里我们需要两个中间变量
。对每个因变量运用全微分链式法则我们得到:
然我们看看第二个等号右边这个复杂的向量,它其实可以写成两部分:
也就是f对g的雅可比矩阵,乘以g对x的雅可比矩阵(在这里是梯度)。看到这里大家应该就明白为什么说layout和全微分的链式法则重要了。更一般地:向量链式法则
时间原因不能把后面的码上来,下篇会介绍各种常用的算子(Operator),以及深度学习中的例子。