小样本如何更好的在BERT上fine-tune

小样本如何更好的在BERT上fine-tune

Revisiting Few-sample BERT Fine-tuning阅读笔记,论文地址:https://arxiv.org/abs/2006.05987

1 摘要

这篇论文主要探讨了如何更有效地使用BERT在小样本数据集上进行fine-tune。虽然当前预训练模型在各项NLP任务中都取得了很好的效果,但是当大规模参数的预训练模型应用在小样本数据集上,其fine-tune的过程仍然是不稳定的。比如在相同的fine-tune过程中使用不同的初始化参数会导致结果有很大的偏差(之前参加预训练模型泛化能力挑战赛的时候,相同的epoch,每次的结果都会不一样),这会使得研究者们反复的去实验,不仅会浪费时间和资源而且还给实验对比带来挑战。

因此,论文针对在小样本数据集上的fine-tune的不稳定性进行分析(Fine-tune Instability),已有的方案:

  • Fine-tuning pretrained language models:Weight initializations,data orders, and early stopping

  • Effective regularization to fine-tune large-scale pretrained language models

  • Sentence encoder on stilts:Supplementary training on intermediate labeled-data tasks

该论文主要聚焦三个方面的优化工作:

  • 优化算法

  • 模型初始化

  • 训练迭代次数

首先,论文中提到在BERT-adam优化算法中遗漏了梯度偏差修正,不利于模型的finetune,尤其在小数据集上,训练初期,模型会持续震荡,进而会降低整个训练过程的效率,减慢收敛的速度,导致微调的不稳定性。其次,BERT中某些网络层为fine-tune提供了一个不利的训练起点,并且通过简单的地重新初始化这些网络层可以加速学习并提高性能。最后,提到了训练时间的影响,并观察到常用的方法往往没有分配足够的时间去训练,需要增大训练步数。基于这些问题,作者对其进行的了改进,并重新评估性能情况,。

2 相关工作

  • BERT

  • Fine-tuning

  • Fine-tuning Instability

  • Bert Representation Transferability

介绍了如上四个方面的相关工作。

3 实验细节

  • Data 数据:使用的是GCLUE Benchmark上的八个数据集,包含四个任务,自然语言推理(RTE、QNLI、MNLI)、释义检测(MRPC、QQP)、情感分类(SST-2)、语言可接受性(CoLA)。训练样本少于1万条,随机抽取1千条作为验证集。

  • 参数设置:使用的是24层的BERTlarge模型,32的batch size,dropout为0.1,前三代的学习率是2e-5,warm-up为0.1。

4 优化算法 Adam偏差修正

BERT在实现Adam算法的时候与原始Adam算法的不同,省略了偏差修正的步骤,原始BERT文章并没有说明原因,但是有人在官网的github上提过issue,google的回答是:This was mostly an oversight,but doesn’t really matter when using a reasonable learning rate warmup。大致意思就是:emmmm之前可能是因为疏忽了,但是如果采用合理的预热学习率,这就会不重要。。。

论文作者针对这种情况做了细致的实验对比,在四个不同的数据集上,尝试了50个不同的随机种子,分别使用带偏差修正的Adam和不带偏差修正的Adam去做fine-tune任务,具体的实验结果见原论文的结果图。

结论:

  • 使用偏移修正的adam能够极大提升模型在测试集上的效果。

  • 使用偏移修正的Adam来finetune能够更快达到收敛,同时获得更小的loss。

5 重新初始化网络层的权重

在使用BERT做fine-tune的时候,通常是使用BERT预训练模型权重去初始化模型参数,然后接上一层具体任务的输出网络层。这样做可以充分利用BERT在预训练过程中学习到的特征。另外,有研究表明预训练模型中,底层的网络一般学习到比较通用的特征信息,而顶层的网络一般会接近具体的下游任务的特征信息。也就是说使用完整的预训练模型结构并不一定是一个很有效的fine-tune方法。因此,我们再fine-tune时,只保留底部的BERT权重参数,对于靠近顶部的权重可以重选初始化从头开始学习。论文做了如下实验来验证:

  • 重选初始化pooler层,同时尝试重新初始化bert的top-L层权重, 1<=L<=6,该超参数可以使用交叉验证法来设置,具体的步骤和实验结果见原始论文的结果图。

结论:

  • 在四个数据集上,模型通过重新初始化部分权重,在精度上都有不同程度的提升。

  • 到底在该对多少层的权重进行重新初始化,并没有明显规律

  • 需要用到pooler层的分类任务,对pooler层进行重新初始化肯定能对模型的训练有一定的帮助。

6 更多的步数

通过增加训练步数来提升fine-tune的效果。一般我们可以通过观察loss的变化来看收敛效果,并不一定需要追求多训练步数,这个问题需要具体对待。

7 更多的实验

论文在最后还做了一组对比实验,他将目前几个比较经典的解决训练震荡的方法列了出来,具体如下:

  • Pre-trained Weight Decay:传统的weight decay中,权重参数会减去一个正则项\lambda w 。而pre-trained weight decay则是在finetune时,将预训练时的权重{w}'引入到weight decay计算中 ,最终正则项为\lambda (w-{w}')。通过这种方式,能够使得模型的训练变得更稳定。
  • Mixout:在finetune时,每个训练iter都会设定给一个概率p,模型会根据这个p将模型参数随机替换成预训练的权重参数。这个方法主要是为了减缓灾难性遗忘,让模型不至于在finetune任务时忘记预训练时学习到的知识。
  • Layerwise Learning Rate Decay:即对于不同的层数,会使用不同的学习率。因为靠近底部的层学习到的是比较通用的知识,所以在finetune时并不需要它过多的去更新参数,相反靠近顶部的层由于偏向学习下游任务的相关知识,因此需要更多得被更新。
  • Transferring via an Intermediate Task:即在finetune一个小样本数据集任务时,先在一个较大的过渡任务上进行finetune。

作者将上述四个方法与本论文中的几个优化点做了对比实验,最后发现相对于只使用偏移修正的Adam优化算法,Pre-trained Weight Decay、Mixout、Layerwise Learning Rate Decay并没有显著的优势。当结合了偏移修正和权重重新初始化之后,上述三个方法的效果是明显有差距的。而对于Transferring via an Intermediate Task,虽然它的效果很好,但是它需要额外的标注数据,成本比较高。

你可能感兴趣的:(NLP)