【个人笔记 | 训练参数 | 整理ing】

11 篇文章 0 订阅

Transformers之自定义学习率动态调整

get_sceduler作为接口进行调用

周期性学习率(Cyclical Learning Rate):神经网络参数训练意味着寻找合适的一些参数,使得在每个batch训练完成后损失(loss)达到最小。而学习率(learning_rate, LR)决定了当前的权重参数朝着降低损失的方向上改变多少。通常来说,有两种广泛使用的方法用来设置训练过程中的LR。

第一种是SGD,在训练开始时设置一个LR常量,并且设定一个LR衰减策略(如step,exponential等),用这个单一的LR用来更新所有参数。在每个epochs中,LR按预先设定随时间逐渐衰减,当我们临近最小损失时, 通过衰减可以减缓更新,以防止我们越过最小值

存在的不足和挑战有:①难以选择初始的LR达到想要的效果;②LR衰减策略同样难以设定,他们很难自适应动态变化的数据;③所有的参数使用相同的LR进行更新,而这些参数可能学习速率不完全相同;④很容易陷入鞍点不能自拔。

一些改进的优化器如AdaGradAdaDeltaRMSprop and Adam 很大程度上缓解了上述困难,主要是对每个参数采用不同的自适应学习率。比如AdaDelta,它的更新机制甚至不需要我们主动设置默认的学习率。

第二种是CyclicalLR,是Leslie Smith于2015年提出的。这是一种调节LR的方法,在该方法中,设定一个LR上限和下限,LR的值在上限和下限的区间里周期性地变化。看上去,CLR似乎是自适应LR技术和SGD的竞争者,事实上,CLR技术是可以和上述提到的改进的优化器一起使用来进行参数更新的。

直觉上看,随着训练次数的增加我们应该保持学习率一直减小以便于在某一时刻达到收敛。然而,事实恰与直觉相反,使用一个在给定区间里周期性变化的LR可能更有用处。原因是周期性高的学习率能够使模型跳出在训练过程中遇到的局部最低点和鞍点。事实上,Dauphin等[3]指出相比于局部最低点,鞍点更加阻碍收敛。如果鞍点正好发生在一个巧妙的平衡点,小的学习率通常不能产生足够大的梯度变化使其跳过该点(即使跳过,也需要花费很长时间)。这正是周期性高学习率的作用所在,它能够更快地跳过鞍点。另外一个好处是,最优的LR肯定落在最小值和最大值之间。换言之,我们确实在迭代过程中使用了最好的LR。

其中使用的参数Epoch,iterations, cycles and stepsize:考虑一个包含50000个样本的训练集。

一个epoch是至将整个训练集训练一轮。如果我们令batch_size等于100(每次使用100个样本进行训练), 那么一个epoch总共需要计算500次iteration. iteration的数目随着epoch的增加不断积累,在第二个epoch,对应着501到1000次iteration,后面的以此类推。

一个cycle定义为学习率从低到高,然后从高到低走一轮所用的iteration数。而stepsize指的是cycle迭代步数的一半。注意,cycle不一定必须和epoch相同,但实践上通常将cycle和epoch对应相同的iteration。

对于CLR需要给三个参数base_lr、max_lrstep_size,确定方式可以如下:

①对于给定的数据集,怎么确定合理的base lr 和max lr呢?答案是先跑几个epoch,并且让学习率线性增加,观察准确率的变化,从中选出合适的base 和max lr

通过fast.ai模块中lr_find功能来实现:在开始训练模型的同时,从低到高地设置学习率,直到损失(loss)变得失控为止,然后将损失和学习率画在一张图中,在损失持续下降。即将达到最小值前的范围上取一个值作为学习率。比如下图:可以在10-2到3x10-2之间任意取一个值。

这里的思想和Leslie是一致的,他在论文中提出了一个很好的训练方法:用两个等长的步骤组成一个cycle:从很小的学习率开始,慢慢增大学习率,然后再慢慢降低回到最小值。最大学习率应该根据Learning Rate Finder来确定,最小值则可以取最大值的十分之一。这个cycle的长度应该比总的epoch次数越小,在训练的最后阶段,可以将学习率降低到最小值以下几个数量级。

学习率变化形式:

triangular:学习率是按照三角的规律周期性变化。

traiangular2:这里max lr 按cycle进行对半衰减。

exp_range:这里max lr按iteration进行指数衰减。

②怎么确定stepsize呢? 已经有论文做过实验,他们将stepsize设成一个epoch包含的iteration数量的2-10倍。拿我们之前举的例子来说,我们一个epoch包含500个iteration,那么stepsize就设成1000-5000。该论文实验表明,stepsize设成2倍或者10倍,两者结果并没有太大的不同。

CLR提供了一个快速的收敛,可以与SGD以及一些更高级的优化器一起使用,值得一试。

Cyclic Learning rate和SGDR-学习率调整策略论文两篇

待阅读:

pytorch常用的学习率设置方式_落樱弥城的博客-CSDN博客_pytorch循环学习率

PyTorch torch.optim.lr_scheduler 学习率设置 调参-- CyclicLR_zisuina_2的博客-CSDN博客_cycliclr

Python torch.optim.lr_scheduler.CyclicLR用法及代码示例 - 纯净天空 (vimsky.com)

PyTorch torch.optim.lr_scheduler 学习率设置 调参 -- CosineAnnealingLR_zisuina_2的博客-CSDN博客_lr_scheduler.cosineannealinglr

Pytorch动态调整学习率的方法详解及示例_风雪夜归人o的博客-CSDN博客_动态学习率

必读论文

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值