学习速率是训练DNN
模型的一个关键参数。过大的学习速率设置会导致训练过程不收敛,过小的学习速率会导致收敛速度缓慢。本篇博客将介绍一种现有论文中的学习速率的选取方法。
这种方法作为一种最佳实践,也被Fast AI
库所采纳。博主的初衷是使用Fast AI
所提供的API
,便捷地实现这种搜索方法。但在实践过程中却发现Fast AI
已经从1.0
版本升级到了2.0
版本,其很多功能的实现方式发生了变化。之前博主基于Fast AI 1.0
所探讨的一些扩展技能都不再适用。有鉴于此,为避免Fast AI
版本变更导致的技能点失效,本篇博文不但将介绍基于Fast AI
的懒人方法,还将介绍其具体步骤。如此,基于naive
的pytorch
的实现也很easy
。
博文主要内容如下:第一部分将给出学习速率选取方法的流程图,并论述实现过程中所需注意的要点。第二部分将介绍如何在自定义的应用场景中使用Fast AI
的相关方法。第三部分给出了不同实现方式的结果。最后将给出相关的参考链接。
一、学习速率搜索方法
方法流程图及注意要点如下图所示,其基本流程是设置不同的学习速率,每个学习速率训练一个batch
,由loss
值的变化趋势来选取合适的学习速率。
二、Fast AI
中的lr_find()
Fast AI
中的lr_find()
的方法,是关联于Learner
对象的。为在自定义应用场景中使用lr_find()
方法,我们需要将自定义的data
、model
、loss function
、optimizer
等深度学习所需要素封装为Learner
对象。
1. 将pytorch
的Dataset
转换为Fast AI
的Dataloaders
data = DataLoaders.from_dsets(train_ds, valid_ds, bs=128).cuda()
注意:batch_size
参数的默认值为64
。
2. 将pytorch
的optim
实例转换为Fast AI
的loss_func
# ps: param_set.
def opt_func(ps, lr): return OptimWrapper(optim.SGD(ps, lr=lr, momentum=0.9, weight_decay=1E-4))
3. 构建Fast AI
的Learner
对象
# criterion is same as the conventional loss functions in pytorch
learn = Learner(data, model, loss_func=criterion, opt_func=opt_func, metrics=accuracy)
注意:opt_func
默认选择Adam
优化器。
然后就可使用learn.lr_find()
函数了,所需参数均有默认值。
三、在MNIST
数据上的结果
相关结果如下,每种实现都会依据loss
最小以及loss
下降最速的准则给出两个建议值。其中基于pytorch
的方法给出的建议值分别为0.063
、0.302
,基于Fast AI
的方法给出的建议值分别为0.158
、0.251
。
参考
- Cyclical Learning Rates for Training Neural Networks: 学习速率设置方法的论文。
- pytorch-lr-finder.git: 基于
pytorch
实现的lr_find()
方法。