【第12天】训练模型-Learning Rate

摘要

  1. 浅谈Learning Rate

    1.1 简介

    1.2 示意图

  2. Learning Rate的策略(3种)

    2.1 Fixed Learning Rate

    2.2 Reduce Learning Rate

    2.3 Cyclical Learning Rate


内容

  1. 浅谈Learning Rate

    1.1 简介

    • 训练模型时,以学习率控制模型的学习进度(梯度下降的速度)。
    • 在梯度下降法中,通常依照过去经验,选择一个固定的学习率,即固定每个epoch更新权重的幅度。
    • 公式为:新权重 = 旧权重 - 学习率 * 梯度

    1.2 示意图

    图片来自於:Aaron Chen-机器学习与深度学习精要

  2. Learning Rate的策略(3种)

    2.1 Fixed Learning Rate

    • 简介:训练模型时,采用固定的学习率。

    • 困境:到模型训练後期,仍使用固定的学习率,会发现收敛速度明显变慢,且容易找到局部最小值(Local minuma),而非最佳解(Global minima)。如下图。

      图片来自於:https://www.twblogs.net/a/5efe3eb9e53eaf40aa872468

    • 范例:Learning Rate固定为0.001

    # 编译模型
    model.compile(optimizer=Adam(lr=0.001),
                 loss='categorical_crossentropy',
                 metrics=['accuracy'])
    

    2.2 Reduce Learning Rate

    • 简介:到模型训练後期,模型逐渐接近全局最小值(Global minima),适度地降低学习率,有助於找到最佳解(Global minima)。

    • 困境:模型仍有可能陷入鞍点(Saddle Point),影响效能。

    • 鞍点(Saddle Point):模型训练後期,其一阶梯度已经趋近0,但是从不同的维度观察,维度1时,可能是极小值;维度2时,可能是极大值。

      图片来自於:https://read01.com/PM43jxj.html#.YVGUNZpByUk

    • 常用的衰降方法

      • 分段常数衰减:每训练n个epoch,就进行一次学习率衰降。
      • 指数衰减:学习率随着epoch,成指数关系衰降。
      • ReduceLROnPlateau:当模型连续训练n次没有更好,就进行一次学习率衰降。

      ※注:详细说明可参考此处

    • 我们挑选ReduceLROnPlateau进行Reduce Learning Rate,范例如下。

    # 设定lr降低条件(0.001 → 0.005 → 0.0025 → 0.00125 → 下限:0.0001)
    reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.5,
                               patience=5, mode='min', verbose=1,
                               min_lr=1e-4)
    
    # 训练模型时,以Callbacks监控,呼叫reduce_lr调整Learning Rate值
    history = model.fit_generator(train_generator,
                       epochs=8, verbose=1,
                       steps_per_epoch=train_generator.samples//batch_size,
                       validation_data=valid_generator,
                       validation_steps=valid_generator.samples//batch_size,
                       callbacks=[checkpoint, estop, reduce_lr])
    
    • 参数说明
      • monitor:欲监控的数值。通常使用val_loss或val_acc
      • mode:选择监控的模式。对应monitor类别,val_loss设定min或val_acc设定max。
      • factor:缩放学习率的常数。训练模型中,若符合patience条件(如:连续训练5个epoch後,val_loss未降低),则将原本的学习率值乘以factor,做为新的学习率。
      • patience:若赋值为5,代表模型连续训练5个epoch後,监控的数值表现没有更好,就会停止训练。
      • verbose:用於选择模型训练资讯的显示方式。
      • min_lr:每当符合patience条件,学习率会变动(缩小),min_lr代表学习率的下限。

    2.3 Cyclical Learning Rate

    • 简介:设定学习率的上下限後,让学习率在一定范围内衰降或增加。
    • 优点:训练模型时,让学习率在一定范围内衰降或增加,模型收敛速度快,且有助於逃离鞍点,避免影响模型效能。
    • 范例:需要先定义CLR,请参考Keras Team-cyclical_learning_rate.py
    # 定义CLR後,呼叫CyclicLR
    from clr_callback import CyclicLR
    
    # 设置CyclicLR
    EPOCHS = 8
    test_step_size = (train_generator.samples * EPOCHS) / train_generator.batch_size
    
    # step_size计算公式为train sample size/batch size * p (p为2-10倍)
    step_size = 6000 
    clr = CyclicLR(step_size=test_step_size)
    
    # 训练模型时,以Callbacks监控,呼叫clr调整Learning Rate值
     history = model.fit_generator(train_generator,
                       epochs=8, 
                       steps_per_epoch=train_generator.samples//batch_size,
                       validation_data=valid_generator,
                       validation_steps=valid_generator.samples//batch_size,
                       callbacks=[checkpoint, estop, clr])
    

小结

  1. 我们在训练模型时,主要是尝试与Reduce Learning Rate(ReduceLROnPlateau)与Cyclical Learning Rate,观察两者表现。
  2. 下一章,目标是:「探讨不同的优化器演算法」。

让我们继续看下去...


参考资料

  1. Leslie N. Smith-Cyclical Learning Rates for Training Neural Networks
  2. Keras Team-cyclical_learning_rate.py
  3. CLR论文解析
  4. 【学习率】梯度下降学习率的设定策略

<<:  Day 27 利用transformer自己实作一个翻译程序(九) Point wise feed forward network

>>:  学习Python纪录Day12 - Python模组

[Day 27]TensorFlow运算方法

我们今天来聊聊TensorFlow运算的几个较为常用的方法,不像其他语言的加减乘除,TensorFl...

[Day28] React - 建立React 元件 (Component )

前面介绍了如何用JSX语法建立React元素,接着这篇会记录如何建立React元件,即前面提到的Re...

六边形架构图

六边形架构图 (Hexagonal Architecture Diagram) 是一种用於软件设计的...

【从零开始的 C 语言笔记】第二十篇-While Loop(2)

不怎麽重要的前言 上一篇介绍了while loop的概念,让大家在回圈的使用上可以相对的弹性。 这次...

Day7收假第一天-无头...苍蝇头

记得在KiKi吃到苍蝇头,让不爱吃韭菜的我也是搭着白饭一口接一口,而且苍蝇头做法简单材料单纯,只要韭...