Keras 自适应Learning Rate (LearningRateScheduler)

  • Learning Rate Schedules

    学习率时间表旨在通过根据预定义的时间表降低学习率来调整训练期间的学习率。 常见的学习率时间表包括基于时间的衰减,阶跃衰减和指数衰减。 出于说明目的,我构建了一个在CIFAR-10上训练的卷积神经网络,使用具有不同学习率计划的随机梯度下降(SGD)优化算法来比较性能。

  • Constant Learning Rate
    固定学习率是Keras中SGD优化器中的默认学习率计划。 动量和衰减率默认都设置为零。 选择正确的学习率是很棘手的。 通过在我们的示例中对学习率范围进行试验,lr = 0.1可以显示出相对良好的性能。 这可以作为我们尝试不同学习率策略的基准。

keras.optimizers.SGD(lr=0.1, momentum=0.0, decay=0.0, nesterov=False)

Keras 自适应Learning Rate (LearningRateScheduler)_第1张图片

  • Time-Based Decay
    基于时间的衰减的数学形式为lr = lr0 /(1 + kt),其中lr,k是超参数,t是迭代次数。 查看Keras的源代码,SGD优化器采用衰减和lr参数,并在每个时期以递减的因子更新学习速率。

    lr *= (1. / (1. + self.decay * self.iterations))
    

    动量是SGD优化器中的另一个参数,我们可以对其进行调整以获得更快的收敛速度。 与经典的SGD不同,动量法可帮助参数矢量以恒定的梯度下降沿任意方向建立速度,从而防止振荡。 动量的典型选择是在0.5到0.9之间。
    SGD优化器还具有一个称为nesterov的参数,默认情况下将其设置为false。 Nesterov动量是动量方法的另一种形式,对凸函数具有更强的理论收敛保证。 实际上,它的工作原理要好于标准动量。
    在Keras中,我们可以通过在SGD优化器中设置初始学习率,衰减率和动量来实现基于时间的衰减。

    learning_rate = 0.1
    decay_rate = learning_rate / epochs
    momentum = 0.8
    sgd = SGD(lr=learning_rate, momentum=momentum, decay=decay_rate, nesterov=False)
    

    Keras 自适应Learning Rate (LearningRateScheduler)_第2张图片

  • Step Decay
    逐步衰减时间表会使学习率每隔几个时期下降一倍。 逐步衰减的数学形式为:

    lr = lr0 * drop^floor(epoch / epochs_drop) 
    

    一种典型的方法是每10个周期将学习率降低一半。 为了在Keras中实现此功能,我们可以定义一个逐步衰减函数,并使用LearningRateScheduler回调将逐步衰减函数作为参数,并返回更新后的学习速率以供SGD优化器使用。

    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
    lrate = LearningRateScheduler(step_decay)
    

    回调是要在训练过程的给定阶段应用的一组功能。 我们可以使用回调来获得训练期间模型的内部状态和统计信息。 在我们的示例中,我们通过扩展基类keras.callbacks.Callback来创建自定义回调,以记录训练过程中的丢失历史记录和学习率。

    class LossHistory(keras.callbacks.Callback):
        def on_train_begin(self, logs={}):
           self.losses = []
           self.lr = []
     
        def on_epoch_end(self, batch, logs={}):
           self.losses.append(logs.get(‘loss’))
           self.lr.append(step_decay(len(self.losses)))
    

    将所有内容放在一起,我们可以传递一个由LearningRateScheduler回调和我们的自定义回调组成的回调列表以适合模型。 然后,我们可以通过访问loss_history.lr和loss_history.losses可视化学习率进度表和损失历史记录。

    loss_history = LossHistory()
    lrate = LearningRateScheduler(step_decay)
    callbacks_list = [loss_history, lrate]
    history = model.fit(X_train, y_train, 
       validation_data=(X_test, y_test), 
       epochs=epochs, 
       batch_size=batch_size, 
       callbacks=callbacks_list, 
       verbose=2)
    

    Keras 自适应Learning Rate (LearningRateScheduler)_第3张图片

  • Exponential Decay
    另一个常见的时间表是指数衰减。 它具有数学形式lr = lr0 * e ^(-kt),其中lr,k是超参数,t是迭代数。 同样,我们可以通过定义指数衰减函数并将其传递给LearningRateScheduler来实现。 实际上,可以使用此方法在Keras中实现任何自定义衰减时间表。 唯一的区别是定义了不同的自定义衰减函数。

    def exp_decay(epoch):
       initial_lrate = 0.1
       k = 0.1
       lrate = initial_lrate * exp(-k*t)
       return lrate
    lrate = LearningRateScheduler(exp_decay)
    

    Keras 自适应Learning Rate (LearningRateScheduler)_第4张图片
    使用不同的学习率对比如下:
    Keras 自适应Learning Rate (LearningRateScheduler)_第5张图片

  • Adaptive Learning Rate Methods

    使用学习速率计划的挑战在于必须预先定义其超参数,并且它们在很大程度上取决于模型和问题的类型。 另一个问题是,将相同的学习率应用于所有参数更新。 如果数据稀疏,则可能需要在不同程度上更新参数。
    在Keras中,我们可以使用相应的优化器轻松实现这些自适应学习算法。 通常建议将这些优化器的超参数保留为默认值(有时除外)。

    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)
    

    Keras 自适应Learning Rate (LearningRateScheduler)_第6张图片
    最后,我们比较了我们讨论过的所有学习率计划和自适应学习率方法的性能如下:
    Keras 自适应Learning Rate (LearningRateScheduler)_第7张图片
    参考连接:
    https://www.cnblogs.com/jins-note/p/9550826.html

你可能感兴趣的:(深度学习)