服务热线:13988889999

站内公告:

诚信为本:市场永远在变,诚信永远不变。
图深度学习入门教程(五)——模型的优化器

你的位置: 首页 > 杏悦新闻

图深度学习入门教程(五)——模型的优化器

2024-04-22 14:29:48  点击量:

摘要:

深度学习还没学完,怎么图深度学习又来了?别怕,这里有份系统教程,可以将0基础的你直接送到图深度学习。还会定期更新哦。

本教程是一个系列免费教程,争取每月更新2到4篇。

主要是基于图深度学习的入门内容。讲述最基本的基础知识,其中包括深度学习、数学、图神经网络等相关内容。该教程由代码医生工作室出版的全部书籍混编节选而成。偏重完整的知识体系和学习指南。在实践方面不会涉及太多基础内容 (实践和经验方面的内容,请参看原书)。

文章涉及使用到的框架以PyTorch和TensorFlow为主。默认读者已经掌握Python和TensorFlow基础。如有涉及到PyTorch的部分,会顺带介绍相关的入门使用。

本教程主要针对的人群:

  • 已经掌握TensorFlow基础应用,并想系统学习的学者。
  • PyTorch学习者
  • 正在从TensorFlow转型到PyTroch的学习者
  • 已经掌握Python,并开始学习人工智能的学者。

本篇文章主要介绍模型的优化器。在模型的优化器方面,图神经网络所使用的技术是与深度学习是完全一样的。

本篇文章主要介绍深度学习中模型优化器的种类及选取,顺便介绍一下TF2与PyTorch框架中的优化器接口。

1 优化器模块

在有了正向结构和损失函数后,就是通过优化函数来优化学习参数了,这个过程也是在反向传播中完成的。这个优化函数叫做优化器,在深度学习框架中被统一封装到优化器模块中。其内部原理主要是通过梯度下降的方法对模型中的参数进行优化。

1.1 优化器与梯度下降

在实际训练过程中,很难一次将其调整到位,而是通过多次迭代一点一点的将其修正,最终直到模型的输出值与实际标签值的误差小于某个阀值为止。

优化器是基于Bp算法的一套优化策略。主要的作用是通过算法帮助模型在训练过程中,如何更快更好的将参数调整到位。

在优化器策略中,最基础的算法就是梯度下降法。

梯度下降法是一个最优化算法,通常也称为最速下降法。常用于机器学习和人工智能当中用来递归性地逼近最小偏差模型,梯度下降的方向也就是用负梯度方向为搜索方向,沿着梯度下降的方向求解极小值。

在训练过程中,每次的正向传播后都会得到输出值与真实值的损失值,这个损失值越小,代表模型越好,于是梯度下降的算法就用在这里,帮助我们找最小的那个损失值,从而可以反推出来对应的学习参数b和w,达到优化模型的效果。

1.2 优化器的类别

原始的优化器主要使用3中梯度下降的方法:批量梯度下降、随机梯度下降和小批量梯度下降。

  • 批量梯度下降:遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度。这种方法每更新一次参数都要把数据集里的所有样本都看一遍,计算量开销大,计算速度慢,不支持在线学习,这称为Batch gradient descent,批梯度下降。
  • 随机梯度下降:每看一个数据就算一下损失函数,然后求梯度更新参数,这个称为随机梯度下降,stochastic gradient descent。这个方法速度比较快,但是收敛性能不太好,可能在最优点附近晃来晃去,hit不到最优点。两次参数的更新也有可能互相抵消掉,造成目标函数震荡的比较剧烈。
  • 小批量梯度下降:为了克服两种方法的缺点,现在一般采用的是一种折中手段——小批的梯度下降,这种方法把数据分为若干个批,按批来更新参数,这样,一个批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性。另一方面因为批的样本数与整个数据集相比小了很多,计算量也不是很大。

随着梯度下降领域的深度研究,又出现了更多功能强大的优化器,它们在性能和精度方便做得越来越好。当然其实现过程也变得越来越复杂。主流的优化器有RMSprop、Adagrad、Adam、SGD等,它们都有自身的特点以及适应的场景。

