【教程】估算一个最佳学习速率,以更好地训练深度神经网络

对于训练深度神经网络来说,学习速率是调优的最重要的超参数之一。在这篇文章中,我将描述一个简单而有力的方法来找到一个合理的学习速率。这种方法是我从Fast AI网站的深度学习课程中了解到的。

学习速率如何影响训练

深度学习模型通常由随机梯度下降优化器训练。许多随机梯度下降的变体,如Adam, RMSProp, Adagrad等等,都可以让你设置学习速率。学习速率能够告诉优化器,在一个小批次处理的梯度方向移动权重的距离有多远。

如果学习速率很低,那么训练就更可靠,但是优化需要花费大量的时间,因为最小的损失函数的步长是很小的。

如果学习速率很高,那么训练可能不会收敛甚至是扩散的。权重的变化会非常大,以至于优化器会超过最小值,并使损失变得更严重。

梯度下降与小(上)和大(下)学习速率。来源:Coursera的机器学习课程

训练应该从一个相对较大的学习速率开始,因为在开始的时候,随机的权重远远不是最优的,然后在训练过程中学习速率会下降,从而允许更优的权重更新。

有多种方法可以为学习速率选择一个好的起点。一个简单的方法是尝试一些不同的值,看看哪一个值能给你最好的损失,同时又不牺牲训练的速度。我们可能从一个很大的值开始,比如0.1,然后尝试以指数方式降低的值,如0.01, 0.001等等。当我们开始以一个大的学习速度进行训练时,损失并没有得到改善,甚至可能在我们进行最初的几次训练的时候就会增长。当以较小的学习速率进行训练时,在某些时候,损失函数的值在开始的几次迭代中开始减少。这个学习速率是我们可以使用的最大值,任何更高的值都不会让训练收敛。即使这个值也太高了:它不能足够好地为多个epoch进行训练,因为随着时间的推移,网络将需要更优的更新。因此,一个合理的开始训练的学习速率可能会降低1-2个数量级。

更聪明的方法 在2015年的“训练神经网络的循环学习速率”论文的3.3章节,Leslie N.Smith描述了一种强大的技术,为神经网络选择一系列的学习速率。

关键是要训练一个从低学习速率开始的网络,每一批次都要以指数级的速度增加学习速率。

论文地址:https://arxiv.org/abs/1506.01186

每个小批次处理后,学习速率提高

记录每个批次的学习速率和训练损失。然后,把损失和学习速率画出来。通常情况下是这样的:

开始时的损失减少,然后在训练过程中开始扩散

首先,低学习速率的损失会慢慢提高,然后训练会加速,直到学习速率变大,并且损失增加:训练过程会扩散。

我们需要在图上选择一个点,以最快的速度减少损失。在本例中,当学习速率在0.001到0.01之间时,损失函数就会迅速下降。

另一种观察这些数字的方法是计算损失的变化率(损失函数关于迭代次数的导数),然后绘制y轴上的变化率和x轴上的学习速率。

损失变化率

它看起来波动有些大,让我们用简单的移动平均数的方法来平滑它。

损失的变化率,简单的移动平均数

这样看起来更好。在这张图上,我们需要找到最小值。它接近于学习速率=0.01。

实现 美国USF数据研究所的杰里米霍华德和他的团队开发了fast.ai。fast.ai是一个在PyTorch之上的一个高级抽象的深度学习库,它是一种易于使用又强大的工具集,用于训练艺术深度学习模型。杰里米在最新版本的深度学习课程中使用了这个库。该库提供了一个学习速率查找器的实现。你只需要几行代码就可以绘制对你的模型的学习率造成的损失。

fast.ai库:https://github.com/fastai/fastai

代码:

# learn is an instance of Learner class or one of derived classes like ConvLearner
learn.lr_find()
learn.sched.plot_lr()

这个库没有代码来绘制损失函数的变化率,但是计算它是很简单的:

