一、学习率衰减
1、重启学习率
余弦退火(Cosine Annealing)
每隔一段时间重启学习率,在单位时间内能收敛到多个局部最小值,可以得到很多个模型做集成。
# 余弦退火
torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)
参数:
optimizer: 优化器
T_max: 回到初始学习率的周期,每半个周期降到eta_min
eta_min: 最小学习率, 默认0
last_epoch: 最后的epoch的索引,默认0
# 余弦退火重启
torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0, T_mult=1, eta_min=0, last_epoch=- 1, verbose=False)
参数:
optimizer: 优化器
T_max: 第一次回到初始学习率的epoch
T_mult: 乘以T_max的数,即周期翻倍
eta_min: 最小学习率, 默认0
last_epoch: 最后的epoch的索引,默认0
2、梯度衰减
torch.optim.lr_scheduler.StepLR
torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=- 1, verbose=False)
torch.optim.lr_scheduler.ExponentialLR
torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=- 1, verbose=False)
二、正则化
L1/L2正则化、权重衰减、EarlyStop、DropOut、BN/LN/GN、标签平滑、各种数据增强等
--Flooding(ICML2020--Do We Need Zero Training Loss Afer Achieving Zero Training Error?)
当模型拟合能力很好并达到较小训练误差,如果继续训练模型降低损失,模型更易把一些噪声或无用信息当做特征学习进来,从而泛化能力很差。
通过找到损失函数的一个平衡点解决权衡问题,提出‘flooding’方法使loss先正常下降到flooding level(超参,设置的训练损失阈值)附近,当训练损失低于这个阈值进行梯度上升。
一行代码即可实现,且可与任何随机优化器以及正则化方法搭配。
公式:
代码: