深度学习中常见概念(收敛、优化器、学习率等)

收敛

打个简单的比方,训练网络模型,就好比解方程,为了得到这个方程的极值点,训练的过程就好比是找准一个方向,不断的朝这个方向靠近,使得方程的值不断减小,最终达到极值点,而不收敛,就是,不论你怎么跑,方程的解都不减小。即达不到最后的极值点.在loss上就表现为稳定性的比较大。跟迭代不收敛或者系统不稳定差不多,上下波动不能趋近一个定值。

收敛的意思是指某个值一直在往我们所期望的阈值靠,就拿深度学习中loss损失来做示例,如下一张图是loss在每轮训练时的一个曲线图,可以看到loss一直从一开始的1.8在往1.0降,1.0就是我们期望的阈值,而1.8是最开始loss最大损失值。

深度学习中常见概念(收敛、优化器、学习率等)_第1张图片

可以看到在训练过程中损失值一直在往我们期望的阈值上靠近,这个曲线非常平滑,没有出现曲线一直卡在某个点不下降或突然曲线上升了(这个情况是跑飞了)的原因,如果有可能是学习率设置的问题。如下图所示:
深度学习中常见概念(收敛、优化器、学习率等)_第2张图片

可以看到原本下降的过程中又突然增长回来了,这个原因可能是你学习率在进行衰减时出现了问题,这样的损失值在更新权重时肯定会有影响,这种情况也叫局部震荡,即在一个特定阈值附近进行来回跳跃,在1.0的阈值之间来回跳跃始终迭代不前,这种情况就出现了无法收敛的问题。

学习率代表了你loss损失值的利用率,所以你loss衰减取决于你的学习率。网络不收敛直观体现是loss函数无法下降,本质上是网络或者训练方法有问题,包括bachsize尺寸,是否数据归一化,学习率设计,初始化权重等,这些都需要检查一下。

优化器

优化器是什么

优化器是引导神经网络更新参数的工具,深度学习在计算出损失函数之后,需要利用优化器来进行反向传播,完成网络参数的更新。在这个过程中,便会使用到优化器,优化器可以利用计算机数值计算的方法来获取损失函数最小的网络参数。在深度学习中,不同的优化器只是定义了不同的一阶动量和二阶动量,一阶动量是与梯度相关的函数,二阶动量是与梯度平方相关的函数。常用的优化器主要有随机梯度下降法、Momentum、AdaGrad、RMSProp和Adam优化器。

优化器或者优化算法,是通过训练优化参数,来最小化(最大化)损失函数。损失函数是用来计算测试集中目标值Y的真实值和预测值的偏差程度。

为了使模型输出逼近或达到最优值,我们需要用各种优化策略和算法,来更新和计算影响模型训练和模型输出的网络参数。

梯度下降法

对于优化算法,优化的目标是网络模型中的参数θ(是一个集合,θ1、θ2、θ3 …)目标函数为损失函数L = 1/N ∑ Li (每个样本损失函数的叠加求均值)。这个损失函数L变量就是θ,其中L中的参数是整个训练集,换句话说,目标函数(损失函数)是通过整个训练集来确定的,训练集全集不同,则损失函数的图像也不同。那么为何在mini-batch中如果遇到鞍点/局部最小值点就无法进行优化了呢?因为在这些点上,L对于θ的梯度为零,换句话说,对θ每个分量求偏导数,带入训练集全集,导数为零。对于SGD/MBGD而言,每次使用的损失函数只是通过这一个小批量的数据确定的,其函数图像与真实全集损失函数有所不同,所以其求解的梯度也含有一定的随机性,在鞍点或者局部最小值点的时候,震荡跳动,因为在此点处,如果是训练集全集带入即BGD,则优化会停止不动,如果是mini-batch或者SGD,每次找到的梯度都是不同的,就会发生震荡,来回跳动。

常见优化器:

  • Batch Gradient Descent (BGD)
  • Stochastic Gradient Descent (SGD)
  • Mini-Batch Gradient Descent (MBGD)
  • Momentum
  • Nesterov Accelerated Gradient
  • Adagrad (Adaptive gradient algorithm)
  • Adadelta
  • RMSprop
  • Adam:Adaptive Moment Estimation

优化器效果比较

下面看一下几种算法在鞍点和等高线上的表现:
深度学习中常见概念(收敛、优化器、学习率等)_第3张图片
深度学习中常见概念(收敛、优化器、学习率等)_第4张图片
上面两种情况都可以看出,Adagrad, Adadelta, RMSprop 几乎很快就找到了正确的方向并前进,收敛速度也相当快,而其它方法要么很慢,要么走了很多弯路才找到。由图可知自适应学习率方法即 Adagrad, Adadelta, RMSprop, Adam 在这种情景下会更合适而且收敛性更好。

