在计算出模型的损失之后,就需要利用损失值进行模型参数的优化。
在实践操作中最常用到的是一阶优化函数,典型的一阶优化函数包括GD、SGD、Momentum、Adagrad、Adam 等等。一阶优化函数在优化过程中求解的是参数的一阶导数这些一阶导数的值就是模型中参数的微调值
这里引入了一个新的概念 :梯度。梯度其实就是将多元函数的各个参数求得的偏导 数以向量的形式展现出来,也叫作多元函数的梯度。

梯度下降

    梯度下降( Gradient Descent, 简称 GD )是参数优化的基础方法。虽然梯度下降己被广泛应用,但是其自身纯在许多不足,所以在其基础上改进的优化函数也非常多。

全局梯度下降的参数更新公式如下 :

机器学习优化势函数_深度学习


                                    公式1

    其中 ,训练样本总数为 n, j=0…n 。 可以将这里的等号看作编程中的赋值运算, θ是我们优化的参数对象,η是学习速率,J(θ)是损失函数,机器学习优化势函数_神经网络_02是根据损失函数来计算θ的梯度。学习速率用于控制梯度更新的快慢,如果学习速率过快,参数的更新跨步就会变大,极易出现局部最优和抖动;如果学习速率过慢,梯度更新的迭代次数就会增加,参数更新、优化的时间也会变长,所以选择一个合理的学习速率是非常关键的 。

    全局的梯度下降在每次计算损失值时都是针对整个参与训练的数据集而言的,所以会出现一个令人困扰的问题:因为模型的训练依赖于整个数据集,所以增加了计算损失值的时间成本和模型训练过程中的复杂度,而参与训练的数据量越大,这两个问题越明显。

    全局梯度下降每次学习都使用整个训练集,因此其优点在于每次更新都会朝着正确的方向进行,最后能够保证收敛于极值点(凸函数收敛于全局极值点,非凸函数可能会收敛于局部极值点),但是其缺点在于每次学习时间过长,并且如果训练集很大以至于需要消耗大量的内存,并且全量梯度下降不能进行在线模型参数更新。

批量梯度下降

    为了避免全局梯度下降问题带来的弊端,人们对全局梯度下降进行了改进,创造了批量梯度下降( Batch Gradient Descent,简称 BGD )的优化算法。 批量梯度下降就是将整个参与训练的数据集划分为若干个大小差不多的训练数据集 ,我们将其中的一个训练数据集叫作一个批量 , 每次用 一个批量的数据来对模型进行训练,并以这个批量计算得到的损失值为基准来对模型中的全部参数进行梯度更新,默认这个批量只使用 一次, 然后使用下一个批量的数据来完成相同的工作,直到所有批量的数据全部使用完毕。

    假设划分出来的批量个数为m,其中的一个批量包含 batch个数据样本,那么一个批 量的梯度下降的参数更新公式如下 :

机器学习优化势函数_机器学习优化势函数_03


                                            公式2

    训练样本总数为 batch, j = 0· ··batch 。 从以上公式中我们可以知道,其批量梯度下降算法大体上和全局的梯度下降算法没有多大的区别,唯一的不同就是损失值的计算方式使用的是J_batch(θj) ,即这个损失值是基于我们的一个批量的数据来进行计算的如果我们将批量划分得足够好,则计算损失函数的时间成本和模型训练的复杂度将会大大降低,不过仍然存在一些小问题,就是选择批量梯度下降很容易导致优化函数的最终结果是局部最优解

    批量梯度下降法是最原始的形式,它是指在每一次迭代时使用所有样本来进行梯度的更新。

随机梯度下降

    原始随机梯度下降算法每次从训练集中随机选择一个样本来进行学习。还有一种方法能够很好地处理全局梯度下降中的问题,就是批量随机梯度下降( Batch Stochastic Gradient Descent, 简称SGD ) 。 随机梯度下降是通过随机的方式从整个参与训练的数据集中选取一部分来参与模型的训练,所以只要我们随机选取的数据集大小合适, 就不用担心 计算损失函数的时间成本和模型训练的复杂度 ,而且与整个参与训练的数据集的大小没有关系 。

    假设我们随机选取的一部分数据集包含stochastic个数据样本,那么随机梯度下降的参数更新公式如下:

机器学习优化势函数_机器学习_04


                                            公式3

    训练样本的总数为stochastic, j = 0· ··stochastic 。 从该公式中可以看出,随机梯度下降和批量梯度下降的计算过程非常相似 ,只不过计算随机梯度下降损失值时使用的是 J_stochastic(θ_j),即这个损失值基于我们随机抽取stochastic个训练数据集。随机梯度下降虽然很好地提开了 训练速度,但是会在模型的参数优化过程中出现抖动的情况,原因就是我们选取的参与训练的数据集是随机的,所以模型会受到随机训练数据集中噪声数据的影响, 又因为有随机的因素 ,所以也容易导致模型最终得到局部最优解

