赞
踩
选择合适的学习率能够提高随机梯度下降算法的性能,并减少训练时间。为了能够使梯度下降有更好的性能,需要把学习率的值设定在合适的范围内。学习率决定了参数移动到最优值时的速度。如果learning rate
过大,可能会越过最优值;过小会导致下降的过慢,长时间无法收敛。
学习率衰减的基本思想是:学习率随着训练的进行逐渐衰减。在训练开始时,使用较大的learning rate
,可以加快梯度下降即快速收敛。随着训练的进行,逐步降低learning rate
,即收敛速度减小。
目前比较流行的两种学习率衰减方法为:
learning rate
线性衰减在Keras中基于时间的线性learning rate
衰减是通过 SGD 类中的随机梯度下降优化算法来实现的。它具有一个decay衰减率参数,该参数的线性衰减速率学习如下:
L e a r n i n g R a t e = L e a r n i n g R a t e ∗ 1 1 + d e c a y ∗ e p o c h Learning\ Rate = Learning\ Rate * \frac{1}{1 + decay * epoch} Learning Rate=Learning Rate∗1+decay∗epoch1
当decay衰减率为0(默认值)时,对学习率没有影响,使用非零时,学习率呈线性衰减,如下所示,decay衰减为0.001时,最初的5个epoch的学习率如下:
epoch learning rate
1 0.1
2 0.0999000999
3 0.0997006985
4 0.09940249103
5 0.09900646517
下面代码例子中,SGD学习率设置为较高的0.1,decay设置为0.005,动量值设置为0.9
from sklearn import datasets import numpy as np from keras.models import Sequential from keras.layers import Dense from keras.wrappers.scikit_learn import KerasClassifier from keras.optimizers import SGD # 导入数据 dataset = datasets.load_iris() x = dataset.data Y = dataset.target # 设定随机种子 seed = 7 np.random.seed(seed) # 构建模型函数 def create_model(init='glorot_uniform'): # 构建模型 model = Sequential() model.add(Dense(units=4, activation='relu', input_dim=4, kernel_initializer=init)) model.add(Dense(units=6, activation='relu', kernel_initializer=init)) model.add(Dense(units=3, activation='softmax', kernel_initializer=init)) #模型优化 learningRate = 0.1 momentum = 0.9 decay_rate = 0.005 sgd = SGD(lr=learningRate, momentum=momentum, decay=decay_rate, nesterov=False) # 编译模型 model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) return model epochs = 200 model = KerasClassifier(build_fn=create_model, epochs=epochs, batch_size=5, verbose=1) model.fit(x, Y)
learning rate
指数衰减通常这种方法是通过固定的epoch周期将学习率降低50%来实现的。比如学习率初始为0.1,每10个epoch降低50%。前10个epoch使用0.1的学习率,接下来10个epoch使用0.05的学习率,依次类推,学习率以指数级进行衰减。在Keras中,使用LearningRateScheduler
回调,来实现学习率的指数衰减。LearningRateScheduler
回调使用预定义的回调函数来实现学习率的指数衰减,将epoch数作为参数,并将学习率返回得的SGD中使用。下面定义了一个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 ) Learning\ Rate = Initial\ Learning\ Rate * Drop\ Rate^{floor(\frac{1+Epoch}{Epoch\ Drop})} Learning Rate=Initial Learning Rate∗Drop Ratefloor(Epoch Drop1+Epoch)
from sklearn import datasets import numpy as np from keras.models import Sequential from keras.layers import Dense from keras.wrappers.scikit_learn import KerasClassifier from keras.optimizers import SGD from keras.callbacks import LearningRateScheduler from math import pow, floor # 导入数据 dataset = datasets.load_iris() x = dataset.data Y = dataset.target # 设定随机种子 seed = 7 np.random.seed(seed) # 计算学习率 def step_decay(epoch): init_lrate = 0.1 drop = 0.5 epochs_drop = 10 lrate = init_lrate * pow(drop, floor(1 + epoch) / epochs_drop) return lrate # 构建模型函数 def create_model(init='glorot_uniform'): # 构建模型 model = Sequential() model.add(Dense(units=4, activation='relu', input_dim=4, kernel_initializer=init)) model.add(Dense(units=6, activation='relu', kernel_initializer=init)) model.add(Dense(units=3, activation='softmax', kernel_initializer=init)) #模型优化 learningRate = 0.1 momentum = 0.9 decay_rate = 0.0 sgd = SGD(lr=learningRate, momentum=momentum, decay=decay_rate, nesterov=False) # 编译模型 model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) return model lrate = LearningRateScheduler(step_decay) epochs = 200 model = KerasClassifier(build_fn=create_model, epochs=epochs, batch_size=5, verbose=1, callbacks=[lrate]) model.fit(x, Y)
learning rate
衰减使用技巧Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。