热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【NLP】BERT论文笔记

论文原文:https:arxiv.orgabs1810.04805论文年份:2018论文被引:36172(2022330&#

论文原文:https://arxiv.org/abs/1810.04805
论文年份:2018
论文被引:36172(2022/3/30)


Bert: Pre-training of Deep Bidirectional Transformers for Language Understanding
Abstract

We introduce a new language representation model called BERT, which stands for Bidirectional Encoder Representations from Transformers. Unlike recent language representation models (Peters et al., 2018a; Radford et al., 2018), BERT is designed to pretrain deep bidirectional representations from unlabeled text by jointly conditioning on both left and right context in all layers. As a result, the pre-trained BERT model can be finetuned with just one additional output layer to create state-of-the-art models for a wide range of tasks, such as question answering and language inference, without substantial taskspecific architecture modifications.

BERT is conceptually simple and empirically powerful. It obtains new state-of-the-art results on eleven natural language processing tasks, including pushing the GLUE score to 80.5% (7.7% point absolute improvement), MultiNLI accuracy to 86.7% (4.6% absolute improvement), SQuAD v1.1 question answering Test F1 to 93.2 (1.5 point absolute improvement) and SQuAD v2.0 Test F1 to 83.1 (5.1 point absolute improvement).

1 Introduction

现在,有两种将预训练的语言表示用于下游任务的策略:

  • 基于特征(feature-based):例如 ELMo 模型,将包含预训练表示作为附加特征的特定任务架构。
  • 微调(fine-tuning):例如 GPT 模型,引入了最少的特定于任务的参数,并通过简单地微调所有预训练参数来对下游任务进行训练。

这两种方法在预训练期间共享相同的目标函数,使用单​​向语言模型来学习通用语言表示

我们认为,当前的技术限制了预训练表示的能力,特别是对于微调方法。主要限制是标准语言模型是单向的(undirectional),这限制了在预训练期间使用的架构的选择。例如,在 OpenAI GPT 中,作者使用从左到右(left-to-right)的架构,其中每个标记只能关注 Transformer 的自注意力层中的先前标记(Vaswani 等,2017)。这种限制对于句子级(sentence-level)任务来说是次优的,并且在将基于微调的方法应用于标记级(token-level)任务(例如问答)时可能非常有害,在这些任务中,从两个方向合并上下文至关重要。

在本文中,我们通过提出 BERT:Transformers 的双向编码器表示来改进基于微调的方法。 BERT 通过使用受 完形填空(Cloze) 任务 (Taylor, 1953) 启发的 掩码语言模型 (Masked Language Model,MLM) 预训练目标来缓解前面提到的单向约束。掩码语言模型从输入中随机掩蔽一些标记,目标是仅根据其上下文来预测被掩蔽词的原始词汇表 id。与从左到右的语言模型预训练不同,MLM 目标使表示能够融合左右上下文,这使我们能够预训练一个深度双向 Transformer。除了掩码语言模型之外,我们还使用了 下一句预测(next sentence prediction) 任务,该任务联合预训练文本对表示。我们论文的贡献如下:

  • 我们证明了双向预训练对语言表示的重要性。BERT 使用掩码语言模型来实现预训练的深度双向表示。
  • 我们证明了预训练的表示减少了对许多精心设计的任务特定架构的需求。 BERT 是第一个基于微调的表示模型,它在大量句子级和标记级任务上实现了最先进的性能,优于许多特定于任务的架构。
  • 源码和预训练模型下载: https://github.com/google-research/bert

2 Related Work
2.1 Unsupervised Feature-based Approaches

ELMo 及其前身 (Peters et al., 2017, 2018a) 将传统的词嵌入研究沿不同的维度进行了推广。他们从从左到右和从右到左的语言模型中提取上下文相关的特征。每个标记(token)的上下文表示是从左到右和从右到左表示的连接(concatenation)

在将上下文词嵌入与现有的特定任务架构集成时,ELMo 提升了几个主要 NLP 基准的最新技术水平,包括问答,情感分析和命名实体识别 。有研究提出通过使用 LSTM 从左右上下文预测单个单词的任务来学习上下文表示。与 ELMo 类似,他们的模型是基于特征的,而不是深度双向的。有研究表明完形填空任务可用于提高文本生成模型的鲁棒性

2.2 Unsupervised Fine-tuning Approaches

最近,产生上下文标记表示的句子或文档编码器已经从未标记的文本中进行了预训练,并针对有监督的下游任务进行了微调。这些方法的优点是只需要从头开始学习很少的参数。至少部分由于这一优势,OpenAI GPT 在 GLUE 基准的许多句子级任务上取得了先前最先进的结果。在这里插入图片描述

2.3 Transfer Learning from Supervised Data

这方面的研究有很多,比较著名的是计算机视觉领域,其证明了从大型预训练模型进行迁移学习的重要性,其中一个有效的方法是微调使用 ImageNet 预训练的模型。

3 BERT

BERT模型的框架有两个步骤:

  • 预训练(pre-training):BERT 模型通过不同的预训练任务在未标记数据上进行训练。
  • 微调(fine-tuning):BERT 模型首先使用预训练的参数进行初始化,然后所有参数都使用来自下游任务的标记数据进行微调

每个下游任务都有单独的微调模型,即使它们使用相同的预训练参数进行初始化。

BERT 的一个显着特点是其跨不同任务的统一架构。预训练架构和最终的下游架构之间相差无几。

BERT 的模型架构是基于原始实现的多层双向 Transformer 编码器。其实现几乎与原始版本的 Transformers 相同,具体可以参考Transformer论文和代码实现(The Annotated Transformer)。

符号标记:

  • LLL:层数(即 Transformer blocks)
  • HHH:隐藏大小
  • AAA:自注意力头的数量

模型架构有两种:

  • BERTBASEBERT_{BASE}BERTBASE: L= 12,H=768,A=12,总参数=110M
  • BERTLARGEBERT_{LARGE}BERTLARGE:L=24,H=1024,A=16,总参数=340M

为方便比较,BERTBASE 与 OpenAI GPT 有相同的模型大小。重要的区别是,BERT Transformer 使用双向自注意力,而 GPT Transformer 使用受限自注意力(constrained self-attention),其中每个标记只能关注其左侧的上下文

为了使 BERT 处理各种下游任务,我们的输入表示能够在一个标记序列中明确表示单个句子和一对句子(例如问题 h、答案 i)。在整个工作中,“句子”可以是连续文本的任意跨度,而不是实际的语言句子。一个 “序列”是指输入到 BERT 的标记序列,它可能是一个句子,也可能是两个打包在一起的句子

我们使用 WordPiece Embedding 和 30,000 个标记词汇。每个序列的第一个标记始终是一个特殊的分类标记 ([CLS])。与该标记对应的最终隐藏状态用作分类任务的聚合序列表示。句子对被打包成一个单一的序列。我们以两种方式区分句子。首先,我们用一个特殊的标记([SEP])将它们分开。其次,我们向每个标记添加一个学习嵌入,指示它属于句子 A 还是句子 B。如图 1 所示,我们将输入嵌入表示为 EEE,特殊 [CLS] 标记的最终隐藏向量表示为 C∈RHC ∈ \mathbb{R}^HCRH,第 iii 个输入标记的最终隐藏向量为 Ti∈RHT_i ∈ \mathbb{R}^HTiRH。对于给定的标记,其输入表示是通过对相应的标记、段和位置嵌入求和来构造的。这种结构的可视化可以在图 2 中看到。
在这里插入图片描述

3.1 Pre-training BERT


Task #1: Masked LM

为了训练深度双向表示,我们简单地随机屏蔽一定百分比的输入标记,然后预测那些被屏蔽的标记。我们将此过程称为“Masked LM”(MLM),它在文献中通常被称为完形填空任务(Taylor,1953)。所有的实验中,我们随机屏蔽了每个序列中所有 WordPiece 标记的 15%

尽管这使我们能够获得双向预训练模型,但缺点是我们在预训练和微调之间造成了不匹配,因为在微调期间不会出现 [MASK] 标记。为了缓解这种情况,我们并不总是用实际的 [MASK] 标记替换“masked”单词。训练数据生成器随机选择 15% 的标记位置进行预测。如果选择第 i 个标记,我们通过三种方式将第 i 个标记进行替换替换: 1) 80% 的时间用 [MASK] 标记 ;2) 10% 的时间用一个随机标记 ;3) 10% 的时间标记不变。然后,最终的隐藏向量 Ti ,通过softmax激活函数,预测原始标记。具体地:

  • 80% 的时间将单词替换为 [MASK] 标记,例如,my dog is hairy → my dog is [MASK]
  • 10% 的时间将单词替换为随机单词,例如,my dog is hairy → my dog is apple
  • 10% 的时间保持单词不变,例如,my dog is hairy → my dog is hairy。这样做的目的是使表示偏向于实际观察到的单词。

