文 / Jacob Devlin 和 Ming-Wei Chang, Research Scientists, Google AI Language
缺少训练数据是自然语言处理(Natural Language Processing, NLP)面临的最大挑战之一。由于 NLP 是一个具备不同任务的多样化领域,因此大多数任务特定数据集仅包含几千或几十万个人类标签的训练样例。然而,基于深度学习的 NLP 模型可以从更大量的数据中获益,在数百万或数十亿的带标签的训练样例中学习得到改善。为了帮助缩小在数据方面的差距,研究人员开发了各种技术,使用网络上无标签的文本训练一个通用的语言表示模型(称为预训练)。用预训练模型在小数据的 NLP 任务(如问答和情感分析)上进行微调,与从头开始训练相比,可以显著提高准确度。
本周我们开源了一种 NLP 预训练新技术 Bidirectional Encoder Representations from Transformers(BERT)(https://github.com/google-research/bert)。此次发布的版本中,世界上任何人都可以在一个云 TPU 上花费大约 30 分钟,或使用单个 GPU 在几个小时内训练他们自己最先进的问答系统(或各种其他模型)。该版本包括在 TensorFlow 之上构建的源代码和许多预先训练的语言表示模型。在我们的相关论文中,展示了包括斯坦福问答数据集(SQUAD v1.1)在内 11 个 NLP 任务的最新结果。
是什么让 BERT 与众不同?
BERT 建立在最新的预训练与上下文相关的语言表示的工作之上 — 包括 Semi-supervised Sequence Learning、Generative Pre-Training、ELMo 和 ULMFit。然而,与以前的模型不同,BERT 是第一个深度、双向、无监督的语言表示模型,仅使用无标签的文本语料库(在本例中为维基百科)进行预训练。
为什么这很重要?预训练表示可以是与上下文无关的或与上下文相关的。与上下文相关的表示又可以分成单向(只跟上文或下文相关)或双向的 (同时考虑上文和下文)。与上下文无关模型诸如 word2vec 或 GloVe 之类的对每个单词生成一个词嵌入表示,所以在这些模型下 “bank” 一词在 “bank account” 和 “bank of the river” 中会具有相同的表示。而与上下文相关模型则基于句子中其他单词来生成每个词的表示。例如,在句子 “I accessed the bank account” 中,一个单向的上下文相关模型表示 “bank” 会基于上文 “I accessed the” 而非下文 “account”。 然而,BERT 表示 “bank” 会同时使用它的 上文 和 下文 — “I accessed the ... account” — 从深层神经网络的最底层开始,成为双向的表示。
与先前工作中领先的上下文预训练方法相比,BERT 神经网络架构的示意图如下所示。箭头表示从一个层到下一个层的信息流。图示中顶部的绿色框对应每个输入词最终的上下文表示:
双向的力量
如果双向如此强大,为什么以前没有这样实现?在训练单向模型时,预测词时必须只能基于句子中上文的单词。然而,想要直接让模型同时根据上文和下文来预测词是不可能的,因为这将允许被预测的单词会随着多层模型间接地 “看见自己”。
为了解决这个问题,我们使用直接的蒙版技术来掩盖输入中的一些单词,然后模型就能同时根据上文和下文来预测被掩盖的单词。例如:
虽然这个想法由来已久,但是 BERT 首次把它成功应用到预训练深度神经网络中。
BERT 还学习如何建模句子之间的 关系,通过预训练对任何文本语料库都可生成的一个很简单的任务来实现:给定两个句子 A 和 B,判断 B 是在语料库中 A 之后实际出现的下一个句子,或者只是一个随意的句子?例如:
使用云 TPU 进行训练
到目前为止,我们所描述的所有内容看起来都相当直观,那么还需要什么才能使 BERT 运行得如此良好?云 TPU 。云 TPU 使我们可以自由地快速试验、调试和优化我们的模型,这对于我们超越现有的预训练技术至关重要。由 Google 的研究人员于 2017 年开发的 Transformer 模型架构 也为我们提供了使 BERT 成功所需的基础。Transformer 在我们的 开源版本 以及 tensor2tensor 库 中实现。
注:Transformer 模型架构 链接
https://ai.googleblog.com/2017/08/transformer-novel-neural-network.html
开源版本 链接
https://github.com/google-research/bert
tensor2tensor 库 链接
https://github.com/tensorflow/tensor2tensor
BERT 的结果
为了评估性能,我们将 BERT 与其他最先进的 NLP 系统进行了比较。需要注意的是,在我们的实验中,我们几乎没有针对特定任务而对神经网络架构进行更改。在 SQuAD v1.1 上,BERT 获得了 93.2% 的 F1 分数(一种准确度的衡量指标),超过了之前最高水准的分数 91.6% 和人类分数 91.2%:
BERT 还在极具挑战性的 GLUE 基准测试中将准确性的标准提高了 7.6%。这个基准测试包含 9 种不同的自然语言理解(NLU)任务。在这些任务中,具有人类标签的训练数据跨度从 2,500 个样本到 400,000 个样本不等。BERT 在所有任务中都大大提高了准确性。
如何使用 BERT?
我们发布的模型可以在几个小时或更短的时间内在各种 NLP 任务上进行微调。开源版本还包括运行预训练的代码,我们相信大多数使用 BERT 的 NLP 研究人员永远不需要从头开始训练他们自己的模型。我们最初发布的 BERT 模型主要为英语模型。基于社区反馈,在开源代码和英语模型之后,我们发布了支持中文以及多语言的预训练基础模型 BERT-Base,更好地帮助世界各国的研究人员和开发者解决相应的自然语言处理问题。
您可以在 https://github.com/google-research/bert 找到开源 TensorFlow 实现和预训练 BERT 模型。或者,你也可以通过 Colab 和 “BERT FineTuning with Cloud TPUs” 笔记本开始使用 BERT。
您还可以阅读我们的论文 “BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding” 以获取更多详细信息。
参考网址:
Github:https://github.com/google-research/bert
论 文: https://arxiv.org/abs/1810.04805
更多 AI 相关阅读: