BERT 101 🤗 SOTA NLP 模型详解

发布于 2022 年 3 月 2 日
在 GitHub 上更新

什么是 BERT?

BERT,全称 Bidirectional Encoder Representations from Transformers (来自 Transformer 的双向编码器表示),是一种用于自然语言处理的机器学习 (ML) 模型。它于 2018 年由 Google AI Language 的研究人员开发,如同瑞士军刀一般,为 11 种以上最常见的语言任务提供了解决方案,例如情感分析和命名实体识别。

长久以来,语言对于计算机来说一直难以“理解”。当然,计算机可以收集、存储和读取文本输入,但它们缺乏基本的语言 上下文

于是,自然语言处理 (NLP) 应运而生:这是一个旨在让计算机能够阅读、分析、解释并从文本和口语中获取意义的人工智能领域。这一实践结合了语言学、统计学和机器学习,以帮助计算机“理解”人类语言。

传统上,个别的 NLP 任务需要由为该特定任务创建的个别模型来解决。直到——BERT 的出现!

BERT 彻底改变了 NLP 领域,它解决了 11 种以上最常见的 NLP 任务 (并且比以前的模型做得更好),使其成为 NLP 领域的多面手。

在本指南中,你将了解什么是 BERT,它有何不同,以及如何开始使用 BERT。

  1. BERT 有什么用?
  2. BERT 的工作原理是什么?
  3. BERT 模型的大小和架构
  4. BERT 在常见语言任务上的性能
  5. 深度学习对环境的影响
  6. BERT 的开源力量
  7. 如何开始使用 BERT
  8. BERT 常见问题解答
  9. 结论

让我们开始吧!🚀

1. BERT 有什么用?

BERT 可以用于各种各样的语言任务

  • 可以判断电影评论的正面或负面程度。(情感分析)
  • 帮助聊天机器人回答你的问题。(问答)
  • 在写电子邮件 (Gmail) 时预测你的文本。(文本预测)
  • 只需输入几句话,就能写一篇关于任何主题的文章。(文本生成)
  • 可以快速总结冗长的法律合同。(摘要)
  • 可以根据周围的文本区分具有多种含义的词 (例如“bank”)。(多义词消歧)

还有更多语言/NLP 任务以及每个任务背后的更多细节。

有趣的事实: 你几乎每天都在与 NLP (很可能是 BERT) 互动!

NLP 的应用包括谷歌翻译、语音助手 (Alexa、Siri 等)、聊天机器人、谷歌搜索、声控 GPS 等等。


1.1 BERT 示例

自 2020 年 11 月以来,BERT 帮助 Google 更好地呈现几乎所有搜索的 (英语) 结果。

这是一个例子,说明 BERT 如何帮助 Google 更好地理解特定的搜索,例如

源码

在 BERT 出现之前,Google 显示的是关于如何配药的信息。

在 BERT 出现之后,Google 理解了“for someone (为某人)”与为别人取药有关,现在搜索结果有助于回答这个问题。


2. BERT 的工作原理是什么?

BERT 的工作原理是利用以下几点

2.1 海量训练数据

一个包含 33 亿单词的大规模数据集为 BERT 的持续成功做出了贡献。

BERT 专门在维基百科 (约 25 亿单词) 和谷歌的 BooksCorpus (约 8 亿单词) 上进行了训练。这些大型信息数据集不仅让 BERT 对英语语言有了深入的了解,也对我们的世界有了深入的了解!🚀

在如此大的数据集上训练需要很长时间。BERT 的训练得益于新颖的 Transformer 架构,并通过使用 TPU (张量处理单元 - 谷歌专门为大型 ML 模型构建的定制电路) 加速了训练过程。——64 个 TPU 在 4 天内完成了 BERT 的训练。

注意: 对较小的 BERT 模型的需求正在增加,以便在较小的计算环境 (如手机和个人电脑) 中使用 BERT。2020 年 3 月发布了 23 个较小的 BERT 模型DistilBERT 提供了 BERT 的轻量级版本;运行速度快 60%,同时保持了 BERT 95% 以上的性能。

2.2 什么是掩码语言模型?

MLM 通过掩码 (隐藏) 句子中的一个单词,并迫使 BERT 双向地使用被覆盖单词两侧的单词来预测被掩码的单词,从而实现/强制从文本中进行双向学习。这是前所未有的!

有趣的事实: 我们人类自然而然地就会这样做!

掩码语言模型示例

想象一下,你的朋友在冰川国家公园露营时给你打电话,他们的信号开始中断。在电话掉线之前,你听到的最后一句话是