Task #2: Next Sentence Prediction (NSP)

许多重要的下游任务,例如问答 (Question Answering,QA)自然语言推理 (Natural Language Inference,NLI),都是基于对两个句子之间关系的理解,而语言建模无法直接捕捉到这一点。为了训练一个理解句子关系的模型,我们预先训练一个二值化的下一个句子预测任务(binarized next sentence prediction task),该任务可以从任何单语语料库(monolingual corpus)中轻松生成。具体来说,在为每个预训练示例选择句子 A 和 B 时,50% 的时间 B 是 A 之后的实际下一个句子(标记为 IsNext),50% 的时间是语料库中的随机句子(标记为作为NotNext)。如图 1 所示,C 用于下一个句子预测 (NSP)。尽管它很简单,但我们在第 5.1 节中证明了针对此任务的预训练对 QA 和 NLI 都非常有益

在之前的工作中,只有句子嵌入被转移到下游任务,但 BERT 转移所有参数来初始化最终任务模型参数

对于预训练语料库,BERT 使用 BooksCorpus(8 亿单词)和英语维基百科(25 亿单词)进行预训练

3.2 Fine-tuning BERT

微调很简单,因为 Transformer 中的自注意力机制允许 BERT 通过交换适当的输入和输出来对许多下游任务(无论它们涉及单个文本还是文本对)进行建模。对于涉及文本对的应用程序,一种常见的模式是在应用双向交叉注意之前独立编码文本对。但 BERT 使用自注意力机制来统一这两个阶段,因为使用自注意力对连接的文本对进行编码有效地包括了两个句子之间的双向交叉注意力

