下游NLP任务分为两类:
基于特征(feature-based),例如ELMO,使用特定于任务的体系结构,其中包括作为附加功能的预训练表示。
fine-tuning,例如openAI提出的GPT,引入最小的特定于任务的参数,并通过简单地微调预训练参数对下游任务进行训练。
之前的工作使用单项的语言模型去学习一般语言表示,这也是最大的限制。
GPT中使用的是单项的transformer,而BERT中使用的是双向的transformer(使用了双向self-attention),一般来说双向transformer叫做transformer encoder,单项transformer叫做transformer decoder
Input 表示为token、Segment、Position的和。
使用##来表示被分开的词,例如play ##ing
每一个序列的开始都有一个特殊的编码[CLS],最后的隐藏状态(该【CLS】对应transformer的输出)用做分类任务的集合,若不是分类任务,则忽略[CLS]
Pre-training 任务:
区分不同的sentence有两个方法,第一个是在不同的句子之间有[SEP],第二是通过不同的编码来区分不同的句子,例如把A放入到第一个句子中,B加入到第二个句子中
单独的句子输入只是用A 编码。
我们不使用传统的从左到右或从右到左的语言模型来预训练BERT。相反,我们使用两个新的无监督预测任务对BERT进行预训练
标准条件语言模型只能训练为从左到右或从右到左,因为双向条件作用将允许每个单词在多层上下文中间接地“看到自己”。
第一个无监督预测任务:Mask LM
masked LM 类似于类似于CBOW,将输入的token按照一定的百分比(15%)修改为随机数,然后去预测那些被替换为随机数的位置的数。(类似于完形填空),与denoising auto-encoders相比,不需要预测完整的input,而只需要预测那些被替换的空。尽管这样可以获得一个双向的model,但是有两个缺点。1、会使得pre-training和fine-tuning比例失当。因为被mask的token在fine-tuning的时候没有。为了解决这个问题,没有使用【mask】来替换而是选择随机填充。最终决定的策略是80%用【mask】来替换,10%用随机的单词替换,10%用原来的词(这样做的目的是使表示偏向于实际观察到的单词)。2、每个批次只能预测15%的token,所以收敛速度会比较慢
第二个无监督任务:Next Sentence Prediction
为了训练一个理解句子关系的模型,我们预先训练了一个二值化的下一个句子预测任务,这个任务可以从任何单语语料库中轻松生成。
其中50%的B是句子A后面应该接的正确的句子,50%的B是语料库中随机的句子
预训练语料库用的BooksCorpus(800M words)和English Wikipedia(2500M words),对于Wikipedia只提取文本段落忽略列表、表、标题,为了提取长的连续序列,关键是使用文档级语料库而不是句子级。
训练使用的激活函数是gelu(与OpenAI GPT一样),损失函数用的是这两个任务可能性的平均值的和。
Fine-tuning过程中唯一新添加的参数是在分类层
其中K表示的分类label的种类数目,BERT的所有参数以及W都通过最大化预测标签的对数概率。
Batch_size、Learning rate、Number of eopchs这三个参数不同的任务应该也不同,但是作者发现一组参数在所有任务上都很好。
同时作者还发现相对于小的来说,大规模数数据集据集对超参数不是很敏感,fine-tuning一般很快,所以可以在上述参数上选择效果最好的model。
BERT与GPT的比较:
1、训练数据集不同,GPT只用了BooksCorpus(800M words),BERT除此之外还用了Wikipedia(2500M words)
2、GPT在fine-tuning的时候引入了[SEP]、[CLS],而BERT是在pre-train的时候引入[SEP]、[CLS]、句子A/B编码。
3、GPT训练了1Msteps batch_size为32000words,BERT训练了1M steps 但是batch_size为128000words
4、GPT使用同一个学习率5e-5在所有的fine-tuning实验,BERT根据任务的不同选择表现最好的学习率。
除此之外作者做了ablation 实验,证实BERT效果之所以好很大程度都来自于pre-train的那两个的任务。
实验:
GLUE的目的:1、将数据集规范的切分为训练、验证、测试集。2、设置一个评估服务器来缓解评估不一致和测试集过度拟合的问题(用户需要将他们的预测值上传到GLUE服务器上来评估,并限制上传次数)。GLUE基准测试包括以下数据集:
MNLI:该数据集是用来进行检测第二个句子相对于第一个句子来说是否矛盾、是否自然。
QQP:该数据集是一个二元分类任务,目标是确定在Quora上提出的两个问题在语义上是否等价
QNLI:是斯坦福Q&A数据集的一个版本,该数据及已经转换为一个二分类任务。数据表示为(question,sentence),若其中包含正确回答则为pos。
SST-2:这是一个单句子二分类任务的数据集,是由人工标准的从影评中抽取出来的评论组成。
CoLA:也是一个单句子二分类任务的数据集,用于检测一个英语句子是否满足语法。
SBS-B:该数据集是从新闻标题和其他来源提取的句子对的集合,每一个句子对都有对应的1~5的打分,代表着这两个句子语义的相似性。
MRPC:该数据是从在线新闻中自动抽取出来的句子对,并人工判断该句子对是否语义等价。
RTE:与MNLI类似,不过训练数据比较少。
WNLI:是一个小型的自然语言推理数据集(该数据集构建有一些问题,每次提交的结果都比基线差,因此在于GPT对比时,排除该数据集)。
除了在上述数据集的实验之外,作者还做了自身的对比试验,1、No NSP,与训练时的两个任务中,只进行MLM,去掉NSP任务.2、训练时使用LTRmodel(left to right),同时No nsp,并且预测每一个输入的单词,而不进行masking,同时在fine-tuning时也只能从左到右,因为我们发现使用左向上下文进行预训练和使用双向上下文进行finetune训练的效果总是较差。
实验结果如下:
BERT与No NSP相比可以看出与训练的策略是有用的,LTR&No NSP与No NSP相比差很多是因为它没有右侧上下文的信息。
为了增强LTR系统的可靠性,我们尝试在其上添加一个随机初始化的BiLSTM进行finetuning。
除此之外,作者说明了为什么没有设计类似于ELMO的实验(分别训练LTR、RTLmodels然后将他们连接起来),原因:1、这样的开销是一个双向模型的两倍2、RTLmodel对于Q&A这样的任务是不合理的,因为RTLmodel不能将问题的答案限定在问题上。3、这比深度双向模型的功能要弱得多,因为深度双向模型可以选择使用左上下文或右上下文。
除了这些之外,作者还探索了Model size的影响 training step的影响