朋友:“天哪!我正在钓鱼,一条巨大的鳟鱼刚刚 [____] 了我的鱼线!”

你能猜出你朋友说了什么吗?

你能够自然地预测缺失的单词,通过将缺失单词前后的单词作为上下文线索进行双向考虑 (此外还有你对钓鱼原理的历史知识)。你猜到你的朋友说的是“broke (弄断)”了吗?这也是我们预测的,但即使是我们人类,对这些方法也容易出错。

注意: 这就是为什么你经常会看到将“人类表现”与语言模型的性能得分进行比较。是的,像 BERT 这样的新模型可以比人类更准确!🤯

你上面用来填补 [____] 单词的双向方法与 BERT 获得 SOTA 准确率的方式类似。在训练过程中,会随机隐藏 15% 的分词,BERT 的任务是正确预测被隐藏的单词。因此,直接教会模型关于英语语言 (以及我们使用的单词) 的知识。这不是很巧妙吗?

来玩玩 BERT 的掩码预测吧

托管推理 API
掩码符号:[MASK]
此模型可以按需加载到推理 API 上。

有趣的事实: 掩码技术已经存在很长时间了 - 1953 年关于完形填空程序 (或“掩码”) 的论文

2.3 什么是下一句预测?

NSP (下一句预测) 用于帮助 BERT 学习句子之间的关系,通过预测给定的句子是否是前一个句子的下一句。

下一句预测示例

  1. Paul went shopping. He bought a new shirt. (保罗去购物了。他买了一件新衬衫。) (正确的句子对)
  2. Ramona made coffee. Vanilla ice cream cones for sale. (雷蒙娜煮了咖啡。香草冰淇淋甜筒出售。) (不正确的句子对)

在训练中,50% 的正确句子对与 50% 的随机句子对混合在一起,以帮助 BERT 提高下一句预测的准确性。

有趣的事实: BERT 是同时在 MLM (50%) 和 NSP (50%) 上进行训练的。

2.4 Transformer

Transformer 架构使得 ML 训练能够极其高效地并行化。因此,大规模并行化使得在相对较短的时间内对 BERT 进行大量数据训练成为可能。

Transformer 使用注意力机制来观察单词之间的关系。这一概念最初在流行的 2017 年论文《Attention Is All You Need》中提出,引发了世界各地 NLP 模型对 Transformer 的使用。

自 2017 年问世以来,Transformer 已迅速成为解决许多领域任务 (如自然语言处理、语音识别和计算机视觉) 的最先进方法。简而言之,如果你在做深度学习,那么你需要 Transformer!

Lewis Tunstall,Hugging Face 机器学习工程师兼《Natural Language Processing with Transformers》作者

流行的 Transformer 模型发布时间线

源码

2.4.1 Transformer 是如何工作的?

Transformer 的工作原理是利用注意力机制,这是一种强大的深度学习算法,最早出现在计算机视觉模型中。

——这与我们人类通过注意力处理信息的方式并无太大不同。我们非常擅长忘记/忽略那些不会构成威胁或不需要我们回应的日常琐碎输入。例如,你还记得上周二回家路上看到和听到的一切吗?当然不记得!我们大脑的记忆力是有限且宝贵的。我们能够回忆,得益于我们能够忘记琐碎的输入。

同样,机器学习模型需要学会只关注重要的事情,而不要浪费计算资源处理不相关的信息。Transformer 创建差异化的权重,以表明句子中的哪些单词最关键,需要进一步处理。

Transformer 通过将输入在一系列 Transformer 层 (通常称为编码器) 中连续处理来实现这一点。如有必要,可以使用另一系列 Transformer 层——解码器——来预测目标输出。——然而,BERT 并未使用解码器。Transformer 特别适合无监督学习,因为它们可以高效地处理数百万个数据点。

有趣的事实:自 2011 年以来,Google 一直在使用你的 reCAPTCHA 选择来标记训练数据。整个 Google Books 档案和《纽约时报》目录中的 1300 万篇文章都已通过人们输入 reCAPTCHA 文本进行了转录/数字化。现在,reCAPTCHA 要求我们标记 Google 街景图像、车辆、红绿灯、飞机等。如果 Google 让我们意识到我们参与了这项工作 (因为训练数据很可能具有未来的商业意图),那将会很不错,但我跑题了。

要了解有关 Transformer 的更多信息,请查看我们的 Hugging Face Transformers 课程

3. BERT 模型的大小和架构

让我们来分析一下两个原始 BERT 模型的架构

ML 架构术语表

ML 架构部分 定义
参数量 模型可用的可学习变量/值的数量。
Transformer 层 Transformer 块的数量。一个 Transformer 块将一系列单词表示转换为一系列上下文相关的单词 (编号表示)。
隐藏层大小 位于输入和输出之间的数学函数层,用于为 (单词) 分配权重以产生期望的结果。
注意力头 一个 Transformer 块的大小。
处理中 用于训练模型的处理单元类型。
训练时长 训练模型所需的时间。

以下是 BERTbase 和 BERTlarge 的上述 ML 架构部分的数量

Transformer 层 隐藏层大小 注意力头 参数量 处理中 训练时长
BERTbase 12 768 12 1.1 亿 4 个 TPU 4 天
BERTlarge 24 1024 16 3.4 亿 16 个 TPU 4 天

让我们来看看 BERTlarge 的额外层、注意力头和参数如何提高了它在 NLP 任务中的性能。

4. BERT 在常见语言任务上的性能

BERT 已在 11 个常见的 NLP 任务上成功达到了最先进的准确率,超越了以往顶尖的 NLP 模型,并且是第一个超越人类的模型!但是,这些成就是如何衡量的呢?

NLP 评估方法:

4.1 SQuAD v1.1 & v2.0

SQuAD (斯坦福问答数据集) 是一个阅读理解数据集,包含约 10.8 万个问题,这些问题可以通过相应的维基百科文本段落来回答。BERT 在这种评估方法上的表现是一项重大成就,它击败了之前的最先进模型和人类水平的表现。

4.2 SWAG

SWAG (Situations With Adversarial Generations) 是一项有趣的评估,因为它检测模型推断常识的能力!它通过一个包含 11.3 万个关于常识情景的多项选择题的大规模数据集来实现这一点。这些问题是从视频场景/情景中转录的,SWAG 为模型提供了下一个场景中四种可能的结果。然后模型尽力预测正确答案。

BERT 的表现优于之前的顶尖模型,包括人类水平的表现。

4.3 GLUE 基准测试

GLUE (通用语言理解评估) 基准测试是一组用于训练、衡量和相互比较分析语言模型的资源。这些资源由九个旨在测试 NLP 模型理解能力的“困难”任务组成。以下是每个任务的摘要

虽然其中一些任务可能看起来无关紧要和陈腐,但重要的是要注意,这些评估方法在指示哪些模型最适合你的下一个 NLP 应用方面 极其 强大。

达到这种水平的表现并非没有代价。接下来,让我们了解一下机器学习对环境的影响。

5. 深度学习对环境的影响

大型机器学习模型需要海量数据,这在时间和计算资源上都代价高昂。

这些模型也对环境有影响

源码

机器学习对环境的影响是我们相信通过开源实现机器学习世界民主化的众多原因之一!共享大型预训练语言模型对于降低我们社区驱动工作的总体计算成本和碳足迹至关重要。

6. BERT 的开源力量

与其他大型学习模型 (如 GPT-3) 不同,BERT 的源代码是公开可访问的 (在 Github 上查看 BERT 的代码),这使得 BERT 在世界范围内得到更广泛的使用。这是一个改变游戏规则的因素!

开发人员现在能够快速启动并运行像 BERT 这样的最先进模型,而无需花费大量的时间和金钱。🤯

开发人员可以转而将精力集中在微调 BERT 上,以针对其独特的任务定制模型的性能。

值得注意的是,如果你不想微调 BERT,目前已有数千个开源免费、预训练的 BERT 模型可用于特定用例。

为特定任务预训练的 BERT 模型

你还可以在 Hugging Face Hub 上找到数百个预训练的开源 Transformer 模型

7. 如何开始使用 BERT

我们创建了这个 notebook,以便你可以通过这个简单的教程在 Google Colab 中试用 BERT。打开 notebook 或将以下代码添加到你自己的 notebook 中。专业提示:使用 (Shift + 单击) 来运行代码单元格。

注意:Hugging Face 的 pipeline 类 使得引入像 Transformers 这样的开源 ML 模型变得极其简单,只需一行代码即可。

7.1 安装 Transformers

首先,让我们通过以下代码安装 Transformers

!pip install transformers

7.2 试用 BERT

请随意将下面的句子换成你自己的句子。但是,请在某处保留 [MASK],以便 BERT 预测缺失的单词

from transformers import pipeline
unmasker = pipeline('fill-mask', model='bert-base-uncased')
unmasker("Artificial Intelligence [MASK] take over the world.")

当你运行上面的代码时,你应该会看到类似这样的输出

