Tensorflow2.0学习率衰减详细汇总

这里先列出5种常见学习率衰减策略的总结,之后详细介绍如何利用tensorflow库自带的类实现学习率衰减。

最后以上面5个例子演示如何自己自定义一个学习率衰减策略。这样大家以后就可以按照自己的需要定制一个学习率调度器了。

学习率调度器的实现参考:

1. 总结

α 0 \alpha_{0} α0——初始学习率

α t \alpha_{t} αt——第 t t t个step时的学习率

β \beta β ——学习率衰减系数

t t t ——当前是第几个step

T T T ——经历个多少个step后完成一次学习率衰减

这里的公式与《神经网络与深度学习》第7章略微有一点区别,就是引入了 T T T,主要是为了与tensorflow的API相契合。不影响理解。

方法公式说明
分段常数衰减
Piecewise Constant Decay
每经过 T 1 , T 2 , . . . , T m T_1, T_2, ... ,T_m T1,T2,...,Tm倍,学习率就下降为原来的 β 1 , β 2 , . . . , β m \beta_1, \beta_2, ... ,\beta_m β1,β2,...,βm
逆时衰减
Inverse Time Decay
α t = α 0 1 1 + β × t T \alpha_{t}=\alpha_{0} \frac{1}{1+\beta \times \frac{t}{T}} αt=α01+β×Tt1经过 T T T个step后,学习率下降为原来的 1 1 + β \frac{1}{1+\beta} 1+β1
指数衰减
Exponential Decay
α t = α 0 β t T \alpha_{t}=\alpha_{0}\beta^{\frac{t}{T}} αt=α0βTt迭代 T T T个step后,学习率降为原来的 β \beta β
自然指数衰减
Natural Exponential Decay
α t = α 0 exp ⁡ ( − β × t T ) \alpha_{t}=\alpha_{0} \exp (-\beta \times \frac{t}{T}) αt=α0exp(β×Tt)迭代 T T T个step后,学习率降为原来的 exp ⁡ ( − β ) \exp{(-\beta)} exp(β)
余弦衰减
Cosine Decay
α t = 1 2 α 0 ( 1 + cos ⁡ ( t π T ) ) \alpha_{t}=\frac{1}{2} \alpha_{0}\left(1+\cos \left(\frac{t \pi}{T}\right)\right) αt=21α0(1+cos(Ttπ))迭代 T T T个step后学习率降至0

下图是不同学习率衰减的效果。
在这里插入图片描述

2. 利用TensorFlow2的API使用学习率衰减

下面通过tensorflow2的API演示如何创建一个学习率衰减调度器,以下例子中的初始学习率均为 α 0 = 1 \alpha_0=1 α0=1

2.1 分段常数衰减(Piecewise Constant Decay)

# 分段常数衰减(Piecewise Constant Decay)
import tensorflow as tf
boundaries=[20, 40, 60, 80]  # 以 0-20 20-40 40-60 60-80 80-inf 为分段
values=[1, 0.5, 0.25, 0.125, 0.0625]  # 各个分段学习率的值
piece_wise_constant_decay = tf.keras.optimizers.schedules.PiecewiseConstantDecay(
                            boundaries=boundaries, values=values, name=None)

在这里插入图片描述

2.2 逆时衰减(Inverse Time Decay)

α t = α 0 1 1 + β × t T \alpha_{t}=\alpha_{0} \frac{1}{1+\beta \times \frac{t}{T}} αt=α01+β×Tt1

initial_learning_rate=1.相当于 α 0 = 1 \alpha_0= 1 α0=1

decay_steps=1相当于 T = 1 T=1 T=1

decay_rate=0.1相当于 β = 0.1 \beta=0.1 β=0.1

即:
α t = 1 ⋅ 1 1 + 0.1 t \alpha_{t}=1 · \frac{1}{1+0.1t} αt=11+0.1t1

import tensorflow as tf
inverse_time_decay = tf.keras.optimizers.schedules.InverseTimeDecay(
                     initial_learning_rate=1., decay_steps=1, decay_rate=0.1)

在这里插入图片描述

2.3 指数衰减(Exponential Decay)

α t = α 0 β t T \alpha_{t}=\alpha_{0}\beta^{\frac{t}{T}} αt=α0βTt

initial_learning_rate=1.相当于 α 0 = 1 \alpha_0= 1 α0=1

decay_steps=1相当于 T = 1 T=1 T=1

decay_rate=0.96相当于 β = 0.96 \beta=0.96 β=0.96

即:
α t = 1 ⋅ 0.9 6 t \alpha_{t}=1·0.96^{t} αt=10.96t

import tensorflow as tf
exponential_decay = tf.keras.optimizers.schedules.ExponentialDecay(
                        initial_learning_rate=1., decay_steps=1, decay_rate=0.96)

在这里插入图片描述

2.4 自然指数衰减(Natural Exponential Decay)