def plot_loss_change(sched, sma=1, n_skip=20, y_lim=(-0.01,0.01)):
 """
 Plots rate of change of the loss function.
 Parameters:
 sched - learning rate scheduler, an instance of LR_Finder class.
 sma - number of batches for simple moving average to smooth out the curve.
 n_skip - number of batches to skip on the left.
 y_lim - limits for the y axis.
 """
 derivatives = [0] * (sma + 1)
 for i in range(1 + sma, len(learn.sched.lrs)):
 derivative = (learn.sched.losses[i] - learn.sched.losses[i - sma]) / sma
 derivatives.append(derivative)
 
 plt.ylabel("d/loss")
 plt.xlabel("learning rate (log scale)")
 plt.plot(learn.sched.lrs[n_skip:], derivatives[n_skip:])
 plt.xscale('log')
 plt.ylim(y_lim)

plot_loss_change(learn.sched, sma=20)

请注意,在训练前选择一次学习速率是不够的。最佳学习速率在训练时下降。你可以周期性地重新运行相同的学习速率搜索过程,以在训练过程的后期找到学习速率。

使用其他库实现该方法 我还没有准备好使用像Keras这样的其他库的学习速率的搜索方法。只要多次运行训练,每次只训练一个小批次就可以了。在每次小批次训练后,通过将它乘以一个小的常数增加学习速率。当损失比先前观察到的最好的值(例如,当当前损失>最好损失乘以4)高很多时,停止该程序。

选择一个学习速率的起始值只是问题的一部分。另一件要优化的事情是学习进度:如何在训练中改变学习速率。传统观点认为,随着时间的推移,学习速率会逐渐下降,有多种方法来设置:当损失停止改进、指数学习速率衰减,等等情况发生时,学习速率就会降低。

Fast AI网站:http://www.fast.ai/

原文发布于微信公众号 - ATYUN订阅号(atyun_com)

原文发表时间:2017-12-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏决胜机器学习

深层神经网络参数调优(五) ——超参数调试、batch归一化、softmax回归

深层神经网络参数调优(五) ——超参数调试、batch归一化、softmax回归 (原创内容,转载请注明来源,谢谢) 一、超参数调试 1、超参数 超参数是不直...

3898
来自专栏企鹅号快讯

通俗理解神经网络中激活函数作用

推荐阅读时间8min~13min 主要内容:通俗理解激活函数,主要来自我在学习会的slides,讲解了激活函数的非线性能力和组合特征的作用 ? ? 下面我分别对...

2097
来自专栏量化投资与机器学习

深度学习应用于交易

● 我们想预测未来股票走势 ● 监督学习 训练数据中的每个示例是由输入向量(特征)和期望输出值(标签)组成。 监督学习算法分析训练数据和近似函数,可用于映射新的...

2745
来自专栏智能算法

逻辑回归(LR)算法

一、算法介绍 Logistic regression (逻辑回归)是一种非线性回归模型,特征数据可以是连续的,也可以是分类变量和哑变量,是当前业界比较常用的机...

3646
来自专栏大数据挖掘DT机器学习

Python:使用sklearn进行集成学习

---- 1 前言 2 集成学习是什么? 3 偏差和方差   3.1 模型的偏差和方差是什么?   3.2 bagging的偏差和方差 ...

3019
来自专栏超然的博客

Graph Attention Networks

paper:https://mila.quebec/wp-content/uploads/2018/07/d1ac95b60310f43bb5a0b802452...

741
来自专栏机器之心

入门 | 将应用机器学习转化为求解搜索问题

27910
来自专栏机器学习算法与Python学习

深度学习之自编码与稀疏性

自编码算法与 稀疏性 目前为止,我们已经讨论了神经网络在监督学习中的应用。在监督学习中,训练样本是有标签的。现在假设我们只有一个无类别标签的训练样本集合{x[^...

2848
来自专栏深度学习之tensorflow实战篇

随机森林,random forest

模型组合(比如说有Boosting,Bagging等)与决策树相关的算法比较多,这些算法最终的结果是生成N(可能会有几百棵以上)棵树,这样可以大大的减少单决策树...

2765
来自专栏老秦求学

Deep Learning Tutorial 李宏毅(一)深度学习介绍

大纲 深度学习介绍 深度学习训练的技巧 神经网络的变体 展望 深度学习介绍 深度学习介绍 深度学习属于机器学习的一种。介绍深度学习之前,我们先大致了解一下机器学...

40310

扫码关注云+社区