一、梯度下降法

1、总述:

在机器学习中,基于基本的梯度下降法发展了三种梯度下降方法,分别为随机梯度下降法,批量梯度下降法以及小批量梯度下降法
(1)批量梯度下降法(Batch Gradient Descent,BGD)
BGD 得到的是一个全局最优解,但是批量梯度下降法在更新每一个参数时,都需要所有的训练样本,如果样本的数量很大,那么可想而知这种方法的迭代速度会相当的慢。从迭代的次数上来看,BGD迭代的次数相对较少。
(2)随机梯度下降(Stochastic Gradient Descent,SGD)
随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经迭代到最优解了,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。但是,SGD 伴随的一个问题是噪音较 BGD 要多,使得 SGD 并不是每次迭代都向着整体最优化方向。从迭代的次数上来看,SGD 迭代的次数较多,在解空间的搜索过程看起来很盲目。
(3)小批量梯度下降法(Mini-batch Gradient Descent,MBGD)
有上述的两种梯度下降法可以看出,其各自均有优缺点,那么能不能在两种方法的性能之间取得一个折衷呢?即,算法的训练过程比较快,而且也要保证最终参数训练的准确率,而这正是小批量梯度下降法(Mini-batch Gradient Descent,简称MBGD)的初衷。
(4)总结:

梯度下降法 方法 优点 缺点
批量梯度下降法 最小化所有训练样本的损失函数,使得最终求解的是全局的最优解,即求解的参数是使得风险函数最小,但是对于大规模样本问题效率低下 容易找到全局最优解;易于并行实现 当样本数目很多时,训练过程会很慢
随机梯度下降 最小化每个样本的损失函数,虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近,适用于大规模训练样本情况 训练速度快 准确度下降;对于非凸问题,只能收敛到局部最优;不易于并行实现。
小批量梯度下降法 以损失很小的一部分精确度和增加一定数量的迭代次数为代价,换取了总体的优化效率的提升。增加的迭代次数远远小于样本的数量 训练过程较快,而且也要保证最终参数训练的准确率 容易达到局部最优

2、什么是梯度下降法

(1) 梯度下降法示例
举个例子:比如当我们要做一个房屋价值的评估系统,那都有哪些因素决定或影响房屋的价值呢?比如说面积、房子的大小(几室几厅)、地段、朝向等等,这些影响房屋价值的变量被称为特征(feature)。在这里,为了简单,我们假定房屋只由一个变量影响,那就是房屋的面积。
假设有一个房屋销售的数据如下:

面积(m2\displaystyle m^{2}m2) 销售价钱(万元)
123 250
150 320
87 160
102 220

可以做出一个图,x轴是房屋的面积。y轴是房屋的售价,如下:

如果来了一个新的房子/面积,假设在房屋销售价格的记录中没有的,怎么办呢?
可以用一条曲线去尽量准的拟合这些数据,然后如果有新的输入面积,我们可以在将曲线上这个点对应的值返回。如果用一条直线去拟合房屋价格数据,可能如下图这个样子:

