这篇介绍以下最近大热的BERT,它在11个NLP任务中刷新了成绩,效果确实惊人。不过在介绍论文之前我还是想说这项工作不是很好复现,如果没有足够的资源就不要想了 。我觉得很可能未来的利用价值在于直接使用作者公布的预训练好的模型。
现在有很多利用预训练的语言表征来完成下游NLP任务的研究,作者把它们概括为两类feature-based和fine-tuning:
分类 | 代表 | task-specific模型 | 使用方案 |
---|---|---|---|
feature-based | ELMo | 需要 | 把表征作为feature提供给下游任务 |
fine-tuning | OpenAI GPT,(前文介绍过的) ULMFiT | 不需要 | fine tune预训练的参数 |
这两类方法的共性在于它们在预训练中都使用了一样的目标函数,也都使用了单向的语言模型。
作者对这些方法的批评在于它们没有很好的利用上下文的信息。尽管如ELMo这样的算法利用了正向和反向的语言模型,可本质上仍然是两个unidirectional模型的叠加。对于SQuAD这种阅读理解式的任务,能够同时从两个方向提取context信息至关重要,然而现存的方法有巨大的局限性。
BERT, OpenAI GPT, 和ELMo之间的区别如图示:
作为fine-tuning这一类的方法,作者提出了改进的方案:BERT(Bidirectional Encoder Representations from Transformers)
具体做法是,
在实际的预训练中,这两个任务是jointly training
论文使用了两种模型:
B E R T B A S E BERT_{BASE} BERTBASE: L=12, H=768, A=12, Total Parameters=110M
B E R T L A R G E BERT_{LARGE} BERTLARGE: L=24, H=1024, A=16, Total Parameters=340M
这里L是layers层数(即Transformer blocks个数),H是hidden vector size, A是self-attention的“头数”。
在NLP领域,10层以上的layer还是比较“惊人”的,印象中当年Attention is All You Need第一次提出transformer的时候,在MT任务中用到了6层。当然从结构上来讲,transformers之间用的是residual connection,并且有batch normarlization这种“常规”操作,多层不是什么问题。有意思的是在于这么多层的结构究竟学到了什么?NLP不能和CV做简单的类比,网络层数并不是“多多益善”;有论点认为低层偏向于语法特征学习,高层偏向于语义特征学习。希望将来的研究能够给出更充分更有启发性的观点。
针对不同的任务,模型能够明确的表达一个句子,或者句子对(比如[问题,答案])。对于每一个token, 它的表征由其对应的token embedding, 段表征(segment embedding)和位置表征(position embedding)相加产生。如下图:
具体细节如下:
Masked LM
具体细节论文上解释的很清楚了,这里从略了。
提一下值得注意的一点吧:为了达到真正的bidirectional的LM的效果,作者创新性的提出了Masked LM,但是缺点是如果常常把一些词mask起来,未来的fine tuning过程中模型有可能没见过这些词。这个量积累下来还是很大的。因为作者在他的实现中随机选择了句子中15%的WordPiece tokens作为要mask的词。
为了解决这个问题,作者在做mask的时候,
Next Sentence Prediction
具体做法很容易理解,这里仍然从略。
简单说一下这么做的原因。很多NLP的任务比如QA和NLI都需要理解两个句子之间的关系,而语言模型并不能直接反应这种关系。为了是预训练出来的模型很好的适应这些任务,作者提出了这样的一个预训练任务。实验表明,增加这样的一个任务在针对下游的QA和NLI任务时效果非常好。
在预训练中文章使用了BooksCorpus(800M 词)和English Wikipedia(2,500M 词)。
对于句子级的分类任务,BERT的微调方法非常直观。论文用刚才介绍过的特殊符号[CLS]来对应整个句子的表征。我们只需要把它作为输入通过一层网络,最后做softmax就可以了。
GLUE
GLUE是一个自然语言任务集合,它包括以下这些数据集:
名称 | 全名 | 用途 |
---|---|---|
MNLI | Multi-Genre NLI | 蕴含关系推断 |
QQP | Quora Question Pairs | 问题对是否等价 |
QNLI | Question NLI | 句子是否回答问句 |
SST-2 | Stanford Sentiment Treebank | 情感分析 |
CoLA | Corpus of Linguistic Acceptability | 句子语言性判断 |
STS-B | Semantic Textual Similarity | 语义相似 |
MRPC | Microsoft Research Paraphrase Corpus | 句子对是否语义等价 |
RTE | Recognizing Texual Entailment | 蕴含关系推断 |
WNLI | Winograd NLI | 蕴含关系推断 |
BERT在每一个单项上的表现都是最优。一个很有意思的现象是:在所有的任务上 B E R T L A R G E BERT_{LARGE} BERTLARGE远超过 B E R T B A S E BERT_{BASE} BERTBASE,其中甚至包括那些仅有少量训练数据的任务。
Ablation Studies
BERT本身包含了很多创新点,下面看一下各个部分的贡献。
先看一下pre-training中所用到的各种技术的重要性。
No NSP : 没有next sentence prediction(NSP)任务
LTR & No NSP: 没有MLM,而是用Left-to-Right(LTR) LM
+BiLSTM: fine-tuning过程中,在LTR & No NSP上增加一个随机初始化的BiLSTM
另外作者还实验了模型大小,预训练步数,已经feature-based版本的BERT,实验结果也非常令人信服。特别要强调的一点是:我们知道在大型任务中大的模型会带来持续的效果增长,但是这是我们第一次看见,只要模型经过了足够的预训练,在小任务中大模型也能够带来显著的增长。
BERT绝对是一项里程碑式的工作。我想可能利用语言模型预训练然后在fine-tuning这条路可能已经走到底了。无论是从技术上还是从资源上来讲。技术上来讲,BERT使用了masked lm和下一句预测的联合训练方法,在加上12层( B E R T B A S E BERT_{BASE} BERTBASE)的transformer,的确碾压ELMo,ULMFiT,OpenAI GPT; 从资源上讲,开销巨大,个人很难复现其工作。相信很多人在等着Google发布模型。它有可能是CV领域利用image net预训练出的那些著名模型在NLP领域的对等物。这同时也是Transformer的巨大胜利,它的self attention机制和position embedding相信会赢得更大的关注。理论上来讲,还是存在那么多的未知:12层或者24层的架构究竟学到了什么?这不是CV领域,低层学语法特征,高层学语义特征不足以解释其效果; 另外实验中的复杂模型竟然在小数据集上也表现优异,个人觉得这不是经过了充足的预训练就能够解释清楚的。