- 在有了正向结构和损失函数后,就可通过优化函数来优化学习参数了,这个过程也是在反向传播中完成的。
- 在这个优化器函数称为优化器,在pytorch中被同一封装优化器模块中。
- 其内部原理是通过梯度下降的方法对模型中的参数进行优化。
1.了解反向传播与BP算法
- 反向传播的意义是告诉模型我们需要将权重调整多少。
- 在刚开始没有得到合适的权重时,正向传播生成的结果与实际的标签有误差,反向传播就是把这个误差传递给权重,让权重做适当的调整来达到一个合适的输出。
- 最终的目的是让正向传播的输出结果与标签间的误差最小,这就是反向传播的核心思想。
- BP(error Back ProPagation) 算法又称"误差方向传播算法"。它是反向传播过程中常用的方法。
- 正向传播的模型是清晰的,于是很容易得出一个由权重组成的关于输出的表达式。
- 接着我们可以得出一个描述损失值的表达式(将输出值与标签直接相减,或进行平方差等运算)
- 为了让这个损失值最小化,我们用数学知识,选择一个损失值的表达式并使用这个表达式有最小值,接着,通过对其求导的方式,找到最小值时刻的函数切线斜率(也就是梯度),从而让权重的值沿着这个梯度来调整。
2. 优化器与梯度下降
- 在实际训练过程中,很难一次将神经网络中的权重参数调整到位,一般需要通过多次迭代将其修正,直到模型的输出值与实际标签值的误差小于某个阈值为止。
- 优化器是基于BP算法的一套优化策略。其主要的作用是通过算法帮助模型在训练过程中更快,更好地将参数调整到位。
- 在优化器策略中,基础的算法是梯度下降法。
- 梯度下降法是一个最优化算法,通常也称为最速下降法。
- 它常在机器学习和人工智能中用来递归地逼近最小偏差模型。
- 它使用梯度下降的方向 (也就是用负梯度方向)为搜索方向,并沿着梯度下降的方向求解极小值。
- 在训练过程中,每次正向传播后都会得出输出值与真实值的损失值。
- 在这个损失值越小,代表模型越好。
- 梯度下降的算法在这里发挥作用,帮助我们找到最小的那个损失值,从而可以使用我们反推出对应的学习参数权重,达到优化模型的目的。
3. 优化器的类别
- 原始的优化器主要使用3中梯度下降的方法:批量梯度下降,随机梯度下降和小批量梯度下降。
- 批量梯度下降(batch gradient descent):遍历全部数据集计算一次损失函数,然后计算函数对各个参数的梯度,更新梯度。这种方法每更新一次参数都要把数据集里的所有样本检查一遍,计算开销大,计算速度慢,不支持在线学习。
- 随机梯度下降(stochastic gradient descent):每检查一个数据就计算一下损失函数,然后求梯度更新参数。这个方法计算速度比较快,但是收敛性能不太好,结果可能在最优点附近摆动,却无法取到最优点。两次参数的更新也有可能互相抵消,使目标函数震荡得比较剧烈。
- 小批量梯度下降:为了弥补上述两种方法的不足而采用的一种折中手段。这种方法把数据分为若干批,按批来更新参数,这样,一批中的一组数据共同决定了本次梯度的方向,梯度下降的过程就不容易“跑偏”,减少了随机性。另外,因为批的样本数与整个数据集相比小了很多,计算量也不是很大。
- 随着梯度下降领域的深度研究,又出现了更多功能强大的优化器,它们在性能和精度方面表现得越来越好,当然,实现过程也变得越来越复杂。
- 目前主流的优化器有RMSProp,AdaGrad,Adam,SGD等,它们有各自的特点及适应的场景。
4. 优化器的使用方法
-
在pytroch中,程序员可以使用torch.optim构建一个优化器(optimizer)对象。该对象能够保持当前参数状态并基于计算得到的梯度进行参数更新。
-
优化器模块封装了神经网络在反向传播中的一系列策略。这些优化策略可以使模型在训练的过程中更快,更好的收敛。
-
我们可以构建一个Adam优化器对象:
optimizer = torch.optim.Adam(model.parameters(), lr = learning_rate()
- 其中,Adam()是优化器方法。该方法的参数较多,其中最常见的参数有如下两个。
-
待优化权重参数:一般是固定写法。调用模型的parameters() 方法,将返回值传入即可。
-
优化时的学习率lr:用来控制优化器在工作时对参数的调节幅度。
优化器在工作时,会先算出梯度(根据损失值对某个参数求偏导),再沿着该梯度(这里可以把斜率当做梯度)的方向,算出一段距离(该距离有学习率控制),将该差值作为变化值更新到原有参数上。
学习率越大,模型的收敛速度就越快,但是模型的训练效果容易出现大的震荡。
学习率越小,模型的震荡幅度就越小,但是收敛越慢。 -
整个过程中的求导和反向传播操作都是在优化器里完成的。
5. 查看优化器的参数结构
- PyTorch中的每个优化器类都会有param_groups属性。该属性记录着每个优化权重的配置参数。
- 该属性记录着每个待优化权重的配置参数。
- 属性param_groups是一个列表对象,该列表对象中的元素与待优化权重一一对应,对字典对象的形式存放着待优化权重的配置参数。
- 查看字典对象中的配置参数名称:
list(optimizer.parm_groups[0].keys())
- 改代码取出了属性param_groups中的第一个待优化权重的配置参数。
- 运行后,系统会输出该配置参数中的参数名称,例如:
['params', 'lr', 'betas', 'eps', 'weight_decay', 'amsgrad']
Adam 优化器会为每个待优化权重分配这样的参数,部分参数的意义如下:
- params:优化器要作用的权重参数。
- lr:学习率。
- weight_decay:权重参数的衰减率。
权重参数的衰减率weight_decay是指模型在训练过程中使用L2正则化的衰减参数。L2正则是一种防止模型过拟合的方法。 - amsgrad:是否使用二阶冲量的方式。
- 上面这几个参数是Adam优化器具有的,当然不同的优化器有不同的参数。
- 这些参数可以在初始化时为其赋值,也可以在初始化之后,通过字典中的key(参数名称)为其赋值。
6. 常见的优化器——Adam
- PyTorch中封裝了很多优化器的视线,其中以Adam优化器最为常见(一般推荐使用的学习率为3e-4)
7. 更好的优化器——Ranger
-
Ranger优化器在2019年出现之后广受好评,经过测试发现,该优化器无论从性能还是精度上,均有很好的表现。
-
Ranger优化器是在RAdam与Lookahead优化器基础上进行融合得到的。
- RAdam:带有整流器的Adam,能够利用方差的潜在散度动态地打开或关闭自适应学习率。
- Lookahead:通过迭代更新两组权重的方法,提前观察另一个优化器生成的序列,以选择搜索方向。
-
Ranger优化器将RAdam与Lookahead优化器组合到一起,并兼顾了二者的优点。
-
PyTorch中没有封装Ranger优化器。需要自己实现。
8. 如何选取优化器
- 选取优化器没有特定的标准,需要根据具体的任务,多次尝试选择不同的优化器,选择使得评估函数最小的那个优化器。
- 根据经验,RMSProp,AdaGrad,Adam,SGD是比较通用的优化器,其中前三个适合自动收敛,最后一个优化器常用于手动精调模型。
- 在自动收敛方面,一般以Adam优化器最为常用。综合来看,它在收敛速度,模型所训练出来的精度方面,效果相对更好一点,而且对于学习率设置的要求比较宽松,更容易使用。
- 在手动精调模型方面,尝尝通过手动修改学习率来进行模型的二次调优。为了训练出更好的模型,一般先使用Adam优化器训练模型,在模型无法进一步收敛后,再使用SGD优化器,通过手动调节学习率的方式,进一步提升模型性能。
如果要进一步提升性能,那么可以尝试使用AMSGrad,Adamax或Ranger优化器。 - AMSGrad在Adam优化器基础上使用了二阶冲量,在计算机视觉模型上表现更为出色。
- Adamax在带有词向量的自然语言处理模型中表现得更好。
- Ranger优化器在上述几款优化器之后出现,综合性能的表现使其更加适合各种模型。该优化器具有精度高,收敛快,而且使用方便的特点(不需要手动调参)
- 在实际的训练中,需要通过测试比较来选择更适合当前任务的优化器。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