1.3 优化器的选取

优化器的选取没有特定的标准,需要根据具体的任务,多次尝试选择不同的优化器,选择使得评估函数最小的那个优化器。

根据经验,RMSprop、Adagrad、Adam、SGD是比较通用的优化器。其中前三个优化器适合自动收敛。而最后一个优化器,常用于精调模型。

在自动手收敛方面:一般以Adam优化器最为常用,综合来看,它在收敛速度、模型所训练出来的精度方面,效果相对更好一些。而且对于学习率的设置要求相对比较宽松,更容易使用。

在精调模型方面:常常通过手动修改学习率来进行模型的二次调优。为了训练出更好的模型,一般会在使用Adam优化器训练到模型无法收敛之后,再使用SGD优化器,通过手动调节学习率的方式,进一步提升模型性能。

随着2019年Ranger优化器的出现,目前已经被公认为最好的优化器。无论从性能还是精度上都优于以往的其它优化器。

相关Ranger论文的获取方式是:

在网站中,搜索论文号:1908.00700

https://arxiv.org

目前在TensorFlow 2.0版本中并没有Ranger优化器的封装。需要额外安装Addons模块进行使用。

2 TensorFlow中的优化器种类

在TensorFlow 2.0版本中,常用的优化器有:

  • SGD:随机梯度下降优化器。包含扩展功能的优化器有:动量(momentum)优化器、学习率衰减优化器、Nestrov 动量 (NAG) 优化器。
  • RMSprop:均方根传播优化器。是一种平均梯度的优化器。一般使用优化器的默认参数,这个优化器对训练循环神经网络比较好。
  • Adagrad:适应性梯度优化器。是一种具有特定参数学习率的优化器,它根据参数在训练期间的更新频率进行自适应调整。参数更新越多,则更新值越小。
  • Adadelta:Adagrad 的扩展,具有更强鲁棒性,它不是累积所有过去的梯度,而是根据渐变更新的移动窗口调整学习率。即使进行了很多更新,Adadelta仍在继续学习。与Adagrad相比,在Adadelta无需设置初始学习率。
  • Adam:适应性矩估计。是随机梯度下降算法的扩展。
  • Adamax:Adam算法基于无穷范数的变种。
  • Nadam:Nesterov momentum版本的Adam优化器。
  • AMSGrad:使用了二阶动量的Adam优化器。
  • RAdam:带有整流器的Adam,能够利用方差的潜在散度动态地打开或关闭自适应学习率。
  • Lookahead:通过迭代更新两组权重的方法,提前观察另一个优化器生成的序列,来选择搜索方向。
  • Ranger:RAdam与LookAhead优化器的协同组合。

具体的使用方法可以参考我们的配套图书,这里不再详述。

3 PyTorch中的优化器使用

在PyTorch中可以使用torch.optim构建一个optimizer对象。该对象能够保持当前参数状态并基于计算得到的梯度进行参数更新。

优化器模块封装了神经网络在反向传播中的一系列优化策略。这些优化策略可以使模型在训练过程中更快更好的进行收敛。具体代码如下:

其中,Adam是优化器方法。该方法的参数较多,其中常用的参数主要有两个:

  • 待优化权重Parameter:一般是固定写法。调用模型的parameters方法,将返回值传入即可。
  • 优化时的学习率:用来控制优化器在工作时对参数的调节幅度。优化器在工作时,会先算出梯度(根据损失值对某个Parameter参数求偏导),再沿着该梯度(这里可以把梯度当作斜率)的方向,算出一段距离(该距离由学习率控制)之后的差值,将该差值作为变化值更新到原有参数上。学习率越大,模型的收敛速度越快,但是模型的训练效果容易出现较大的震荡。学习率越小模型的震荡幅度越小,但是收敛越慢。

整个过程中的求导和反向传播操作,都是在优化器里自动完成的。

4 学习率在模型训练中的作用

优化器参数lr代表学习率,代表模型在反向优化中沿着梯度方向调节的步长大小。这个参数用来控制模型在优化过程中调节权重的幅度。