α t = α 0 exp ⁡ ( − β × t T ) \alpha_{t}=\alpha_{0} \exp (-\beta \times \frac{t}{T}) αt=α0exp(β×Tt)

initial_learning_rate=1.相当于 α 0 = 1 \alpha_0= 1 α0=1

decay_steps=1相当于 T = 1 T=1 T=1

decay_rate=0.96相当于 β = 0.05 \beta=0.05 β=0.05

即:
α t = 1 ⋅ exp ⁡ ( − 0.05 t ) \alpha_{t}=1·\exp (-0.05t) αt=1exp(0.05t)
这个实现方案我没在tensorflow找到,于是自己实现了一个,这部分如果不太理解,可以暂时跳过这部分。自定义学习率调度器的方法在后面有提到。

import tensorflow as tf
class NaturalExpDecay(tf.keras.optimizers.schedules.LearningRateSchedule):
    def __init__(self, initial_learning_rate, decay_steps, decay_rate):
        super().__init__()
        self.initial_learning_rate = tf.cast(initial_learning_rate, dtype=tf.float32)
        self.decay_steps = tf.cast(decay_steps, dtype=tf.float32)
        self.decay_rate = tf.cast(decay_rate, dtype=tf.float32)
        
    def __call__(self, step):
        return self.initial_learning_rate * tf.math.exp(-self.decay_rate * (step / self.decay_steps))
    
natural_exp_decay = NaturalExpDecay(initial_learning_rate=1, 
                                    decay_steps=1, 
                                    decay_rate=0.05)

在这里插入图片描述

2.5 余弦衰减(Cosine Decay)

α t = 1 2 α 0 ( 1 + cos ⁡ ( t π T ) ) \alpha_{t}=\frac{1}{2} \alpha_{0}\left(1+\cos \left(\frac{t \pi}{T}\right)\right) αt=21α0(1+cos(Ttπ))

initial_learning_rate=1.相当于 α 0 = 1 \alpha_0= 1 α0=1

decay_steps=100相当于 T = 100 T=100 T=100

即:
α t = 1 2 ⋅ 1 ⋅ ( 1 + cos ⁡ ( t π 100 ) ) \alpha_{t}=\frac{1}{2} ·1·\left(1+\cos \left(\frac{t \pi}{100}\right)\right) αt=211(1+cos(100tπ))
注意这里 T = 100 T=100 T=100而不是1,当 t = 100 t=100 t=100时, α t = 0.5 ⋅ ( 1 + c o s ( π ) ) = 0.5 ⋅ ( 1 − 1 ) = 0 \alpha_t=0.5·(1+cos(\pi))=0.5·(1-1)=0 αt=0.5(1+cos(π))=0.5(11)=0

import tensorflow as tf
cosine_decay = tf.keras.experimental.CosineDecay(
                initial_learning_rate=1., decay_steps=100)

在这里插入图片描述

2.6 使用方法

学习率衰减调度器的使用方法非常简单,以指数衰减为例。

  • 先创建一个学习率衰减调度器
  • 把它传入你选择的优化器(这里选择Adam优化器)
import tensorflow as tf
# 1. 先创建指数衰减学习率
exponential_decay = tf.keras.optimizers.schedules.ExponentialDecay(
                    initial_learning_rate=0.01, decay_steps=1000, decay_rate=0.96)
# 2. 送入优化器
optimizer = tf.keras.optimizers.Adam(exponential_decay)
# 普通的优化器
# optimizer = tf.keras.optimizers.Adam(0.01)

3. 自定义实现学习率衰减

这部分参考了tensorflow教程里有关自定义学习率的部分。

通过参考下面的例子,大家以后就可以自由的定义自己需要的学习率调度器。实现学习率衰减,warmup等功能。

首先需要创建一个自定义学习率调度器的类,继承tf.keras.optimizers.schedules.LearningRateSchedule

创建好后,使用方法与2.6完全一致。

代码如下

分段常数衰减(Piecewise Constant Decay)

import tensorflow as tf
class PiecewiseConstantDecay(tf.keras.optimizers.schedules.LearningRateSchedule):
    def __init__(self, boundaries, values):
        super().__init__()
        self.boundaries = tf.cast(boundaries, dtype=tf.float32)
        self.values = tf.cast(values, dtype=tf.float32)
    
    def __call__(self, step):
        for i in range(len(self.boundaries)):
            if self.boundaries[i] >= step:
                return self.values[i]
        else:
            return self.values[-1]

逆时衰减(Inverse Time Decay)

import tensorflow as tf
class InverseTimeDecay(tf.keras.optimizers.schedules.LearningRateSchedule):
    def __init__(self, initial_learning_rate, decay_steps, decay_rate):
        super().__init__()
        self.initial_learning_rate = tf.convert_to_tensor(initial_learning_rate)
        self.decay_steps = tf.cast(decay_steps, dtype=tf.float32)
        self.decay_rate = tf.convert_to_tensor(decay_rate)
    
    def __call__(self, step):
        step = tf.convert_to_tensor(step)
        return self.initial_learning_rate / (1 + self.decay_rate * step / self.decay_steps)