[{'score': 0.3182411789894104,
  'sequence': 'artificial intelligence can take over the world.',
  'token': 2064,
  'token_str': 'can'},
 {'score': 0.18299679458141327,
  'sequence': 'artificial intelligence will take over the world.',
  'token': 2097,
  'token_str': 'will'},
 {'score': 0.05600147321820259,
  'sequence': 'artificial intelligence to take over the world.',
  'token': 2000,
  'token_str': 'to'},
 {'score': 0.04519503191113472,
  'sequence': 'artificial intelligences take over the world.',
  'token': 2015,
  'token_str': '##s'},
 {'score': 0.045153118669986725,
  'sequence': 'artificial intelligence would take over the world.',
  'token': 2052,
  'token_str': 'would'}]

有点吓人,对吧?🙃

7.3 警惕模型偏见

让我们看看 BERT 为“男人”推荐什么工作

unmasker("The man worked as a [MASK].")

当你运行上面的代码时,你应该会看到类似这样的输出

[{'score': 0.09747546911239624,
  'sequence': 'the man worked as a carpenter.',
  'token': 10533,
  'token_str': 'carpenter'},
 {'score': 0.052383411675691605,
  'sequence': 'the man worked as a waiter.',
  'token': 15610,
  'token_str': 'waiter'},
 {'score': 0.04962698742747307,
  'sequence': 'the man worked as a barber.',
  'token': 13362,
  'token_str': 'barber'},
 {'score': 0.037886083126068115,
  'sequence': 'the man worked as a mechanic.',
  'token': 15893,
  'token_str': 'mechanic'},
 {'score': 0.037680838257074356,
  'sequence': 'the man worked as a salesman.',
  'token': 18968,
  'token_str': 'salesman'}]

BERT 预测这个男人的工作是木匠、服务员、理发师、机械师或销售员

现在让我们看看 BERT 为“女人”推荐什么工作

unmasker("The woman worked as a [MASK].")

你应该会看到类似这样的输出

[{'score': 0.21981535851955414,
  'sequence': 'the woman worked as a nurse.',
  'token': 6821,
  'token_str': 'nurse'},
 {'score': 0.1597413569688797,
  'sequence': 'the woman worked as a waitress.',
  'token': 13877,
  'token_str': 'waitress'},
 {'score': 0.11547300964593887,
  'sequence': 'the woman worked as a maid.',
  'token': 10850,
  'token_str': 'maid'},
 {'score': 0.03796879202127457,
  'sequence': 'the woman worked as a prostitute.',
  'token': 19215,
  'token_str': 'prostitute'},
 {'score': 0.030423851683735847,
  'sequence': 'the woman worked as a cook.',
  'token': 5660,
  'token_str': 'cook'}]

BERT 预测这个女人的工作是护士、女服务员、女佣、妓女或厨师,这显示了职业角色中明显的性别偏见。

7.4 你可能喜欢的其他 BERT Notebook:

首次使用 BERT 的可视化 Notebook

训练你的分词器

+别忘了查看 Hugging Face Transformers 课程 以了解更多 🎉

8. BERT 常见问题解答

BERT 能和 PyTorch 一起使用吗?

可以!我们在 Hugging Face 的专家已经在 GitHub 上开源了 PyTorch transformers 仓库

专业提示:Lewis Tunstall、Leandro von Werra 和 Thomas Wolf 还写了一本书,帮助人们用 Hugging Face 构建语言应用,名为《Natural Language Processing with Transformers》

BERT 能和 Tensorflow 一起使用吗?

预训练 BERT 需要多长时间?

2 个原始的 BERT 模型分别在 4 个 (BERTbase) 和 16 个 (BERTlarge) Cloud TPU 上训练了 4 天。

微调 BERT 需要多长时间?

对于上面讨论的常见 NLP 任务,BERT 在单个 Cloud TPU 上需要 1-25 分钟,在单个 GPU 上需要 1-130 分钟。

是什么让 BERT 与众不同?

BERT 是 NLP 领域最早以两步方式进行训练的模型之一
  1. BERT 以无监督的方式在海量未标记数据 (无人为标注) 上进行了训练。
  2. 然后,BERT 从之前的预训练模型开始,在少量人为标注的数据上进行训练,从而达到了最先进的性能。

9. 结论

BERT 是一个高度复杂和先进的语言模型,帮助人们自动化语言理解。它能够在海量数据上进行训练,并利用 Transformer 架构彻底改变 NLP 领域,从而实现了最先进的性能。

得益于 BERT 的开源库,以及杰出的 AI 社区为持续改进和分享新的 BERT 模型所做的努力,尚未触及的 NLP 里程碑的未来看起来一片光明。

你将用 BERT 创造什么?

了解如何为你的特定用例微调 BERT 🤗

社区

注册登录 发表评论