小批量梯度下降

    Mini-batch梯度下降综合了batch梯度下降与stochastic梯度下降,在每次更新速度与更新次数中间取得一个平衡,其每次更新从训练集中随机选择m,m<n 个样本进行学习(Mini-batch gradient descent)
    相对于随机梯度下降,Mini-batch梯度下降降低了收敛波动性,即降低了参数更新的方差,使得更新更加稳定。相对于全量梯度下降,其提高了每次学习的速度。并且其不用担心内存瓶颈从而可以利用矩阵运算进行高效计算。一般而言每次更新随机选择[50,256]个样本进行学习,但是也要根据具体问题而选择,实践中可以进行多次试验,选择一个更新速度与更次次数都较适合的样本数。mini-batch梯度下降可以保证收敛性,常用于神经网络中。

Momentum

    这种优化方法就是在随机梯度下降的同时,增加动量 (Momentum) 这来自于物理中的概念, 可以想象损数是一个山谷,一个球从山谷滑 ,在一个平坦的地势,球的滑动速度就会慢下来,可能陷入一些鞍点或者局部极小值点,如图一所示,SGD会在峡谷这些地方附近振荡,从而收敛很慢。

机器学习优化势函数_梯度下降_05


                                                        图一 增加动量

    这个时候给它增加动量就可以让它从高处滑落时的势能转换为平地的功能,相当于惯性增加小球在平地滑动的速度,从而帮助其跳出鞍点或者局部极小点。

    在普通的梯度下降法w=w+v中,每次w的更新量v为

机器学习优化势函数_深度学习_06


                公式4

    当使用动量时,则把每次w的更新量v考虑为本次的梯度下降量−ηdw与上次w的更新量v乘上一个介于[0, 1]的因子momentum的和,即v为

机器学习优化势函数_神经网络_07


                                公式5

    如果这一时刻更新度vt与上一时刻更新度vt−1的方向相同,则会加速。反之,则会减速。因此可以获得更快的收敛速度与减少振荡

增加动量的优点:

  1. 加速收敛
  2. 提高精度(减少收敛过程中的振荡)

    除此之外,对于动量还有 个变形, Nesterov 我们 新参数的时候需要梯度,传统的动量方法是计算当前位置的梯度,但是 Nesterov的方法是计算经过动更新之后的位置的梯度。

Adagrad

    这是自适应学习率 (adaptive) 的方法,它的公式是:

机器学习优化势函数_机器学习_08


                                                        公式6

    我们可以看到学习率在不断变小, 且受每次计算出来的梯 影响 ,对

于梯度 大的参数,它的学习率就会变得 对更,里面的根号特重要,没有这个

根号算法表现非常差。同时e是一个平滑数参数,通常设置为10(-4)~10(-8),这是为了避免分母为0。

    自适应学习 的缺点就是在某些情况下一直递 学习率并不好,这样会造成学

习过早停止。

RMSprop

    这是种非常有效的自适应学习率改进方法,它的公式是:

机器学习优化势函数_梯度下降_09


                                                            公式7

机器学习优化势函数_机器学习优化势函数_10


                                            公式8

    这里多了一个a,这是 一个衰减率,也就是说RMSprop不再会将前面所有的梯度平方求和,而是通过这个衰减率将其变小,使用了 种滑动平均的方式,越靠前面的梯度对自适应的学习率影响越小,这样就能更加有效地避免Adagrad学习率一直递减太多的问题,能够更快地收敛。

Adam

这是种综合型的学习方法,可以看成是RSMprop 加上动量 (Momentum) 的学习方法,达到比 RMSProp 更好的效果。一个 比较“ 智能”的优化函数方法一一自适应时刻估计方法(Adaptive Moment Estimation,简称 Adam)。Adam在模型训练优化的过程中通过让每个参数获得自适应的学习率,来达到优化质量和速度的双重提升。举个简单的实例,假设我们在一开始进行模型参数的训练时损失值比较大,则这时需要使用较大的学习速率让模型参数进行较大的梯度更新 ,但是到了后期我们的损失值己经趋近于最小了,这时就需要使用较小的学习速率让模型参数进行较小的梯度更新以防止在优化过程中出现局部最忧解。
在实际应用中当然不止Adam这种类型的自适应优化函数,不过应用该方法在最后取得的效果都比较理想 ,这和Adam收敛速度快、学习效果好的优点脱不了干系,而且对于在优化过程中出现的学习速率消失、收敛过慢、高方差的参数更新等导致损失值波动等问题, Adam都有很好的解决方案。
    以上介绍了多种基于梯度的参数更新方法,实际中我们可以使用 Adam 作为默认的优化算法,往往能够达到比较好的效果,同时SGD+Momentum 的方法也值得尝试