深度学习(四):学习率

学习率的定义:将输出误差反向传播给网络参数,以此来拟合样本的输出。本质上是最优化的一个过程,逐步趋向于最优解。但是每一次更新参数利用多少误差,就需要通过一个参数来控制,这个参数就是学习率(Learning rate),也称为步长。

以梯度下降法为例:

公式中的θ就是代表着权重参数,新的θ会由之前的θ计算得来,这个计算过程就是为了寻找目标函数收敛到最小值。那么公式中出现的α就是当下的学习率。

最理想的学习率不是固定值,而是一个随着训练次数衰减的变化的值,也就是在训练初期,学习率比较大,随着训练的进行,学习率不断减小,直到模型收敛。

分享几种我常用的学习率调整算法:

第一种:常规优化器decay

sgd=tf.keras.optimizers.SGD(lr=0.01,decay=1e-3)#decay:大或等于0的浮点数,每次epoch更新后的学习率衰减值0.001

深度学习(四):学习率_第1张图片

 第二种:自定义学习率,经过epochs_drop个epoch学习率改为原来的二分之一

"""
1.首先定义了一个学习率随着训练周期epoch更新的算法myScheduler
2.用LearningRateScheduler定义个回调函数
3.在model.fit()中配置回调参数callbacks=,即可在每轮训练中按照给定算法更新学习率
"""
def step_decay(epoch):
    initial_lrate= 0.01 #初始学习率
    drop= 0.5
    epochs_drop= 10.0
    lrate= initial_lrate* math.pow(drop, math.floor((1+epoch)/epochs_drop))
    return lrate

from keras.callbacks import LearningRateScheduler
sgd= tf.keras.optimizers.SGD(lr=0.0, momentum=0.9, decay=0.0, nesterov=False)
lrate= LearningRateScheduler(step_decay)
callbacks_list= [lrate]
base_model_vgg16.compile(optimizer=sgd,loss="categorical_crossentropy",metrics=['accuracy'])

 深度学习(四):学习率_第2张图片

 第三种:自适应学习率

keras.optimizers.Adagrad(lr=0.01, epsilon=1e-08, decay=0.0)
keras.optimizers.Adadelta(lr=1.0, rho=0.95, epsilon=1e-08, decay=0.0)
keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)
keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)

第四种:根据性能指标来调整学习率

from keras.callbacks import ReduceLROnPlateau
"""
monitor:被监测的量
factor:每次减少学习率的因子,学习率将以lr = lr*factor的形式被减少
patience:当patience个epoch过去而模型性能不提升时,学习率减少的动作会被触发
mode:‘auto’,‘min’,‘max’之一,在min模式下,如果检测值触发学习率减少。在max模式下,当检测值不再上升则触发学习率减少。
epsilon:阈值,用来确定是否进入检测值的“平原区”
cooldown:学习率减少后,会经过cooldown个epoch才重新进行正常操作
min_lr:学习率的下限
"""
myReduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=10, verbose=0, mode='auto', epsilon=0.0001, cooldown=0, min_lr=0)
#model.fit(train_x, train_y, batch_size=32, epochs=300, validation_split=0.1, callbacks=[myReduce_lr])

你可能感兴趣的:(深度学习,深度学习,学习,人工智能)