指数衰减-学习率

在神经网络的参数更新过程中,学习率不能太大也不能太小,太大可能会导致参数在最优值两侧来回移动,太小会大大降低优化速度,为了解决学习率的问题,TensorFlow 提供了一种灵活的学习率设置方法,即指数衰减法

TensorFlow API: tf.keras.optimizers.schedules.ExponentialDecay

每迭代一轮,新的学习率都会根据以上参数更新一次,式子如下:

decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)

其中, learning_rate是初始学习率, decay_rate是衰减率, global_step表示从0到当前的训练次数, decay_steps用来控制衰减速度。这个式子实质上就是一个指数乘上一个常数,最后得到新一轮的学习率。指数衰减学习率是先使用较大的学习率来快速得到一个较优的解,然后随着迭代的继续,逐步减小学习率,使得模型在训练后期更加稳定。指数型学习率衰减法是最常用的衰减方法,在大量模型中都广泛使用。

import tensorflow as tf

w = tf.Variable(tf.constant(5, dtype=tf.float32))

epoch = 40
LR_BASE = 0.2  # 最初学习率
LR_DECAY = 0.99  # 学习率衰减率
LR_STEP = 1  # 喂入多少轮BATCH_SIZE后,更新一次学习率

for epoch in range(epoch):  # for epoch 定义顶层循环,表示对数据集循环epoch次,此例数据集数据仅有1个w,初始化时候constant赋值为5,循环100次迭代。
    lr = LR_BASE * LR_DECAY ** (epoch / LR_STEP)
    with tf.GradientTape() as tape:  # with结构到grads框起了梯度的计算过程。
        loss = tf.square(w + 1)
    grads = tape.gradient(loss, w)  # .gradient函数告知谁对谁求导
    w.assign_sub(lr * grads)  # .assign_sub 对变量做自减 即:w -= lr*grads 即 w = w - lr*grads
    print("After %s epoch,w is %f,loss is %f,lr is %f" % (epoch, w.numpy(), loss, lr))

猜你喜欢

转载自blog.csdn.net/Frank_LJiang/article/details/106296290