神经网络调优 ---学习率lr

  • 关于初始学习率

    • 尽量使用大的学习率,因为很多研究都表明更大的学习率有利于提高泛化能力
    • 和数据量的关系:学习率一般也需要随着训练数据量的增大而适当降低
    • 和batch_size的关系:更小的bath_size需要更小的学习率

  • Pytorch学习率调整策略通过 torch.optim.lr_sheduler 接口实现。pytorch提供的学习率调整策略分为三大类,分别是:

    • 有序调整:等间隔调整(Step),多间隔调整(MultiStep),指数衰减(Exponential),余弦退火(CosineAnnealing);
    • 自适应调整:依训练状况伺机而变,通过监测某个指标的变化情况(loss、accuracy),当该指标不怎么变化时,就是调整学习率的时机(ReduceLROnPlateau);
    • 自定义调整:通过自定义关于epoch的lambda函数调整学习率(LambdaLR)
  • 在每个epoch的训练中,使用step()语句进行学习率更新,此方法类似于optimizer.step()更新模型参数

    optimizer = torch.optim.Adam(model.parameters(),
                                 lr=0.0003,
                                 betas=(0.9, 0.999),
                                 eps=1e-08,
                                 weight_decay=0,
                                 amsgrad=False)
    ExpLR = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.9999)
    for epoch in range(epoch_num):
    	for step, (batch_x, batch_y) in enumerate(loader):
        	y_pred = model(batch_x)
            loss = loss_func(y_pred, batch_y)
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
    
        ExpLR.step() # 每个epoch衰减一次学习率
    
  • Pytorhc中学习率衰减类型

    1. 等间隔调整学习率 StepLR
      • 含义: 每训练step_size个epoch,学习率调整为lr=lr*gamma.
      • 参数:
        • optimizer: 神经网络训练中使用的优化器,如optimizer=torch.optim.SGD(…)
        • step_size(int): 学习率下降间隔数,单位是epoch,而不是iteration.
        • gamma(float): 学习率调整倍数,默认为0.1
        • last_epoch(int): 上一个epoch数,这个变量用来指示学习率是否需要调整。当last_epoch符合设定的间隔时,就会对学习率进行调整;当为-1时,学习率设置为初始值
      torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)
      
    2. 多间隔调整学习率 MultiStepLR
      • 含义: 学习率调整的epoch间隔并不是相等的,如epoch=10时调整一次,epoch=30时调整一次,epoch=80时调整一次
      • 参数:
        • milestone(list): 一个列表参数,表示多个学习率需要调整的epoch值,如milestones=[10, 30, 80]
        • 其它参数同等间隔方式
      torch.optim.lr_sheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)
      
    3. 指数衰减调整学习率 ExponentialLR
      • 含义: 学习率呈指数型衰减,每训练一个epoch,lr=lr * pow(gamma, epoch)
      • 参数:
        • gamma(float):学习率调整倍数的底数,指数为epoch
      torch.optim.lr_sheduler.ExponentialLR(optimizer, gamma, last_epoch)
      
    4. 余弦退火函数调整学习率CosineAnnealingLR
      • 含义: 学习率呈余弦函数型衰减,并以2*T_max为余弦函数周期,整个走势如同Cos(x)

      • 参数:

        • T_max(int): 学习率下降到最小值时的epoch数,即当epoch=T_max时,学习率下降到余弦函数最小值,一般Tmax=epochs总数
        • eta_min: 学习率调整的最小值,即epoch=T_max时,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yNCxUZSI-1615865569968)(https://math.jianshu.com/math?formula=lr_{min}%3D)]eta_min, 默认为0
      torch.optim.lr_sheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)
      
    5. 根据指标调整学习率 ReduceLROnPlateau
      • 含义: 当某指标(loss或accuracy)在最近几个epoch中都没有变化(下降或升高超过给定阈值)时,调整学习率。
        如当验证集的loss不再下降时调整学习率;或监察验证集的accuracy不再升高时,调整学习率。

      • 参数:

        • mode(str): 模式选择,有min和max两种模式,min表示当指标不再降低(如监测loss),max表示当指标不再升高(如监测accuracy)

        • factor(float): 学习率调整倍数,同前面的gamma,当监测指标达到要求时,lr=lr * factor

        • patience(int): 忍受该指标多少个epoch不变化,当忍无可忍时,调整学习率

        • verbose(bool): 是否打印学习率信息,默认为False, 即不打印该信息

        • threshold_mode (str): 选择判断指标是否达最优的模式,有两种模式:‘rel’ 和 ‘abs’.
          当threshold_mode == rel, 并且 mode == max时,dynamic_threshold = best * (1 + threshold);
          当threshold_mode == rel, 并且 mode == min时,dynamic_threshold = best * (1 - threshold);
          当threshold_mode == abs, 并且 mode == max时,dynamic_threshold = best + threshold;
          当threshold_mode == abs, 并且 mode == min时,dynamic_threshold = best - threshold;

        • threshold(float): 配合threshold_mode使用。

        • cooldown(int): “冷却时间”,当调整学习率之后,让学习率调整策略冷静一下,让模型在训练一段时间,再重启监测模式。

        • min_lr(float or list): 学习率下限,可为float,或者list,当有多个参数组时,可用list进行设置。

        • eps(float): 学习率衰减的最小值,当学习率的变化值小于eps时,则不调整学习率

      torch.optim.lr_sheduler.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)
      

猜你喜欢

转载自blog.csdn.net/hechao3225/article/details/114873489