站内公告:
2024-04-22 14:29:48 点击量:
摘要:
深度学习还没学完,怎么图深度学习又来了?别怕,这里有份系统教程,可以将0基础的你直接送到图深度学习。还会定期更新哦。
本教程是一个系列免费教程,争取每月更新2到4篇。
主要是基于图深度学习的入门内容。讲述最基本的基础知识,其中包括深度学习、数学、图神经网络等相关内容。该教程由代码医生工作室出版的全部书籍混编节选而成。偏重完整的知识体系和学习指南。在实践方面不会涉及太多基础内容 (实践和经验方面的内容,请参看原书)。
文章涉及使用到的框架以PyTorch和TensorFlow为主。默认读者已经掌握Python和TensorFlow基础。如有涉及到PyTorch的部分,会顺带介绍相关的入门使用。
本教程主要针对的人群:
本篇文章主要介绍模型的优化器。在模型的优化器方面,图神经网络所使用的技术是与深度学习是完全一样的。
本篇文章主要介绍深度学习中模型优化器的种类及选取,顺便介绍一下TF2与PyTorch框架中的优化器接口。
1 优化器模块
在有了正向结构和损失函数后,就是通过优化函数来优化学习参数了,这个过程也是在反向传播中完成的。这个优化函数叫做优化器,在深度学习框架中被统一封装到优化器模块中。其内部原理主要是通过梯度下降的方法对模型中的参数进行优化。
1.1 优化器与梯度下降
在实际训练过程中,很难一次将其调整到位,而是通过多次迭代一点一点的将其修正,最终直到模型的输出值与实际标签值的误差小于某个阀值为止。
优化器是基于Bp算法的一套优化策略。主要的作用是通过算法帮助模型在训练过程中,如何更快更好的将参数调整到位。
在优化器策略中,最基础的算法就是梯度下降法。
梯度下降法是一个最优化算法,通常也称为最速下降法。常用于机器学习和人工智能当中用来递归性地逼近最小偏差模型,梯度下降的方向也就是用负梯度方向为搜索方向,沿着梯度下降的方向求解极小值。
在训练过程中,每次的正向传播后都会得到输出值与真实值的损失值,这个损失值越小,代表模型越好,于是梯度下降的算法就用在这里,帮助我们找最小的那个损失值,从而可以反推出来对应的学习参数b和w,达到优化模型的效果。
1.2 优化器的类别
原始的优化器主要使用3中梯度下降的方法:批量梯度下降、随机梯度下降和小批量梯度下降。
随着梯度下降领域的深度研究,又出现了更多功能强大的优化器,它们在性能和精度方便做得越来越好。当然其实现过程也变得越来越复杂。主流的优化器有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版本中,常用的优化器有:
具体的使用方法可以参考我们的配套图书,这里不再详述。
3 PyTorch中的优化器使用
在PyTorch中可以使用torch.optim构建一个optimizer对象。该对象能够保持当前参数状态并基于计算得到的梯度进行参数更新。
优化器模块封装了神经网络在反向传播中的一系列优化策略。这些优化策略可以使模型在训练过程中更快更好的进行收敛。具体代码如下:
其中,Adam是优化器方法。该方法的参数较多,其中常用的参数主要有两个:
整个过程中的求导和反向传播操作,都是在优化器里自动完成的。
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类可以实现在评价指标不再提升时,减少学习率。该类的初始化参数如下:
在训练的过程中,当模型所表现的精度停滞时,减少2倍或10倍的学习率常常能获得较好的效果。根据被监测对象monitor的情况,如果在patience个训练次数中看不到模型性能提升,则减少学习率。
4.3 PyTorch中设置退化学习率
PyTorch中使用lr_scheduler接口来实现退化学习率的设置。
在lr_scheduler接口中还支持了多种退化学习率的实现,每种退化学习率都是通过一个类来实现的。具体如下:
其中, LambdaLR退化学习率最为灵活,可以根据需求指定任何策略的学习率变化。在fine-tune(微调模型的一种方法)中特别有用,不仅可以为不同层设置不同的学习率,还可以为不同层设置不同的学习率调整策略。
Copyright © 2012-2018 首页-杏悦-杏悦注册站 版权所有
地址:海南省海口市玉沙路58号电话:0898-88889999手机:13988889999
ICP备案编号:琼ICP备88889999号
微信扫一扫