【Day 1】谁是BERT?如何BERT?BERT的基础介绍

从芝麻街角色到改变NLP的模型

如果你用Google以「BERT」作为关键字搜寻图片,那麽你会发现一个奇特的现象:一只黄色的玩偶与奇怪的网状结构模型混杂在一起。那只黄色玩偶是「芝麻街」电视节目的角色,它的名字正是BERT,而奇怪网状结构的模型示意图则是2018年Google所发布的改变自然语言处理领域的预训练语言模型(Pretrained Language Model)——BERT,全名为Bidirectional Encoder Representations from Transformers。两者的同名不是巧合,而是Google工程师们起名时的创意(或者说恶搞)。许多後续跟BERT或预训练语言模型有关的新模型也会用芝麻街角色的名字来命名(始作俑者其实是发布早於BERT的ELMo,可惜後者被BERT抢尽风头)。

Google_BERT

为什麽要研究或使用BERT?因为BERT以其出色的表现已经快要成为NLP的代名词了。几乎所有的比赛、大部分的研究论文都有使用到BERT相关模型(指包含BERT衍生模型或根据BERT思想所开发的新模型)。2018年10月12日,Google团队的Thang Luong说:「一个NLP的新世代开启了」。他们做到了。当年BERT横扫所有的NLP评估基准(Benchmark),而後直至现在,虽然原始版本的BERT已不再是榜首,但盘据排行榜前三名的仍必定是根据BERT思想所开发的新模型或者乾脆就是在BERT之上修改出的衍生版本。

BERT Model

以下,让我们先来从Transfer Learning(迁移学习)这个概念来初步认识BERT:

Transfer Learning

迁移学习的概念,简单说就是将已经在一个特定资料集上训练好的模型拿来用於另一个资料集的训练。它所应用的情境通常是,自己所要做的任务仅有少量标注资料,不足以训练一个好模型,但是公开领域中已经有了许多跟自己的任务相似或资料相似的大型标注资料集。那麽将已经在大型资料集上训练好的模型拿来在自己的任务上继续训练,往往会获得比较好的结果。这是因为模型已经透过大型资料集的学习有了一定的对於任务的理解、对於资料特徵提取的掌握。

而自然语言处理刚好就是一个非常缺乏标注资料,但同时「公开」资料相当丰富的领域(尽管绝大多数公开资料都没有标注)。迁移学习在此有用武之地。

BERT的两步骤训练法

古人说「熟读唐诗三百首,不会作诗也会吟」,又说过「书读百遍,其义自现」。虽然这种讲法可能被批评为读死书,但其实有其道理所在。这个道理就是:语言文字作为一种符号的序列排列,已经存在的各种排列方式(语句)本身就蕴含了特定的规律。例如,最普遍的一个规律就是,两个词语如果在序列中邻近出现的频率高,那麽它们的语义可能就越相近。想一想,「狗」可能最经常与「犬」一起出现,也可能与「猫」在一篇文章中同时出现,但很少会与「鲸鱼」、「蚂蚁」或非生物词汇一起出现。

如果能够从世界上从古至今已经积累的各种语句中学习到一部分规律,再将此规律应用於自然语言处理任务中,岂不是可以大幅提高模型效果?这种想法被称为预训练,属於Transfer Learning,也是BERT这类模型的核心思想。

所以BERT的训练一般来说分两步(但後续的介绍中你会看到三步以上的做法,不必惊讶):

  • 预训练Pretraining:也就是「熟读唐诗三百首」、「书读百遍」的部分。BERT透过一些已经定好的任务进行预训练,这类任务的要求是不需要进行人工标注,只要利用序列本身已有的资讯即可。原始BERT的预训练任务有两个:其一是「克漏字」,随机将语句中的少数词语遮住,然後训练BERT模型猜出被遮住的词语是什麽;其二是「下一句预测」,将上下相连的两个句子中的第二句(下一句)以固定比率替换成其他句子,训练模型判断这个句子是否是第一句的下一句。

  • 微调Fine-tune:已经预训练好的模型最擅长的就是预训练任务,但是实际应用场景中,我们并不需要克漏字和下一句预测。我们需要的是文本的分类、命名实体识别、问答、摘要等等。要让已经预训练好的模型学会实际任务的处理方式,也同时调整它已经学到的文本的表示来适应该任务的文本语义,我们必须做fine-tune。这个步骤是在BERT模型的输出部分设计一个自己的小模型(通常简单的线性层即可),让整个模型的输出可以符合任务需要。

以下是BERT原论文中对於这两个步骤的示意图,左边展示了预训练过程中的「下一句预测」任务,而右边则是让BERT在NER、MNLI、QA等任务中进行微调。

pretrain finetune

本系列介绍

本系列文章将远远不止於BERT模型的介绍,坊间已经有太多此类内容了。我将一方面聚焦於BERT系列模型的最新发展,包括新模型的介绍、训练技巧、提升BERT模型效果的方式。虽然BERT效果好,得到广泛使用,但从BERT被发明到现在也已过去了三年时间。三年时间,研究者们做了哪些改善?如何让BERT引领的思潮继续发挥更大更强的作用?另一方面,也将介绍BERT用於下游任务的实际作法。而如果你想要学习的是BERT模型的具体内部结构、技术细节,那这不是本系列的重点。

参考

Google BERT原始论文


<<:  Fit Leather Jackets

>>:  < 关於 React: 开始打地基| 建立一个最小的单位 “Element” >

.NET Core第27天_CacheTagHelper的使用

.net core mvc框架微软有特别封装缓存标签协助程序(CacheTagHelper)。 C...

Day15 Combine 02 - Publisher

Publisher 在Combine 中,Publisher 是观察者模式中的Observable,...

Processing - Day 27 数学好棒棒 第二篇章

前言 今天接续昨天的,继续讲数学。 正文 floor() 无条件退位取整数 floor(n); //...

Day 17 | 今天是Coroutiones的 Dispatcher

读到Dispatcher有种越来越难的感觉QQ 这些太高深的东西对於小萌新来说真的好杀热情阿 估计今...

Day 08 : 操作基础篇 5 - 如何调整 Obsidian App 设定档? 让 Obsidian App 拥有自己的外观主题与插件

前言 这是 Obsidian 使用教学 — 基础篇的第 5 篇文章。 前一篇文章 谈到了备份 Obs...