一、方向导数与梯度
1.1 方向导数
现在我们来讨论函数在一点
沿某一方向的变化率问题.
定义 设函数在点
的某一邻域
内有定义.自点
引射线
.设
轴正向到射线
的转角为
(逆时针方向:
0;顺时针方向:
0),并设
'(
+△
,
+△
)为
上的另一点且
'∈
.我们考虑函数的增量
(
+△
,
+△
)-
与
、
'两点间的距离
的比值.当
'沿着
趋于
时,如果这个比的极限存在,则称这极限为函数
在点
沿方向
的方向导数,记作
,即
(1)
从定义可知,当函数在点
的偏导数
x、
y存在时,函数在点
沿着
轴正向
=
,
轴正向
=
的方向导数存在且其值依次为
x、
y,函数
在点
沿
轴负向
=
,
轴负向
=
的方向导数也存在且其值依次为-
x、-
y.
关于方向导数的存在及计算,我们有下面的定理.
定理 如果函数在点
是可微分的,那末函数在该点沿任一方向的方向导数都存在,且有
(2)
其中为
轴到方向
的转角.
证 根据函数在点
可微分的假定,函数的增量可以表达为
两边各除以,得到
所以
这就证明了方向导数存在且其值为
对于三元函数=
来说,它在空间一点
沿着方向
(设方向
的方向角为
的方向导数,同样可以定义为
(3)
其中,△
=
,△
=
,△
=
.
同样可以证明,如果函数在所考虑的点处可微分,那末函数在该点沿着方向的方向导数为
1.2 梯度
定义 设函数在平面区域
内具有一阶连续偏导数,则对于每一点
,都可定出一个向量
这向量称为函数=
在点
的梯度,记作
,即
=
如果设是与方向
同方向的单位向量,则由方向导数的计算公式可知
这里,(^,e)表示向量
与
的夹角.由此可以看出,就是梯度在射线
上的投影,当方向
与梯度的方向一致时,有
(
^,
)
1,
从而有最大值.所以沿梯度方向的方向导数达到最大值,也就是说,梯度的方向是函数
在这点增长最快的方向.因此,我们可以得到如下结论:
函数在某点的梯度是这样一个向量,它的方向与取得最大方向导数的方向一致,而它的模为方向导数的最大值.
由梯度的定义可知,梯度的模为
我们知道,一般说来二元函数在几何上表示一个曲面,这曲面被平面z=c(c是常数)所截得的曲线
的方程为
这条曲线在
面上的投影是一条平面曲线
(图8―10),它在
平面直角坐标系中的方程为
对于曲线上的一切点,已给函数的函数值都是
,所以我们称平面曲线
为函数
的等高线.
由于等高线上任一点
处的法线的斜率为
,
所以梯度
为等高线上点处的法向量,因此我们可得到梯度与等高线的下述关系:函数
在点
的梯度的方向与过点
的等高线
在这点的法线的一个方向相同,且从数值较低的等高线指向数值较高的等高线(图8―10),而梯度的模等于函数在这个法线方向的方向导数.这个法线方向就是方向导数取得最大值的方向。
二、梯度下降法
2.1 梯度下降的几何形式
下图为梯度下降的目的,找到J(θ)的最小值。
其实,J(θ)的真正图形是类似下面这样的,因为其是一个凸函数,只有一个全局最优解,所以不必担心像上图一样找到局部最优解
直到了要找到图形中的最小值之后,下面介绍自动求解最小值的办法,这就是梯度下降法
对参数向量θ中的每个分量θj,迭代减去速率因子a* (dJ(θ)/dθj)即可,后边一项为J(θ)关于θj的偏导数
2.2 梯度下降的原理
下图展示了对单个特征θ1的直观图形,起始时导数为正,θ1减小后并以新的θ1为基点重新求导,一直迭代就会找到最小的θ1,若导数为负时,θ1的就会不断增到,直到找到使损失函数最小的值。
有一点需要注意的是步长a的大小,如果a太小,则会迭代很多次才找到最优解,若a太大,可能跳过最优,从而找不到最优解。
另外,在不断迭代的过程中,梯度值会不断变小,所以θ1的变化速度也会越来越慢,所以不需要使速率a的值越来越小
下图就是寻找过程
当梯度下降到一定数值后,每次迭代的变化很小,这时可以设定一个阈值,只要变化小于该阈值,就停止迭代,而得到的结果也近似于最优解。
若损失函数的值不断变大,则有可能是步长速率a太大,导致算法不收敛,这时可适当调整a值
为了选择参数a,就需要不断测试,因为a太大太小都不太好。
如果想跳过的a与算法复杂的迭代,可以选择 Normal Equation。
梯度下降的几何形式
下图为梯度下降的目的,找到J(θ)的最小值。
其实,J(θ)的真正图形是类似下面这样的,因为其是一个凸函数,只有一个全局最优解,所以不必担心像上图一样找到局部最优解
直到了要找到图形中的最小值之后,下面介绍自动求解最小值的办法,这就是梯度下降法
对参数向量θ中的每个分量θj,迭代减去速率因子a* (dJ(θ)/dθj)即可,后边一项为J(θ)关于θj的偏导数
Steepest gradient 方法得到的是局部最优解,如果目标函数是一个凸优化问题,那么局部最优解就是全局最优解,理想的优化效果如下图,值得注意一点的是,每一次迭代的移动方向都与出发点的等高线垂直:

粗略来讲,在二次函数中,椭球面的形状受 hesse 矩阵的条件数影响,长轴与短轴对应矩阵的最小特征值和最大特征值的方向,其大小与特征值的平方根成反比,最大特征值与最小特征值相差越大,椭球面越扁,那么优化路径需要走很大的弯路,计算效率很低。
三、几种常见的梯度下降
在具体使用梯度下降法的过程中,主要有以下几种不同的变种,即:batch、mini-batch、SGD。其主要区别是不同的变形在训练数据的选择上。
1、批量梯度下降法BGD
批梯度下降法(Batch Gradient Descent)针对的是整个数据集,通过对所有的样本的计算来求解梯度的方向。
批量梯度下降法的损失函数为:
进一步得到批量梯度下降的迭代式为:
每迭代一步,都要用到训练集所有的数据,如果样本数目很大,那么可想而知这种方法的迭代速度!
优点:全局最优解;易于并行实现;
缺点:当样本数目很多时,训练过程会很慢。
从迭代的次数上来看,BGD迭代的次数相对较少。其迭代的收敛曲线示意图可以表示如下:
2、小批量梯度下降法MBGD
在上述的批梯度的方式中每次迭代都要使用到所有的样本,对于数据量特别大的情况,如大规模的机器学习应用,每次迭代求解所有样本需要花费大量的计算成本。是否可以在每次的迭代过程中利用部分样本代替所有的样本呢?基于这样的思想,便出现了mini-batch的概念。
假设训练集中的样本的个数为1000,则每个mini-batch只是其一个子集,假设,每个mini-batch中含有10个样本,这样,整个训练数据集可以分为100个mini-batch。伪代码如下:
3、随机梯度下降法SGD
随机梯度下降算法(stochastic gradient descent)可以看成是mini-batch gradient descent的一个特殊的情形,即在随机梯度下降法中每次仅根据一个样本对模型中的参数进行调整,等价于上述的b=1情况下的mini-batch gradient descent,即每个mini-batch中只有一个训练样本。
随机梯度下降法的优化过程为:
随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将theta迭代到最优解了,对比上面的批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。但是,SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。
优点:训练速度快;
缺点:准确度下降,并不是全局最优;不易于并行实现。
从迭代的次数上来看,SGD迭代的次数较多,在解空间的搜索过程看起来很盲目。其迭代的收敛曲线示意图可以表示如下:
随机梯度下降代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
三种梯度下降方法的总结
1.批梯度下降每次更新使用了所有的训练数据,最小化损失函数,如果只有一个极小值,那么批梯度下降是考虑了训练集所有数据,是朝着最小值迭代运动的,但是缺点是如果样本值很大的话,更新速度会很慢。
2.随机梯度下降在每次更新的时候,只考虑了一个样本点,这样会大大加快训练数据,也恰好是批梯度下降的缺点,但是有可能由于训练数据的噪声点较多,那么每一次利用噪声点进行更新的过程中,就不一定是朝着极小值方向更新,但是由于更新多轮,整体方向还是大致朝着极小值方向更新,又提高了速度。
3.小批量梯度下降法是为了解决批梯度下降法的训练速度慢,以及随机梯度下降法的准确性综合而来,但是这里注意,不同问题的batch是不一样的,只能通过实验结果来进行超参数的调整。
四 普通梯度下降的挑战与改进
-
如何选择正确的学习率。学习率太小收敛太慢。学习率太大导致损失函数在极值点波动或发散。
-
调整训练期间的学习速率。例如根据预定义的时间减少学习率,或者当epoch之间的目标的变化降到阈值以下时,即early stopping。 然而,这些时间计划和阈值必须提前定义,因此不能适应数据集的特性。
-
对所有参数使用相同的学习率。 如果数据稀疏,并且每个特征具有不同的使用频率,我们不想将其全部更新到相同的程度,但是对使用频率较少的特征执行更大的更新。
(ps:数据稀疏,例如对于文本分类问题,通常使用bag-of-words作为特征,每个文档都用一个向量表示,向量的长度是词表的长度,并且有很多值是0,代表文档中没有这个词。那么这个数据就是稀疏数据。而对于图片来说,每个图片都有像素,且值不为0,这个数据就是稠密数据) - 对于神经网络通用的高度非凸的误差函数最小化的另一个关键挑战是避免陷入其众多次优局部最小值中。 Dauphin等人认为难度实际上不是来自局部最小值,而是来自鞍点,如下图所示。 这些鞍点通常被具有相同误差的平台包围,这使得SGD难以逃脱,因为梯度在所有维度上接近于零。
梯度下降优化算法
Momentum
SGD方法的一个缺点是其更新的方法完全依赖于当前的batch,因而其更新十分不稳定,可引入mementum,模拟惯性,即更新时在一定程度上保留很之前更新的方向,同时利用当前的batch的梯度微调最终的更新方向,可一定程度上增加稳定性,从而学习的更快,且还有一定摆脱局部最优的能力难。
SGD方法很难从陡峭的区域上跳出来,陡峭的区域指的是一个维度上的表面比在另一个维度上的表面更加陡的区域,这在局部最优中是常见的。在这些情况下,SGD在峡谷的斜坡上振荡。
SGD without momentum
SGD with momentum
Momentum 是一种有助于在相关方向上加速SGD并抑制振荡的方法,如图所示。
一般取0.9或类似的值
对于梯度指向相同方向的维度,动量项增加,并且减少梯度改变方向的维度的更新。 因此获得更快的收敛和减少振荡。
Nesterov accelerated gradient
Adagrad
Adagrad是一种参数的自适应学习率算法,对常用的参数执行较小的更新,对不常用的参数执行较大更新。 因此,它非常适合处理稀疏数据。
以前,我们对所有参数
同时执行更新,因为每个参数使用相同的学习速率
,Adagrad在每个时间步长t对每个参数
间步长t对每个参数
θi
使用不同的学习速率,首先表示出Adagrad的每个参数更新,然后将其向量化。
是参数
在时间不长t时候的梯度;
t,i
g
是一个对角矩阵,每一个对角元素是
θ
到时间t的梯度的和。
是一个平滑参数,为了不让分母为0。不用平方根的话,算法表现不好。
SGD更新
θ
θ
Adagrad 改变
θ
θ
是一个对角矩阵,每一个对角元素是
θ
到时间t的梯度的和。
是一个平滑参数,为了不让分母为0。不用平方根的话,算法表现不好。
Adagrad的主要优点之一是它不需要手动调整学习速率。 大多数实现使用默认值0.01。
Adagrad的主要弱点是它在分母中的平方梯度的积累:由于每个增加的项都是正数,累积的总和在训练期间保持增长。 这又导致学习速率收缩并且最终变得无穷小,在该点处算法不再能够获取额外的知识。 以下算法旨在解决这个缺陷。
需要手工设置一个全局的初始学习率
更新参数时,左右两边的单位不同一。
Adadelta
Adadelta是Adagrad的延伸,旨在减少其单调降低的学习率。 Adadelta不是累积所有过去的平方梯度,而是将累积过去的梯度的窗口限制到一定的固定大小w区间。
Adadelta的梯度采用过去所有时刻梯度平方的衰减平均,时刻t的值仅依赖于之前的均值和当前梯度
类似于momentum项,我们将的值取在0.9附近
Adam(Adaptive Moment Estimation)

