作者:Jacob Devlin and Ming-Wei Chang, Research Scientists, Google AI Language
翻译:佟海宁
校对:吴金笛
本文约2000字,建议阅读9分钟。
本文为你介绍谷歌最新发布的自然语言预训练模型BERT。
简介
自然语言处理(NLP)面临的众多挑战之一是训练数据的短缺。由于NLP是一个具有许多不同任务的多样化领域,因此大多数针对特定任务的数据集仅包含了几千到几十万个人为标记的训练示例。然而,现代基于深度学习的NLP模型往往需要更大量的数据,在拥有在数以百万计甚至十亿计的带标注的训练样例上进行训练时性能将会得到极大改善。
为了帮助缩小数据差距,研究人员开发了各种技术用于使用网络上海量未标注的文本(称为预训练)来训练通用语言表示模型。然后,将其应用于小数据NLP任务(如问答和情感分析)微调预训练模型,与从头对数据集进行训练相比,使用预训练模型可以显著地提高准确度。
本周,我们公布了一项用于NLP预训练的新技术,称为双向编码器表示的变形器 (Bidirectional Encoder Representations Transformers),即BERT。通过这个模型,所有人都可以在大约30分钟内使用一个服务器上的TPU训练他们自己最先进的诸如问答系统等各种模型,或者使用单个GPU在几个小时内完成训练。在我们公布的源码中包括了在Tensorflow上构建的一系列语言表示模型。在我们的论文中,我们展示了11个NLP任务的最新结果,包括在极具竞争力的斯坦福问答数据集(SQUAD v1.1)上的测试结果。
BERT特点
BERT建立在包括半监督序列学习,预训练生成,ELMo和ULMFit等最新预训练上下文表示模型的基础上。然而与以前的模型不同的是,BERT是第一个深度双向无监督的语言表示,仅使用纯文本语料库(在本例中为维基百科)进行预训练。
深度双向无监督很重要的一个原因是: 预训练的表示既可以是上下文相关也可以是上下文无关的,并且上下文相关的可以进一步分成是单向的或双向的。诸如word2vec或GloVe之类的上下文无关模型为词汇表中的每个单词生成单个单词嵌入表示。例如,“银行”一词在“银行账户”和“河岸”中具有相同的无上下文表示。相反,上下文模型生成基于句子中其他单词的每个单词的表示。例如,在“我访问银行帐户”一句中,单向上下文模型将基于“我访问过”而不是“帐户”来表示“银行”。但是,BERT表示使用其上一个和下一个上下文的“银行” - “我访问了...帐户” - 从深层神经网络的最底层开始,使其成为双向的。
与先前最先进的上下文预训练方法相比,BERT神经网络架构的可视化如下所示。箭头表示从一层到下一层的信息流。顶部的绿色框表示每个输入词的最终语境化表示:
双向性的优点
既然双向性这么强大,为什么以前没有人实现呢? 为了理解其中原因,我们可以考虑这样的场景: 基于一个可以被有效训练的前向模型(只考虑每个单词之前的内容),我们无法将它简单的转换成基于它前后两个单词的双向内容。因为这将意味着被预测的单词需要在多层模型中间接地“看到自己”。
为了解决这个问题,我们使用单向的技术来屏蔽输入中的一些单词,然后双向调节每个单词以预测被屏蔽的单词。 例如:
所以虽然这个想法已经存在了很长时间,但BERT是它第一次被成功用于训练深度神经网络。
BERT还能够通过简单任务的预训练来学习对句子之间的关系进行建模,这个简单任务是可以从任何文本语料库中生成的。 比如给定两个句子A和B,B是在语料库中A之后出现的实际下一个句子还是只是一个随意的句子。例如:
如何使用服务器TPU进行训练
到目前为止我们所描述的所有内容看起来都相当简单,那么我们具体需要如何使用他呢? 答案就是使用服务器上的TPU。 TPU使我们可以自由快速的调试我们的模型,这对于我们区别于现有预训练技术至关重要。 由Google的研究人员于2017年开发的Transformer模型架构也为我们提供了使BERT成功所需的基础。 Transformer的具体实现可以参考我们发布的对应的开源版本以及tensor2tensor库。
BERT的具体应用结果
为了评估其性能,我们将BERT与其他几个最先进的NLP系统进行了比较。注意以下结果中, BERT几乎没有进行针对神经网络架构的任务特定更改就实现了如下中的结果。 在SQuAD v1.1上,BERT获得了93.2%的F1分数(精度的衡量标准),超过了之前的最高分91.6%和人工能达到的91.2%:
BERT还在非常具有挑战性的GLUE基准上提高了7.6%的绝对性,GLUE是一套9种不同的自然语言理解(NLU)任务。 这些任务中人工标记的训练数据的数量范围从2,500个到400,000个,BERT大大提高了所有这些数据的最新准确度:
如何应用BERT
我们发布的模型可以在几小时或更短的时间内在通过调试应用到各种NLP任务中。 尽管我们相信使用BERT的大多数NLP研究人员并不需要从头开始预训他们自己的模型 ,我们依然把运行预训练的代码一并包含在了开源代码中。 我们今天发布的BERT模型仅限英语,但我们希望在不久的将来发布其他多种语言的预训练的模型。
可以在下面链接中找到开源TensorFlow实现和预训练BERT模型的介绍:
https://goo.gl/language/bert
或者,您也可以通过Colab开始使用BERT,对应的notebook可以使用如下链接:
https://colab.sandbox.google.com/github/tensorflow/tpu/blob/master/tools/colab/bert_finetuning_with_cloud_tpus.ipynb。
您还可以阅读我们的对应论文“BERT: Pre-training of Deep Bidirectional Transformers for Language derstanding“:
https://arxiv.org/abs/1810.04805
原文标题:
Open Sourcing BERT: State-of-the-Art Pre-training for Natural Language Processing
原文链接:
https://ai.googleblog.com/2018/11/open-sourcing-bert-state-of-art-pre.html
译者简介
佟海宁,哥本哈根大学计算机硕士在读,主修数据科学。之前的学习生活中,总会发现各种有趣技术的背后都有机器学习的影子。希望自己能在大数据的浪潮中踏实深耕,行远自迩。