神经网络训练过程中,依据每 batch 训练数据前向流传的后果,计算损失函数,再由损失函数依据梯度降落法更新每一个网络参数,在参数更新过程中应用到一个学习率(learning rate),用来定义每次参数更新的幅度。
过小的学习率会升高网络优化的速度,减少训练工夫,过大的学习率可能导致网络参数在最终的极优值两侧来回摆动,导致网络不能收敛。实际中证实无效的办法是设置一个依据迭代次数衰减的学习率,能够兼顾训练效率和前期的稳定性。
Tensorflow
- 分段常数衰减
分段常数衰减是在当时定义好的训练次数区间上,设置不同的学习率常数。刚开始学习率大一些,之后越来越小,区间的设置须要依据样本量调整,个别样本量越大区间距离应该越小。
tf.train.piecewise_constant(
x, #标量,训练次数
boundaries, #学习率参数利用区间列表, [10,20,30]
values, #学习率列表,长度比 boundaries 多 1, [0.1,0.5,0.025,0.0125]
name=None
)
- 指数衰减
指数衰减是比拟罕用的衰减办法,学习率是跟以后的训练轮次指数相干的。
tf.train.exponential_decay(
learning_rate, #初始学习率
global_step, #以后训练轮次
decay_steps, #衰减周期,用于阶梯型衰减
decay_rate, #衰减率系数
staircase=False, #True 为阶梯型衰减,False 为指数型衰减 (间断衰减)
name=None
)
- 天然指数衰减
天然指数衰减是指数衰减的一种非凡状况,学习率也是跟以后的训练轮次指数相干,只不过以 e 为底数。
tf.train.natural_exp_decay(
learning_rate, #初始学习率
global_step, #以后训练轮次
decay_steps, #衰减周期,用于阶梯型衰减
decay_rate, #衰减率系数
staircase=False, #True 为阶梯型衰减,False 为指数型衰减 (间断衰减)
name=None
)
天然指数衰减对学习率的衰减水平要远大于个别的指数衰减,个别用于能够较快收敛的网络,或者是训练数据集比拟大的场合。
- 多项式衰减
多项式衰减是这样一种衰减机制:定义一个初始的学习率,一个最低的学习率,依照设置的衰减规定,学习率从初始学习率逐步升高到最低的学习率,并且能够定义学习率升高到最低的学习率之后,抉择是始终放弃应用这个最低的学习率,还是达到最低的学习率之后再升高学习率到肯定值,而后再升高到最低的学习率(重复这个过程)
tf.train.polynomial_decay(
learning_rate, #初始学习率
global_step, #以后训练轮次
decay_steps, #衰减周期
end_learning_rate=0.0001, #最小学习率
power=1.0, #多项式的幂,默认为 1,即线性的
cycle=False, #达到最低学习率后是否升高,默认是 False,即放弃最低学习率
name=None
)
红色的学习率衰减曲线对应 cycle = False,降落后不再回升,放弃不变,绿色的学习率衰减曲线对应 cycle = True,降落后往返升降。
多项式衰减中设置学习率能够往返升降的目标是为了避免神经网络前期训练的学习率过小,导致网络参数陷入某个部分最优解出不来,设置学习率升高机制,有可能使网络跳出部分最优解。
- 余弦衰减
tf.train.cosine_decay(
learning_rate, #初始学习率
global_step, #以后训练轮次
decay_steps, #衰减步数,从初始学习率到最小学习率须要的轮次
alpha=0.0, #最小学习率
name=None
)
改良的余弦衰减办法还有:
线性余弦衰减,对应函数 tf.train.linear_cosine_decay()
噪声线性余弦衰减,对应函数 tf.train.noisy_linear_cosine_decay()
红色规范余弦衰减,学习率从初始曲线过渡到最低学习率;
蓝色线性余弦衰减,学习率从初始线性过渡到最低学习率;
绿色噪声线性余弦衰减,在线性余弦衰减根底上减少了随机噪声;
Pytorch
- 固定步长衰减
torch.optim.lr_scheduler.StepLR(
optimizer, #优化器
step_size, #步长
gamma=0.1, #衰减率
last_epoch=-1, #始终到 last_epoch
verbose=False)
>>> example #隔 30 步衰减为原来的 0.1
>>> # Assuming optimizer uses lr = 0.05 for all groups
>>> # lr = 0.05 if epoch < 30
>>> # lr = 0.005 if 30 <= epoch < 60
>>> # lr = 0.0005 if 60 <= epoch < 90
>>> # ...
>>> scheduler = StepLR(optimizer, step_size=30, gamma=0.1)
>>> for epoch in range(100):
>>> train(...)
>>> validate(...)
>>> scheduler.step()
- 多步长衰减
torch.optim.lr_scheduler.MultiStepLR(
optimizer, #优化器
milestones, #学习率更新区间(list)gamma=0.1, #衰减率
last_epoch=-1,
verbose=False)
Example #在 epoch=30,80 的时候更新学习率
>>> # Assuming optimizer uses lr = 0.05 for all groups
>>> # lr = 0.05 if epoch < 30
>>> # lr = 0.005 if 30 <= epoch < 80
>>> # lr = 0.0005 if epoch >= 80
>>> scheduler = MultiStepLR(optimizer, milestones=[30,80], gamma=0.1)
>>> for epoch in range(100):
>>> train(...)
>>> validate(...)
>>> scheduler.step()
- 指数衰减
torch.optim.lr_scheduler.ExponentialLR(optimizer_ExpLR, gamma=0.98)
#其中参数 gamma 示意衰减的底数,抉择不同的 gamma 值能够取得幅度不同的衰减曲线
- 余弦退火衰减
optimizer_CosineLR = torch.optim.SGD(net.parameters(), lr=0.1)
CosineLR = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer_CosineLR, T_max=150, eta_min=0)
严格的说,余弦退火策略不应该算是学习率衰减策略,因为它使得学习率依照周期变动,其蕴含的参数和余弦常识统一,参数 T_max 示意余弦函数周期;eta_min 示意学习率的最小值,默认它是 0 示意学习率至多为正值。确定一个余弦函数须要晓得最值和周期,其中周期就是 T_max,最值是初试学习率。
Reference
https://www.tensorflow.org/ap…
https://pytorch.org/docs/stab…
https://zhuanlan.zhihu.com/p/…