最近谷歌搞了个大新闻,公司AI团队新发布的BERT模型,在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩:全部两个衡量指标上全面超越人类,并且还在11种不同NLP测试中创出最佳成绩,包括将GLUE基准推至80.4%(绝对改进7.6%),MultiNLI准确度达到86.7%(绝对改进率5.6%)等。可以预见的是,BERT将为NLP带来里程碑式的改变,也是NLP领域近期最重要的进展。
谷歌团队的ThangLuong直接定义:BERT模型开启了NLP的新时代!
从现在的大趋势来看,使用某种模型预训练一个语言模型看起来是一种比较靠谱的方法。从之前AI2的ELMo,到OpenAI的fine-tunetransformer,再到Google的这个BERT,全都是对预训练的语言模型的应用。
BERT这个模型与其它两个不同的是
BERT模型具有以下两个特点:
第一,是这个模型非常的深,12层,并不宽(wide),中间层只有1024,而之前的Transformer模型中间层有2048。这似乎又印证了计算机图像处理的一个观点——深而窄比浅而宽的模型更好。
[1]BERT要解决什么问题?
通常情况transformer模型有很多参数需要训练。譬如BERTBASE模型:L=12,H=768,A=12,需要训练的模型参数总数是12*768*12=110M。这么多参数需要训练,自然需要海量的训练语料。如果全部用人力标注的办法,来制作训练数据,人力成本太大。
受《ANeuralProbabilisticLanguageModel》论文的启发,BERT也用unsupervised的办法,来训练transformer模型。神经概率语言模型这篇论文,主要讲了两件事儿,1.能否用数值向量(wordvector)来表达自然语言词汇的语义?2.如何给每个词汇,找到恰当的数值向量?
这篇论文写得非常精彩,深入浅出,要言不烦,而且面面俱到。经典论文,值得反复咀嚼。很多同行朋友都熟悉这篇论文,内容不重复说了。常用的中文汉字有3500个,这些字组合成词汇,中文词汇数量高达50万个。假如词向量的维度是512,那么语言模型的参数数量,至少是512*50万=256M
深度学习四大要素,1.训练数据、2.模型、3.算力、4.应用。训练数据有了,接下去的问题是模型。
[2]BERT的五个关键词Pre-training、Deep、Bidirectional、Transformer、LanguageUnderstanding分别是什么意思?
《ANeuralProbabilisticLanguageModel》这篇论文讲的LanguageModel,严格讲是语言生成模型(LanguageGenerativeModel),预测语句中下一个将会出现的词汇。语言生成模型能不能直接移用到其它NLP问题上去?
能实现语言表征目标的模型,可能会有很多种,具体用哪一种呢?作者提议,用DeepBidirectionalTransformers模型。假如给一个句子“能实现语言表征[mask]的模型”,遮盖住其中“目标”一词。从前往后预测[mask],也就是用“能/实现/语言/表征”,来预测[mask];或者,从后往前预测[mask],也就是用“模型/的”,来预测[mask],称之为单向预测unidirectional。单向预测,不能完整地理解整个语句的语义。于是研究者们尝试双向预测。把从前往后,与从后往前的两个预测,拼接在一起[mask1/mask2],这就是双向预测bi-directional。细节参阅《NeuralMachineTranslationbyJointlyLearningtoAlignandTranslate》。
BERT的作者认为,bi-directional仍然不能完整地理解整个语句的语义,更好的办法是用上下文全向来预测[mask],也就是用“能/实现/语言/表征/../的/模型”,来预测[mask]。BERT作者把上下文全向的预测方法,称之为deepbi-directional。如何来实现上下文全向预测呢?BERT的作者建议使用Transformer模型。这个模型由《AttentionIsAllYouNeed》一文发明。
这两步训练合在一起,称为预训练pre-training。训练结束后的Transformer模型,包括它的参数,是作者期待的通用的语言表征模型。
首先来看下谷歌AI团队做的这篇论文。
BERT的新语言表示模型,它代表Transformer的双向编码器表示。与最近的其他语言表示模型不同,BERT旨在通过联合调节所有层中的上下文来预先训练深度双向表示。因此,预训练的BERT表示可以通过一个额外的输出层进行微调,适用于广泛任务的最先进模型的构建,比如问答任务和语言推理,无需针对具体任务做大幅架构修改。
论文作者认为现有的技术严重制约了预训练表示的能力。其主要局限在于标准语言模型是单向的,这使得在模型的预训练中可以使用的架构类型很有限。
在论文中,作者通过提出BERT:即Transformer的双向编码表示来改进基于架构微调的方法。
BERT提出一种新的预训练目标:遮蔽语言模型(maskedlanguagemodel,MLM),来克服上文提到的单向性局限。MLM的灵感来自Cloze任务(Taylor,1953)。MLM随机遮蔽模型输入中的一些token,目标在于仅基于遮蔽词的语境来预测其原始词汇id。
与从左到右的语言模型预训练不同,MLM目标允许表征融合左右两侧的语境,从而预训练一个深度双向Transformer。除了遮蔽语言模型之外,本文作者还引入了一个“下一句预测”(nextsentenceprediction)任务,可以和MLM共同预训练文本对的表示。
论文的主要贡献在于:
BERT目前已经刷新的11项自然语言处理任务的最新记录包括:将GLUE基准推至80.4%(绝对改进7.6%),MultiNLI准确度达到86.7%(绝对改进率5.6%),将SQuADv1.1问答测试F1得分纪录刷新为93.2分(绝对提升1.5分),超过人类表现2.0分。
本节介绍BERT模型架构和具体实现,并介绍预训练任务,这是这篇论文的核心创新。
模型架构
BERT的模型架构是基于Vaswanietal.(2017)中描述的原始实现multi-layerbidirectionalTransformer编码器,并在tensor2tensor库中发布。由于Transformer的使用最近变得无处不在,论文中的实现与原始实现完全相同,因此这里将省略对模型结构的详细描述。
在这项工作中,论文将层数(即Transformerblocks)表示为L,将隐藏大小表示为H,将self-attentionheads的数量表示为A。在所有情况下,将feed-forward/filter的大小设置为4H,即H=768时为3072,H=1024时为4096。论文主要报告了两种模型大小的结果:
图1:预训练模型架构的差异。BERT使用双向Transformer。OpenAIGPT使用从左到右的Transformer。ELMo使用经过独立训练的从左到右和从右到左LSTM的串联来生成下游任务的特征。三个模型中,只有BERT表示在所有层中共同依赖于左右上下文。
输入表示(inputrepresentation)
论文的输入表示(inputrepresentation)能够在一个token序列中明确地表示单个文本句子或一对文本句子(例如,[Question,Answer])。对于给定token,其输入表示通过对相应的token、segment和positionembeddings进行求和来构造。图2是输入表示的直观表示:
图2:BERT输入表示。输入嵌入是tokenembeddings,segmentationembeddings和positionembeddings的总和。
具体如下:
与Petersetal.(2018)和Radfordetal.(2018)不同,论文不使用传统的从左到右或从右到左的语言模型来预训练BERT。相反,使用两个新的无监督预测任务对BERT进行预训练。
任务1:MaskedLM
从直觉上看,研究团队有理由相信,深度双向模型比left-to-right模型或left-to-rightandright-to-left模型的浅层连接更强大。遗憾的是,标准条件语言模型只能从左到右或从右到左进行训练,因为双向条件作用将允许每个单词在多层上下文中间接地“seeitself”。
为了训练一个深度双向表示(deepbidirectionalrepresentation),研究团队采用了一种简单的方法,即随机屏蔽(masking)部分输入token,然后只预测那些被屏蔽的token。论文将这个过程称为“maskedLM”(MLM),尽管在文献中它经常被称为Cloze任务(Taylor,1953)。
在这个例子中,与maskedtoken对应的最终隐藏向量被输入到词汇表上的输出softmax中,就像在标准LM中一样。在团队所有实验中,随机地屏蔽了每个序列中15%的WordPiecetoken。与去噪的自动编码器(Vincentetal.,2008)相反,只预测maskedwords而不是重建整个输入。
虽然这确实能让团队获得双向预训练模型,但这种方法有两个缺点。首先,预训练和finetuning之间不匹配,因为在finetuning期间从未看到[MASK]token。为了解决这个问题,团队并不总是用实际的[MASK]token替换被“masked”的词汇。相反,训练数据生成器随机选择15%的token。例如在这个句子“mydogishairy”中,它选择的token是“hairy”。然后,执行以下过程:
数据生成器将执行以下操作,而不是始终用[MASK]替换所选单词:
Transformerencoder不知道它将被要求预测哪些单词或哪些单词已被随机单词替换,因此它被迫保持每个输入token的分布式上下文表示。此外,因为随机替换只发生在所有token的1.5%(即15%的10%),这似乎不会损害模型的语言理解能力。
使用MLM的第二个缺点是每个batch只预测了15%的token,这表明模型可能需要更多的预训练步骤才能收敛。团队证明MLM的收敛速度略慢于left-to-right的模型(预测每个token),但MLM模型在实验上获得的提升远远超过增加的训练成本。
任务2:下一句预测
许多重要的下游任务,如问答(QA)和自然语言推理(NLI)都是基于理解两个句子之间的关系,这并没有通过语言建模直接获得。
在为了训练一个理解句子的模型关系,预先训练一个二进制化的下一句测任务,这一任务可以从任何单语语料库中生成。具体地说,当选择句子A和B作为预训练样本时,B有50%的可能是A的下一个句子,也有50%的可能是来自语料库的随机句子。例如:
Input=[CLS]themanwentto[MASK]store[SEP]
heboughtagallon[MASK]milk[SEP]
Label=IsNext
Input=[CLS]theman[MASK]tothestore[SEP]
penguin[MASK]areflight##lessbirds[SEP]
Label=NotNext
团队完全随机地选择了NotNext语句,最终的预训练模型在此任务上实现了97%-98%的准确率。
如前文所述,BERT在11项NLP任务中刷新了性能表现记录!在这一节中,团队直观呈现BERT在这些任务的实验结果,具体的实验设置和比较请阅读原论文.
图3:我们的面向特定任务的模型是将BERT与一个额外的输出层结合而形成的,因此需要从头开始学习最小数量的参数。在这些任务中,(a)和(b)是序列级任务,而(c)和(d)是token级任务。在图中,E表示输入嵌入,Ti表示tokeni的上下文表示,[CLS]是用于分类输出的特殊符号,[SEP]是用于分隔非连续token序列的特殊符号。
图5:SQuAD结果。BERT集成是使用不同预训练检查点和fine-tuningseed的7x系统。
图6:CoNLL-2003命名实体识别结果。超参数由开发集选择,得出的开发和测试分数是使用这些超参数进行五次随机重启的平均值。
BERT是一个语言表征模型(languagerepresentationmodel),通过超大数据、巨大模型、和极大的计算开销训练而成,在11个自然语言处理的任务中取得了最优(state-of-the-art,SOTA)结果。或许你已经猜到了此模型出自何方,没错,它产自谷歌。估计不少人会调侃这种规模的实验已经基本让一般的实验室和研究员望尘莫及了,但它确实给我们提供了很多宝贵的经验:
1.这个模型的双向和Elmo不一样,大部分人对他这个双向在novelty上的contribution的大小有误解,我觉得这个细节可能是他比Elmo显著提升的原因。Elmo是拼一个左到右和一个右到左,他这个是训练中直接开一个窗口,用了个有顺序的cbow。
2.可复现性差:有钱才能为所欲为(Reddit对跑一次BERT的价格讨论)
ForTPUpods:4TPUs*~$2/h(preemptible)*24h/day*4days=$768(basemodel)16TPUs=~$3k(largemodel)ForTPU:16tpus*$8/hr*24h/day*4days=12k64tpus*$8/hr*24h/day*4days=50k最后他问到:ForGPU:"BERT-Largeis24-layer,1024-hiddenandwastrainedfor40epochsovera3.3billionwordcorpus.Somaybe1yeartotrainon8P100s",然后这个就很interesting了。