而图中绿色的点就是我们想要预测的点。

  • 为了数学建模,首先给出一些概念和常用的符号。
  • 房屋销售记录表 – 训练集(training set)或者训练数据(training data), 是我们流程中的输入数据,一般称为x
  • 房屋销售价钱 – 输出数据,一般称为y
  • 拟合的函数(或者称为假设或者模型),一般写做 y = h(x)
  • 训练数据的条目数(#training set), 一条训练数据是由一对输入数据和输出数据组成的
  • 输入数据的维度(特征的个数,#features),n

然后便是一个典型的机器学习的过程,首先给出一个输入数据,我们的算法会通过一系列的过程得到一个估计的函数,这个函数有能力对没有见过的新数据给出一个新的估计,也被称为构建一个模型。

X1\displaystyle X_{1}X1X2\displaystyle X_{2}X2XN\displaystyle X_{N}XN去描述feature里面的分量,比如X1\displaystyle X_{1}X1=房间的面积,X2\displaystyle X_{2}X2=房间的朝向等等,可以做出一个估计函数:

θθθ在这儿称为参数,在这儿的意思是调整feature中每个分量的影响力,就是到底是房屋的面积更重要还是房屋的地段更重要。
如果我们令X0\displaystyle X_{0}X0 = 1,就可以用向量的方式来表示了:

程序也需要一个机制去评估我们θθθ是否比较好,所以说需要对我们做出的h函数进行评估,一般这个进行评估的函数称为损失函数(loss function),描述h函数不好的程度,这里我们称这个函数为JJJ函数。

换言之,把对Xi\displaystyle X_{i}Xi的估计值与真实值yi\displaystyle y_{i}yi差的平方和作为损失函数,前面乘上的系数1/21/21/2是为了方便求导(且在求导的时候,这个系数会消掉)。
如何调整θθθ以使得J(θ)J(θ)J(θ)取得最小值有很多方法,其中有最小二乘法(min square),是一种完全是数学描述的方法,另外一种就是梯度下降法
(2)梯度下降算法流程
梯度下降法的算法流程如下:

  • 首先对θ赋值,这个值可以是随机的,也可以让θ是一个全零的向量。
  • 改变θ的值,使得J(θ)按梯度下降的方向进行减少。

为了描述的更清楚,给出下面的图:

这是一个表示参数θθθ与误差函数J(θ)J(θ)J(θ)的关系图,红色的部分是表示J(θ)J(θ)J(θ)有着比较高的取值,我们需要的是,能够让J(θ)J(θ)J(θ)的值尽量的低,也就是达到深蓝色的部分(让误差/损失最小嘛)。θ0\displaystyle \theta _{0}θ0θ1\displaystyle \theta _{1}θ1表示θθθ向量的两个维度。
在上面提到梯度下降法的第一步是给θθθ给一个初值,假设随机给的初值是在图上的十字点。
然后我们将θθθ按照梯度下降的方向进行调整,就会使得J(θ)J(θ)J(θ)往更低的方向进行变化,如下图所示,算法的结束将是在θθθ下降到无法继续下降为止。

当然,可能梯度下降的最终点并非是全局最小点,即也可能是一个局部最小点,如下图所示:

上面这张图就是描述的一个局部最小点,这是我们重新选择了一个初始点得到的,看来我们这个算法将会在很大的程度上被初始点的选择影响而陷入局部最小点。
下面我将用一个例子描述一下梯度减少的过程,对于我们的函数J(θ)J(θ)J(θ)求偏导JJJ

下面是更新的过程,也就是θi\displaystyle \theta _{i}θi会向着梯度最小的方向进行减少。θi\displaystyle \theta _{i}θi表示更新之前的值,减号后面的部分表示按梯度方向减少的量,ααα表示步长,也就是每次按照梯度减少的方向变化多少

一个很重要的地方值得注意的是,梯度是有方向的,对于一个向量θθθ,每一维分量θi\displaystyle \theta _{i}θi都可以求出一个梯度的方向,我们就可以找到一个整体的方向,在变化的时候,我们就朝着下降最多的方向进行变化就可以达到一个最小点,不管它是局部的还是全局的。

用更简单的数学语言进行描述是这样的:

(3)梯度下降法是否一定下降最快
梯度下降法并不一定是下降最快的方向,它只是目标函数在当前的点的切平面(当然高维问题不能叫平面)上下降最快的方向。在practical implementation中,牛顿方向(考虑海森矩阵)才一般被认为是下降最快的方向,可以达到superlinear的收敛速度。梯度下降类的算法的收敛速度一般是linear甚至sublinear的(在某些带复杂约束的问题)。
一般解释梯度下降,会用下山来举例。假设你现在在山顶处,必须抵达山脚下(也就是山谷最低处)的湖泊。但让人头疼的是,你的双眼被蒙上了无法辨别前进方向。换句话说,你不再能够一眼看出哪条路径是最快的下山路径,如下图:

最好的办法就是走一步算一步,先用脚向四周各个方向都迈出一步,试探一下周围的地势,用脚感觉下哪个方向是下降最大的方向。换言之,每走到一个位置的时候,求解当前位置的梯度,沿着梯度的负方向(当前最陡峭的位置向下)走一步。就这样,每要走一步都根据上一步所在的位置选择当前最陡峭最快下山的方向走下一步,一步步走下去,一直走到我们感觉已经到了山脚。
当然这样走下去,我们走到的可能并不一定是真正的山脚,而只是走到了某一个局部的山峰低处。换句话说,梯度下降不一定能够找到全局的最优解,也有可能只是一个局部最优解。当然,如果损失函数是凸函数,梯度下降法得到的解就一定是全局最优解。

总之,梯度下降法的优化思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向,所以也被称为是“最速下降法”。最速下降法越接近目标值,步长越小,前进越慢。梯度下降法的搜索迭代示意图如下图所示:

正因为梯度度下降法在接近最优解的区域收敛速度明显变慢,所以利用梯度下降法求解需要很多次的迭代。在机器学习中,基于基本的梯度下降法发展了两种梯度下降方法,分别为随机梯度下降法和批量梯度下降法。

3、随机梯度下降

普通的梯度下降算法在更新回归系数时要遍历整个数据集,是一种批处理方法,这样训练数据特别忙庞大时,可能出现如下问题:

  • 收敛过程可能非常慢;
  • 如果误差曲面上有多个局极小值,那么不能保证这个过程会找到全局最小值。

(1) 随机梯度下降
为了解决上面的问题,实际中我们应用的是梯度下降的一种变体被称为随机梯度下降。

上面公式中的误差是针对于所有训练样本而得到的,而随机梯度下降的思想是根据每个单独的训练样本来更新权值,这样我们上面的梯度公式就变成了:

经过推导后,我们就可以得到最终的权值更新的公式:

有了上面权重的更新公式后,我们就可以通过输入大量的实例样本,来根据我们预期的结果不断地调整权值,从而最终得到一组权值使得我们的算法能够对一个新的样本输入得到正确的或无限接近的结果。
这里做一个对比,设代价函数为:

参数更新为:

iii是样本编号下标,jjj是样本维数下标,mmm为样例数目,nnn为特征数目。所以更新一个θj\displaystyle \theta _{j}θj只需要一个样本就可以。

(2)批量梯度下降
参数更新为:

iii是样本编号下标,jjj是样本维数下标,mmm为样例数目,nnn为特征数目。所以更新一个θj\displaystyle \theta _{j}θj需要遍历整个样本集

二、牛顿法和拟牛顿法

1、牛顿法(Newton’s method)

(1)含义
牛顿法是一种在实数域和复数域上近似求解方程的方法。方法使用函数 f(x)f(x) 的泰勒级数的前面几项来寻找方程 f(x)=0f(x)=0 的根,牛顿法最大的特点就在于它的收敛速度很快。关于牛顿法的具体实例应用,可参考笔者的另外一篇博客:牛顿迭代法求解开方问题。
(2)原理
首先,选择一个接近函数 f(x)零点的 x0,计算相应的 f(x0) 和切线斜率f’(x0)(这里f’表示函数 f 的导数)。
然后我们计算穿过点(x0, f(x0)) 并且斜率为f’(x0)的直线和 x 轴的交点的x坐标,也就是求如下方程的解:


将新求得的点的 x 坐标命名为x1,通常x1会比x0更接近方程f(x) = 0的解。因此我们现在可以利用x1开始下一轮迭代。迭代公式可化简为如下所示:

已经证明,如果f’是连续的,并且待求的零点x是孤立的,那么在零点x周围存在一个区域,只要初始值x0位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果f’(x)不为0, 那么牛顿法将具有平方收敛的性能。粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。

由于牛顿法是基于当前位置的切线来确定下一次的位置,所以牛顿法又被很形象地称为是"切线法"。牛顿法的搜索路径(二维情况)如下图所示:

(3)牛顿法的优缺点

  • 优点:二阶收敛,收敛速度快;
  • 缺点:牛顿法是一种迭代算法,每一步都需要求解目标函数的 Hessian 矩阵的逆矩阵,计算比较复杂。

(4)牛顿法与梯度下降法的效率对比

  • 从收敛速度上看 ,牛顿法是二阶收敛,梯度下降是一阶收敛,前者牛顿法收敛速度更快。但牛顿法仍然是局部算法,只是在局部上看的更细致,梯度法仅考虑方向,牛顿法不但考虑了方向还兼顾了步子的大小,其对步长的估计使用的是二阶逼近。
  • 从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。

    注:红色的牛顿法的迭代路径,绿色的是梯度下降法的迭代路径

2、拟牛顿法(Quasi-Newton Methods)

(1)含义
拟牛顿法的本质思想是改善牛顿法每次需要求解复杂的 Hessian 矩阵的逆矩阵的缺陷,它使用正定矩阵来近似 Hessian 矩阵的逆,从而简化了运算的复杂度。拟牛顿法不需要二阶导数的信息,所以有时比牛顿法更为有效。常用的拟牛顿法有 DFP (Davidon Fletcher Powell,三个人的名字命名) 算法和 BFGS (Broyden Fletcher Goldfarb Shanno,四个人的名字命名) 算法。
拟牛顿法和最速下降法一样只要求每一步迭代时知道目标函数的梯度。通过测量梯度的变化,构造一个目标函数的模型使之足以产生超线性收敛性。这类方法大大优于最速下降法,尤其对于困难的问题。另外,因为拟牛顿法不需要二阶导数的信息,所以有时比牛顿法更为有效。如今,优化软件中包含了大量的拟牛顿算法用来解决无约束,约束,和大规模的优化问题。
(2)原理
与牛顿法相同, 拟牛顿法是用一个二次函数以近似目标函数f(x)f(x)f(x)f(x)f(x)f(x)的二阶泰勒展开是:

其中, 表示f(x)f(x)f(x)的梯度 ▽f\displaystyle \triangledown ff,BBB表示Hessian矩阵H[f(x)]\displaystyle \mathbb{H}[ f( x)]H[f(x)]的近似。 ▽f\displaystyle \triangledown ff梯度可进一步近似为下列形式:

令上式等于0,计算出Newton步长△x\displaystyle \vartriangle xx

然后H[f(x)]\displaystyle \mathbb{H}[ f( x)]H[f(x)]构造的近似BBB满足:

上式称作割线方程组。但当f(x)f(x)f(x)是定义在多维空间上的函数时, 从该式计算BBB将成为一个不定问题 (未知数个数比方程式个数多).此时,构造BBB,根据Newton步长更新当前解的处理需要回归到求解割线方程.几乎不同的拟牛顿法就有不同的选择割线方程的方法.而大多数的方法都假定BBB具有对称性 (即满足B=BT\displaystyle B=B^{T}B=BT)。另外,下表所示的方法可用于求解Bk+1\displaystyle B_{k+1}Bk+1;在此Bk+1\displaystyle B_{k+1}Bk+1于某些范数与Bk\displaystyle B_{k}Bk尽量接近。即对于某些正定矩阵VVV,使用以下方式更新BBB

近似Hessian矩阵一般以单位矩阵等作为初期值。最优化问题的解xk\displaystyle x_{k}xk由根据近似所得 Bk\displaystyle B_{k}Bk的计算出的Newton步长更新得出。

  • 以下为该算法的总结

三、共轭梯度法(Conjugate Gradient)

共轭梯度法是介于梯度下降法(最速下降法)与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了梯度下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hessian矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。
在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,具有逐步收敛性,稳定性高,而且不需要任何外来参数。
下图为共轭梯度法和梯度下降法搜索最优解的路径对比示意图:

四、几种优化算法对比

1、Batch Gradient Descent (BGD)

缺点: 由于这种方法是在一次更新中,就对整个数据集计算梯度,所以计算起来非常慢,遇到很大量的数据集也会非常棘手,而且不能投入新数据实时更新模型。
**优点 :**Batch gradient descent 对于凸函数可以收敛到全局极小值,对于非凸函数可以收敛到局部极小值。

2、Stochastic Gradient Descent (SGD)

和 BGD 的一次用所有数据计算梯度相比,SGD 每次更新时对每个样本进行梯度更新,对于很大的数据集来说,可能会有相似的样本,这样 BGD 在计算梯度时会出现冗余,而 SGD 一次只进行一次更新,就没有冗余,而且比较快,并且可以新增样本。虽然包含一定的随机性,但是从期望上来看,它是等于正确的导数的。
缺点: SGD 因为更新比较频繁,会造成 cost function 有严重的震荡。
BGD 可以收敛到局部极小值,当然 SGD 的震荡可能会跳到更好的局部极小值处。当我们稍微减小 learning rate,SGD 和 BGD 的收敛性是一样的。

3、Mini-Batch Gradient Descent (MBGD)

梯度更新规则:
MBGD 每一次利用一小批样本,即 n 个样本进行计算,这样它可以降低参数更新时的方差,收敛更稳定,另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。和 SGD 的区别是每一次循环不是作用于每个样本,而是具有 n 个样本的批次。
缺点:
(1)Mini-batch gradient descent 不能保证很好的收敛性,learning rate 如果选择的太小,收敛速度会很慢,如果太大,loss function 就会在极小值处不停地震荡甚至偏离。(有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小 learning rate,不过这个阈值的设定需要提前写好,这样的话就不能够适应数据集的特点。)对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,因为鞍点周围的error是一样的,所有维度的梯度都接近于0,SGD 很容易被困在这里。(会在鞍点或者局部最小点震荡跳动,因为在此点处,如果是训练集全集带入即BGD,则优化会停止不动,如果是mini-batch或者SGD,每次找到的梯度都是不同的,就会发生震荡,来回跳动。)
(2)SGD对所有参数更新时应用同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新。Lr会随着更新的次数逐渐变小。

4、Momentum

SGD 在 ravines 的情况下容易被困住, ravines 就是曲面的一个方向比另一个方向更陡,这时 SGD 会发生震荡而迟迟不能接近极小值。
梯度更新规则:
Momentum 通过加入 γv_t−1 ,可以加速 SGD, 并且抑制震荡中期以及现在最普及的就是引入动量因子:
Δxt=ρΔxt−1−η⋅gt
ρ为动量因子,通常设为0.9
在更新中引入0.9这样的不平衡因子,使得:
(1)在下降初期,使用前一次的大比重下降方向,加速。
(2)在越过函数谷面时,异常的学习率,会使得两次更新方向基本相反,在原地”震荡“此时,动量因子使得更新幅度减小,协助越过函数谷面。
(3)在下降中后期,函数面局部最小值所在的吸引盆数量较多,一旦陷进吸引盆当中,Gradient→0,但是前后两次更新方向基本相同。
此时,动量因子使得更新幅度增大,协助跃出吸引盆。
优点
可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡。
缺点
这种情况相当于小球从山上滚下来时是在盲目地沿着坡滚,如果它能具备一些先知,例如快要上坡时,就知道需要减速了的话,适应性会更好。

5、Nesterov Accelerated Gradient

梯度更新规则:
用 θ−γv_t−1 来近似当做参数下一步会变成的值,则在计算梯度时,不是在当前位置,而是未来的位置上

超参数设定值: 一般 γ 仍取值 0.9 左右。
效果比较:

蓝色是 Momentum 的过程,会先计算当前的梯度,然后在更新后的累积梯度后会有一个大的跳跃。
而 NAG 会先在前一步的累积梯度上(brown vector)有一个大的跳跃,然后衡量一下梯度做一下修正(red vector),这种预期的更新可以避免我们走的太快。
NAG 可以使 RNN 在很多任务上有更好的表现。
目前为止,我们可以做到,在更新梯度时顺应 loss function 的梯度来调整速度,并且对 SGD 进行加速。我们还希望可以根据参数的重要性而对不同的参数进行不同程度的更新。

6、Adagrad (Adaptive gradient algorithm)

这个算法就可以对低频的参数做较大的更新,对高频的做较小的更新,也因此,对于稀疏的数据它的表现很好,很好地提高了 SGD 的鲁棒性,例如识别 Youtube 视频里面的猫,训练 GloVe word embeddings,因为它们都是需要在低频的特征上有更大的更新。

梯度更新规则:

其中 g 为:t 时刻参数 θ_i 的梯度

如果是普通的 SGD, 那么 θ_i 在每一时刻的梯度更新公式为:

但这里的 learning rate η 也随 t 和 i 而变:

超参数设定值:一般η选取0.01
优点:
Adagrad 的优点是减少了学习率的手动调节

缺点:
它的缺点是分母会不断积累,这样学习率就会收缩并最终会变得非常小。其中 G_t 是个对角矩阵, (i,i) 元素就是 t 时刻参数 θ_i 的梯度平方和。
超参数设定值:一般η选取0.01

7、Adadelta

AdaDelta的缺陷
超参数设定值: γ 一般设定为 0.9
局部最小值
从多个数据集情况来看,AdaDelta在训练初期和中期,具有非常不错的加速效果。但是到训练后期,进入局部最小值雷区之后,AdaDelta就会反复在局部最小值附近抖动。
主要体现在验证集错误率上,脱离不了局部最小值吸引盆。这时候,切换成动量SGD,如果把学习率降低一个量级,就会发现验证集正确率有2%~5%的提升,这与常规使用动量SGD,是一样的。之后再切换成AdaDelta,发现正确率又退回去了。再切换成动量SGD,发现正确率又回来了。

注:使用Batch Norm之后,这样从AdaDelta切到SGD会导致数值体系崩溃,原因未知。
个人猜测,人工学习率的量级降低,给训练造成一个巨大的抖动,从一个局部最小值,抖动到了另一个局部最小值,而AdaDelta的二阶近似计算,或者说所有二阶方法,则不会产生这么大的抖动,所以很难从局部最小值中抖出来。这给追求state of art的结果带来灾难,因为只要你一直用AdaDelta,肯定是与state of art无缘的。基本上state of art的结果,最后都是SGD垂死挣扎抖出来的。
这也是SGD为什么至今在state of art的论文中没有废除的原因,人家丑,但是实在。
精度
eps的数值不是固定的。1e-6在Caffe Cifar10上就显得过小了,1e-8比较适合。这意味着不同数值比例体系,精度需要人工注意。
paper里高精度反而没低精度好,说明精度也有比较大抖动。so,究竟什么样的精度是最好的呢?

在FCNN-AlexNet里,1e-8在epoch1之后就会产生数值问题。原因是sqrt(1e-8)*grad很大,这时候1e-10是比较好的。
另外,DensePrediction一定要做normalize,否则也有可能让AdaDelta的迭代步长计算出现数值问题。该问题在FCNN-AlexNet进行到epoch5左右时候开始明显化。caffe默认给的1e-10实际上要比paper里的1e-6要相对robust。

8、RMSprop

超参数设定值:

Hinton 建议设定 γ 为 0.9, 学习率 η 为 0.001

RMSprop 是 Geoff Hinton 提出的一种自适应学习率方法。
RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的,
梯度更新规则:

RMSprop 与 Adadelta 的第一种形式相同:(使用的是指数加权平均,旨在消除梯度下降中的摆动,与Momentum的效果一样,某一维度的导数比较大,则指数加权平均就大,某一维度的导数比较小,则其指数加权平均就小,这样就保证了各维度导数都在一个量级,进而减少了摆动。允许使用一个更大的学习率η)

RMSprop 与 Adadelta 的第一种形式相同:(使用的是指数加权平均,旨在消除梯度下降中的摆动,与Momentum的效果一样,某一维度的导数比较大,则指数加权平均就大,某一维度的导数比较小,则其指数加权平均就小,这样就保证了各维度导数都在一个量级,进而减少了摆动。允许使用一个更大的学习率η)

9、Adam:Adaptive Moment Estimation

超参数设定值:
建议* β1 = 0.9,β2 = 0.999,ϵ = 10e−8*

这个算法是另一种计算每个参数的自适应学习率的方法。相当于 RMSprop + Momentum
除了像 Adadelta 和 RMSprop 一样存储了过去梯度的平方 vt 的指数衰减平均值 ,也像 momentum 一样保持了过去梯度 mt 的指数衰减平均值:
如果 mt 和 vt 被初始化为 0 向量,那它们就会向 0 偏置,所以做了偏差校正,通过计算偏差校正后的 mt 和 vt 来抵消这些偏差:

如果 mt 和 vt 被初始化为 0 向量,那它们就会向 0 偏置,所以做了偏差校正,通过计算偏差校正后的 mt 和 vt 来抵消这些偏差:

梯度更新规则:

实践表明,Adam 比其他适应性学习方法效果要好

五、不同优化算法效果对比

1、各优化方法在损失曲面鞍点处上的表现

2、各优化方法在损失曲面上的表现:
3、上面两种情况都可以看出,Adagrad, Adadelta, RMSprop 几乎很快就找到了正确的方向并前进,收敛速度也相当快,而其它方法要么很慢,要么走了很多弯路才找到。

六、如何选择优化算法

1、如果数据是稀疏的,就用自适用方法,即 Adagrad, Adadelta, RMSprop, Adam。
2、RMSprop, Adadelta, Adam 在很多情况下的效果是相似的。
3、Adam 就是在 RMSprop 的基础上加了 bias-correction 和 momentum,随着梯度变的稀疏,Adam 比 RMSprop 效果会好。
4、整体来讲,Adam 是最好的选择。
5、很多论文里都会用 SGD,没有 momentum 等。SGD 虽然能达到极小值,但是比其它算法用的时间长,而且可能会被困在鞍点。
6、如果需要更快的收敛,或者是训练更深更复杂的神经网络,需要用一种自适应的算法。

参考文献:
[1] 机器学习中常见的最优化算法;
[2] 常见的几种最优化方法;
[3] 梯度下降法的三种形式BGD、SGD以及MBGD;
[4] 牛顿法与拟牛顿法。
[5]机器学习中常见的最优化算法总结:https://blog.csdn.net/huangfei711/article/details/79883350
[6]一文通透优化算法:从随机梯度、随机梯度下降法到牛顿法、共轭梯度:https://blog.csdn.net/v_JULY_v/article/details/81350035
[7]优化算法总结-深度学习:https://blog.csdn.net/fengzhongluoleidehua/article/details/81104051

机器学习、深度学习中常用的优化算法详解——梯度下降法、牛顿法、共轭梯度法相关推荐

  1. 深度学习中的Adam优化算法详解

    Adam论文:https://arxiv.org/pdf/1412.6980.pdf (一).什么是Adam算法? Adam(Adaptive momentum)是一种自适应动量的随机优化方法(A m ...

  2. 深度学习中常用的优化算法(SGD, Nesterov,Adagrad,RMSProp,Adam)总结

    深度学习中常用的优化算法(SGD, Nesterov,Adagrad,RMSProp,Adam)总结 1. 引言 在深度学习中我们定义了损失函数以后,会采取各种各样的方法来降低损失函数的数值,从而使模 ...

  3. Keras深度学习实战(4)——深度学习中常用激活函数和损失函数详解

    Keras深度学习实战(4)--深度学习中常用激活函数和损失函数详解 常用激活函数 Sigmoid 激活函数 Tanh 激活函数 ReLU 激活函数 线性激活函数 Softmax 激活函数 损失函数 ...

  4. 深度学习中常用的优化算法

    参考<动手学深度学习> https://zh.d2l.ai/chapter_optimization/index.html 一维梯度下降 我们先以简单的一维梯度下降为例,解释梯度下降算法可 ...

  5. DL之AF:机器学习/深度学习中常用的激活函数(sigmoid、softmax等)简介、应用、计算图实现、代码实现详细攻略

    DL之AF:机器学习/深度学习中常用的激活函数(sigmoid.softmax等)简介.应用.计算图实现.代码实现详细攻略 目录 激活函数(Activation functions)相关配图 各个激活 ...

  6. 【20210922】【机器/深度学习】KNN (K近邻) 算法详解

    一.算法概念 KNN, K-near neighbor,即最近邻算法.它是一种分类算法,算法思想是:一个样本与数据集中的 k 个样本最相似,如果这 k 个样本中的大多数属于某一个类别,则该样本也属于这 ...

  7. 深度学习中常用的Adam算法

    一.Adam算法 Adam(Adaptive momentum)是一种自适应动量的随机优化方法(A method for stochastic optimization),经常作为深度学习中的优化器算 ...

  8. 机器学习(深度学习)中的反向传播算法与梯度下降

    这是自己在CSDN的第一篇博客,目的是为了给自己学习过的知识做一个总结,方便后续温习,避免每次都重复搜索相关文章. 一.反向传播算法 定义:反向传播(Backpropagation,缩写为BP)是&q ...

  9. 深度学习中常用的优化方法

    一.basic algorithm 1. SGD 此处的SGD指mini-batch gradient descent,关于batch gradient descent, stochastic gra ...

最新文章

  1. ::operator new、sgi stl alloc、dlmalloc测试结果
  2. 从MySQL 5.6升级到8.0,Facebook付出了惨痛代价……
  3. 【一步教学,一步到位】mysql高可用架构
  4. 鸿蒙系统多屏协同,官方铁证!鸿蒙 2.0 手机来了,EMUI 11 多屏协同支持鸿蒙手机...
  5. 梯度消失和梯度爆炸_知识干货-动手学深度学习-05 梯度消失和梯度爆炸以及Kaggle房价预测...
  6. sql的case when用法
  7. linux清除configure文件_在Linux操作系统下自动生成Makefile的方法
  8. 封年大促|年货节优秀PSD分层模板
  9. 用Python爬数据,FineBI做分析后,我发现淘宝的手机原来这么便宜
  10. idea导入项目无法解析java
  11. HTML5 - 搭建移动Web应用
  12. 海量数据的常用10大解决方案
  13. SOEM主站开发笔记-- 点亮第一个LED----SOEM 的simpletest.c代码的解析以及改动
  14. osm地图数据 mysql_GIS 地图数据的来源?
  15. 使用md5进行密码的加密和验证
  16. 【MySQL】黑马教程MySQL数据库 MySQL基础(二)
  17. 大数据教程(10.5)运营商流量日志解析增强
  18. 计算机efs加密,2分钟让你学会电脑EFS文件加密
  19. 国外Flash源码的汉化
  20. 中俄蒙三国六方签订白鹤研究与保护合作备忘录

热门文章

  1. 服务器宝塔Error: connect ETIMEDOUT
  2. 程序员白piao服务器。大派送
  3. DelphiX 组件
  4. ESIM模拟器生成事件使用流程
  5. 致所有看到这段话的朋友们
  6. 编译时出现stripped of unavailable superclass
  7. Quartz的一般配置方法
  8. Binding的详细说明
  9. C++中的delegate
  10. 在线项目管理软件的重要性