来自2019年NAACL的BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding,进一步点燃了文本数据的大规模自监督预训练时代,虽然此前自监督训练、无监督训练很常见,例如Word2Vec的Cbow和Skipgram或者ELMO这些,但是我觉得Bert主要是规模比较大,利用了Transformer模型,效果比较好。
在【PLM-3】中,我们对BERT的模型结构实现进行具体讲解。
NLP任务相比于CV任务,我们明显可以感受到其符号的结构性强,需要符号推理系统,也需要统计信息参与,其它还有很多固定用法、常识背景的参与,使得语言现象极端复杂。一些基于统计的方法以及现在的神经网络方法,本质上还是对普遍的,大规模信息进行建模。
在Imagenet上训练(pre-training)的用于classification的CNN可以有效地帮助高级任务,而此前NLP中的大部分模型都是特殊问题,特殊设计。
Bert模型借鉴了Elmo的工作,以及GPT工作的建模,在摘要中就已经引用了。
两类密切相关的pre-trained language representations。The two approaches share the same objective function during pre-training, where they use unidirectional language models to learn general language representations.
The feature-based approach, such as ELMo (Peters et al., 2018a), uses task-specific architectures that include the pre-trained representations as additional features.
其它比如很多词向量,word2vec和GLOVE等等
The fine-tuning approach, such as the Generative Pre-trained Transformer (OpenAI GPT)introduces minimal task-specific parameters, and is trained on the downstream tasks by simply fine-tuning all pretrained parameters.
例如机器翻译和nature laguage inference,(但是似乎效果并不理想,感觉其实是数据不够多)本文其实也证明了,无监督的大量数据比有监督的少量数据,训练得到的效果更好。
NLP任务中虽然已经有一些预训练的方法了,比如在sentence-level和token-level上都可以进行应用。
本文针对于一般的language Understanding的问题,利用Transformer架构实现了双向语言模型的建模,构造了预训练的 language representation模型
在GLUE任务和MultiNLI和SQuAD几个任务上做了很大的提升,无论是绝对值还是相对值(都写在了摘要中)。总之,Bert让NLP的大量无监督数据下的预训练,火出圈了。
主要运用的时候,分为预训练和fine-tune两步,预训练后的模型参数用于fine-tune,fine-tune的具体任务各自使用有监督的数据和少部分不同的参数,进行训练。这是预训练方面的,本领域标准的pipeline
从写论文的方面,介绍一下是很好的。
这里呢,主要有 B e r t B a s e Bert_{Base} BertBase和 B e r t L a r g e Bert_{Large} BertLarge两个模型。
Bert模型的复杂度(计算复杂度?)很层数是线性关系,和宽度是平方关系,因此,深度变为两倍,那么宽度大概应该是 2 \sqrt 2 2倍,头的个数随着模型的宽度增加而增加。
考虑到使得模型对于一般数据的方便的处理,因此只有一个编码器,无论输入的是句子对,还是句子,都可以将它们处理成一个序列(sequence),即输入的。相比之下,Transformer的输入是句子对。
这里使用WordPiece的embedding方法,构建词典,避免词典过于庞大。如何把两个句子放在一起?序列的头部,为【CLS】(因为注意力可以看到所有词,所以也不一定放到最后),而句子间使用【SEP】记号分割。
对于一个输入的token(词元),我们实际上的embedding是词语"本身embedding(token embedding)"+“句子embedding(segment embedding)”+“位置embedding(position embedding,在序列中的位置)”,确实是相加,不是拼接。。这里三个embedding都是学的,Transformer的位置是人工构造的。
双向为什么好?比较容易理解吧,但是之前不用双向的原因是,实际上,我们不能在看到答案的时候,再去预测,因此之前很多模型都是单向的。不过这里由于是完形填空,因此不用担心这个问题。不过Transformer双向确实比较诡异。
随机对wordpiece生成的token进行15%概率的掩码,将他们替换为【MASK】即【CLS】、【SEQ】这些特殊的token就不进行掩码。
但是注意,我们在微调的时候,【MASK】是没有的,因此在pre-train和fine-tuning的时候,输入数据其实就不同了,可能会造成问题。因此实际上构造训练数据的时候,在这选中的15%的token中,有80%的概率真的变为【MASK】,10%的概率变为其它随机的token(噪音,类似denoise autoencoder),还有10%的概率保持不变(这就很幽默了。。,真的在做finetune)
在QA和Nature language Inference都需要一些句子层面的理解,因此作者认为需要学习一些句子层面的关系。
对于输入序列其中的句子,其中各个用【SEP】分割的句子,用50%的概率将序列(句子A,句子B),随机换成(句子A,句子C),也就是next sentence的随机替换。
使用BookCorpus(800M词语)和English Wikipedia(2500M 个词语)
值得注意的是,使用document_level的语料,而不是随机的打乱的句子,因为实际上Transformer对于长句子的处理,还确实不错,因此可以使用比较长的连续的句子。
和Transformer的decoder和encoder架构有区别,直接把所有信息都读到encoder里,而self-attention也允许我们直接读到所有信息。代价就是,似乎不能做机器翻译。
At the input, sentence A and sentence B from pre-training are analogous(相似的) to(与下列形式上相似的是)
At the output:
1.the token representations are fed into an output layer for token level tasks, such as sequence tagging or question answering,
2.the [CLS] representation is fed into an output layer for classification, such as entailment or sentiment analysis.(稍微有点神奇?)
认为最后隐藏层的【CLS】向量蕴含了整个序列的信息:
we represent the input sequence (for single sentence or sentence pairs)
as described in Section 3, and use the final hidden vector C ∈ R H C \in R^H C∈RH corresponding to the first input token ([CLS]) as the aggregate representation.
任务:给定一段话,问一个问题,需要找出答案所对应的片段。因此我们只需要学一个开头向量和结尾向量,即作为开头词语的概率和结尾词语的概率。
略,大致方法和上面类似,也只需要对输出改变相应的输出层。
首先模型变大,效果会变好;而本文将模型变的特别大,会使得language model的效果好。(Bert参数1个亿很大,但是现在GPT已经可以达到1000亿参数。。)
直接利用特征,不微调,效果比微调的差。因此还是要微调(直接用特征不微调,是指freeze这个)
GPT是用language modeling的方法做自监督(next word prediction),而bert相当于denoising的自监督方法,完型填空。
本文是一个很好的A+B式的工作,把ELMO的双向建模和GPT的Transformer用在一起,效果很好。
整体结构中规中矩,卖点(解决问题)最好只有1个,实际上一篇文章的卖点可能有很多,这里作者给出的卖点是:双向性。但是本文的贡献,实际上,对于解决问题的思路有很好的贡献,以及使得大量无监督数据度的大型预训练效果很好,满足深度学习的研究者期望——简单、暴力效果好。
其实此前预训练在CV方面应用很多,无监督预训练也常常用于RBM等等网络参数初始化上。在NLP上相对不太多,但是一定注意pretrain+finetune本身,不是个新概念,只不过Bert带火了NLP领域的自监督式的预训练。