神经网络中warmup为什么有效?

首先warmup主要解决的问题或者说是作用:

  1. 有助于减缓模型在初始阶段对mini-batch的提前过拟合现象,保持分布的平稳
  2. 有助于保持模型深度的稳定性

从训练的效果可以体现为:一开始loss比较大,不容易收敛,因此用小一点的学习率,慢慢学,慢慢往上涨;梯度偏离真正较优的方向可能性比较大,那就走短一点,如果错了还可以调整回来。

由于刚开始训练的时候,模型的权重是随机初始化的,此时如果选择一个较大的学习率,可能带来模型的不稳定(震荡),选择预热学习率的方式,可以使得开始训练的几个epoch或者一些step内学习率较小,在预热的小学习率下,模型可以慢慢的趋于稳定,等模型相对稳定后再去选择预先设定的学习率进行训练,使得模型收敛的速度变得更快,模型的效果更好。

warmup是针对学习率learning rate优化的一种策略,主要过程是,在预热期间,学习率从0线性(也可以非线性)增加到优化器中的初始预设lr,之后使其学习率从优化器中的初始学习率线性较低到0.

如何使用warmup?

  • warm_up_ratio 设置预热步数
from transformers import AdanW, get_linear_schedule_with_warmup

optimizer = AdamW(model.parameters(), lr=lr, eps=adam_epsilon)
len_dataset = 3821 # 可以根据pytorch中的len(Dataset)计算
epoch = 30
batch_size = 32
total_steps = (len_dataset // batch_size) * epoch if len_dataset % batch_size = 0 else (len_dataset // batch_size + 1) * epoch # 每一个epoch中有多少个step可以根据len(DataLoader)计算:total_steps = len(DataLoader) * epoch

warm_up_ratio = 0.1 # 定义要预热的step
scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps = warm_up_ratio * total_steps, num_training_steps = total_steps)
......
optimizer.step()
scheduler.step()
optimizer.zero_grad()
  • num_warmup_steps 设置预热步数
    # training steps 的数量: [number of batches] x [number of epochs].
    total_steps = len(train_dataloader) * epochs
     
    # 设计 learning rate scheduler
    scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps = 50, 
                                                num_training_steps = total_steps)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值