指数衰减学习率是先使用较大的学习率来快速得到一个较优的解,然后随着迭代的继续,逐步减小学习率,使得模型在训练后期更加稳定。在训练神经网络时,需要设置学习率(learning rate)控制参数的更新速度,学习速率设置过小,会极大降低收敛速度,增加训练时间;学习率太大,可能导致参数在最优解两侧来回振荡。
函数原型:
tf.train.exponential_decay(
learning_rate,
global_step,
decay_steps,
decay_rate,
staircase=False,#默认为False
name=None
)
staircase:布尔值。如果True以不连续的间隔衰减学习速率,最后曲线就是锯齿状
该函数返回衰退的学习速率。它被计算为:
decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)
指数衰减学习率的各种参数:
# 初始学习率
learning_rate = 0.1
# 衰减系数
decay_rate = 0.9
# decay_steps控制衰减速度
# 如果decay_steps大一些,(global_step / decay_steps)就会增长缓慢一些
# 从而指数衰减学习率decayed_learning_rate就会衰减得慢一些
# 否则学习率很快就会衰减为趋近于0
decay_steps = 50
# 迭代轮数
global_steps = 3000
此时的意思是学习率以基数0.9每50步进行衰减。例如当迭代次数从1到3000次时,迭代到最后一次时,3000/50=60. 则衰减到基数的60次方。
是初始化的学习率, 是随着 的递增而衰减。显然,当 为初值0时, 有下面等式:
用来控制衰减速度,如果 大一些, 就会增长缓慢一些。从而指数衰减学习率 就会衰减得慢一否则学习率很快就会衰减为趋近于0。
徒手实现指数衰减学习率:
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
X = []
Y = []
learning_rate=1
global_steps=3000
decay_steps=50
decay_rate=0.9
# 指数学习率衰减过程
for global_step in range(global_steps):
decayed_learning_rate = learning_rate * decay_rate**(global_step / decay_steps)
X.append(global_step / decay_steps)
Y.append(decayed_learning_rate)
#print("global step: %d, learning rate: %f" % (global_step,decayed_learning_rate))
plt.plot(X,Y,'b')
plt.ylabel(u"learning_rate学习率")
plt.xlabel('global_step / decay_steps')
plt.show()
---------------------
作者:亮亮兰
来源:CSDN
原文:https://blog.csdn.net/lyl771857509/article/details/79734107
版权声明:本文为博主原创文章,转载请附上博文链接!