BERT用于各项任务示意图:
从BERT出现到现在的广泛使用,以BERT为代表的预训练模型所提出的pre-traing + fine-tune两阶段的方法逐渐成为了很多涉及文本数据领域处理问题的新范式,例如文本分类、阅读理解、数据增广、问答系统和信息检索等。同时为了更好的提升BERT在所处理任务上的性能,以及更好的减小模型容量的同时又不至于损失模型的性能,不同的研究人员纷纷提出了BERT的多种变体。
🤗 Transformers 这个开源库就集成了如下的多种预训练模型,我们可以通过几行代码构建模型来将其用于下游的任务中 。
除了针对于BERT本身所存在的模型训练参数量太大以及推断时间所需太长的结构问题,如何在下游任务针对于BERT进行具体的fine-tune同样有很多问题需要我们思考,如:
- 如何更好的在文本分类任务上进行域适应的fine-tune
- 如何更好的进行post-train以进一步的利用MLM的预训练策略提升模型的性能
- 如何选择不同层对于输入的表示来进行下游任务的处理
- 如何调整BERT的输入来适应更长的文本
- 如何选择更好的学习率和优化器使模型更好更快的收敛
- ……
下面将总结这两天看的一些关于BERT在Text Classifition相关任务上的一些文章,看看前人是如何来理解BERT所带来的优势以及更好的将其进行应用于具体的任务。
Conditional BERT Contextual Augmentation
数据增广是一种广泛的应用于深度学习中的方法,它的目的就是通过增加数据量来缓解训练数据太少或者避免模型过拟合。从宏观意义上来说,如今的深度学习仍然使建立在数据集的基础上,尽管有各种模型各种训练的ticks,但是高质量的数据集远可以弥补模型构建和调参所需的工作。但是就有监督学习(supervised learning)来说,高质量的标注数据需要耗费大量的人力、财力和时间,所以各种数据增广技术便被提出来用于缓解这种尴尬的境地。
例如在视觉领域中对图像的裁剪、旋转以及通过VAE和GAN等生成模型生成新的图像等,在文本领域中常见的有如下三种:
- 基于规则,聚类,人工干预:这样的方式符合人们的直觉,但是得到的数据质量不稳定
- 基于同义词:使用例如wordNet这样同义词知识库来寻找同义词进行替换,或者使用word2vec等词嵌入来寻找相近的词进行替换
- 基于上下文的词嵌入:使用表示更优秀的上下文嵌入向量模型来选择语义更相近的词进行替换
BERT本身就可以提供表达丰富的上下文向量,因此可以直接使用第三种方法来做数据增广,但是作者这里指出,原始的BERT在使用MLM进行预训练的时候并没有考虑可能存在的情感和观念等信息,导致预测的内容可能并不准确。
e.g.
This actor is good
,在情感分析中它所对应的标签为positive,如何单纯的使用MLM进行预测This actor is [MASK]时,[MASK]部分可能是bad、boring等其他的词,这样的结果和对应的标签是不相符的。
针对于上述的问题,作者提出了一种新的MLM方式称为Conditional Masked Language Model,即模型在预测MASK的内容时同时考虑对应的标签信息。BERT在原始的MLM中相当于计算 P ( ⋅ ∣ S / { t i } ) P(\cdot|S / \{t_{i}\}) P(⋅∣S/{ti}),而现在相当于计算 P ( ⋅ ∣ y , S / { t i } ) P(\cdot|y, S / \{t_{i}\}) P(⋅∣y,S/{ti})。
Conditional Masked Language Model表现在模型上就是加了一层的Label Embedding。
文章思想简单直观,实验可自行查阅~
Improving BERT-Based Text Classification With Auxiliary Sentence and Domain Knowledge
本文作为一篇SCI虽然很长,但是思考的仍是一些普遍性的问题,例如:如何提高BERT在特定任务上的信息[本文针对于文本分类而言],以及如何设置BERT在训练中所涉及的一些参数等。因此,本文提出了一种通过构造辅助句子来提升模型性能的BERT变体 - - BERT4TC,它将单句分类任务转换成了句子对形式的分类任务进行处理。
BERT4TC直接使用BERT并没有进行进行处理
文中提出了四种类型的输入:
- BERT4TC-S:它并没有构造任何的辅助句子,直接使用BERT的单句分类
- BERT4TC-AQ:添加一个预定义的句子,文中使用的是
What is the results?
,但这样的句子并不能提供任何的额外信息,因此直觉上来看不会对于模型的效果有什么提升,反而会因为引入了不必要的噪声造成模型性能的下降。作者也通过实验帮我们验证了这种直觉:
For all datasets, BERT4TC-AQ with question auxiliary sentence doesn’t bring any performance improvements to the model, but decreases it on the contrary.
- -BERT4TC-AA:加入对应的标签信息组成句子对 [ C L S ] S e n t [ S E P ] P o s i t i v e / N e g t i v e [ S E P ] [CLS] Sent [SEP] Positive / Negtive[SEP] [CLS]Sent[SEP]Positive/Negtive[SEP],句子预测对应的标签变成 { 0 , 1 } \{0,1\} {0,1}。作者在实验中验证了这种方式相比第一种有提升。
BERT4TC-AA achieves the accuracy improvements by 28.64%, 1.5%, 1.37% and 0.51% respectively over BERT4TC-S that the input sequence is a single sentence.
QUESTION?:直接在训练的句子中加入真实的标签信息相比于前两种方式肯定可以提升模型效果,但这样的不是不会涉及信息泄露的问题吗?你直接在训练数据中就告诉了模型它的情感标签,然后再让模型预测它是积极的还是消极的,虽然positive/negtive变成了{0,1},但是两者有什么本质区别嘛?希望有缘人看到这可以帮我解疑答惑,不甚感激~
- BERT4TC-AWA :除了像上述的方法添加对应的标签后又加了一些不必要的其他词,例如文中是
The result is positive/negtive.
,然后标签同样变为了 { 0 , 1 } \{0,1\} {0,1}形式。实验证明了
BERT4TC-AA and BERT4TC-AWA on various multi-class datasets demonstrate that only including the categorical label in the auxiliary sentence would be enough, since other meaningless tokens might bring noisy information on the contrary.
QUESTION:实验结果证明了它和BERT4TC-AA都可以提升模型效果,除了标签外其他的词反而可能带来噪声影响模型效果。但是所有的数据加入的辅助句中只有positive或是negtive这两个词不同,BERT这么大的模型慢慢肯定就不会关注The result is这些词了,那么说到底仍然是第三种方式,仍然会有信息泄露问题,这样做的意义在哪里呢?
除了这些主要内容外,作者还通过实验得出了其他的一些结果:
- MLM这样的预训练策略可以帮助模型学到特定数据域的知识,以及减少偏差。因此在使用预训练好的BERT时,为了使其更好的适应具体的下游任务,可以使用同域中的数据利用MLM进行进一步的post-train。
- 针对于短文本数据集来说,学习率为2e-5更能帮助BERT客服灾难性遗忘的问题
- 针对于短文本数据集来说,由于样本的token数通常远小于512的限制,因此使用token_maxlen相比于其他的输入长度显然效果更好,额……
- 针对于长文本来说,采用前128和后352的拼接方式作为输入效果更好,学习率1e-5通常效果更好
这是 How to fine-tune BERT for Text Classifition中已有的结论,不能算是新的结论吧……
- 使用顶层 [ C L S ] [CLS] [CLS]的表示进行分类效果更好,额……
总之看完有点一言难尽,实验做的是挺多的,但是有价值的启示,额……