1.收敛
打个简单的比方,训练网络模型,就好比解方程,为了得到这个方程的极值点,训练的过程就好比是找准一个方向,不断的朝这个方向靠近,使得方程的值不断减小,最终达到极值点,而不收敛,就是,不论你怎么跑,方程的解都不减小。即达不到最后的极值点.在loss上就表现为稳定性的比较大。跟迭代不收敛或者系统不稳定差不多,上下波动不能趋近一个定值。
收敛的意思是指某个值一直在往我们所期望的阈值靠,就拿深度学习中loss损失来做示例,如下一张图是loss在每轮训练时的一个曲线图,可以看到loss一直从一开始的1.8在往1.0降,1.0就是我们期望的阈值,而1.8是最开始loss最大损失值。
可以看到在训练过程中损失值一直在往我们期望的阈值上靠近,这个曲线非常平滑,没有出现曲线一直卡在某个点不下降或突然曲线上升了(这个情况是跑飞了)的原因,如果有可能是学习率设置的问题。如下图所示:
可以看到原本下降的过程中又突然增长回来了,这个原因可能是你学习率在进行衰减时出现了问题,这样的损失值在更新权重时肯定会有影响,这种情况也叫局部震荡,即在一个特定阈值附近进行来回跳跃,在1.0的阈值之间来回跳跃始终迭代不前,这种情况就出现了无法收敛的问题。
学习率代表了你loss损失值的利用率,所以你loss衰减取决于你的学习率。网络不收敛直观体现是loss函数无法下降,本质上是网络或者训练方法有问题,包括bachsize尺寸,是否数据归一化,学习率设计,初始化权重等,这些都需要检查一下。
2.优化器
2.1优化器是什么
优化器是引导神经网络更新参数的工具,深度学习在计算出损失函数之后,需要利用优化器来进行反向传播,完成网络参数的更新。在这个过程中,便会使用到优化器,优化器可以利用计算机数值计算的方法来获取损失函数最小的网络参数。在深度学习中,不同的优化器只是定义了不同的一阶动量和二阶动量,一阶动量是与梯度相关的函数,二阶动量是与梯度平方相关的函数。常用的优化器主要有随机梯度下降法(SGD)、Momentum、AdaGrad、RMSProp和Adam优化器。
2.1.1反向传播
反向传播是为了让神经网络更新前面的参数,可以想象成做题的时候(题目就可以想成一个一个的神经元节点),我们有做对的,有做错的,做错的题目就可以反过来告诉我们应该重点学习哪一块知识,学习哪些题型,然后神经网络通过forward把这个节点的参数权重调大,这样就是方向传播更新参数
优化器或者优化算法,是通过训练优化参数,来最小化(最大化)损失函数。损失函数是用来计算测试集中目标值Y的真实值和预测值的偏差程度。
为了使模型输出逼近或达到最优值,我们需要用各种优化策略和算法,来更新和计算影响模型训练和模型输出的网络参数。
2.2梯度下降法
对于优化算法,优化的目标是网络模型中的参数θ(是一个集合,θ1、θ2、θ3 …)目标函数为损失函数L = 1/N ∑ Li (每个样本损失函数的叠加求均值)。这个损失函数L变量就是θ,其中L中的参数是整个训练集,换句话说,目标函数(损失函数)是通过整个训练集来确定的,训练集全集不同,则损失函数的图像也不同。那么为何在mini-batch中如果遇到鞍点/局部最小值点就无法进行优化了呢?因为在这些点上,L对于θ的梯度为零,换句话说,对θ每个分量求偏导数,带入训练集全集,导数为零。对于SGD/MBGD而言,每次使用的损失函数只是通过这一个小批量的数据确定的,其函数图像与真实全集损失函数有所不同,所以其求解的梯度也含有一定的随机性,在鞍点或者局部最小值点的时候,震荡跳动,因为在此点处,如果是训练集全集带入即BGD,则优化会停止不动,如果是mini-batch或者SGD,每次找到的梯度都是不同的,就会发生震荡,来回跳动。
2.3常见优化器:
Batch Gradient Descent (BGD)Stochastic Gradient Descent (SGD)Mini-Batch Gradient Descent (MBGD)MomentumNesterov Accelerated GradientAdagrad (Adaptive gradient algorithm)AdadeltaRMSpropAdam:Adaptive Moment Estimation2.4优化器效果比较
下面看一下几种算法在鞍点和等高线上的表现:
上面两种情况都可以看出,Adagrad, Adadelta, RMSprop 几乎很快就找到了正确的方向并前进,收敛速度也相当快,而其它方法要么很慢,要么走了很多弯路才找到。由图可知自适应学习率方法即 Adagrad, Adadelta, RMSprop, Adam 在这种情景下会更合适而且收敛性更好。
2.5如何选择优化算法
如果数据是稀疏的,就用自适用方法,即 Adagrad, Adadelta, RMSprop, Adam。
RMSprop, Adadelta, Adam 在很多情况下的效果是相似的。
Adam 就是在 RMSprop 的基础上加了 bias-correction 和 momentum,
随着梯度变的稀疏,Adam 比 RMSprop 效果会好。
整体来讲,Adam 是最好的选择。
很多论文里都会用 SGD,没有 momentum 等。SGD 虽然能达到极小值,但是比其它算法用的时间长,而且可能会被困在鞍点。
如果需要更快的收敛,或者是训练更深更复杂的神经网络,需要用一种自适应的算法。
3.学习率
调参的第一步是知道这个参数是什么, 它的变化对模型有什么影响。每个机器学习的研究者都会面临调参过程的考验,而在调参过程中,学习速率(learning rate)的调整则又是非常重要的一部分。
3.1学习率是什么
要理解学习率是什么, 首先得弄明白神经网络参数更新的机制,梯度下降+反向传播:
总结一句话: 将输出误差反向传播给网络参数, 以此来拟合样本的输出. 本质上是最优化的一个过程, 逐步趋向于最优解.
但是每一次更新参数利用多少误差, 就需要通过一个参数来控制, 这个参数就是学习率 (Learning rate), 也称为步长.
学习速率代表了神经网络中随时间推移,信息累积的速度。学习率是最影响性能的超参数之一,如果我们只能调整一个超参数,那么最好的选择就是它。相比于其它超参数学习率以一种更加复杂的方式控制着模型的有效容量,当学习率最优时,模型的有效容量最大。因此,为了训练神经网络,其中一个需要设置的关键超参数是学习率。
3.2学习率对模型的影响
学习率越大, 输出误差对参数的影响就越大, 参数更新的就越快, 但同时受到异常数据的影响也就越大, 很容易发散.
学习率 (Learning rate,η) 作为监督学习以及深度学习中重要的超参,其决定着目标函数能否收敛到局部最小值以及何时收敛到最小值。
合适的学习率能够使目标函数在合适的时间内收敛到局部最小值。
运用梯度下降算法进行优化时,权重的更新规则中,在梯度项前会乘以一个系数,这个系数就叫学习速率 α。
学习率是指导我们,在梯度下降法中,如何使用损失函数的梯度调整网络权重的超参数。new_weight = old_weight - learning_rate * gradient
3.3学习率对损失值和深度网络的影响
学习率如果过大,可能会使损失函数直接越过全局最优点,容易发生梯度爆炸,loss 振动幅度较大,模型难以收敛。学习率如果过小,损失函数的变化速度很慢,容易过拟合。会大大增加网络的收敛复杂度. 虽然使用低学习率可以确保我们不会错过任何局部极小值,但也意味着我们将花费更长的时间来进行收敛,特别是在被困在局部最优点的时候。3.4学习率的作用
学习率 (learning rate),控制模型的学习进度.
由以上可以看出,为深度网络选择一个良好的学习率更新策略,可以抽象为以下两点好处:
更快地达到loss的最小值保证收敛的loss值是神经网络的全局最优解3.5学习率设置
最理想的学习率不是固定值, 而是一个随着训练次数衰减的变化的值, 也就是在训练初期, 学习率比较大, 随着训练的进行, 学习率不断减小, 直到模型收敛.
在训练过程中,一般根据训练轮数设置动态变化的学习率:
刚开始训练时:学习率以 0.01 ~ 0.001 为宜。一定轮数过后:逐渐减缓。接近训练结束:学习速率的衰减应该在 100 倍以上。现阶段研究中,共同认同的学习率设置标准为:首先设置一个较大的学习率,使网络的损失值快速下降,然后随着迭代次数的增加一点点减少学习率,防止越过全局最优解。
那么我们现在面临两个两个问题:
如何选取初始的学习率?
大多数的网络的学习率的初始值设置为 0.01 和 0.001 为宜较为科学的设置方法: 首先设置一个十分小的学习率,在每个 epoch 之后增大学习率,并记录好每个 epoch 的 loss 或者 acc,迭代的 epoch 越多,那被检验的学习率就越多,最后将不同学习率对应的 loss 或 acc 进行对比。如何根据迭代次数更新学习率(即衰减学习率策略)3.5.3学习率大小
3.5.2学习率减缓机制
从初始学习率不停地向下衰减,策略一般有如下三种方式:轮数衰减、指数衰减、分数衰减
轮数减缓: 如五轮训练后学习率减半,下一个五轮后再次减半;指数减缓: 即学习率按训练轮数增长指数插值递减等;分数减缓3.6学习率和目标函数损失值曲线
理想情况下,曲线应该是滑梯式下降 [绿线]:
Solution:初始学习率过大,导致振荡,应减小学习率,并从头开始训练 。曲线初始时强势下,降没多久归于水平 [紫线]:
Solution:后期学习率过大,导致无法拟合,应减小学习率,并重新训练后几轮 。曲线全程缓慢 [黄线]:
Solution:初始学习率过小,导致收敛慢,应增大学习率,并从头开始训练 。
3.7学习率总结
选择最优学习率是很重要的,因为它决定了神经网络是否可以收敛到全局最小值。选择较高的学习率,它可能在你的损失函数上带来不理想的后果,因此几乎从来不能到达全局最小值,因为你很可能跳过它。所以,你总是在全局最小值附近,但是从未收敛到全局最小值。选择较小的学习率有助于神经网络收敛到全局最小值,但是会花费很多时间——因为你在网络的权重上只做了很少的调整。这样你必须用更多的时间来训练神经网络。较小的学习率也更可能使神经网络困在局部极小值里面,也就是说,神经网络会收敛到一个局部极小值,而且因为学习率比较小,它无法跳出局部极小值。所以,在设置学习率的时候你必须非常谨慎。下图对这个问题进行了可视化:
最优最优学习速率与神经网络的损失函数地图(loss landscape)有关,它是网络参数值的函数,当在特定数据集上执行推断(预测)时量化与使用特定参数配置相关的「误差」。这个损失地图可能对于很相似的网络架构也看起来很不同。最优学习率取决于你的损失地图的拓扑结构,也就是你的模型结构和数据集。当你用默认的学习率(由你的深度学习库自动决定)可以提供一个差不多的结果,你也可以通过搜寻最优学习率来提高表现。
最终,我们希望得到一个学习率,极大地减少网路损失。我们可以在逐步提高每一次小批量(迭代)的学习速率的同时通过做一个简单实验来观察,记录每一次增量之后的损失。这个逐步的增长可以是线性或指数的。
对于太慢的学习速率来说,损失函数可能减小,但是按照非常浅薄的速率减小的。当进入了最优学习率区域,你将会观察到在损失函数上一次非常大的下降。进一步增加学习速率会造成损失函数值「跳来跳去」甚至在最低点附近发散。记住,最好的学习速率搭配着损失函数上最陡的下降,所以我们主要关注分析图的坡度。如下图所示:
你应该为这个实验设置你的学习率界限从而你能看到所有的三个阶段,确保识别最优范围。
另一个大家常用的技巧是学习速率退火(learning rate annealing),推荐大家先从一个比较高的学习速率开始然后慢慢地在训练中降低学习速率。这个方法背后的思想是我们喜欢快速地从初始参数移动到一个参数值「好」的范围,但这之后我们又想要一个学习速率小到我们可以发掘「损失函数上更深且窄的地方」,(来自 Karparthy 的 CS231n 课程笔记:http://cs231n.github.io/neural-networks-3/#annealing-the-learning-rate)。这样做的理由主要是如前文所述,太高的学习速率可以造成参数更新会在最小值和随后的更新间「跳来跳去」,这点子会造成在极小值范围内持续的有噪声的收敛,或者在更极端的例子里可能造成从最小值发散出去。
学习速率退火的最流行方式是「步衰减」(Step Decay),其中学习率经过一定数量的训练 epochs 后下降了一定的百分比
其他的方法还有周期性学习率表,或使用带有热重启的随机梯度下降(SGDR)等。
4.超参数
在机器学习(包含深度学习)的上下文中,超参数是在开始学习过程之前设置值的参数,而不是通过训练得到 的参数数据。通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数,以提高学习的性能和效果。
4.1超参数通常存在于:
定义关于模型的更高层次的概念,如复杂性或学习能力。不能直接从标准模型培训过程中的数据中学习,需要预先定义。可以通过设置不同的值,训练不同的模型和选择更好的测试值来决定具体来讲就是深度学习中的的学习率(learning rate)、梯度下降法迭代的数量(iterations)、隐藏层数目(hidden layers)、隐藏层单元数目、激活函数(activation function)都需要根据实际情况来设置,这些数字实际上控制了最后的参数和的值,所以它们被称作超参数。
4.2寻找超参数的最优值
超参数需要人为设置,设置的值对结果产生较大影响。常见设置超参数的方法有:
猜测和检查:根据经验或直觉,选择参数,一直迭代。网格搜索:让计算机尝试在一定范围内均匀分布的一组值。随机搜索:让计算机随机挑选一组值。贝叶斯优化:使用贝叶斯优化超参数,会遇到贝叶斯优化算法本身就需要很多的参数的困难。4.3超参数搜索过程
超参数搜索一般过程如下:
将数据集划分成训练集、验证集及测试集。在训练集上根据模型的性能指标对模型参数进行优化。在验证集上根据模型的性能指标对模型的超参数进行搜索。步骤 2 和步骤 3 交替迭代,最终确定模型的参数和超参数,在测试集中验证评价模型的优劣。其中,搜索过程需要搜索算法,一般有:网格搜索、随机搜过、启发式智能搜索、贝叶斯搜索等