月度归档:2022年11月

第1章 概率统计概述

1.1概率与统计的异同

概率(probabilty)和统计(statistics)看似两个相近的概念,其实研究的问题刚好相反。
概率研究的问题是,已知一个模型和参数,怎么去预测这个模型产生的结果的特性(例如均值、方差、协方差等)。
统计研究的问题则相反。统计是,有一堆数据,要利用这堆数据去预测模型和参数。
总之,概率是已知模型和参数,推数据。统计是已知数据,推模型和参数。
显然,本文解释的最大似然估计(Maximum likelihood estimation, 简称MLE)和最大后验概率(Maximum a posteriori estimation, 简称MAP)都是统计领域的问题。它们都是用来推测参数的方法。

1.2概率论的知识体系

图1-1 概率论的知识体系

1.3概率统计在机器学习中的应用

概率研究对象不是预先知道或确定的事情,而是预先不确定或随机的事件,研究这些不确定或随机事件背后的规律或规则。或许有人会说,这些不确定或随机事件有啥好研究?他们本来就不确定或随机的,飘忽不定、不可捉摸。表面上看似如此,有句话说得好:偶然中有必然,必然中有偶然。就拿我们比较熟悉微积分来说吧,如果单看有限的几步,很多问题都显得杂乱无章,毫无规律可言,而且还很难处理,但是一旦加上一个无穷大(∞)这个“照妖镜”,其背后规律立显,原来难处理的也好处理了。如大数定律、各种分布等带给我们这样的认识。
机器学习、深度学习与概率、信息论有哪些内在关联呢?
(1)被建模系统内在的随机性。例如一个假想的纸牌游戏,在这个游戏中我们假设纸牌被真正混洗成了随机顺序。
(2不完全观测。即使是确定的系统,当我们不能观测到所有驱动系统行为的所有变量或因素时,该系统也会呈现随机性。
(3)不完全建模。假设我们制作了一个机器人,它可以准确观察周围每一个对象的位置。在对这些对象将来的位置进行预测时,如果机器人采用的是离散化的空间,那么离散化的方法将使得机器人无法确定对象们的精确位置:因为每个对象都可能处于它被观测到的离散单元的任何一个角落。也就是说,当不完全建模时,我们不能明确的确定结果,这个时候的不确定,就需要借助概率来处理。
由此看来,概率、信息论很重要,机器学习、深度学习确实很需要它们。后续我们可以看到很多实例,见证概率、信息论在机器学习、深度学习中是如何发挥它们作用的。

第7章带约束的优化问题

带约束条件的最优化问题,约束条件一般分为两种,一种是等式约束;另一种是不等式约束。对于第一种等式约束的优化问题,可以直接利用拉格朗日乘子法去获得最优解;对于不等式约束的优化问题,可以转化为Karush–Kuhn–Tucker conditions(KKT条件)下应用拉格朗日乘数法求解。两种情况都应用拉格朗日乘数法,给出优化问题的必要条件。

7.1 拉格朗日乘数法

拉格朗日乘数法(又称为拉格朗日乘子法),就是求函数f(x_1,x_2,\cdots,x_n)在等式约束函数h(x_1,x_2,\cdots,x_n)=0或不等式约束函数g(x_1,x_2,\cdots,x_n)\le 0的约束条件下的极值的方法。其主要思想是引入一个新的参数λ(即拉格朗日乘子),将约束条件函数与原函数联系到一起,配成与变量数量相等的等式方程,从而求出原函数极值的必要条件。
假设向量x= (x_1,x_2,\cdots,x_n),目标函数为f(x),等式约束函数为h(x),不等式约束函数为g(x)
求等式约束条件下的极值问题:
\underset{\rm x}{min}f(\rm{x})
s.t.h(\rm x)
利用拉格朗日乘数法构造拉格朗日乘子函数:
L(\rm x,u)=f(\rm x)+uh(\rm x) \tag{7.1}
其中参数u称为拉格朗日乘子。利用拉格朗日乘数法把有约束的极值问题,转换为无约束的极值问题。对拉格朗日乘子函数的所有自变量(x及参数u)求导,并令其为0,就可得到函数的候选极值点。
\nabla_{\rm x} L(\rm x,u)=\nabla_{\rm x} f(\rm x)+u\nabla_{\rm x} h(\rm x)=0 \tag{7.2}
 \nabla_u L(\rm x,u)=h(\rm x)=0 \tag{7.3}
由式(7.2)可知,在极值点目标函数的梯度是约束函数梯度的倍数,即这两个梯度是平行的关系,如图7-1所示。如果有多个等式约束函数,目标函数的梯度是约束函数梯度的线性组合。

图7-1 f(x)的等高线与约束函数h(x)等高线在切点的梯度互相平行
【说明】f(x)的梯度是等高线的法向量。以二维空间为例,假设而为函数f(x,y)
根据微分定义:
f(x+\Delta x,y+\Delta y)\approx f(x,y)+\frac{\partial f}{\partial x}\Delta x+\frac{\partial f}{\partial y}\Delta y=(\frac{\partial f}{\partial x},\frac{\partial f}{\partial y})\left(\begin{matrix}\Delta x\\ \Delta y\end{matrix}\right)
(\Delta x,\Delta y)表示函数f(x)等高线的方向,当\Delta x \longrightarrow 0,\Delta y \longrightarrow 0时,(\frac{\partial f}{\partial x},\frac{\partial f}{\partial y})\left(\begin{matrix}\Delta x\\ \Delta y\end{matrix}\right)\longrightarrow 0
即等高线的方向与f(x)的梯度互相垂直。
例1:利用拉格朗日乘数法求如下极值问题
\underset{x,y}{min}(x^2+y^2)
s.t. xy-3=0
(1)构建拉格朗日乘子函数
L(x,y,u)=x^2+y^2+u(xy-3)
对自变量及乘子变量求导,并令其为0,可得如下方程组:
\frac{\partial L}{\partial x}=2x+uy=0
\frac{\partial L}{\partial y}=2y+ux=0
\frac{\partial L}{\partial u}=xy-3=0
解得:
u=-2,x=\sqrt 3,y=\sqrt 3x=-\sqrt 3,y=-\sqrt 3
目标函数(x^2+y^2)的海塞矩阵为:
\left(\begin{matrix}{\frac{\partial^2 f}{\partial x^2}}&{\frac{\partial^2 f}{\partial x{\partial y}}}\\{\frac{\partial^2 f}{\partial y{\partial x}}}&{\frac{\partial^2 f}{\partial y^2}}\end{matrix}\right)=\left(\begin{matrix}{2}&0 \\ {0}&2\end{matrix}\right)
为正定矩阵,故目标函数是凸函数,有极小值。极值点与等高线之间的位置见图7-2所示

图7-2 极值点的位置示意图
实现图72-的python代码:

求不等式约束条件下的极值问题:
前面介绍了等式约束的极值问题,通常面对更多的是不等式条件约束的情况,对这种情况,其取得极值的必要条件为KKT条件(非充分条件,如果优化问题为优化问题,则是充分条件)。
\underset{\rm x}{min}f(\rm{x})
s.t. g(\rm x)\leq 0
利用拉格朗日乘数法构造拉格朗日乘子函数:
L(\rm x,\lambda)=f(\rm x)+\lambda g(\rm x)
其中参数\lambda称为拉格朗日乘子,g(\rm x)\leq 0
对不等式约束,极值点与不等式构成的区域有2种情况,如图7-3所示。
(1)极值点在g(x)<0区域内,如图7-3(a),这就是没有限制条件下的极值点,不等式约束不起作用,可以直接最小化目标函数,求得极值点x^*,由此可得:
\nabla_{x^*} f(x^*)=0,\lambda=0,g(x^* )<0

图7-3  极值点在约束区域的位置

(2)极值点在g(x)=0上,如图7-3(b)所示。 这种情况,约束条件起作用,所以\lambda \neq 0,g(x)=0。这样问题就相当于等式约束问题,由此可得极值点满足: \nablaf(x^* )=-\lambda\nabla g(x^*) 由图7-1可知,梯度\nabla f(x)与梯度\nabla g(x)平行且方向相反,为此需要\lambda > 0,即有:
g(x^* )=0,\lambda > 0
综合以上两种情况,就得到在不等式约束的条件下,获取极值点的必要条件为:
\lambda \geq 0,\lambda g(x^*)=0,g(x^* )\leq 0
这实际上就是KKT条件的核心内容。
接下来简单介绍KKT条件的完整信息。

例2:求下例问题的极值

目标函数为凸函数,解得最小值为:x=y=1
目标函数最优点的位置如图7-4所示。

图7-4 目标函数与约束函数等高线及最优点位置

7.2 KKT条件

KKT条件是求带等式、不等式约束问题极值的一阶必要条件,是拉格朗日乘数法的推广,对于如下的优化问题:

【说明】KKT条件只是取得极值的必要条件,而非充分条件。如果是一个凸优化问题,KKT条件是取得极值的充分必要条件。

第6章改进梯度下降法

优化器在机器学习、深度学习中往往起着举足轻重的作用,同一个模型,因选择不同的优化器,性能有可能相差很大,甚至导致一些模型无法训练。所以,了解各种优化器的基本原理非常必要。本节重点介绍各种优化器或算法的主要原理,及各自的优点或不足。
梯度下降法的最大优点就是沿下降最快的方向迭代。但不足之处也不少。梯度下降法对学习率表敏感,而且迭代过程中始终不变,这是一个可以改进的地方;另外,梯度越到极值点就越小,或在比较平滑的地方梯度也很小,以至于趋近于0,这是可改进的另一个地点。接下来就这些改进进行说明。这些改进涉及一个重要概念指数加权平均,所以,先介绍这个概念的来源及其优点等。

6.1 指数加权平均法

表1常用平均法比较

【说明】

①F_(t-1)表示前期预测值
②F_t表示当前预测值
③x_t当前实际值
④α权重参数

指数加权平均法可参考:
https://zhuanlan.zhihu.com/p/32335746

6.2传统梯度优化的不足

传统梯度更新算法为最常见、最简单的一种参数更新策略。其基本思想是:先设定一个学习率λ,参数沿梯度的反方向移动。假设基于损失函数L(f(x,θ),y),其中θ需更新的参数,梯度为g,则其更新策略的伪代码如下所示:
这种梯度更新算法简洁,当学习率取值恰当时,可以收敛到全面最优点(凸函数)或局部最优点(非凸函数)。
但其不足也很明显,对超参数学习率比较敏感(过小导致收敛速度过慢,过大又越过极值点),如图6-1的右图所示。在比较平坦的区域,因梯度接近于0,易导致提前终止训练,如图6-1的左图所示,要选中一个恰当的学习速率往往要花费不少时间。
图6-1学习速率对梯度的影响
学习率除了敏感,有时还会因其在迭代过程中保持不变,很容易造成算法被卡在鞍点的位置,如图6-2所示。

图6-2算法卡在鞍点示意图
另外,在较平坦的区域,因梯度接近于0,优化算法往往因误判,还未到达极值点,就提前结束迭代,如图6-3所示。

图6-3在较平坦区域,梯度接近于0,优化算法因误判而提前终止迭代
传统梯度优化方面的这些不足,在深度学习中会更加明显。为此,人们自然想到如何克服这些不足的问题。从本小节前文更新策略的伪代码可知,影响优化的主要因素有:
•优化梯度方向
•优化学习率
•参数的初始值
•优化训练数据集的大小
所以很多优化方法大多从这些方面入手,数据集优化方面采用批量随机梯度下降方法,从梯度方向优化方面有动量更新策略;有些从学习率入手,这涉及自适应问题;还有从两方面同时入手等方法,接下来将介绍这些方法。

6.3 动量算法

动量(momentum)是模拟物理里动量的概念,具有物理上惯性的含义,一个物体在运动时具有惯性,把这个思想运用到梯度下降计算中,可以增加算法的收敛速度和稳定性,具体实现如图6-4所示。
图6-4动量算法示意图
由图6-4所示,可知动量算法每下降一步都是由前面下降方向的一个累积和当前点的梯度方向组合而成。
含动量的随机梯度下降法,其算法伪代码如下:
其中parameters是模型参数,假设模型为model,则parameters指model. parameters()。
具体使用动量算法时,动量项的计算公式如下:
v_k=\alpha v_{k-1}-\lambda \hat g(\theta_k)\tag{6.1}
其中\lambda为学习率,\alpha为动态因子(一般取值为0.9)。如果按时间展开,则第k次迭代使用了从1到k次迭代的所有负梯度值,且负梯度按动量系数\alpha指数级衰减,相当于使用了移动指数加权平均,具体展开过程如下:
由此可知,当在比较平缓处,但\alpha=0.5,0.9 时,将是分别是梯度下降法的2倍、10倍。
使用动量算法,不但可加速迭代速度,还可能跨过局部最优找到全局最优,如图6-5所示。
图6-5 使用动量算法的潜在优势
每个参数的实际更新差值取决于最近一段时间内梯度的指数加权平均值。
当某个参数在最近一段时间内的梯度方向振幅较大时,其真实的参数更新幅度变小,增加稳定性;相反,当在最近一段时间内的梯度方向都一致时,其真实的参数更新幅度变
大,起到加速作用。
我们以求解函数f(x_1,x_2)=0.05x_1^2+2x_1^2极值为例,使用梯度下降法和动量算法分别进行迭代求解,具体迭代过程如图6-6、图6-7所示(图实现代码请参考本书第5章代码部分)。
图6-6 梯度下降法的迭代轨迹 图6-7 使用动量项的迭代轨迹
从图6-6 可以看出,不使用动量算法的SGD学习速度比较慢,振幅比较大;图6-7 可以看出,使用动量算法的SGD,振幅较小,而且较快到达极值点。
批量随机梯度下降法PyTorch代码实现:

6.4 Nesterov动量算法

既然每一步都要将两个梯度方向(历史梯度、当前梯度)做一个合并再下降,那为什么不先按照历史梯度往前走那么一小步,按照前面一小步位置的“超前梯度”来做梯度合并呢?如此一来,可以先往前走一步,在靠前一点的位置(如图6-8中的C点)看到梯度,然后按照那个位置再来修正这一步的梯度方向,如图6-8所示。

图6-8 Nesterov下降法示意图
这就得到动量算法的一种改进算法,称为NAG(Nesterov Accelerated Gradient)算法,也称Nesterov动量算法。这种预更新方法能防止大幅振荡,不会错过最小值,并对参数更新更加敏感。如图6-9所示。
图6-9 Nesterov加速梯度下降法
NAG下降法的算法伪代码如下:
NAG算法的PyTorch实现如下:

NAG动量法和经典动量法的差别就在B点和C点梯度的不同。动量法,更多关注梯度下降方法的优化,如果能从方向和学习率同时优化,效果或许更理想。事实也确实如此,而且这些优化在深度学习中显得尤为重要。接下来我们介绍几种自适应优化算法,这些算法同时从梯度方向及学习率进行优化,效果非常好。

6.5 AdaGrad算法

传统梯度下降算法对学习率这个超参数非常敏感,难以驾驭;对参数空间的某些方向也没有很好的方法。这些不足在深度学习中,因高维空间、多层神经网络等因素,常会出现平坦、鞍点、悬崖等问题,因此,传统梯度下降法在深度学习中显得力不从心。还好现在已有很多解决这些问题的有效方法。上节介绍的动量算法在一定程度缓解对参数空间某些方向的问题,但需要新增一个参数,而且对学习率的控制还不很理想。为了更好驾驭这个超参数,人们想出来多种自适应优化算法,使用自适应优化算法,学习率不再是一个固定不变值,它会根据不同情况自动调整来适用情况。这些算法使深度学习向前迈出一大步!这节我们将介绍几种自适应优化算法。
AdaGrad算法是通过参数来调整合适的学习率λ,能独立地自动调整模型参数的学习率,对稀疏参数进行大幅更新和对频繁参数进行小幅更新,如图6-10所示。因此,Adagrad方法非常适合处理稀疏数据。AdaGrad算法在某些深度学习模型上效果不错。但还有些不足,可能因其累积梯度平方导致学习率过早或过量的减少所致。
图6-10 AdaGrad 算法迭代过程示意图
AdaGrad算法伪代码如下:
由上面算法的伪代码可知:
•随着迭代时间越长,累积梯度r越大,从而学习速率\frac{\lambda}{\delta+\sqrt{r}}随着时间就减小,在接近 目标值时,不会因为学习速率过大而越过极值点。
•不同参数之间学习速率不同,因此,与前面固定学习速率相比,不容易在鞍点卡住。
•如果梯度累积参数r比较小,则学习速率会比较大,所以参数迭代的步长就会比较大。相反,如果梯度累积参数比较大,则学习速率会比较小,所以迭代的步长会比较小。
AdaGrad算法的PyTorch实现代码:

6.6 RMSProp算法

RMSProp算法修改AdaGrad,为的是在非凸背景下的效果更好,在凸函数可能振幅较大,如图6-11所示。对梯度平方和累计越来越大的问题,RMSProp指数加权的移动平均代替梯度平方和。RMSProp为使用移动平均,引入了一个新的超参数ρ,用来控制移动平均的长度范围。
图6-11 RMSProp迭代过程示意图
RMSProp算法伪代码如下:
RMSProp算法在实践中已被证明是一种有效且实用的深度神经网络优化算法,在深度学习中得到广泛应用。
RMSProp算法PyTorch实现代码如下:

6.7 Adam算法

Adam(Adaptive Moment Estimation,自适应矩估计)算法本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳,如图6-12所示。
图6-12 Adam算法迭代过程示意图
Adam算法是另一种学习速率自适应的深度神经网络方法,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习速率。Adam算法伪代码如下:

Adam算法的PyTorch实现如下。

6.8 Yogi算法

Adam算法综合了动量算法及自适应算法的优点,是深度学习常用的算法,但也存在一些问题:即使在凸环境下,当 r的第二力矩估计值爆炸时,它可能无法收敛。为此可通过改进r和优化参数初始化等方法来解决。 其中通过改进r是一种有效方法,即把r\longleftarrow \rho_2 r +(1-\rho_2) \hat g^2(等价于r\longleftarrow r +(1-\rho_2)(\hat g^2-r)\hat g^2-r改为\hat g^2\odot sgn(\hat g^2-r),这就是Yogi更新。
Yogi算法的PyTorch代码如下:

前文介绍了深度学习的正则化方法,它是深度学习核心之一;优化算法也是深度学习的核心之一。优化算法很多,如随机梯度下降法、自适应优化算法等,那么具体使用时该如何选择呢?
RMSprop、Nesterov、Adadelta和Adam被认为是自适应优化算法,因为它们会自动更新学习率。而使用SGD时,必须手动选择学习率和动量参数,通常会随着时间的推移而降低学习率,下图是这些优化算法之间的关系:
图6-13 改进梯度下降法之间的关系
有时可以考虑综合使用这些优化算法,如采用先用Adam,然后用SGD优化方法,这个想法,实际上由于在训练的早期阶段SGD对参数调整和初始化非常敏感。因此,我们可以通过先使用Adam优化算法进行训练,这将大大节省训练时间,且不必担心初始化和参数调整,一旦用Adam训练获得较好的参数后,我们可以切换到SGD +动量优化,以达到最佳性能。采用这种方法有时能达到很好效果,如图6-14所示,迭代次数超过150后,用SGD效果好于Adam。

图6-14迭代次数与测试误差间的对应关系
注意算法比较:
图6-15 多种改进算法运行效果比较
从图6-15可知,SGD迭代一定次数后,收敛很慢;Momentum要好于SGD,但Adma下降最快,而且性能也最好。

6.9 权重初始化

在机器学习中,如何初始化权重非常重要,如果初始化不当,将直接导致无法收敛。比例如果把权重初始化为0或全为一样的值,多一个多维矩阵,如一个mxn的权重参数w,在误差反向传播时,所以的权重都会进行相同的更新,通过多次迭代后,可能更新为相同的值,这就严重偏离了源数据分布。所以为防止权重均一化,必须随机生成初始值(一般使随机初始化的数据满足正态分布)。
是否我们就一概为把权重参数都随机生成就成了呢?在实际操作时,我们还需要进一步分析,权重参数的正向传播和反向传播过程中,还受激活函数的影响。一般来说,对对称型的激活函数,如果sigmoid、softmax、tanh等,对随机生成的满足正态分布的数据,还需要考虑前一层的网络节点数(假设前一层的网络层输出节点数为n),如下图所示。使正态分布的标准差除以√(n+m) ,以使数据呈现更稳定和更有代表性,这种初始化方法称为Xavier初始化。
图6-16 权重初始化的输入节点、输出节点数
对于非对称的激活函数(如ReLU、Leak-ReLU等),因这些激活函数本身偏置(如ReLU激活函数把小于0的都置为0),为使数据更有广度、还需要对标准差惩罚力度减少一点,一般使参数初始化的范围比原来扩大一倍,这种初始化方法称为Kaiming_He初始化。以下是各种初始化小结:
【说明】其中m、n分别表示权重矩阵W的输入、输出节点数,详细含义请参考上图。
如果对卷积核参数的初始化,PyTorch中缺省采用Kaiming_He初始化中均匀分布。大家可从conv.py源码中找到:
init.kaiming_uniform_(self.weight, a=math.sqrt(5))
偏置的初始化源码为:
bound = 1 / math.sqrt(fan_in)
init.uniform_(self.bias, -bound, bound)
(1)PyTorch代码实现:
•Xavier初始化:
torch.nn.init.xavier_normal_(tensor, gain=1)
torch.nn.init.xavier_uniform_(tensor, gain=1)
•Kaiming_He初始化:
torch.nn.init.kaiming_uniform_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')
torch.nn.init.kaiming_normal_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')
(2)NumPy实现
np.random.uniform(-r,r)
np.random.randn(n,m)*σ

第5章 梯度下降法

机器学习中一项重要任务就是求目标函数(或称为损失函数)的极小值或极大值。通过求目标函数的极值来确定相关权重参数,从而确定模型。如何求目标函数(注,这里的目标函数如果没有特别说明,一般指凸函数)的极值?最常用的一种方法就是梯度下降法。接下来我们将介绍梯度下降法及几种变种方法。

5.1.梯度下降法

梯度不仅是走向极值的方向,而且是下降最快的方向。
假设函数f(x)的有最小值,如图5-4所示。梯度下降法的数学表达式为:
x_1=x_0-\lambda\nabla f(x_0)
其中
1、参数λ称为步长或学习率,
图5-1 学习率对寻找最优点过程的影响
2、这里为何取梯度的负值?
从图5-2可知,无论从左到右还是从右到左,沿梯度的负方向都是指向极小值(如果梯度正方向将指向函数的极大值)。

图5-2 梯度下降法示意图
如何理解沿梯度是函数值下降最快的方向呢?下面进行简单说明。
根据导数的定义及泰勒公式,可得函数梯度与函数增量、自变量增量之间的关系。
f(x+\nabla x)-f(x)=(\nabla f(x))^T \nabla x+o(||\nabla x||)
如果\nabla x足够小,则可以忽略高阶无穷小项,从而得到:
f(x+\nabla x)-f(x)\approx(\nabla f(x))^T \nabla x
由于(\nabla f(x))^T \nabla x=||\nabla f(x)||?||\nabla x||cos\theta
其中\theta\nabla f(x)\nabla x之间的夹角,由于-1\leq cos\theta\leq 1,因此,
如果\nabla x=-\nabla f(x),cos\theta=-1,此时,当||\nabla f(x)||||\nabla x||一定时,沿梯度的反方向下降最快。
【说明】为何取负梯度?
求极小值,梯度的方向实际就是函数在此点下降最快的方向!而我们需要朝着下降最快的方向走,自然就是负的梯度的方向,所以此处需要加上负号。
如果求极大值,则取梯度的正方向即可。

5.2 单变量函数的梯度下降法

假设函数f(x)=x^2+3,
使用梯度下降法,得到极值点。具体采用迭代法,沿梯度方向(或梯度负方向)逐步靠近极值点,如下图所示:

具体实现方法:

用迭代法求函数f(x)=x^2+3的最优点。

用python代码实现:

运行结果:
x1:0.4000
x2:0.0800
x3:0.0160
x4:0.0032
x5:0.0006
x6:0.0001
x7:0.0000
练习:用梯度下降法求函数f(x)=(x-1)^2+2的极值点(迭代3次或以上),并用python实现这个过程。

5.3 多变量函数的梯度下降法

如何用梯度下降方法求极值?以下通过一个简单示例来说明。
假设f(X)=x_1^2+x_2^2,该函数的最小值点为(0,0),用梯度下降法来一步步逼近这个最小值点。
假设从点(1,3)开始,学习率设为\eta=0.1,函数f(X)的梯度为:
\nabla f(X)=(2x_1,2x_2)
梯度方向是下降最快的方向,如下图所示:

实现上图的python代码:


用Python实现代码以上过程:

运行结果
x1:0.1074,x2:0.3221
x1:0.0115,x2:0.0346
x1:0.0012,x2:0.0037
x1:0.0001,x2:0.0004
x1:0.0000,x2:0.0000
练习:
用梯度下降法求函数f(x_1,x_2)=(x_1-1)^2+(x_2-1)^2的最优点,并用python实现并可视化。

5.4 梯度下降法的应用

梯度可以通过迭代的方法来求极值点,但更重要的作用是通过这个过程,来求梯度中的权重参数,从而确定模型。
例如,
求梯度时,往往涉及很多样本,根据这些样本更新参数。每次更新时,如何选择样本是有讲究的。
如果样本总数不大,我们每次更新梯度时,可以使用所有样本。但如果样本比较大,如果每次都用所有样本更新,在性能上不是一个好的方法,这时我们可以采用其它方案,这样既保证效果,又不影响性能。训练时根据样本选择方案不同,大致可分为:
(1)随机梯度下降法
每次求梯度时,不是使用所有样本的数据,而是每次随机选取一个样本来求梯度。这种方法每次更新梯度较快,但这种方法更新梯度振幅较大,如果样本较大,这样方法也非常耗时,效果也不很理想。
(2)批量梯度下降法
针对随机梯度下降法的不足,人们又想到一个两全其美的方法,即批量随机梯度下降法,这种方法每次更新梯度时,随机选择一个批量来更新梯度。这种方法有更好稳定性,同时性能方面也不错,尤其适合与样本比较大时,优势更加明显。
用梯度下降法拟合一条直线:
h_{\theta} (x)={\theta}_1 x+{\theta}_0
其中:\theta_0 ,\theta_1为参数。
假设y为真实值,根据不同的样本x,代入h_{\theta}(x)便可得到预测值。
我们的目标是尽量使真实值y与预测值h_{\theta}(x)尽可能接近,换句话,就是使它们之间的距离,通过不断学习样本,不断更新参数\theta=[\theta_0,{\theta}_1],使以下目标函数的值最小。
L(\theta_0,\theta_1)=\frac{2}{m}\sum_{i=1}^m(y^i-h_{\theta}(x^i))^2
即:\underset{\theta_0,\theta_1}{lim}L(\theta_0,\theta_1)
使用批量梯度下降法处理以上这个回归问题,具体算法如下:
\theta_i=\theta_i-\lambda\frac{\partial}{\partial\theta_i}L(\theta_0,\theta_1),i=0,1
写成矩阵的形式:
h_{\theta}(x)=\theta_0+\theta_1 x_1+\cdots+\theta_n x_n
用X表示m个样本:X=\left(\begin{matrix}1&x_1^1&\cdots&x_n^1 \\ \vdots&\vdots&\ddots&\vdots \\ 1&x_1^m&\cdots&x_n^m\end{matrix}\right),这是一个m\times(n+1)矩阵
\theta=\left(\begin{matrix}\theta_0 \\ \theta_1\\ \vdots \\ \theta_n\end{matrix}\right) 这是一个(n+1)\times1矩阵
X\theta内积的形状为:m\times1
Y=\left(\begin{matrix}y_1 \\ y_2\\ \vdots \\ y_m\end{matrix}\right)这是一贯mx1向量,
使用矩阵向量方式定义损失值:

5.5 用Python实现批量梯度下降法

批量梯度下降法用Python实现:

训练模型并可视化运行结果

运行结果如下:
最终j_history值:
[0.10784944]
最终theta值:
[[-0.27223179]
[ 0.6187312 ]]
可视化结果如下:

【说明】

5.6np.array与np.mat的区别

1.生成数组所需数据格式不同
np.mat可以从string或list中生成;而np.array只能从list中生成。
2.生成的数组计算方式不同
np.array生成数组,用np.dot()表示内积,(*)号或np.multiply()表示对应元素相乘。
np.mat生成数组,(*)和np.dot()相同,都表示内积,对应元素相乘只能用np.multiply()。
3.生成维度不同
np.mat只生成2维,np.array可生成n维。
建议使用array格式,因很多numpy函数返回值都是array格式。

5.7 用Python实现随机梯度下降法

1.定义损失函数、梯度函数

2.运行梯度函数及可视化运行结果

3.运行结果
最终j_history值:
[0.07909981]
最终theta值:
[-0.25281579 0.60842649]

【练习】
把数据集改为:
m = 100000
x1 = np.random.normal(size = m)
X = x1.reshape(-1,1)
y = 4. * x1 + 3. +np.random.normal(0,3,size = m)
x= np.hstack([np.ones((len(x1),1)), X])

第4章 梯度

偏导数是对一个变量求导,它只反应函数与一个自变量之间的关系,无法反应所有自变量与函数的关系。梯度则连接函数所有自变量的导数,综合了对所有自变量的关系,对单变量而言,梯度就是微分;对多变量函数而言,它是多元函数对多个自变量偏导数形成的向量。

4.1 单变量函数的梯度

对单变量函数(如f(x)=3x^2+4),其微分就是梯度,梯度通常用倒三角(\nabla)表示:
如函数f(x)在点x处的梯度,可表示为
\nabla f(x)=D(f(x))=\frac{df}{dx}=6x
函数f(x)在点x的梯度就是函数在该点的切线斜率。

4.2 多变量函数的梯度

多变量函数(如f(x,y)=3x^2+xy+y^2+1)的梯度
对多变量函数,如y=f(x_1,x_2,\cdots,x_n),则函数y的梯度是对所有自变量的偏导数构成的向量,表示如下:
\nabla f(x)=[\frac{\partial f}{\partial x_1},\frac{\partial f}{\partial x_2},\cdots,\frac{\partial f}{\partial x_n}]^T
梯度的方向就是函数给定点上升最快的方向,梯度的反方向是函数在给定点下降最快的方向。
梯度有什么作用呢?它是寻找函数极值的重要依据,下节将详细介绍。

4.3梯度与梯度直方图(HOG)

图像的梯度(x和y导数)非常有用,因为边缘和拐角(强度突变的区域)周围的梯度幅度很大,并且边缘和拐角比平坦区域包含更多关于物体形状的信息。
方向梯度直方图(Histogram of Oriented Gradient,HOG)

4.3.1图像梯度

梯度的方向是函数 f(x,y) 变化最快的方向,当图像中存在边缘时,有一些相邻像素的灰度值变化比较大,即一定有较大的梯度值。所以可以求图像的梯度来确定图像的边缘。
图像梯度是指图像某像素在x和y两个方向上的变化率(与相邻像素比较),是一个二维向量,由2个分量组成,X轴的变化、Y轴的变化 。
其中X轴的变化是指当前像素右侧(X加1)的像素值减去当前像素左侧(X减1)的像素值,如下图所示:

同理,Y轴的变化是当前像素下方(Y加1)的像素值减去当前像素上方(Y减1)的像素值。
计算出来这2个分量,形成一个二维向量,就得到了该像素的图像梯度。
分别对图像按照x方向和y方向进行求偏导,得到x梯度图和y梯度图。
导数的含义就是计算像素灰度值的变化率,对于离散图像而言,在图像上使用一阶差分来计算相邻像素之间的差值,从而得到图像的梯度。
下面这个公式表示了图像的梯度:
\begin{aligned}\nabla f &=\left(\begin{matrix}f_x \\ f_y\end{matrix}\right)\\ &=\left(\begin{matrix}\frac{\partial f(x,y)}{\partial x}\\ \frac{\partial f(x,y)}{\partial y}\end{matrix}\right) \\&=\left(\begin{matrix}{f(x+1,y)-f(x-1,y)} \\ {f(x,y+1)-f(x,y-1)}\end{matrix}\right)\\&=\left(\begin{matrix}{55-105} \\ {90-40}\end{matrix}\right) \\&=\left(\begin{matrix}{-50} \\ {50}\end{matrix}\right)\end{aligned}
梯度是矢量,存在幅值和方向。
梯度的幅值(magnitude)为:
g=\sqrt{f_x^2+f_y^2}=\sqrt{(-50)^2+(50)^2}=70.71
如果g大于某阈值,则认为该点(x,y)为边缘点。
梯度的方向(direction)为:
tanh^{-1}(\frac{f_x}{f_y})=(\frac{-50}{50})=-45^0
也可以使用二阶差分求梯度:
\frac{\partial^2 f(x,y)}{\partial x^2}=f(x+1,y)+f(x-1,y)-2f(x,y)
\frac{\partial^2 f(x,y)}{\partial y^2}=f(x,y+1)+f(x,y-1)-2f(x,y)
下面为一个有关边缘求导的示意图:

图片中的大部分边缘都不是突变的而是渐变的,对于斜坡区域,一阶导数将斜坡变成了平坦区域即变成了粗线,二阶导数将斜坡变成了两条中间存在平台区域的细线。

4.3.2边缘提取

在图像上除使用一阶差分来计算相邻像素之间的变化率外,我们还可以利用卷积和特定的算子来计算相邻像素的变化率。prewitt算子和sobel算子可以计算相邻三个点之间的变化率。它们用于一阶算子的边缘检测,利用像素点上下、左右相邻点的灰度差求取边缘。
求梯度有三种卷积核(robert,prewitt,sobel算子),每种卷积核有两个,对图像分别做两次卷积,一个代表水平梯度,一个代表垂直梯度。
1、Prewitt算子
Prewitt的两个算子
计算水平梯度,检测垂直边缘。
\left(\begin{matrix}-1&0&1 \\ -1&0&1 \\ -1&0&1\end{matrix}\right)
计算垂直梯度,检测水平边缘。
\left(\begin{matrix}-1&-1&11 \\ 0&0&0 \\ 1&1&1\end{matrix}\right)
2.sobel算子
Sobel算子是典型的基于一阶导数的边缘检测算子,由于该算子中引入了类似局部平均的运算,因此对噪声具有平滑作用,能很好的消除噪声的影响。Sobel算子在Prewitt算子的基础上进行了改进,增强了中间位置的权重。与Prewitt算子、Roberts算子相比效果更好。
计算水平梯度,检测垂直边缘。
\left(\begin{matrix}-1&0&1 \\ -2&0&2 \\ -1&0&1\end{matrix}\right)
计算垂直梯度,检测水平边缘。
\left(\begin{matrix}-1&-2&-1 \\ 0&0&0 \\ 1&2&1\end{matrix}\right)
Sobel更强调了和边缘相邻的像素点对边缘的影响。相比较Prewitt算子,Sobel算子能够较好的抑制噪声效果。
假设原图像矩阵为A
则有:
f_x=\left(\begin{matrix}-1&0&1 \\ -2&0&2 \\ -1&0&1\end{matrix}\right)*A
f_y=\left(\begin{matrix}-1&-2&-1 \\ 0&0&0 \\ 1&2&1\end{matrix}\right)*A

4.3.3 sobel算子实例

运行结果:

执行sobel算子

运行结果

4.3.4 sobel算子与卷积核

sobel算子与卷积神经网络中的卷积核功能类似。这是卷积核有一个不足:就是提取概要信息,随着层数的增加将不可避免丢失很多信息,为避免这个问题,人们提出残差网络等方法弥补其不足。
【延伸思考】算子不同方向的偏导与卷积核的不同通道的作用有何异同?

第3章 偏导数与矩阵

3.1.黑塞矩阵

费马定理给出了多元函数极值的必要条件,黑塞矩阵的正定性是极值的充分条件。此外,黑塞矩阵与多元函数的极值、凹凸性有密切的关系。
黑塞矩阵是由多元函数的二阶偏导数组成的矩阵,假设函数f(x_1,x_2,\cdots,x_n)二阶可导,黑塞矩阵由所有二阶偏导数构成,函数f(x_1,x_2,\cdots,x_n)的黑塞矩阵定义为:
\nabla(\nabla f(x))=\nabla^2f(x)=\left(\begin{matrix}{\frac{\partial^2 f}{\partial x_1^2}}&\cdots& {\frac{\partial^2 f}{\partial x_1{\partial x_n}}}\\ {\vdots}&\cdots&\vdots \\ \frac{\partial^2 f}{{\partial x_n}{\partial x_1}}&\cdots&{\frac{\partial^2 f}{\partial x_n^2}}\end{matrix}\right)
这是一个n阶矩阵,一般情况下,多元函数的混合二阶偏导数与次序无关,即:
\frac{\partial^2 f}{\partial x_i\partial x_j}=\frac{\partial^2 f}{\partial x_j\partial x_i}
因此,黑塞矩阵是一个对称矩阵。
费马引理给出了多元函数极值的必要条件,极值的充分条件由黑塞矩阵的正定性决定。
例1:求函数f(x,y,z)=2x^2-xy+y^2-3z^2的黑塞矩阵。
函数f的黑塞矩阵为:
\left(\begin{matrix}{\frac{\partial^2 f}{\partial x^2}}&{\frac{\partial^2 f}{\partial x{\partial y}}}& {\frac{\partial^2 f}{\partial x{\partial z}}}\\ {\frac{\partial^2 f}{\partial y{\partial x}}}&{\frac{\partial^2 f}{\partial y^2}}&{\frac{\partial^2 f}{\partial y{\partial z}}}\\ \frac{\partial^2 f}{{\partial z}{\partial x}}&{\frac{\partial^2 f}{\partial z{\partial y}}}&{\frac{\partial^2 f}{\partial z^2}}\end{matrix}\right)=\left(\begin{matrix}4&-1&0 \\ -1&2&0 \\ 0&0&-6\end{matrix}\right)
练习:
求函数f(x,y)=x^2 y-xy^2对应的黑塞矩阵。

3.2 凹凸性判别法则

一元函数的凹凸性定义可以推广到多元函数,即:对于函数f(x),在其定义域内的任意两点x和y,及任意实数0\leq\theta\leq 1,都有:
f(\theta x+(1-\theta)y)\leq\theta f(x)+(1-\theta)f(y)
则函数f(x)为凸函数,反之,为凹函数。
函数f(x,y)=x^2+y^2是凸函数,f(x,y)=-x^2-y^2为凹函数。它们对应图像如下:

一元函数的凹凸性可根据二阶导数判断,多元函数可根据对应的黑塞矩阵的判断:
即:假设多元函数f(x)二阶可导,如果对应的黑塞矩阵半正定,则函数f(x)是凸函数;
如果对应的黑塞矩阵负正定,则函数f(x)是凹函数。

3.3 极值判别法则

一元函数的极值点的必要条件是该点为驻点,充分条件通过二阶导数来判断。这些规则可以推广到多元函数。多元函数的极值点的必要条件是该点为驻点,充分条件通过对应黑塞矩阵
来判断。具体规则如下:
(1)黑塞矩阵正定,函数在该点有极小值;
(2)黑塞矩阵负定,函数在该点有极大值;
(3)黑塞矩阵不定,则该点不是极值点,或是鞍点。

3.4雅可比矩阵

雅可比矩阵是由多个多元函数的所有偏导数构成的矩阵。假设:
y_1=f_1 (x_1,x_2,\cdots,x_n ),y_2=f_2 (x_1,x_2,\cdots,x_n ),\cdots,y_m=f_m (x_1,x_2,\cdots,x_n )
由这些函数构成的雅可比矩阵为:
\frac{\partial y}{\partial x}=\frac{\partial (y_1,y_2,\cdots,y_m)}{\partial (x_1,x_2,\cdots,x_n)}=\left(\begin{matrix}{\frac{\partial^2 f_1}{\partial x_1^2}}&\cdots& {\frac{\partial^2 f_1}{\partial x_1{\partial x_n}}}\\ {\vdots}&\cdots&\vdots \\ \frac{\partial^2 f_m}{{\partial x_n}{\partial x_1}}&\cdots&{\frac{\partial^2 f_m}{\partial x_n^2}}\end{matrix}\right)
这是一个m\times n的矩阵,每一行为一个多元函数的梯度(或所有偏导数)。

例2:求下列函数的雅可比矩阵:
u=x^2+2xy+z
v=3x-xy^2+z^2
这些函数的雅可比矩阵为:
\frac{\partial (u,v)}{\partial (x,y,z)}=\left(\begin{matrix}{\frac{\partial u}{\partial x}}&{\frac{\partial u}{\partial y}}& {\frac{\partial u}{\partial z}}\\ {\frac{\partial v}{\partial x}}&{\frac{\partial v}{\partial y}}&{\frac{\partial v}{\partial z}}\end{matrix}\right)=\left(\begin{matrix}{2x+2y} & 2x & 1 \\ {3-x^2} & {-2xy} & 2z\end{matrix}\right)
神经网络中通常包括多个多元函数的情况,如下图所示:

X=\left(\begin{matrix}x_1\\x_2\\ x_3\end{matrix}\right),w=\left(\begin{matrix}w_{11}&w_{12}\\w_{21}&w_{22}\\ w_{31}&w_{32}\end{matrix}\right),y=\left(\begin{matrix}y_1 \\ y_2 \end{matrix}\right)
上图可用如下表达式表示:
Y=W^TX=y=\left(\begin{matrix}w_{11}x_1+w_{12}x_2+w_{13}x_3 \\ w_{21}x_1+w_{22}x_2+w_{23}x_3 \end{matrix}\right)
由此可得:
\frac{\partial Y}{\partial X}=\frac{\partial (y_1,y_2)}{\partial (x_1,x_2,x_3)}=W^T
【延伸思考】对W^T X加上激活函数(如sigmoid函数),此时\frac{\partial Y}{\partial X}=?

3.5 链式法则的矩阵形式

前面我们介绍了雅可比矩阵,它是涉及多元复合函数求导,这里雅可比矩阵可以简化链式法则的表达形式。
假设z=g(y_1,y_2,\cdots,y_m),y_i=f_i (x_1,x_2,\cdots,x_n)
根据链式法则,z对x的偏导可以通过z对y_i求导,x_j对x求导来实现。具体计算过程如下:
\frac{\partial z}{\partial x_i}=\sum_{j=1}^m\frac{\partial z}{\partial y_j} \frac{\partial y_j}{\partial x_i}
写成矩阵的形式就是:

其中\frac{\partial Y}{\partial X}矩阵就是雅可比矩阵。

3.6 对向量和矩阵求导

在神经网络中我们常见如下表达式:
y=Wx
其中W为mxn矩阵,x是n维向量,y是m维向量。假设f为一个激活函数,y通过激活函数后为f(y)函数,现在对f(y)求导,激活函数不改变y的维度,所以f(y)也是m维向量。
根据链式法则,有:

用矩阵和向量表示,上式可简写为:
\nabla_w f=(\nabla_y f)x^T

3.7 应用:最小二乘法

最小二乘法(二乘”就是平方,所以又称最小平方法)是一种数学优化技术。 它通过最小化误差的平方(即通常我们称之为损失函数)和寻找数据的最佳函数匹配。 利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。为解决过拟合问题可以在损失函数后加上正则项。
对多元函数的最小二乘法,可以用矩阵或向量表示,如对线性回归的函数y=w^T x+b,其中w和b为参数。如果用向量或矩阵来表示,可先作如下处理:
W=[w,b],X=[x,1]
则wx+b可表示为:W^T X,目标函数可表示为:
L(w)=\frac{1}{2}\sum_{k=1}^N(W^T X_k -y_k)^2
其中N表示样本总数,y_i表示第i个样本对应的标签值(或实际值)。L(w)
是一个凸函数,可用最小二乘法求其最小值:
(1)对函数L(w)求一阶偏导
\frac{\partial L}{\partial x_i}=\frac{1}{2}\sum_{k=1}^N(W^T X_k -y_k)x_{ki} \tag{3.1}
其中x_{ki}表示第k个样本的第i个分量。
(2)求二阶偏导,得到黑塞矩阵
\frac{\partial^2 L}{\partial w_i\partial w_j}=\sum_{k=1}^N x_{ki}x_{kj}
由此可得,目标函数的黑塞矩阵为:
其中n表示向量W的维度(或长度)。
(3)证明黑塞矩阵的正定性
对任意非0向量x有:
x^T Hx=x^T X^T Xx=(Xx)^T Xx\geq 0
故目标函数的黑塞矩阵为正定矩阵,由此可知,目标函数为凸函数,故存在极小值。驻点就是极值点。
(4)求解参数w
目标函数对参数w求导,并令导数为0,解得极值点。
由式(3.1)可得:
\sum_{k=1}^N(W^T X_k -y_k)x_{ki}=0
W^T X_k展开为:\sum_j^n w_j x_{kj},从而有:
\sum_{k=1}^N(\sum_{j=1}^n w_j x_{kj} -y_k)x_{ki}=0
对上式进行整理可得:
\sum_{k=1}^N\sum_{j=1}^n w_j x_{kj}x_{ki}=\sum_{k=1}^n y_k x_{ki}
写成矩阵的形式可得:
X^T Xw=X^T y
如果W的系数矩阵X^T X可逆,则可解得方程组的解w为:
W=(X^T X)^T X^T y
如果w的维度和样本数较大,这种计算非常好资源,尤其当X^T X不可逆,该如何求呢?
对这些情况,我们可以采用梯度下降,通过不断迭代,最后收敛于极值点来实现。

第2章 多元函数微积分

2.1一阶偏导数

前面主要介绍了一元函数,在机器学习中,要处理的函数大多是多元函数(如函数y=f(x_1,x_2,\cdots,x_n))。因此,我们需要把导数、微分拓展到多元函数上。
对多元函数如何求导呢?最简单有效的方法就是把多元微分转换为一元微分,具体实现方法就是每次只改变一个变量,其他变量的值固定不变,由此得到偏导数。
偏导数是多元函数对每个自变量的求导,对于多元函数y=f(x_1,x_2,\cdots,x_n),它在(x_1,x_2,\cdots,x_n)点处对x_i的偏导数定义为下式的极限。
\frac{\partial y}{\partial x}=\underset{\Delta x_i \to 0}{lim}\frac{f(x_1,\cdots,x_i+\Delta x_i,\cdots,x_n)-f(x_1,\cdots,x_i,\cdots,x_n)}{\Delta x_i} \tag{2.1}
这与导数的定义相同,其中\partial为偏导数符合。为计算\frac{\partial y}{\partial x_i},我们可以简单把变量x_i外的变量x_1,\cdots,x_{i-1},x_{i+1}\cdots,x_n作为常量,并计算y关于x_i的导数。对于偏导数的表示,以下几个表示方式是等价的:
\frac{\partial y}{\partial x_i}=\frac{\partial f}{\partial x_i}=f_{x_i}=f_i=D_i f
偏导数的几何意义,如图2-1所示,这里以一个二元函数为例,假设z=f(x,y),
则偏导\frac{\partial}{\partial x}f(x,y_0) 在点(x_0,y_0)值就是曲线z=f(x,y_0)在点(x_0,y_0)的切线斜率。

图2-1 偏导数的几何意义
例1 求函数z=x^2+3xy+y-1,求\frac{\partial z}{\partial x}\frac{\partial z}{\partial y}在点(4,-5)的值。
解:求\frac{\partial z}{\partial x},把y看作常量,然后对x求导。
\frac{\partial z}{\partial x}=\frac{\partial}{\partial x} (x^2+3xy+y-1)=2x+3y
\frac{\partial z}{\partial x}在点(4,-5)的值为:2\times4+3\times(-5)=-7
同理可得,\frac{\partial z}{\partial y}在点(4,-5)的值为:13

2.2 高阶偏导数

对偏导数继续求偏导数可以得到高阶偏导数,比一元函数的高阶导数复杂,每次求导时可以对多个变量进行求导,因此有多种组合。对多元函数y=f(x_1,x_2,\cdots,x_n)的二阶导数,可以先对x_i求偏导数,得到\frac{\partial y}{\partial x_i},然后将此一阶偏导数对x_j继续求偏导数。
\frac{\partial^2 y}{\partial x_j\partial x_i}=\frac{\partial}{\partial x_j}(\frac{\partial y}{\partial x_i})
如果二阶混合偏导数连续,则与求导顺序无关,即有:
\frac{\partial^2 y}{\partial x_j\partial x_i}=\frac{\partial^2 y}{\partial x_i\partial x_j}
例2:求函数f(x,y)=x^2+xy-y^2
(1)一阶偏导
(2)二阶偏导
解:(1)一阶偏导有:
\frac{\partial f}{\partial x}=2x+y
\frac{\partial f}{\partial y}=x-2y
(2)二阶偏导有:
\frac{\partial^2 f}{\partial x^2}=\frac{\partial}{\partial x}(2x+y)=2
\frac{\partial^2 f}{\partial x\partial y}=\frac{\partial}{\partial y}(2x+y)=1
\frac{\partial^2 f}{\partial y\partial x}=\frac{\partial}{\partial x}(x-2y)=1
\frac{\partial^2 f}{\partial y^2}=\frac{\partial}{\partial y}(x-2y)=-2
如果二阶混合偏导数连续,则与求导次序无关,即有:
\frac{\partial^2 f}{\partial x\partial y}=\frac{\partial^2 f}{\partial y\partial x}

2.3多元复合函数的链式法则

多元复合函数求导的链式法则是一元函数链式法则的推广。首先,我们看二元函数的情况,注意需要对相关的全部中间变量(如下例中u和v)应用链式法则。假设z=f(u,v),u=g(x,y),v=h(x,y),则z对x,y的偏导导数为:
\frac{\partial z}{\partial x}=\frac{\partial z}{\partial u} \frac{\partial u}{\partial x} +\frac{\partial z}{\partial v} \frac{\partial v}{\partial x}
同理
\frac{\partial z}{\partial y}=\frac{\partial z}{\partial u} \frac{\partial u}{\partial y} +\frac{\partial z}{\partial v} \frac{\partial v}{\partial y}
\frac{\partial z}{\partial x}的求导过程如图2-2所示。

图2-2 多元复合函数的链式法则
练习:

1.11最小二乘法应用实例

最小二乘法(又称为为最小平方法,二乘就是平方的含义),是用来衡量两个模型(样本模型与实际模型)之间距离(准确来说是欧氏距离)的一种方法,其背后的原理求凸函数的最小值。其应用很广泛,在线性回归算法中起到核心作用。两个模型之间的距离可表示为:
\sum_{i=1}^N(y_{true}-y_{prev} )^2
最小二乘法有不少优势,如简单明了、易解释。但也存在很多不足,对模型要比较简单,稍微复杂一点(如模型中参数多几个)或条件宽泛一点,可能就无法处理。当然,对于这些问题,我们可以采用梯度下降法解决。梯度下降法将在后续章节介绍。
这里我们先看一个简单实例,假设一个裁缝师傅有一块长2米的布,他共量了5次,但每次都不一样,具体数据如下,根据这些样本数据,如何确定其最终的结果呢?这个问题我们可以利用最小二乘法来解决。
单位是米

问题1:这个问题的目标是什么?
问题2:求平均值是一种直观方法,但这种方法好像不足让人信服,有人说,是否可以用出现次数多的那个为准?
问题3:如何用用最小二乘法确定最终结果,如何设定这个实际模型?
问题4:这个问题很简单,还可以做哪些延伸?如果由一维变为多维该如何处理?
问题5:如是否可以把这个问题转换为一个概率模型?然后,把用欧氏方法来衡量两个模型之间的相似度,转变为利用交叉熵方法来衡量两个分布之间近似程度?

问题1:主要目的就是通过这些演变数据获取背后的真实数据
问题2: 最小二乘法的本质是用欧氏视角去衡量两个模型之间的近似度,通过优化方法使它们之间的相似度最大化(距离最小化)。为更好理解,把这些点用坐标表示出来。

这是样本数据,我们假设样本数据背后反应的实际数据为y=y ̂这样一条直线,把这条直线视为实际模型,然后利用最小二乘法求出y ̂的值。
L(\hat y)=min\sum_{i=1}^5(\hat y-y_i )^2 =min((\hat y-2.02)^2+(\hat y-1.97)^2+(\hat y-1.98)^2+(\hat y-2.02)^2+(\hat y-2.01)^2)
这个计算过程,实际就是求各点到直线y=y ̂的距离(或样本与实际值的误差)最小化,计算过程如下图所示:

显然函数L(\hat y)是一元二次函数,是凸函数,故其驻点就是最小值点。
L(\hat y)求导,并令其为0得:
L'(\hat y)=2(\hat y-2.02)+2(\hat y-1.97)+2(\hat y-1.98)+2(\hat y-2.02)+2(\hat y-2.01)
解之得:
\hat y=\frac{2.02+1.97+1.98+2.02+2.01}{5}=10
这个结果就是求各个样本点的平均值,即\hat y=10这个模型与样本模型最接近。
问题4:加下来我们介绍梯度时,将介绍如何多维数据的情况。
问题5:这个问题如果用概率统计的思想来处理,该如何处理呢?
概率统计中需要有一个随机变量,随机变量的分布,衡量不同分布之间的相似度等。
实际值与样本的误差可作为一个随机变量:\hat y-y_i
假设这个随机变量的概率为p(\hat y-y_i),该误差是一个随机及独立的变量,正常情况下,这个概率应该满足正态分布(因正态分布的熵最大),不妨假设满足标准正态分布\phi(0,1)
这里y作为一个普通变量(非随机变量),故可以使用最大似然估计也可求出y的值,也是
\hat y=\frac{2.02+1.97+1.98+2.02+2.01}{5}=10
真可谓异曲同工!
大家不妨试一下。

1.10泰勒公式

如果一个复杂函数在某点处存在各阶导数,在这点附近,就可以用一个多项式函数,近似地替代这个复杂函数。这种化繁为简的功能就是泰勒公式的本质和意义所在。
如何用多项式函数近似表示这个复杂函数呢?根据微分的定义,如果函数f(x)在点a处可得,可用一次函数近似代替函数f(x),误差是x-a的高阶无穷小。
f(x)=f(a)+f'(a)(x-a)+o(x-a)
由此,我们可以推广到更高次阶的情况。假设函数f(x)n阶可导,函数f(x)可表示为:
f(x)=f(a)+f'(a)(x-a)+\frac{f''(a)}{2!}(x-a)^2+\cdots+\frac{f^{(n)}(a)}{n!} (x-a)^n+o(x-a)^n \tag{5.5}
这就是泰勒多项式,其中o(x-a)^n称为皮亚诺余项。
如果令\Delta x=x-a,式(5.5)可写成:
f(x)=f(a)+f'(a)\Delta x+\frac{f''(a)}{2!}\Delta x^2+\cdots+\frac{f^{(n)}(a)}{n!} \Delta x^n+o(\Delta x)^n
函数在x=0点处的泰勒公式称为麦克劳林公式,具体形式为:
f(x)=f(0)+f'(0)x+\frac{f''(0)}{2!}x^2+\cdots+\frac{f^{(n)}(0)}{n!} x^n+o(x^n) \tag{5.6}
把余项o(x^n)记为R_n (x),式(5.6)可写为:
f(x)=f(0)+f'(0)x+\frac{f''(0)}{2!}x^2+\cdots+\frac{f^{(n)}(0)}{n!} x^n+R_n (x) \tag{5.7}
基本函数的麦克劳林公式:

用泰勒公式近似sinx函数,分别取k=3,5的情况

 
从上图可以看出,泰勒公式精度随着k增大而精度越高。
实现上图的python代码:

利用泰勒公式可以将非线性问题化为线性问题,且具有很高的精确度,因此其在微积分的各个方面都有重要的应用,如用于梯度下降法、牛顿法、拟牛顿法等的推导。