训练前期学习率大,可以加快收敛速度,训练后期仍然使用较大的学习率,无法收敛到全局最小值,因此要减小学习率,保证后期平稳训练,更加接近最优点。可以人为经验指定,也可以随着迭代自适应衰减。
本文介绍一些 tensorflow 常用的学习率衰减方法。
1、指数衰减
def exponential_decay(
learning_rate, # 初始学习率
global_step, # 当前批次数
decay_steps, # 多少轮更新一次学习率(即总样本/批大小)
decay_rate, # 学习率衰减率(0,1)
staircase=False, # 是否离散衰减,默认为False,连续衰减
name=None # 操作的名字
)
decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)
衰减后的学习率 = 初始学习率 * 学习率衰减率(0,1)^(当前批次数 / 多少轮更新一次学习率(即总样本/批大小))
如果staircase=True,decayed_learning_rate = learning_rate * decay_rate ^ floor(global_step / decay_steps)
2、分段常数衰减
def piecewise_constant(
x,
boundaries, # 分段边界,如[100000, 110000]
values, # 各段的学习率,[1.0, 0.5, 0.1]
name=None # 操作名
)
表示:
第1-100000步,学习率为1.0;
第100000-110000步,学习率为0.5;
其余为0.1
3、多项式衰减
def polynomial_decay(
learning_rate, # 初始学习率
global_step, # 当前批次数
decay_steps, # 多少轮更新一次学习率
end_learning_rate=0.0001, # 最终学习率
power=1.0, # 多项式的指数,默认为1,线性
cycle=False, # 定义学习率是否到达最低学习率后升高,然后再降低,默认False,保持最低学习率
name=None # 操作名
)
global_step = min(global_step, decay_steps)
decayed_learning_rate = (learning_rate - end_learning_rate) * (1 - global_step / decay_steps) ^ (power) + end_learning_rate
衰减后的学习率=(初始学习率 - 最终学习率)*(1 - 当前批次数/多少轮更新一次学习率)^ (多项式的指数)+最终学习率
4、自然指数衰减
def natural_exp_decay(
learning_rate, # 初始学习率
global_step, # 当前批次数
decay_steps, # 多少轮更新一次学习率
decay_rate, # 学习率衰减率
staircase=False, # 是否离散衰减,默认为False,连续衰减
name=None # 操作名
)
decayed_learning_rate = learning_rate * exp(-decay_rate * global_step / decay_step)
衰减后的学习率 = 初始学习率 * exp( - 学习率衰减率 * 当前批次数 / 多少轮更新一次学习率)
5、反时间衰减
def inverse_time_decay(
learning_rate, # 初始学习率
global_step, # 当前批次数
decay_steps, # 多少轮更新一次学习率
decay_rate, # 学习率衰减率
staircase=False, # 是否离散衰减,默认为False,连续衰减
name=None # 操作名
)
decayed_learning_rate = learning_rate / (1 + decay_rate * global_step /decay_step)
衰减后的学习率 = 初始学习率 / (1 + 学习率衰减率 * 当前批次数 / 多少轮更新一次学习率)
如果 staircase=True,decayed_learning_rate = learning_rate / (1 + decay_rate * floor(global_step / decay_step))
6、余弦衰减
def cosine_decay(
learning_rate, # 初始学习率
global_step, # 当前批次数
decay_steps, # 多少轮更新一次学习率
alpha=0.0,
name=None # 操作名
)
global_step = min(global_step, decay_steps)
cosine_decay = 0.5 * (1 + cos(pi * global_step / decay_steps))
decayed = (1 - alpha) * cosine_decay + alpha
decayed_learning_rate = learning_rate * decayed