4 Experiments

本节展示了 11 个 NLP 任务的 BERT 微调结果。

4.1 GLUE

通用语言理解评估(General Language Understanding Evaluation ,GLUE)基准是各种自然语言理解任务的集合。

对于 BERTLARGE,我们发现微调有时在小型数据集上不稳定,因此我们运行了几次随机重启并在开发集上选择了最佳模型。通过随机重启,我们使用相同的预训练检查点,但执行不同的微调数据打乱(shuffle)和分类器层初始化。

4.2 SQuAD v1.1

斯坦福问答数据集 (Stanford Question Answering Dataset ,SQuAD v1.1) 是 10 万个众包问答对的集合。给出一个问题和一段来自维基百科的回答,任务是预测文章中的答案文本跨度。

4.3 SQuAD v2.0

SQuAD 2.0 任务扩展了 SQuAD 1.1 的问题定义,允许在提供的段落中不存在简短答案的可能性,使问题更加现实。

4.4 SWAG

Situations With Adversarial Generations (SWAG) 数据集包含 113k 句对完成示例,用于评估基于常识的推理。给定一个句子,任务是在四个选项中选择最合理的延续。

5 Ablation Studies

5.1 Effect of Pre-training Tasks

在这里插入图片描述
在表 5 中,我们表明移除 NSP 会显着损害 QNLI、MNLI 和 SQuAD 1.1 的性能。接下来,我们通过比较“No NSP”与“LTR & No NSP”来评估训练双向表示的影响。 LTR 模型在所有任务上的表现都比 MLM 模型差,在 MRPC 和 SQuAD 上的下降幅度很大。

