在我们熟知的学习率调度器中,有周期性调度器(单周期,多周期),也由衰减式调度器(按性能衰减,按epoch衰减)和预热式(学习率变化为低->高->缓慢变低)的。
周期性调度器对学习率比较敏感,可以通过学习率的周期性变化跳出局部最小值(在局部最小值时,学习率上升,有一定概率跳出最小值),尽可能找到鞍点;衰减式调度器,对学习率敏感度较低,但很难越过局部最小值(因为其学习率在不断下降,当到达鞍点时没有足够的动量跃出鞍点)。
为了结合这两个调度器的优势,博主对现行公开的两种学习率周期性调度器(余弦退火重启动学习率和余弦式衰减学习率)的代码做了轻微修改,实现了周期性与衰减学习率调度器的结合。
1、余弦退火重启动学习率衰减
由于paddle默认的学习率调度器里没有余弦退火重启动学习率,因此需要自习进行实现。
这里只实现了指数式衰减,参数中的eta_min是学习率最小值。
class CosineAnnealingWarmRestarts2(lr.LRScheduler):
#learning_rate:最大学习率值
#eta_min:最小学习率值
def __init__(self, m