深度学习入门系列12:使用学习规划来提升性能

大家好,我技术人Howzit,这是深度学习入门系列第十二篇,欢迎大家一起交流!

深度学习入门系列1:多层感知器概述
深度学习入门系列2:用TensorFlow构建你的第一个神经网络
深度学习入门系列3:深度学习模型的性能评价方法
深度学习入门系列4:用scikit-learn找到最好的模型
深度学习入门系列5项目实战:用深度学习识别鸢尾花种类
深度学习入门系列6项目实战:声纳回声识别
深度学习入门系列7项目实战:波士顿房屋价格回归
深度学习入门系列8:用序列化保存模型便于继续训练
深度学习入门系列9:用检查点保存训练期间最好的模型
深度学习入门系列10:从绘制记录中理解训练期间的模型行为
深度学习入门系列11:用Dropout正则减少过拟合
深度学习入门系列12:使用学习规划来提升性能
深度学习入门系列13:卷积神经网络概述
深度学习入门系列14:项目实战:基于CNN的手写数字识别
深度学习入门系列15:用图像增强改善模型性能
深度学习入门系列16:项目实战:图像中目标识别
深度学习入门系列17:项目实战:从电影评论预测情感
深度学习入门系列18:递归神经网络概述
深度学习入门系列19:基于窗口(window)的多层感知器解决时序问题
深度学习入门系列20:LSTM循环神经网络解决国际航空乘客预测问题
深度学习入门系列21:项目:用LSTM+CNN对电影评论分类
深度学习入门系列22:从猜字母游戏中理解有状态的LSTM递归神经网络
深度学习入门系列23:项目:用爱丽丝梦游仙境生成文本


训练一个神经网络或一个大型深度学习模型是一项艰难的优化任务。用于训练神经网络的分类算法称之为随机梯度。众所周知,训练期间使用变化的学习速率,可以获得性能提升和加快的训练速度。这节课,你将学习如何在python中使用Keras深度学习库对于不同的模型使用不同的学习速率规划。完成这节课后你将了解:

  • 训练期间学习速率规划在模型性能上提升的好处。
  • 如何配置和评估基于时间学习速率规划。
  • 如何配置和评估基于丢弃学习速率规划。

让我们开始

12.1 使用学习速率规划训练模型

针对随机梯度下降程序调整学习速率能够增加性能和减少训练时间。有时候称之为学习速率退火或者自适应学习速率。这里我们称这个方法为学习速率规划,它默认规划是每次训练周期使用固定学习速率来更新网络权重。

训练期间最简单,也许最常用的学习率调整是随着时间的推移降低学习率的技术。这些具有以下优点:在程序开始训练时需要做更大变化,这时使用大点学习速率,需要更新小变化时,减少学习速率,因此在后期学习过程中更新权重更小。这也是前期快速学好权重并且后期精细调节。下面是两个流行而且容易使用的学习速率规划:

  • 基于迭代周期逐步减少学习速率。
  • 在特定周期使用间断式降低学习率。

接下来,我们将研究如何与Keras一起使用这些学习率规划。

12.2 电离层(Ionosphere)分类集

使用电离层二分类问题作为这节课的示范。该数据集描述了雷达回波,其中目标是电离层中的自由电子。

这是一个二元分类问题,其中正面案例(表示好)表示电离层中某种类型的结构,反面案例(表示不好)表示电离层没有某种类型的结构。这是一个很好的数据集实践神经网络,因为所有的输入同样尺度的小数值。有34属性和351观察值。

在整个数据集上使用10折交叉验证有很好的结果,获得大概94%-98%。数据集在可以在本书提供的代码包中获得。或者,你直接从UCI机器学习仓库中下载它。以 ionosphere.csv文件名放在你的工作目录下。你可以在UCI机器学习仓库网页上了解更多关于电离层( ionosphere)数据集。

12.3 基于时间学习速率规划

Keras有个内置的学习速率规划。在SGD类中随机梯度下降优化算法有个参数叫decay。这个参数使用就是基于时间学习速率衰减规划,等式如下:

L e a r n i n g R a t e = L e a r n R a t e ∗ 1 1 + d e c a y ∗ e p o c h LearningRate=LearnRate*\frac {1}{1+decay*epoch} LearningRate=LearnRate1+decayepoch1

当decay为0时(默认设置),学习速率有没有这个效果了。

LearningRate = 0.1 * 1/(1 + 0.0 * 1) 
LearningRate = 0.1

当decay参数指定时,他会按照之前的周期减少学习速率。举个例子,如果我们使用初始学习速率值0.1,decay为0.001,迭代周期为5,调整学习速率如下:

Epoch Learning Rate 
1 0.1
2 0.0999000999 
3 0.0997006985 
4 0.09940249103 
5 0.09900646517

把这个扩展到100周期,将产生下面图标的学习速率(y轴)对周期(x轴)表:
在这里插入图片描述
你可以通过设置如下的decay创建一个不错默认规划。

Decay = LearningRate / Epochs 
Decay = 0.1 / 100 
Decay = 0.001

下面这个例子描述了Keras中使用基于时间的学习速率调整规划。用34个神经元构建一个小的单隐藏层网络,使用整流器(rectifier)激活函数。输出层为单个神经元并使用sigmoid激活函数,目的是为了输出概率值。随机梯度下降的学习速率设置要比0.1高点。模型被训练50次,decay参数已经设置为0.002,通过0.1/50计算得到。另外,当使用自适应学习速率时,使用动量(momentum)也是不错的想法。在这例子中,我们使用动量值为0.8,完整的例子如下:

# Baseline Model on the Sonar Dataset
from pandas import read_csv
import numpy
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import SGD
from sklearn.preprocessing import LabelEncoder

# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)

# load dataset
dataframe = read_csv("ionosphere.csv", header=None)
dataset = dataframe.values

# split into input (X) and output (Y) variables
X = dataset[:, 0:34].astype(float)
Y = dataset[:, 34]

# encode class values as integers
encoder = LabelEncoder()
encoder.fit(Y)
Y = encoder.transform(Y)

# create model
model = Sequential()
model.add(Dense(34, input_dim=34, activation="relu"))
model.add(Dense(1, activation="sigmoid"))

# Compile model
epochs = 50
learning_rate = 0.1
decay_rate = learning_rate / epochs
momentum = 0.8
sgd = SGD(lr=learning_rate, momentum=momentum, decay=decay_rate, nesterov=False)
model.compile(loss="binary_crossentropy", optimizer=sgd, metrics=["accuracy"])

# Fit the model
model.fit(X, Y, validation_split=0.33, nb_epoch=epochs, batch_size=28, verbose=2))

模型在67%数据集上训练,在33%验证集上评估。运行这个例子显示分类精度为99.14&。这个要比没使用学习速率衰减或动量的基准模型95.69%要高。

... 
Epoch 45/50 
0s - loss: 0.0622 - acc: 0.9830 - val_loss: 0.0929 - val_acc: 0.9914 
Epoch 46/50 
0s - loss: 0.0695 - acc: 0.9830 - val_loss: 0.0693 - val_acc: 0.9828 
Epoch 47/50 
0s - loss: 0.0669 - acc: 0.9872 - val_loss: 0.0616 - val_acc: 0.9828 
Epoch 48/50 
0s - loss: 0.0632 - acc: 0.9830 - val_loss: 0.0824 - val_acc: 0.9914 
Epoch 49/50 
0s - loss: 0.0590 - acc: 0.9830 - val_loss: 0.0772 - val_acc: 0.9828 
Epoch 50/50 
0s - loss: 0.0592 - acc: 0.9872 - val_loss: 0.0639 - val_acc: 0.9828

12.4 基于drop学习率规划

另外一个深度学习模型使用的学习速率规划是在具体次数时系统地降低学习速率。通常,这种方法是通过将学习速率每固定时期数降低一半来实现的。例如,我们初始化学习速率为0.1,每10次个周期减少0.5倍,首次10个周期使用0.1,接下来10个周期使用学习速率的0.05倍,以此类推。如果我们绘制这个例子的100周期内学习速率,那么你将得到下面学习速率(y轴)和周期(x轴)的图。
在这里插入图片描述

当我们在拟合模型时,能在Keras中使用 LearningRateScheduler 回调实现这个。LearningRateScheduler回调可以让我们可以定义一个调用函数,该函数以迭代数作为参数,并返回用于随机梯度下降的学习率。当我使用它时,随机梯度下降指定的学习速率被忽略。下面代码中,我使用了和之前一样的例子,即在Ionosphere数据集上的单层神经网络。定义了一个新的函数step_decay(),实现等式如下:

