如何为你的深度学习模型设置合理的学习率?基于keras自定义callbacks实现学习率自由设置

【说明】:本博客只是向大家推荐一些深度学习学习率设定策略的文章,以及我在keras中实现的相关学习率设置的接口。大家若喜欢可以直接拿去使用。纯学习交流目的,代码地址请看这里。

      在大量的实际应用中,深度学习模型表现出了令人满意的效果。但要训练出一个好的模型,却是一件困难的事。近年来,诸多学者致力于研究深度学习模型的训练调优策略,《Neural Networks Tricks of the Trade》一书详细介绍了诸多技巧。如大家所熟悉的,目前NN的训练基本都是基梯度的反响传播,逐步对各个参数进行更新,直到逼近某个极优点。

       深度学习模型的调优过程中,一个比较重要的超参就是学习率‘Learning rate’。梯度为参数的更新指明了方向,而学习率影响着更新的幅度大小。一个好的学习率设定不仅能缩短模型训练时间,还能提高模型性能。博客《Setting the learning rate of your neural network》系统介绍了如何给DNN拟定一个合适的学习率策略,建议大家认真学习参考下。早期在训练模型时,我们通常会事先依据经验或是某些策略选择一个合适的学习率,然后在训练的整个过程中使用固定不变的学习率。随着研究的深入,诸如阶梯衰减、指数衰减、循环学习率以及各种基于SGD进行改进的优化算法等各种新奇而有效的策略被提出。所有策略的共同思想基本都是,期望模型训练的前期能够对参数进行较大的调整,以加速训练;后期对参数做小幅度微调,以稳步提升模型性能。总的来说学习率的设置大致可以分为直接改变学习率和通过优化算法间接调整学习率两大类。

1 直接法

   就是在训练模型过程中,利用某种函数直接对学习率进行操作变换。常见的有以下几种:

(1)常数法

        整个训练过程保持学习率不变,等价于使用恒等映射函数对学习率进行更新。

(2)阶梯衰减法

      即每经过k个epoch后,将学习率减小一定比例(或减去某个值)。

(3)指数衰减法

      即每经过k个epoch后,都将学习率乘以一个系数(0-1之间的浮点数),期望学习率以指数形式逐渐减小。

(4)循环、热启动法

     直接上两篇经典论文《Cyclical Learning Rates for Training Neural Networks》《SGDR: Stochastic Gradient Descent with Restarts》

(5)分层设置

     即针对DNN的不同层设置不同的学习率。

  当然,还有其他很多方法,大家都可以尝试,不管什么形式,只有最合适,没有最好。

2 间接法

   主要是指基于传统梯度下降法改进而来的一些优化算法,如Adagrad 、Adadelta 、RMSprop 、Adam等等。他们基本都是通过一些梯度或其变形的累积量来针对每一个参数对学习率进行适当的调整。这些算法的具体原理及特点这里就不做介绍了,网上已经有很多优秀的资源。

    在keras中,我们可以通过keras.callbacks.LearningRateScheduler(schedule)类来实现特定需求的学习率策略,其中参数schedule是一个以epoch号为参数的函数,该函数具体实现学习率的变化。但如果我们需要在每一个batch后对学习率进行调整时,又该怎么办呢?这就需要我们自己进行代码实现,主要是继承Callback基类,并重写on_batch_end()等接口即可。

    在fastai库中,作者基于pytorch实现了一套学习率调整的类,提供了合理学习率的搜索接口、循环学习率接口等,使用起来很方便。若要使用还的安装相应的包,我为了自己在keras中使用方便,仿照fastai相关模块,重新利用keras对相关代码进行了实现。具体的代码请移步我的github。

 

你可能感兴趣的:(机器学习,深度学习,学习率,keras,自定义,衰减)