动态调整Learning Rate:TORCH.OPTIM.LR_SCHEDULER

动态调整Learning Rate:TORCH.OPTIM.LR_SCHEDULER

pytorch提供的动态调整LR的策略。
GitHub源码

在1.1.0之前,scheduler的更新要在optimizer之前,为了向后兼容,在1.1.0之后scheduler需要放在optimizer更新之后,如果依然放在optimizer更新之前,那么就会跳过设定的LR的第一个值,官方推荐如下。

scheduler = ...
for epoch in range(100):
    train(...)
    validate(...)
    scheduler.step()

1. BaseClass _LRScheduler

class _LRScheduler(object):
    def __init__(self, optimizer, last_epoch=-1): #初始化
    def state_dict(self): #返回self.__dict__
    def load_state_dict(self, state_dict): #加载self.__dict__,当模型需要resume的时候加载参数
    def get_lr(self): #接口,获得LR
    def step(self, epoch=None): #执行一次更新
  • def init(self, optimizer, last_epoch=-1) :初始化参数,last_epoch为-1的时候,初始化'initial_lr'参数为optimizer的lr参数。同时设定last_epoch为0,为optimizer.step函数添加装饰器。

  • def step(self, epoch=None) :LR更新,同时检查LRScheduler与optimizer的执行顺序。

  • self.base_lrs = list(map(lambda group: group['initial_lr'], optimizer.param_groups)) :通过初始化的LR设置基础的base_lr。

2. LambdaLR

通过设置函数更新LR,lr_lambda可以是一个函数或者函数列表,但是需要和optimizer的参数组数量相同,一个参数一个更新函数,但是有多个参数组的话可以只设定一个更新函数,所有参数组共用这个更新函数。注意LR更新函数是与Base_lr相乘。

# Assuming optimizer has two groups.
lambda1 = lambda epoch: epoch // 30
lambda2 = lambda epoch: 0.95 ** epoch
scheduler = LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])
for epoch in range(100):
    train(...)
    validate(...)
    scheduler.step()
  • def get_lr(self): :
def get_lr(self):
        return [base_lr * lmbda(self.last_epoch)
                for lmbda, base_lr in zip(self.lr_lambdas, self.base_lrs)]

3. StepLR

这个规定了一个特殊的LambdaLR方式,每step_size步之后衰减gamma。多个参数组共用Step_size和gamma,同时Step_size固定。

# 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()

4. ReduceLROnPlateau

当模型的指标停止增加的时候,可以适当降低LR,在Patience时间内模型没有改进的时候,LR会降低。

  • mode:指指标的模型是’min‘还是’max‘,‘min’的时候不降低会减少LR,‘max’则相反。
  • factor:LR降低的速率,newLR=lr \star factor
  • patience:多少个epoch没有改善之后更新LR。
  • verbose:每次更新的时候是否打印信息。
  • threshold:判定为新的最优值的门槛,当新的最优值增加了threshold才会更新。
  • threshold_mode:‘rel’:best \star (1 + threshold)(’max‘), 'abs‘:best + threshold(‘max’)。
  • cooldown:当LR降低之后经过多少个epoch恢复原始的操作,让模型冷静下来。
  • min_lr:LR最低可以降到多少,这个可以是list。
  • eps:更新的值变化小于这个数就可以不用管了。
optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
scheduler = ReduceLROnPlateau(optimizer, 'min')
for epoch in range(10):
    train(...)
    val_loss = validate(...)
    # Note that step should be called after validate()
    scheduler.step(val_loss) # val_loss is a float or zero_dim Tensor

5. CyclicLR

上述的方法都是每次epoch之后更新,CyclicLR会在每个batch之后更新,更新频率更快。
Cyclical Learning Rates for Training Neural Networks

  • base_lr:LR下界。
  • max_lr:LR上界
  • step_size_up:每个循环分为两部分,一部分上升,一部分下降,构成一个三角形,这部分设置上升区间的迭代次数(注意是迭代,每一个batch算一次,而不是epoch)。
  • step_size_down:下降区间的迭代次数。
  • mode:三种模式,‘triangular’,‘triangular2’,‘exp_range‘。如果设定了scale_fn,那么这个参数就没用了。
  • gamma:‘exp_range‘模式下的更新常数。
  • scale_fn:自定义放缩函数,保证值为[0,1]。
  • scale_mode:‘cycle’,‘iterations’
  • cycle_momentum,base_momentum, max_omentum:LR更新的动量。
  • last_epoch:-1为初始化,用于Resume训练。
optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
scheduler = torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr=0.01, max_lr=0.1)
data_loader = torch.utils.data.DataLoader(...)
for epoch in range(10):
    for batch in data_loader:
        train_batch(...)
        scheduler.step()

6. CosineAnnealingWarmRestarts

一个周期性的余弦下降策略。每经过T_{0}次重启一下。
Stochastic Gradient Descent with Warm Restarts

\eta_t = \eta_{min} + \frac{1}{2}(\eta_{max} - \eta_{min})(1 + \cos(\frac{T_{cur}}{T_{i}}\pi))

  • T_0:重启周期
  • T_mult:T_0增加的因子,每次重启之后周期增加。
  • eta_min:LR的最小值。

Others

函数图像以及剩下的函数如下表:

Class Name Parameters Note Figure
LambdaLR optimizer,lr_lambda,last_epoch=-1
StepLR optimizer, step_size, gamma=0.1, last_epoch=-1
MultiStepLR optimizer, milestones, gamma=0.1, last_epoch=-1 上述StepLR的拓展,区别为Step_size不固定,Milestones为递增的数列,每经过一个Milestone衰减一次。
ExponentialLR optimizer, gamma, last_epoch=-1 指数衰减,每Step一次LR衰减Gamma
CosineAnnealingLR optimizer, T_max, eta_min=0, last_epoch=-1 余弦退火算法衰减的简化版。 \eta_t = \eta_{min} + \frac{1}{2}(\eta_{max} - \eta_{min})(1 + \cos(\frac{T_{cur}}{T_{max}}\pi))\eta_{max}是初始化LR,T_{max}是指多少个epoch循环重启一次。
ReduceLROnPlateau optimizer, mode='min', factor=0.1, patience=10, verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08
CyclicLR optimizer, base_lr, max_lr, step_size_up=2000, step_size_down=None, mode='triangular', gamma=1.0, scale_fn=None, scale_mode='cycle', cycle_momentum=True, base_momentum=0.8, max_momentum=0.9, last_epoch=-1
CosineAnnealingWarmRestarts optimizer, T_0, T_mult=1, eta_min=0, last_epoch=-1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容