对于 SQuAD,很明显 LTR 模型在预测方面表现不佳,因为令牌级隐藏状态没有右侧上下文。为了真诚地尝试加强 LTR 系统,我们在顶部添加了一个随机初始化的 BiLSTM。这确实显着改善了 SQuAD 的结果,但结果仍然比预训练的双向模型差得多。 BiLSTM 会损害 GLUE 任务的性能。

我们认识到,也可以训练单独的 LTR 和 RTL 模型,并将每个令牌表示为两个模型的串联,就像 ELMo 所做的那样。但是: (a) 这比单个双向模型贵一倍; (b) 这对于像 QA 这样的任务来说是不直观的,因为 RTL 模型无法以问题的答案为条件; © 这严格来说不如深度双向模型强大,因为它可以在每一层使用左右上下文。

5.2 Effect of Model Size

我们假设当模型直接在下游任务上进行微调并且仅使用极少数随机初始化的附加参数时,特定任务的模型可以受益于更大、更具表现力的预训练表示,即使下游任务数据量非常小。
在这里插入图片描述

5.3 Feature-based Approach with BERT

结果如表 7 所示。BERTLARGE 与最先进的方法具有竞争力。性能最好的方法将来自预训练 Transformer 的前四个隐藏层的标记表示连接起来,这仅落后于微调整个模型的 0.3 F1。这表明 BERT 对于微调和基于特征的方法都是有效的
在这里插入图片描述

6 Conclusion

最近由于使用语言模型进行迁移学习的经验改进表明,丰富的、无监督的预训练是许多语言理解系统不可或缺的一部分。特别是,这些结果使即使是低资源任务也能从深度单向架构中受益。我们的主要贡献是将这些发现进一步推广到深度双向架构,允许相同的预训练模型成功处理广泛的 NLP 任务。

Appendix

不同预训练模型架构对比

在这里插入图片描述

预训练超参数设定

我们以 256 个序列的批大小(256 个序列 * 512 个标记 = 128,000 个标记/批次)训练 1,000,000 个步骤,这在 33 亿个单词语料库中大约是 40 个 epoch。

我们使用 Adam,学习率为 1e-4,β1 = 0.9,β2 = 0.999,L2 权重衰减为 0.01,前 10,000 步进行学习率预热,以及学习率的线性衰减。我们在所有层上使用 0.1 的 dropout 概率。与 OpenAI GPT 相同,使用 gelu 激活函数而不是 relu。训练损失是平均掩蔽 LM 似然和平均下一句预测似然之和。

BERTBASE 在 4 个 Cloud TPU(总共 16 个 TPU 芯片)上进行训练。BERTLARGE 在 16 个 Cloud TPU(总共 64 个 TPU 芯片)上进行训练。每次预训练需要 4 天才能完成。

微调超参数设定

对于微调,大多数模型超参数与预训练中的相同,除了批大小、学习率和训练 epoch 数。dropout 概率始终保持在 0.1。最佳超参数值是特定于任务的,但我们发现以下可能的值范围在所有任务中都能很好地工作:

  • Batch size: 16, 32
  • Learning rate (Adam): 5e-5, 3e-5, 2e-5
  • Number of epochs: 2, 3, 4

我们还观察到,大数据集(例如,100k+ 标记的训练示例)对超参数选择的敏感度远低于小数据集。微调通常非常快,因此只需对上述参数进行详尽的搜索并选择在开发集上表现最佳的模型是合理的

不同任务上的微调

在这里插入图片描述

不同训练步数的影响

在这里插入图片描述

图 5 显示了从已预训练 k 步的检查点进行微调后的 MNLI Dev 精度。这让我们可以回答以下问题:

问题1:BERT 真的需要如此大量的预训练(128,000 单词/batch * 1,000,000 步)才能达到很高的微调精度吗?

  • 答:是的,与 500k 步相比,BERTBASE 在 1M 步上训练时在 MNLI 上的准确率提高了近 1.0%。

问题2:MLM 预训练收敛速度是否比 LTR 预训练慢,因为每批只预测 15% 的单词而不是每个单词?

  • 答:MLM 模型的收敛速度确实比 LTR 模型稍慢。然而,就绝对准确度而言,MLM 模型几乎从开始就优于 LTR 模型。

推荐阅读
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
author-avatar
一啖过
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有