如何选择优化算法

  • 如果数据是稀疏的,就用自适用方法,即 Adagrad, Adadelta, RMSprop, Adam。

  • RMSprop, Adadelta, Adam 在很多情况下的效果是相似的。

  • Adam 就是在 RMSprop 的基础上加了 bias-correction 和 momentum,

  • 随着梯度变的稀疏,Adam 比 RMSprop 效果会好。

  • 整体来讲,Adam 是最好的选择。

  • 很多论文里都会用 SGD,没有 momentum 等。SGD 虽然能达到极小值,但是比其它算法用的时间长,而且可能会被困在鞍点。

  • 如果需要更快的收敛,或者是训练更深更复杂的神经网络,需要用一种自适应的算法。

学习率

调参的第一步是知道这个参数是什么, 它的变化对模型有什么影响。每个机器学习的研究者都会面临调参过程的考验,而在调参过程中,学习速率(learning rate)的调整则又是非常重要的一部分。

学习率是什么

要理解学习率是什么, 首先得弄明白神经网络参数更新的机制,梯度下降+反向传播:

总结一句话: 将输出误差反向传播给网络参数, 以此来拟合样本的输出. 本质上是最优化的一个过程, 逐步趋向于最优解.

但是每一次更新参数利用多少误差, 就需要通过一个参数来控制, 这个参数就是学习率 (Learning rate), 也称为步长.

学习速率代表了神经网络中随时间推移,信息累积的速度。学习率是最影响性能的超参数之一,如果我们只能调整一个超参数,那么最好的选择就是它。相比于其它超参数学习率以一种更加复杂的方式控制着模型的有效容量,当学习率最优时,模型的有效容量最大。因此,为了训练神经网络,其中一个需要设置的关键超参数是学习率。

学习率对模型的影响

学习率越大, 输出误差对参数的影响就越大, 参数更新的就越快, 但同时受到异常数据的影响也就越大, 很容易发散.

学习率 (Learning rate,η) 作为监督学习以及深度学习中重要的超参,其决定着目标函数能否收敛到局部最小值以及何时收敛到最小值。

合适的学习率能够使目标函数在合适的时间内收敛到局部最小值。

运用梯度下降算法进行优化时,权重的更新规则中,在梯度项前会乘以一个系数,这个系数就叫学习速率 α。

学习率是指导我们,在梯度下降法中,如何使用损失函数的梯度调整网络权重的超参数。
new_weight = old_weight - learning_rate * gradient

学习率对损失值和深度网络的影响

  • 学习率如果过大,可能会使损失函数直接越过全局最优点,容易发生梯度爆炸,loss 振动幅度较大,模型难以收敛。
  • 学习率如果过小,损失函数的变化速度很慢,容易过拟合。会大大增加网络的收敛复杂度. 虽然使用低学习率可以确保我们不会错过任何局部极小值,但也意味着我们将花费更长的时间来进行收敛,特别是在被困在局部最优点的时候。

学习率的作用

学习率 (learning rate),控制模型的学习进度.

由以上可以看出,为深度网络选择一个良好的学习率更新策略,可以抽象为以下两点好处:

  • 更快地达到loss的最小值
  • 保证收敛的loss值是神经网络的全局最优解

学习率设置

最理想的学习率不是固定值, 而是一个随着训练次数衰减的变化的值, 也就是在训练初期, 学习率比较大, 随着训练的进行, 学习率不断减小, 直到模型收敛.

在训练过程中,一般根据训练轮数设置动态变化的学习率:

  • 刚开始训练时:学习率以 0.01 ~ 0.001 为宜。
  • 一定轮数过后:逐渐减缓。
  • 接近训练结束:学习速率的衰减应该在 100 倍以上。

现阶段研究中,共同认同的学习率设置标准为:首先设置一个较大的学习率,使网络的损失值快速下降,然后随着迭代次数的增加一点点减少学习率,防止越过全局最优解。

那么我们现在面临两个两个问题:

如何选取初始的学习率?

  • 大多数的网络的学习率的初始值设置为 0.01 和 0.001 为宜
  • 较为科学的设置方法: 首先设置一个十分小的学习率,在每个 epoch 之后增大学习率,并记录好每个 epoch 的 loss 或者 acc,迭代的 epoch 越多,那被检验的学习率就越多,最后将不同学习率对应的 loss 或 acc 进行对比。
  • 如何根据迭代次数更新学习率(即衰减学习率策略)

