机器学习中,通常有很多方法来试图寻找模型的最优解。比如常见的
梯度下降法(Gradient Descent)、
随机梯度下降法SGD
批量梯度下降法BGD
动量优化法(Momentum)、
自适应学习率优化算法
AdaGrad算法
RMSProp算法
Adam算法
lazyadam算法
下面来一一介绍:
在微积分中,对多元函数的参数求 偏导数,把求得的各个参数的导数以向量的形式写出来就是梯度。梯度就是函数变化最快的地方。梯度下降是迭代法的一种,在求解机器学习算法的模型参数 时,即无约束问题时,梯度下降是最常采用的方法之一。顾名思义,梯度下降法的计算过程就是沿梯度下降的方向求解极小值,也可以沿梯度上升方向求解最大值。 假设模型参数为 ,损失函数为 ,损失函数 关于参数 的偏导数,也就是梯度为 ,学习率为 ,则使用梯度下降法更新参数为:
评价:梯度下降法主要有两个缺点:
训练速度慢:每走一步都要要计算调整下一步的方向,下山的速度变慢。在应用于大型数据集中,每输入一个样本都要更新一次参数,且每次迭代都要遍历所有的样本。会使得训练过程及其缓慢,需要花费很长时间才能得到收敛解。
容易陷入局部最优解:由于是在有限视距内寻找下山的反向。当陷入平坦的洼地,会误以为到达了山地的最低点,从而不会继续往下走。所谓的局部最优解就是鞍点。落入鞍点,梯度为0,使得模型参数不在继续更新。
梯度下降法目前主要分为三种方法,区别在于每次参数更新时计算的样本数据量不同:
批量梯度下降法(BGD, Batch Gradient Descent)
随机梯度下降法(SGD, Stochastic Gradient Descent)
小批量梯度下降法(Mini-batch Gradient Descent)
假设训练样本总数为n,样本为 ,模型参数为 ,损失函数为 ,在第i对样本 上损失函数关于参数的梯度为 , 学习率为 ,则使用BGD更新参数为:
由上式可以看出,每进行一次参数更新,需要计算整个数据样本集,因此导致批量梯度下降法的速度会比较慢,尤其是数据集非常大的情况下,收敛速度就会非常慢,但是由于每次的下降方向为总体平均梯度,它得到的会是一个全局最优解。
评价:
批量梯度下降法比标准梯度下降法训练时间短,且每次下降的方向都很正确。
随机梯度下降法,不像BGD每一次参数更新,需要计算整个数据样本集的梯度,而是每次参数更新时,仅仅选取一个样本 计算其梯度,参数更新公式为:
可以看到BGD和SGD是两个极端,SGD由于每次参数更新仅仅需要计算一个样本的梯度,训练速度很快,即使在样本量很大的情况下,可能只需要其中一部分样本就能迭代到最优解,由于每次迭代并不是都向着整体最优化方向,导致梯度下降的波动非常大,更容易从一个局部最优跳到另一个局部最优,准确度下降。
SGD缺点:
小批量梯度下降法就是结合BGD和SGD的折中,对于含有n个训练样本的数据集,每次参数更新,选择一个大小为m 的mini-batch数据样本计算其梯度,其参数更新公式如下:
小批量梯度下降法即保证了训练的速度,又能保证最后收敛的准确率,目前的SGD默认是小批量梯度下降算法。
optimizer=tf.train.GradientDescentOptimizer(learning_rate)
train_op=optimizer.minimize(loss, global_step=global_step)
评价:
虽然小批量梯度下降法需要走很多步的样子,但是对梯度的要求很低(计算梯度快)。而对于引入噪声,大量的理论和实践工作证明,只要噪声不是特别大,都能很好地收敛。
应用大型数据集时,训练速度很快。比如每次从百万数据样本中,取几百或者几千个数据点,算一个梯度,更新一下模型参数。相比于批量梯度下降法BGD的遍历全部样本,每输入一个样本更新一次参数,要快得多。
小批量梯度下降法在选择小批量样本时,同时会引入噪声,使得权值更新的方向不一定正确。
动量优化方法引入物理学中的动量思想,加速梯度下降,Momentum算法。当我们将一个小球从山上滚下来,没有阻力时,它的动量会越来越大,但是如果遇到了阻力,速度就会变小,动量优化法就是借鉴此思想,使得梯度方向在不变的维度上,参数更新变快,梯度有所改变时,更新参数变慢,这样就能够加快收敛并且减少动荡。
momentum算法思想:参数更新时在一定程度上保留之前更新的方向,同时又利用当前batch的梯度微调最终的更新方向,简言之就是通过积累之前的动量来(previous_sum_of_gradient)加速当前的梯度。
假设 gradient 表示t时刻的动量(t时刻的梯度), 表示动量因子,通常取值0.9或者近似值,在随机梯度下降法SGD的基础上增加动量,则参数更新公式如下:
sum_of_gradient=u * gradient + previous_sum_of_gradient * decay_rate
delta=-learning_rate * sum_of_gradient
theta +=delta
在梯度方向改变时,momentum能够降低参数更新速度,从而减少震荡;
在梯度方向相同时,momentum可以加速参数更新, 从而加速收敛。
总而言之,momentum能够加速SGD收敛,抑制震荡。
动量移动得更快(因为它积累的所有动量)
动量有机会逃脱局部极小值(因为动量可能推动它脱离局部极小值)。同样,我们将在后面看到,它也将更好地通过高原区
每个参与训练的参数设置不同的学习率,在整个学习过程中通过一些算法自动适应这些参数的学习率。
自适应学习率优化算法针对于机器学习模型的学习率,传统的优化算法要么将学习率设置为常数要么根据训练次数调节学习率。极大忽视了学习率其他变化的可能性。然而,学习率对模型的性能有着显著的影响,因此需要采取一些策略来想办法更新学习率,从而提高训练速度。
我们先来看一下使用统一的全局学习率的缺点可能出现的问题:
对于某些参数,通过算法已经优化到了极小值附近,但是有的参数仍然有着很大的梯度。
如果学习率太小,则梯度很大的参数会有一个很慢的收敛速度;
如果学习率太大,则已经优化得差不多的参数可能会出现不稳定的情况。
解决方案:
对每个参与训练的参数设置不同的学习率,在整个学习过程中通过一些算法自动适应这些参数的学习率。
Delta-ba-delta:
如果损失与某一指定参数的偏导的符号相同,那么学习率应该增加;
如果损失与该参数的偏导的符号不同,那么学习率应该减小。
基于小批量的训练数据的性能更好的自适应学习率算法主要有:
AdaGrad算法
RMSProp算法
Adam算法
lazyadam算法
思想:AdaGrad(Adaptive Gradient)算法,独立地适应所有模型参数的学习率,缩放每个参数反比于 其所有梯度历史平均值 总和 的平方根。
具有代价函数最大梯度的参数相应地有个快速下降的学习率,
而具有小梯度的参数在学习率上有相对较小的下降。
算法描述:
AdaGrad算法优化策略一般可以表示为:
sum_of_gradient_squared=previous_sum_of_gradient_squared + gradient2
delta=-learning_rate * gradient / sqrt(sum_of_gradient_squared)
theta +=delta
详细执行流程表述:
全局学习率 ,初始化的参数 ,一个为了数值稳定而创建的小常数 (建议默认取 ),以及一个梯度累积变量 (初始化 )。算法主体,循环执行以下步骤,在没有达到停止的条件前不会停止。
(1)取出小批量数据 数据对应的目标用 表示
(2)在小批量数据的基础上按照以下公式计算梯度:
(3)累积平方梯度,并刷新r,过程如公式:
(4)计算参数更新量( 会被逐元素应用):
(5)根据 更新参数:
Adagrad 解决这个问题的思路是: 你已经更新的特征(幅度)越多,你将来更新的就越少,这样就有机会让其它特征(例如稀疏特征)赶上来。用可视化的术语来说,更新这个特征的程度即在这个维度中移动了多少,这个概念由梯度平方的累积和表达。
稀疏特征的平均梯度通常很小,所以这些特征的训练速度要慢得多。
这个属性让 AdaGrad (以及其它类似的基于梯度平方的方法,如 RMSProp 和 Adam)更好地避开鞍点。Adagrad 将采取直线路径,而梯度下降(或相关的动量)采取的方法是“让我先滑下陡峭的斜坡,然后才可能担心较慢的方向”。有时候,原版梯度下降可能非常满足的仅仅停留在鞍点,那里两个方向的梯度都是0。
假定一个多分类问题,i表示第i个分类,t表示第t迭代同时也表示分类i累计出现的次数。 表示初始的学习率取值一般为0.01,?是一个取值很小的数(一般为1e-8)为了避免分母为0。 表示t时刻即第t迭代模型的参数, 表示t时刻,指定分类i,代价函数J(?)关于W的梯度。
从表达式可以看出,
对出现比较多的类别数据,Adagrad给予越来越小的学习率,
而对于比较少的类别数据,会给予较大的学习率。
因此Adagrad适用于数据稀疏或者分布不平衡的数据集。
Adagrad 的主要优势在于不需要人为的调节学习率,它可以自动调节;
缺点在于,随着迭代次数增多,学习率会越来越小,最终会趋近于0。
更好的理解RMSprop
模型优化-RMSprop_温染的笔记-CSDN博客_rmsprop
在AdaGrad算法的基础上经过修改得到。AdaGrad中,每个参数的都反比于其所有梯度历史平方值总和的平方根,但RMSProp算法采用了指数衰减平均的方式淡化遥远过去的历史对当前步骤参数更新量的影响。RMSProp引入了一个新的参数(decay_rate),用于控制历史梯度值的衰减速率。
sum_of_gradient_squared=previous_sum_of_gradient_squared * decay_rate+ gradient2 * (1- decay_rate)
delta=-learning_rate * gradient / sqrt(sum_of_gradient_squared)
theta +=delta
详细执行流程表述:
设全局学习率为 ,历史梯度之的衰减速率参数 ,初始化的参数 ,一个为了数值稳定而创建的小常数 (建议默认取 ),以及一个梯度累积变量 (初始化 )。算法主体,循环执行以下步骤,在没有达到停止的条件前不会停止。
(1)取出小批量数据 数据对应的目标用 表示
(2)在小批量数据的基础上按照以下公式计算梯度:
(3)累积平方梯度,并刷新r,过程如公式:
(4)计算参数更新量( 会被逐元素应用):
(5)根据 更新参数:
更精确地说,梯度的平方和实际上是梯度平方的衰减和。衰减率表明的是只是最近的梯度平方有意义,而很久以前的梯度基本上会被遗忘。顺便说一句,“衰减率”这个术语有点用词不当。与我们在动量中看到的衰减率不同,除了衰减之外,这里的衰减率还有一个缩放效应: 它以一个因子(1 - 衰减率)向下缩放整个项。换句话说,如果衰减率设置为0.99,除了衰减之外,梯度的平方和将是 sqrt (1-0.99)=0.1,因此对于相同的学习率,这一步大10倍。
Adam (Adaptive Moment Estimation)同时兼顾了动量和 RMSProp 的优点。Adam在实践中效果很好,因此在最近几年,它是深度学习问题的常用选择。
让我们来看看它是如何工作的:
sum_of_gradient=previous_sum_of_gradient * beta1 + gradient * (1 - beta1)[类似Momentum]
sum_of_gradient_squared=previous_sum_of_gradient_squared * beta2 + gradient2 * (1- beta2)[类似RMSProp]
delta=-learning_rate * sum_of_gradient / sqrt(sum_of_gradient_squared)
theta +=delta
详细执行流程表述:
设全局学习率为 (建议默认 ),矩估计的指数衰减速率为 和 ( 和 在区间 内,建议默认分别为0.9和0.990),初始化的参数为 ,一个为了数值稳定而创建的小常数 (建议默认取 ),初始值为0的一阶和二阶矩变量 ,以及一个时间步计数器 (初始化 )。然后就是算法的主体,循环执行以下步骤,在没有达到停止的条件前不会停止。
(1)取出小批量数据 数据对应的目标用 表示
(2)在小批量数据的基础上按照以下公式计算梯度:
(3)刷新时间步:
(4)更新一阶有偏矩估计:
(5)更新二阶有偏矩估计:
(6)对一阶矩的偏差进行修正:
(7)对二阶矩的偏差进行修正:
(8)计算参数的更新量:
(9)根据 更新参数:
Beta1( )是一阶矩梯度之和(动量之和)的衰减率,通常设置为0.9。Beta2( )是二阶矩梯度平方和的衰减率,通常设置为0.999。Adam 的速度来自于动量和RMSProp 适应不同方向的梯度的能力。这两者的结合使它变得更强大。
Adam梯度经过偏置校正后,每一次迭代学习率都有一个固定范围,使得参数比较平稳。
结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点
为不同的参数计算不同的自适应学习率
也适用于大多非凸优化问题——适用于大数据集和高维空间。
LazyAdam 是 Adam 优化器的一种变体,可以更高效地处理稀疏更新。原始的 Adam 算法为每个可训练变量维护两个移动平均累加器,这些累加器在每一步都会更新。而此类为稀疏变量提供了更加懒惰的梯度更新处理。它仅更新当前批次中出现的稀疏变量索引的移动平均累加器,而不是更新所有索引的累加器。与原始的 Adam 优化器相比,它可以大幅提高某些应用的模型训练吞吐量。但是,它的语义与原始的 Adam 算法略有不同,这可能会产生不同的实验结果。
优化方法总结以及Adam存在的问题(SGD, Momentum, AdaDelta, Adam, AdamW,LazyAdam)下图是各个算法在等高线的表现,它们都从相同的点出发,走不同的路线达到最小值点。可以看到,Adagrad,Adadelta和RMSprop在正确的方向上很快地转移方向,并且快速地收敛,然而Momentum和NAG先被领到一个偏远的地方,然后才确定正确的方向,NAG比momentum率先更正方向。SGD则是缓缓地朝着最小值点前进。
tf.train.GradientDescentOptimizer
tf.train.AdadeltaOptimizer
tf.train.AdagradOptimizer
tf.train.AdagradDAOptimizer
tf.train.MomentumOptimizer
tf.train.AdamOptimizer
tf.train.FtrlOptimizer
tf.train.ProximalGradientDescentOptimizer
tf.train.ProximalAdagradOptimizer
tf.train.RMSPropOptimizer
“无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。
参考列表
机器学习:各种优化器Optimizer的总结与比较_SanFancsgo的博客-CSDN博客_优化器参考
梯度下降的可视化解释(Adam,AdaGrad,Momentum,RMSProp)
https://blog.csdn.net/weixin_40170902/article/details/80092628