飞桨PaddlePaddle深度学习实战
上QQ阅读APP看书,第一时间看更新

1.2.2 微积分基础

机器学习和深度学习除了需要线性代数的基础知识,还需要一定的微积分基础知识。在机器学习和深度学习计算过程中,反向传播算法(第5章着重讲述)需要用到偏导数求解的知识,而梯度下降算法(第3章着重讲述)需要理解梯度的概念。

1.导数

首先介绍导数的相关知识。导数(Derivative)的直观理解是反映瞬时变化率的量。如图1-1所示,考虑一个实际问题,纵坐标是车辆位移,横坐标是时间,如何知道t1时刻车辆的瞬时速度呢?

获得瞬时速度的核心思想是用平均速度去逼近瞬时速度。这里可以考虑t1和t2,t1在前t2在后,它们之间有一定的时间间隔,这个时间间隔为△t。在这段时间间隔内产生的位移为△s。那么该时间内的平均速度为△s/△t。△t不断缩小,也就是t2不断靠近t1,当t2与t1无限接近几乎重合时,便可以视作t1点的瞬时速率(如图1-1所示)。

图1-1 斜率示意图

导数是从瞬时速度的概念中类比抽象出来的。将瞬时速率拓展到更一般的情形,在更广的函数范围内,根据这种无限逼近的思路,知道任意变量在一点处的变化率(斜率),函数在这一点处的斜率就是导数。在高等数学中更为严谨的定义为:对于定义域和值域都是实域的函数y=f(x),若f(x)在点x0的某个邻域△x内,极限

存在,则称函数y=f(x)在x0处可导,且导数为f'(x0)。

图1-2所示是函数y=4x的曲线,当x=3时,y=12,而当x坐标轴向右移动很小的一段距离0.001时,x=3.001,y=12.004。

这时,定义x发生的变化为dx,dx=0.001,定义y发生的变化为dy,dy=0.004,读者便能计算得到这一小段变化形成的图中三角形的斜率(Slope)为4,此时的斜率便是y=4x在x=3处的导数值f'(3)=Slope=4。当然,这里的0.001只是说明x的变化很小而已,实际上dx是一个无限趋近于0的值,远比0.001要小。类似地,计算x=5时的导数,也能用上述方法,当x=5,y=20,当x=5.001,y=20.004,从而dy=0.004,dx=0.001。函数y=f(x)=4x在x=5处的导数为f'(5)=Slope=dy/dx=4。同样,其他形状的曲线的任意一点的导数,也能用类似的方法计算得到。此外,读者也许会发现,直线的导数在任意一点都相同,为一个确定的值。

图1-2 导数推导计算示意图

上面描述的是在某一点的导数概念,接下来将这个概念推广开来。若函数f(x)在其定义域内包含的每一个点都可导,那么也可以说函数f(x)在这个区间内可导。这样定义函数f'(x)为函数f(x)的导函数,通常也称为导数。函数f(x)的导数f'(x)也可以记作▽xf(x),,以上便是函数与变量的导数的基本知识。

2.偏导数

一个多变量的函数的偏导数(Partial Derivative)就是它关于其中一个变量的导数而保持其他变量恒定(相对于全导数,在全导数中所有变量都允许变化)。简单理解,偏导数就是对多元函数求其中一个未知数的导数,如在含x和y的函数中对x求导,此时是将另一个未知数y看成是常数,相当于对未知数x求导,如式(1-11)、(1-12)所示:

此时称为函数关于x的偏导数,同理,函数关于y的偏导数如式(1-13)所示:

拓展到更为多元的情况下,一个含有多个未知数的函数f',对于其中任意一个变量p求偏导时,只将p视为未知量,其余未知数视为常量(注意只是“视为”)。

特别地,当函数f中本身只含有一个未知数x时,f关于x的导数也就是f关于x的偏导数,如式(1-14)所示:

读者可以参考图1-3所示的例子,J是一个关于a和b的函数,J=f(a,b)=3a+2b:

图1-3 偏导数推导计算示意图