指数衰减(Exponential Decay)

import tensorflow as tf
class ExponentialDecay(tf.keras.optimizers.schedules.LearningRateSchedule):
    def __init__(self, initial_learning_rate, decay_steps, decay_rate):
        super().__init__()
        self.initial_learning_rate = tf.cast(initial_learning_rate, dtype=tf.float32)
        self.decay_steps = tf.cast(decay_steps, dtype=tf.float32)
        self.decay_rate = tf.cast(decay_rate, dtype=tf.float32)
        
    def __call__(self, step):
        return self.initial_learning_rate * self.decay_rate ** (step / self.decay_steps)

余弦衰减(Cosine Decay)

import tensorflow as tf
from math import pi

class CosineDecay(tf.keras.optimizers.schedules.LearningRateSchedule):
    def __init__(self, initial_learning_rate, decay_steps):
        super().__init__()
        self.initial_learning_rate = tf.cast(initial_learning_rate, dtype=tf.float32)
        self.decay_steps = tf.cast(decay_steps, dtype=tf.float32)
    
    def __call__(self, step):
        return self.initial_learning_rate * (1 + tf.math.cos(step * pi / self.decay_steps)) / 2
  • 52
    点赞
  • 189
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
### 回答1: 学习率衰减是指在训练神经网络时,随着训练的进行,逐渐降低学习率的过程。这样做的目的是为了让模型在训练初期快速收敛,而在训练后期避免过拟合。在TensorFlow 2.0中,可以通过使用tf.keras.optimizers中的learning_rate_scheduler来实现学习率衰减。常见的学习率衰减方法有Step Decay、Exponential Decay、Cosine Decay等。 ### 回答2: 学习率衰减是指在训练神经网络时,随着训练的进行,逐渐减小学习率的过程。在本文中,我们将介绍TensorFlow 2.0中学习率衰减的方法和实现。 TensorFlow 2.0中的学习率衰减有三种实现方式:时间衰减、余弦退火和指数衰减。其中,指数衰减是最常用的方法,因为它非常简单且易于调整,同时也有良好的效果。 指数衰减通过指数函数逐渐减小学习率,可以实现快速收敛和防止过拟合。具体实现方式为: ```python initial_learning_rate = 0.1 # 初始化学习率 decay_steps = 10000 # 衰减步数 decay_rate = 0.96 # 衰减率 step = tf.Variable(0, trainable=False) # 定义指数衰减函数 learning_rate = tf.compat.v1.train.exponential_decay(initial_learning_rate, step, decay_steps, decay_rate, staircase=True) # 定义优化器 optimizer = tf.keras.optimizers.SGD(learning_rate) ``` 在上述代码中,我们首先定义了初始学习率衰减步数和衰减率,然后通过指数衰减函数逐步减小学习率。最后,我们使用SGD优化器来训练模型。 除了指数衰减TensorFlow 2.0中还支持余弦退火和时间衰减。其中,余弦退火在训练初期较快地减小学习率,在接近最优解时较慢地减小学习率,从而有效地避免了局部最优解;时间衰减则类似于指数衰减,只是减小学习率的速度不同。 总之,在训练神经网络时使用学习率衰减可以加速收敛、防止过拟合和提高模型的泛化能力。TensorFlow 2.0中提供了三种学习率衰减的实现方式,其中指数衰减是最常用的方法,也是最简单易用的方法。 ### 回答3: 学习率衰减是一种优化算法,它可以帮助更好地训练深度神经网络,并且可以提高模型的准确性和泛化能力。Tensorflow2.0提供了许多学习率衰减函数,可以在训练模型时轻松地应用它们。 学习率衰减可以理解为一种策略,它会随着训练的进行,逐渐减小模型参数的更新量。这是因为在初始训练阶段,学习率越大,模型参数更新越大,但随着训练的进行,参数更新越来越小,这样会使模型达到一个比较稳定的状态。如果学习率不改变,则可能会导致模型过拟合,并且训练时间可能会更长。 Tensorflow2.0提供了三种不同的学习率衰减方式:指数衰减、多项式衰减和余弦衰减。其中指数衰减方式是最常用的方法,它会通过一个指数函数来不断减小学习率,每次减小的程度也可以进行设置。多项式衰减方式会通过一个多项式函数来不断减小学习率,而余弦衰减则会根据余弦函数不断减小学习率学习率衰减不仅可以提高模型的准确性和泛化能力,还可以在遇到局部极小值时,帮助模型跳出局部极小值,更快地找到全局最优解。在使用学习率衰减时,需要注意一些常见的问题,例如衰减率、衰减周期、起始学习率等等。这些参数需要根据具体情况进行设置,以获得更好的训练效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值