点击上方“AI算法与图像处理”,选择加"星标"或“置顶”
重磅干货,第一时间送达
导读作者:pyimagesearch
原文链接:https://www.pyimagesearch.com/2019/07/22/keras-learning-rate-schedules-and-decay/
编译:AI算法与图像处理
作为一名合格的算法工程师,调参的技巧必不可少,接下来将有三篇关于如何调整学习率的文章分享,会设计到大量的图片,篇幅较长,希望大家能耐心读完,也不辜负我辛辛苦苦翻译过来,由于本人自身水平有限,如果有地方翻译的不够准确或不当还请原谅~
内容简介
在本文中,你将学习如何使用Keras实现学习率衰减的方案(Keras learning rate schedules and decay)。
你将学习如何使用Keras的标准学习率衰减以及阶梯型,线性的和多项式学习率衰减方案。
在训练神经网络时,学习率通常是需要你调整的最重要的超参数:
学习率太小,可能导致你的神经网络根本无法学习
学习率太大,你可能会overshoot低loss的区域(甚至从训练开始时就过拟合)
当谈到训练神经网络时,最大的收益(就准确性而言)将来自于选择正确的学习率和适当的学习率表。
但说起来容易做起来难。
为了帮助深度学习从业者(如自己)学习如何评估问题并选择合适的学习率,我们将开始一系列关于学习率衰减方案和使用Keras进行超参数调整的教程。
在本文的第一部分中,我们将讨论为什么学习率是训练神经网络时最重要的超参数。
然后将深入探讨为什么我们要在训练期间调整学习率。
这里我将展示如何使用keras实现和利用一些学习率表。包括:
大多数keras优化器都内置了学习率衰减方案
阶梯型(step-based)衰减的学习率方案
线性学习率衰减方案
多项式学习率方案
我们将使用这些学习率方案在CIFAR-10上进行多个实验,并评估哪一个表现的最好。
这些实验组将作为你在探索自己的深度学习项目和选择适当的学习率和学习率方案时可以使用的模板。
为什么要调整我们的学习率并使用学习率方案
要了解为什么学习率方案是一个有价值的方法,可用于提高模型的准确率并降低loss,考虑到几乎所有神经网络使用的标准权重更新公式:
回想一下,学习率 alpha,控制着我们梯度改变的步长(step)。更大的alpha值意味着更大的步长。如果alpha为0,则网络无法执行任何步骤(因为梯度乘以0为0).
你遇到的大多数初始学习率都是下面的集合中:
然后,在不改变学习率的条件下,网络训练固定数量的epoch。
这种方法在某些情况下可能效果很好,但是随着时间的推移降低学习率往往是有益的。在训练网络时,我们试图在损失曲面(loss landscape)中找到一些位置(location),网络可以获得合理的准确率。它不一定是全局最小值,甚至不是局部最小值,但在实践中,仅仅找到一个具有相当小的loss landscape区域就是“足够好”。
如果我们不断保持高学习率,我们可能会overshoot这些低loss的区域,因此我们将采取一系列步骤进入低loss的区域。
相反,我们可以做的是降低我们的学习率,从而允许我们的网络采取更小的步长——这种降低的学习率使我们的网络能够下降到“更优化”的loss landscape区域,否则用我们的学习率将完全错过。
因此,我们可以将学习率调整的过程视为:
在训练过程的早期以较高的学习率找到一组合理的“好的”权重。
在后续过程中调整这些权重,以使用较小的学习率找到更优的权重。
我们将在本文中介绍一些最受欢迎的学习率方案。
项目文件结构
公众号后台回复“学习率1”,获取本文所需的所有程序和文件
下载附件并使用tree命令查看项目结构:
$
tree
.
├── output
│ ├── lr_linear_schedule.png
│ ├── lr_poly_schedule.png
│ ├── lr_step_schedule.png
│ ├── train_linear_schedule.png
│ ├── train_no_schedule.png
│ ├── train_poly_schedule.png
│ ├── train_standard_schedule.png
│ └── train_step_schedule.png
├── pyimagesearch
│ ├── __init__.py
│ ├── learning_rate_schedulers.py
│ └── resnet.py
└── train.py
2 directories, 12 files
output文件夹下包含学习率和训练历史图。结果中包含的五个实验分别对应于具有tran_*.png文件名的五个图。
pyimagesearch 模块包含了我们的ResNet CNN和learning_rate_schedulers.py。LearningRateDecay父类只包含一个叫plot的方法,用于绘制每种类型的学习率衰减图。还包含子类,StepDecay 和 PolynomialDecay,它们为计算每个周期(epoch)完成时的学习率。这两个类都包含通过继承的绘图方法(面向对象的概念)。
我们的训练代码train.py将在CIFAR-10数据集上训练ResNet。我们将在没有学习速率衰减以及含标准,线性,阶梯型(step-based)和多项式学习率衰减的情况下分别运行代码。
keras中标准的衰减方案(The standard “decay” schedule in Keras)
keras库附带一个基于时间的学习率方案——它通过优化器类的decay参数进行控制(例如SGD,Adam等等)。
为了了解我们如何利用这种类型的学习率衰减,让我们看看如何初始化ResNet架构和SGD优化器的示例:
# 初始化优化器和模型,并编译
opt = SGD(lr=1e-2, momentum=0.9, decay=1e-2/epochs)
model = ResNet.build(32, 32, 3, 10, (9, 9, 9),
(64, 64, 128, 256), reg=0.0005)
model.compile(loss="categorical_crossentropy", optimizer=opt,
metrics=["accuracy"])
这里,初始化我们的SGD优化器,初始学习率1e-2。
然后,我们将衰减设置为学习率除以正在训练网络的周期数(一个常见的经验法则)。
在内部,Keras应用以下学习率方案来调整每个batch更新后的学习率 ——这是一个误解,认为Keras在每个epoch之后更新标准衰减。 使用Keras提供的默认学习率调度程序时请记住这一点。
更新的公式如下:
以CIFAR-10 数据集为例,我们共有50000个训练图片。
如果我们使用的batch大小是64,这意味着每个epoch共有 50000 / 64 = 782步。因此,在一个epoch完成之前,总共需要应用782次权重更新。