当a不变、b发生变化时,假定b在点(1,2)处发生变化,a=1,b=2,此时J=7。而当b增加0.001时,a=1,b=2.001,此时J=7.002。类比于前一小节推导导数时的方法,偏导数也能用相似的方法推导得到,在点(1,2)处求J关于b的偏导数,由于a不发生变化,所以可以求得J对b的偏导数。用类似的方法,读者也能求得在点(1,2)处,J对a的偏导数。

3.向量的导数

之前介绍的函数都是关于一个标量的函数,如f(x)=x,在这样的函数中变量本身是一个数。但是在机器学习和深度学习中,有时候还需要对向量求导,下面介绍向量的求导方法。

(1)标量对向量求导

首先介绍维度的概念。对于向量而言,向量的维度是一个向量中分量的个数。对于函数而言,其中是数值型变量,这样由数值型变量构成的函数也被称为标量的函数。现有向量x,这样函数f(x)关于向量x的导数仍然是p维向量,导数向量中第i个元素的值为。也即函数对向量求导数,其结果为函数对向量的各个分量求偏导数。

更为严谨的数学定义为,对于一个p维向量x∈Rp,关于标量的函数y=f(x)=f(x1,x2,…,xp)∈R,则y关于x的导数如式(1-15)所示:

(2)向量对向量求导

当函数中是关于向量的函数,函数f本身就可以表示成q维向量,现有向量x=[x1,…,xp]T,p与q不相同时,函数f对于向量x求导,所得到的结果是一个p×q矩阵,其中,第i行第j列的元素为。也即由标量的函数构成的函

数f对向量x求导,其结果为一个矩阵,矩阵的第n行为函数f中的每一个函数,对其求偏导。更为严谨的数学定义为,对于一个p维向量x∈Rp,则f关于x的导数为:

4.导数法则

(1)加减法则(Addition Rule)

两个函数的和(或差)的导数,等于两个函数分别对自变量求导的和(或差)。设y=f(x)并且z=g(x),则两者的和的函数对于同一个变量求导的结果,将会是两个函数对于变量分别求导后求和的结果。

加减法则常常被用于简化求导过程。在一些情形下,往往函数本身是很复杂的,直接求导将会有很高的复杂度,这时利用加减法则,将函数分成两个或者多个独立的简单函数,再分别求导和求和,原本复杂的问题就变得简单了。

在深度学习和机器学习中,加减法则常常用于计算两个直接相连的神经元之间的相互影响。例如,神经网络后一层节点为x,它同时受到前一层的神经元y和z的影响,影响关系为x=y+z,那么当y和z同时变化时,若要计算x所发生的变化,便可通过式(1-17)计算得到。

(2)乘法法则(Product Rule)

学习完导数的加减法则,读者也许会推测乘法法则是否与之相类似,即两个函数乘积的导数等于两个函数分别求导的乘积,答案是否定的。这里以矩阵乘法为例,若x∈Rp,y=f(x)∈Rq,z=g(x)∈Rq,乘积的求导过程将如式(1-18)所示:

乘法法则乍看之下比较抽象,这里用一个实际的例子来说明。如果y的转置代表函数中的系数矩阵,z是自变量矩阵,二者同时对于x求偏导数,所得到的结果将会变成两个部分,一个部分是自变量的矩阵,另一个部分是系数的矩阵。机器学习乘法法则也常常用于计算两个直接相连的神经元之间的相互影响,当后一层神经元C是由前一层神经元A和B通过乘法关系得到的,则可以利用乘法法则计算A和B变化时对C的影响。

(3)链式法则(Chain Rule)

链式法则作为在机器学习和深度学习中最为常用的法则,其重要性毋庸置疑,但链式法则本身不好理解,这里我们以一个函数输入输出流为例来阐释链式法则。

观察以下一组函数,这组函数的输入值是x=(x1,x2)。第一个函数f1是一个求和过程,第二个函数f2是一个求积过程:

把这两个函数值作为输入送给第三个函数g,函数g就是一个关于x1,x2的复合函数,其最终的输出值用y表示。由输入x逐步计算得到结果y的过程如图1-4所示。

图1-4 复合函数计算图