学习率大小

深度学习中常见概念(收敛、优化器、学习率等)_第5张图片

学习率减缓机制

从初始学习率不停地向下衰减,策略一般有如下三种方式:轮数衰减、指数衰减、分数衰减

  • 轮数减缓: 如五轮训练后学习率减半,下一个五轮后再次减半;
  • 指数减缓: 即学习率按训练轮数增长指数插值递减等;
  • 分数减缓

学习率和目标函数损失值曲线

理想情况下,曲线应该是滑梯式下降 [绿线]
深度学习中常见概念(收敛、优化器、学习率等)_第6张图片

  • 曲线初始时上扬 [红线]:
    Solution:初始学习率过大,导致振荡,应减小学习率,并从头开始训练 。
  • 曲线初始时强势下,降没多久归于水平 [紫线]:
    Solution:后期学习率过大,导致无法拟合,应减小学习率,并重新训练后几轮 。
  • 曲线全程缓慢 [黄线]:
    Solution:初始学习率过小,导致收敛慢,应增大学习率,并从头开始训练 。

学习率总结

选择最优学习率是很重要的,因为它决定了神经网络是否可以收敛到全局最小值。选择较高的学习率,它可能在你的损失函数上带来不理想的后果,因此几乎从来不能到达全局最小值,因为你很可能跳过它。所以,你总是在全局最小值附近,但是从未收敛到全局最小值。选择较小的学习率有助于神经网络收敛到全局最小值,但是会花费很多时间——因为你在网络的权重上只做了很少的调整。这样你必须用更多的时间来训练神经网络。较小的学习率也更可能使神经网络困在局部极小值里面,也就是说,神经网络会收敛到一个局部极小值,而且因为学习率比较小,它无法跳出局部极小值。所以,在设置学习率的时候你必须非常谨慎。下图对这个问题进行了可视化:
深度学习中常见概念(收敛、优化器、学习率等)_第7张图片
最优最优学习速率与神经网络的损失函数地图(loss landscape)有关,它是网络参数值的函数,当在特定数据集上执行推断(预测)时量化与使用特定参数配置相关的「误差」。这个损失地图可能对于很相似的网络架构也看起来很不同。最优学习率取决于你的损失地图的拓扑结构,也就是你的模型结构和数据集。当你用默认的学习率(由你的深度学习库自动决定)可以提供一个差不多的结果,你也可以通过搜寻最优学习率来提高表现。

最终,我们希望得到一个学习率,极大地减少网路损失。我们可以在逐步提高每一次小批量(迭代)的学习速率的同时通过做一个简单实验来观察,记录每一次增量之后的损失。这个逐步的增长可以是线性或指数的。

对于太慢的学习速率来说,损失函数可能减小,但是按照非常浅薄的速率减小的。当进入了最优学习率区域,你将会观察到在损失函数上一次非常大的下降。进一步增加学习速率会造成损失函数值「跳来跳去」甚至在最低点附近发散。记住,最好的学习速率搭配着损失函数上最陡的下降,所以我们主要关注分析图的坡度。如下图所示:
深度学习中常见概念(收敛、优化器、学习率等)_第8张图片
你应该为这个实验设置你的学习率界限从而你能看到所有的三个阶段,确保识别最优范围。

另一个大家常用的技巧是学习速率退火(learning rate annealing),推荐大家先从一个比较高的学习速率开始然后慢慢地在训练中降低学习速率。这个方法背后的思想是我们喜欢快速地从初始参数移动到一个参数值「好」的范围,但这之后我们又想要一个学习速率小到我们可以发掘「损失函数上更深且窄的地方」,(来自 Karparthy 的 CS231n 课程笔记:http://cs231n.github.io/neural-networks-3/#annealing-the-learning-rate)。这样做的理由主要是如前文所述,太高的学习速率可以造成参数更新会在最小值和随后的更新间「跳来跳去」,这点子会造成在极小值范围内持续的有噪声的收敛,或者在更极端的例子里可能造成从最小值发散出去。

学习速率退火的最流行方式是「步衰减」(Step Decay),其中学习率经过一定数量的训练 epochs 后下降了一定的百分比
深度学习中常见概念(收敛、优化器、学习率等)_第9张图片
其他的方法还有周期性学习率表,或使用带有热重启的随机梯度下降(SGDR)等。

你可能感兴趣的:(深度学习,深度学习,人工智能,优化器,收敛,学习率)