L e a r n i n g R a t e = I n i t i a l L e a r n i n g R a t e ∗ D r o p R a t e f l o o r ( 1 + E p o c h E p o c h D r o p ) LearningRate=InitialLearningRate*DropRate^{floor({\frac{1+Epoch}{EpochDrop}})} LearningRate=InitialLearningRateDropRatefloor(EpochDrop1+Epoch)

在运行开始阶段我们使用 InitialLearningRate 作为学习速率,EpochDrop是迭代周期内降低学习速率的频率,DropRate 是每次降低多少学习速率。

# Drop-Based Learning Rate Decay
import pandas
from pandas import read_csv
import numpy
import math
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import SGD
from sklearn.preprocessing import LabelEncoder
from tensorflow.keras.callbacks import LearningRateScheduler

# learning rate schedule
def step_decay(epoch):
	initial_lrate = 0.1
	drop = 0.5
	epochs_drop = 10.0
	lrate = initial_lrate * math.pow(drop, math.floor((1 + epoch) / epochs_drop))
	return lrate

# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)

# load dataset
dataframe = read_csv("ionosphere.csv", header=None)
dataset = dataframe.values

# split into input (X) and output (Y) variables
X = dataset[:, 0:34].astype(float)
Y = dataset[:, 34]

# encode class values as integers
encoder = LabelEncoder()
encoder.fit(Y)
Y = encoder.transform(Y)

# create model
model = Sequential()
model.add(Dense(34, input_dim=34, activation="relu"))
model.add(Dense(1, activation="sigmoid"))

# Compile model
sgd = SGD(lr=0.0, momentum=0.9, decay=0.0, nesterov=False)
model.compile(loss="binary_crossentropy", optimizer=sgd, metrics=["accuracy"])

# learning schedule callback
lrate = LearningRateScheduler(step_decay)
callbacks_list = [lrate]

# Fit the model
model.fit(X, Y, validation_split=0.33, nb_epoch=50, batch_size=28,callbacks=callbacks_list, verbose=2)

运行这个例子的结果,在验证集上的分类结果为99.14%,再一次比在这个数据集上的基准模型有所提高。

... 
Epoch 45/50 
0s - loss: 0.0546 - acc: 0.9830 - val_loss: 0.0634 - val_acc: 0.9914
Epoch 46/50 
0s - loss: 0.0544 - acc: 0.9872 - val_loss: 0.0638 - val_acc: 0.9914 
Epoch 47/50 
0s - loss: 0.0553 - acc: 0.9872 - val_loss: 0.0696 - val_acc: 0.9914 
Epoch 48/50 
0s - loss: 0.0537 - acc: 0.9872 - val_loss: 0.0675 - val_acc: 0.9914 
Epoch 49/50 
0s - loss: 0.0537 - acc: 0.9872 - val_loss: 0.0636 - val_acc: 0.9914 
Epoch 50/50 
0s - loss: 0.0534 - acc: 0.9872 - val_loss: 0.0679 - val_acc: 0.9914

12.5 使用学习速率规划提示

这部分列举出还要考虑的一些提示和技巧,当神经网络使用学习速率下降时。

  • 增加初始学习速率
    因为学习速率减低,所以会从大点值降低。至少在开始初期,大点学习速率将要导致权重更新更大,在后期,允许你精细的调参中。

  • 使用更大的动量
    当你的学习速率减少到一定小值时,使用更大的动量值将有助于优化算法往正确的方向上更新。

  • 用不同规划算法进行试验
    还不清楚使用哪种规划算法,尝试不同配置,看看在你的问题上那个最好。还要尝试以指数方式更改的规划,尝试对应训练或测试数据集上模型准确性的规划。

12.6 总结

在这节课,你已经发现针对训练神经网络模型的学习速率规划。你已经学到:

  • 使用学习速率规划来提升模型性能的好处
  • 如何在Keras中配置和使用基于时间学习速率规划
  • 如何在Keras中开发你自己的基于减少学习速率的规划。

12.6.1 接下来

这结束了第三部分的课程。现在你知道如何使用更高级Keras特性以及更高级的技术来提高你的神经网络模型。接下来,在第四部分,你将发现一种新的模型称之为卷积神经网络,它在计算机视觉和自然语言处理获得显著的成果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术人Howzit

钱不钱的无所谓,这是一种鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值