如果由变量到函数是一个正向传递的过程,那么求导便是一个反向的过程(如图1-5所示)。

如果要求得函数g对x1的偏导数,观察图1-5,可以发现其由g节点到x1节点共有两条路径,每条路径由两条有向边组成。每条路径可以看作其经过的边的值的乘积,而两个路径求和就恰巧得到了函数g对x1的偏导数。当我们把函数g看作关于x1,x2的复合函数时,分别求得g对x1和x2的偏导数可以得到式(1-20)所示的结果,这便是复合函数求导的链式法则。

图1-5 复合函数求导计算图

特别地,当f1与f2均为向量函数时,此时链式法则将会发生调整,如式(1-21)所示:

向量求导的链式法则与标量函数的链式法则很相似,只不过求导过程变成了求Jacobi矩阵,Jacobi矩阵定义如式(1-22)所示:

需要注意的是,偏导数链式法则中乘法所用到的都是1.2.1节中提到的元素乘,符号为⊙。

链式法则作为深度学习中最为常用的一条求导法则,常常用于利用反向传播算法进行神经网络的训练工作,我们将在后续章节详细学习。

5.常见的向量和矩阵的导数

这里提供一些常见的向量及矩阵的导数知识,读者在推导神经网络中的导数计算时会用到这些知识。向量对于其本身的导数为单位向量,这一点与标量的计算相类似。当一个数或者一个向量对其本身求导,所得到的结果将是1或者单位向量。反映到深度学习神经网络中神经元的相互影响上,便可以理解为一个神经元如果受到自身变化的影响,那么其自身变化多少,影响的大小就有多少:

向量w和x的乘积,设其为z,那么z对于w求偏导数,其结果为x的转置:

拓展到矩阵,矩阵W和矩阵X的乘积设其为矩阵Z,那么Z对于W求偏导数,其结果为X的转置:

上述规则说明,依照系数向量(或矩阵)反推输入向量(或矩阵),即倘若在神经网络中我们知道了神经元的输出结果和系数向量(或矩阵),我们便能反推得到输入,从而进行验证或其他操作。

矩阵A与向量x的乘积对x求偏导数,其结果为矩阵A的转置AT。这个规则常常用于求解具有Ax关系的神经元之间的相互连接,也即后一个神经元如果收到前一个神经元x的影响是Ax,那么当直接相连的前一个神经元增加(或减少)一个单位时,后一个神经元将相应地增加(或减少)AT个单位:

向量x的转置与矩阵A的乘积对向量x求偏导数,其结果为矩阵A本身。这个规则常常用于求解具有xTA关系的神经元之间的相互连接,也即后一个神经元如果收到前一个神经元x的影响是XTA,那么当直接相连的前一个神经元增加(或减少)一个单位时,后一个神经元将相应地增加(或减少)A个单位。

6.梯度

之前讨论的导数基本上是直接考量函数变化率,梯度(Gradient)则从另一个角度考量函数变化最快的方向。在机器学习和深度学习中梯度下降法用以求解损失函数的最小值。梯度的本意是一个向量,该向量表示某一函数在某一点处的方向导数沿着向量方向取得最大值,即函数在该点处沿着该方向(梯度的方向)变化最快,变化率最大(为该梯度的模)。

在机器学习中,考虑二元函数的情形。设函数z=f(x,y)在平面区域D内具有一阶连续偏导数,则对于每一点P(x,y)∈D,都可以定出一个向量,这个向量称为函数z=f(x,y)在点P(x,y)的梯度,记作grad f(x,y)。如图1-6所示,折线方向便是梯度方向。

图1-6 梯度下降示意图

倘若图1-6中的曲面表示的是损失函数,那么梯度下降方向便是损失函数中损失减少最快的方向。使用梯度可以找到到达最小损失较快的方向,设定一个恰当的初始值和探测步长,就能在最快的速度下找到需要的最小损失值。梯度作为探测损失函数中最小损失的一个“指南针”,避免了寻找一个最小损失值时低效率的枚举情况发生,这对于机器学习和深度学习模型的优化求解具有很重要的意义。