发表日期:2018.5.23
论文作者:fast.ai
文章开源代码:http://nlp.fast.ai/category/classification.html
主要内容:
在计算机视觉领域,迁移学习的使用和对目标任务效果的提升已经有目共睹,但在NLP领域,由于模型相对计算机视觉领域较浅,而且由于语言任务的复杂性,通常需要不同的模型微调方法,导致迁移学习在NLP领域使用较困难。本文提出一种通用的NLP迁移学习方法,使用通用语言模型微调(ULMFiT)并介绍了用于微调模型的关键技巧。通过对多种NLP任务的测试,验证的模型的有效性。
整个模型如上图分为三阶段:
第一阶段:General-domain LM pretrainning
使用大型有标记语料库对模型进行预训练,类似CV领域使用ImageNet对模型进行预训练。论文使用的模型是AWD-LSTM,采用的语料库是Wikitext-103。
第二阶段:Target task LM fine-tuning
在待解决的目标问题上进行模型训练微调。此阶段使用了两个小技巧:
(1) Discriminative fine-tuning(区分微调)
不同的网络层捕获的是不同的信息,所以微调时应该区分对待,每一层设置一个学习率的方法(第一层的特征具有通用性,所以设置相对较小的学习率,高层的特征与具体任务相关,因此设置相对较大的学习率)。通常使用的梯度下降更新不同层使用同样的学习率,文中采用不同的学习率:
首先选择最后一层的学习率进行微调,然后在确定倒数第二层的学习率,以此类推,文中没有给出理由的使用了
(2)Slanted triangular learning rate(三角变化的学习率)
学习率先逐渐增加后逐渐下降(由于具体任务的变化,先用较小的学习率,得到一个好的优化方向,再使用较大的学习率,进行优化,在训练后期再使用较小的学习率进行更细致的优化
其中T是总的迭代次数,cut_frac是斜率变化点所在迭代次数占总次数的百分比。ratio指示最小学习率和最大学习率之间的差距。
第三阶段:Target task classifier fine-tuning(上层分类器训练)
除了使用了batch normalization,Drop,Relu,Softmax等常规技术外,文章还是用的其他技巧:
(1)Concat pooling(级联池化)
由于输入的文档通常包含成百上千的词,如果只考虑模型最后的隐层,信息可能会丢失,因此根据GPU内存情况,尽可能多的把把RNN模型里每一个时刻的输出pooling一下,然后concat到最后一层特征上。
(2)Gradual unfreezing(逐步解冻)
首先解冻最后一层进行微调,然后解冻倒数第二层,将已解冻的两层微调,以此类推,每个Epoch向下解冻一层,直至所有层都微调完毕。
(3) BPTT for Text Classification (BPT3C)
将文本分为固定大小的batch,使用边长反向传播序列。
(4)Bidirectional language model(双向语言模型)
分别独立的训练正向和逆向语言模型,然后取平均。
实验验证:
作者在六个比较常用的数据集上评估了该方法,这些数据文档的数量以及文档的长度都不尽相同,在三个常见的分类任务(情感分析、问题分类、主题分类)上进行实验。通过和其他的一些文本分类方法进行比较,作者提出的ULMFiT方法错误率最低,效果最好。在三类分类任务上,ULMFit的监督学习、半监督学习需要的数据比从头训练模型的数据要少得多,但是错误率却更低,模型的效果更好。
讨论LM fine-tuning的影响:
论文中作者除了使用微调的方法,还增加了很多技巧以优化模型,所以需要对微调的方法是否有效进行讨论。通过实验可以看出,从零开始训练模型和使用ULMFiT的方法,在三个测试集上错误率下降幅度较大,后面增加各种trick,使得模型的错误率进一步下降,但是下降的幅度却并不是很大,所以可以看出,确实是ULMFiT的方法是有效。
值得借鉴的地方:
1、NLP的迁移学习。
2、模型中的一些小技巧。