在训练模型中,这个参数常被手动调节,用于对模型精度的提升。设置学习率的大小,是在精度和速度之间找到一个平衡:

  • 如果学习率的值比较大,则训练速度会提升,但结果的精度不够;
  • 如果学习率的值比较小,精度虽然提升了,但训练会耗费太多的时间。

4.1. 退化学习率

一般在训练开始时使用较大的学习率,使得损失函数快速达到极小值附近。随着训练的进行,变成使用较小的学习率,使得损失函数在极小值附近微调,直至达到极小值。这就是退化学习率的想法。

退化学习率是指在训练过程中改变学习率的大小。

4.2. TensorFlow中设置退化学习率

TensorFlow中退化学习率的设置方法有下面的两种:

(1)直接在优化器里设置,例如opt=Adam(lr=INIT_LR, decay=INIT_LR / EPOCHS)。

(2)使用回调函数(Callbacks)的方式。

Callbacks方法是指在被调用的函数或方法里,去回调调用函数的技术。即:由调用函数提供回调函数的实现,由被调用函数选择时机去执行。

在tf.keras接口中定义了很多实用的Callbacks类,在使用时,将这些Callbacks类实例化,并传入fit方法或fit_generator方法的Callbacks参数中即可。下面介绍几个常用的Callbacks类。

ReduceLROnPlateau类可以实现在评价指标不再提升时,减少学习率。该类的初始化参数如下:

  • monitor:被监测的对象。
  • factor:每次减少学习率的因子,学习率将以lr=lr×factor的形式被减少。
  • patience:触发退化学习率事件的判定次数。如果连续迭代训练patience次,模型的性能仍没有提升,则会触发退化学习率动作。
  • mode:判定退化学习率的条件。该值可以被设置成“auto”、“min”、“max”中的一个。如果取值为min,则检测值不再下降会触发退化学习率。如果取值为max,则当检测值不再上升会触发学习率。
  • epsilon:阈值,用来确定是否进入检测值的“平原区”。
  • cooldown:学习率减少后,会经过cooldown个epoch才重新进行正常操作。
  • min_lr:学习率的下限。

在训练的过程中,当模型所表现的精度停滞时,减少2倍或10倍的学习率常常能获得较好的效果。根据被监测对象monitor的情况,如果在patience个训练次数中看不到模型性能提升,则减少学习率。

4.3 PyTorch中设置退化学习率

PyTorch中使用lr_scheduler接口来实现退化学习率的设置。

在lr_scheduler接口中还支持了多种退化学习率的实现,每种退化学习率都是通过一个类来实现的。具体如下:

  • 等间隔调整学习率 StepLR:每训练指定步数,学习率调整为lr=lrgamma(gamma为手动设置的退化率参数)。
  • 多间隔调整学习率 MultiStepLR:按照指定的步数来出发调整学习率。调整方式也是lr=lrgamma。
  • 指数衰减调整学习率 ExponentialLR:每训练一步,学习率呈指数型衰减,即学习率调整为公式如下图(step为训练步数)。
  • 余弦退火函数调整学习率CosineAnnealingLR:每训练一步,学习率呈余弦函数型衰减。
  • 根据指标调整学习率 ReduceLROnPlateau:当某指标(loss或accuracy)在最近几次训练中都没有变化(下降或升高超过给定阈值)时,调整学习率。
  • 自定义调整学习率 LambdaLR:为不同参数组设定不同学习率调整策略。

其中, LambdaLR退化学习率最为灵活,可以根据需求指定任何策略的学习率变化。在fine-tune(微调模型的一种方法)中特别有用,不仅可以为不同层设置不同的学习率,还可以为不同层设置不同的学习率调整策略。

首页 |杏悦介绍 |杏悦展示 |杏悦新闻 |杏悦登录 |杏悦代理 |杏悦招商 |杏悦平台 |杏悦APP下载 |联系我们

13988889999

Copyright © 2012-2018 首页-杏悦-杏悦注册站 版权所有

地址:海南省海口市玉沙路58号电话:0898-88889999手机:13988889999

ICP备案编号:琼ICP备88889999号

微信扫一扫

微信扫一扫

>

平台注册入口