关于炼丹

lr_scheduler的选择

学习率在训练过程起到很重要的作用,这段时间里最常用的两个:

  • 循环学习率调度器
    循环学习率调度器主要基于一个基本的观点:将训练过程中的学习率从较低的初始值逐渐增加,然后再逐渐减小到较小的终止值。这个过程有助于模型更快地收敛,并且可以降低模型过拟合的风险。同时,通过在训练过程中循环地逐渐调整学习率,可以避免在过多迭代中学习率过小或者过大。
torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr=, steps_per_epoch=, epochs=)
  • 指数衰减学习率调度器
    指数衰减学习率调度器的工作方式很简单:在每个训练迭代中,它会根据一个事先指定的指数衰减率,对当前学习率进行乘法衰减。
torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.88, last_epoch=-1)

个人感觉:循环学习率调度器在训练收敛的过程更稳定一些
注意事项:OneCycleLR是每个step更新一次,代码要放在最里层,ExponentialLR是每个epoch更新一次,代码放在两个for循环之间

蒸馏模型

当模型落地应用,通常需要压测下模型的响应速度,这时候需要将大的模型蒸馏成较小的模型,实践中最常见的就是把Bert模型蒸馏成Bi-LSTM模型,降低参数量和提升响应速度。
蒸馏模型的过程就是teacher-student模式,先训练大模型(teacher),然后利用大模型去教会小模型(student),蒸馏过程中,训练损失是由两部分组成:(1)大模型和小模型生成结果的差异(2)小模型生成结果与正确答案之间的差异

teacher_model.eval()
student_model.train()
distill_loss(output_t, output_s, labels)

def distill_loss(teacher_logits, student_logits, labels):
  hard_loss = F.cross_entropy(student_logits, labels)
  soft_loss = F.kl_div(F.log_softmax(student_logits/T, dim=1), 
                       nn.softmax(teacher_logits/T, reduction="batchmean"))
  return alpha*hard_loss + (1_alpha)*soft_loss*T*T

# 其中:T=temperature=5  alpha=0.1
posted @ 2023-08-18 18:27  嘎吱嘎吱脆  阅读(8)  评论(0编辑  收藏  举报