news 2026/6/1 5:16:30

BERT:基于深度双向 Transformer 的语言理解预训练模型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
BERT:基于深度双向 Transformer 的语言理解预训练模型

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

  • 摘要
  • 1. 引言
  • 2. BERT
    • 2.1 介绍
    • 2.2 BERT架构
    • 2.3 输入/输出表示
  • 3. 预训练bert
    • 3.1 任务 1:掩码语言模型
    • 3.2 任务 2:下一句预测(NSP)
    • 3.3 预训练数据
  • 4. 微调bert
    • 4.1 方法
    • 4.2 不同任务的微调
    • 4.3 bert和openai gpt的区别
  • 5. 实验
    • 5.1 通用语言理解评估(GLUE)基准
    • 5.2 SQuAD v1.1
    • 5.3 SQuAD v2.0
    • 5.4 SWAG
  • 6. 消融实验
    • 6.1 预训练任务的效果
    • 6.2 模型尺寸的影响
    • 6.3 基于特征的BERT方法
  • 7. 总结

摘要

BERT 是 Google 提出的深度双向预训练语言模型,仅用 Transformer 编码器,通过双向上下文联合建模打破传统单向 / 浅双向模型限制,开创 NLP 预训练 + 微调通用范式。

拆成 3 句人话

  • 双向(bidirectional)
    普通模型只能从左往右看(比如 GPT),BERT 是左右一起看。
    例:我今天去__买水果
    单向:只看 “我今天去”
    BERT:同时看 “我今天去”+“买水果”,更容易猜到是超市
  • 所有层都双向(in all layers)
    不是只在表层双向,每一层 Transformer 都能看到完整上下文,理解更深。
  • 从无标注文本预训练(pre-train from unlabeled text)
    不需要人工打标签,直接用海量普通文本自学语言规律

1. 引言

语言模型预训练已被证明对提升诸多自然语言处理任务的效果有效。现有的两种策略用于将预先训练的语言表示应用于下游任务:基于特征的和微调的。

  • 基于特征的方法,如Elmo,使用包括预先训练的表示作为额外特征的特定于任务的体系结构。
  • 微调方法,如生成性预训练变压器,引入了最低限度的任务特定参数,并通过简单地微调所有预训练参数来对下游任务进行训练。

这两种方法在训练前使用相同的目标函数,使用单向语言模型来学习一般的语言表征。
局限:标准语言模型是单向的,现有技术限制了预训练阶段可采用的架构选择。

在本文中,我们改进了基于微调的方法,提出了BERT:来自Transformers的双向编码器表示。BERT在完形填空任务的启发下,采用了“掩码语言模型”(MLM)的预训练目标,缓解了前面提到的单向性限制(Taylor,1953)。掩码语言模型从输入中随机掩蔽一些标记,目标是仅基于其上下文来预测掩码单词的原始词汇ID。与从左到右语言模型预训练不同,MLM目标使表示能够融合左上下文和右上下文,这允许我们预训练深度双向转换器。除了掩蔽语言模型外,我们还使用了一个“下一句预测”任务,该任务联合预先训练文本对表示。本论文的主要贡献如下:

  • 我们证明了双向预训练对于语言表示的重要性。与Radford 等人(2018) 使用单向语言模型进行预训练不同,BERT 采用掩码语言模型来实现预训练的深度双向表示。这也与 Peters 等人(2018a)的研究形成对比,后者采用了独立训练的从左到右和从右到左语言模型的浅层拼接方式。
  • 我们证明了预训练表示减少了对大量精心设计的特定任务架构的需求。BERT 是首个基于微调的表示模型,它在大量句子级和标记级任务上取得了最先进的性能,表现优于许多特定任务架构。
  • BERT 推动了十一项自然语言处理任务的现有技术水平发展。相关代码和预训练模型可在https://github.com/google-research/bert 查看。

2. BERT

2.1 介绍

在我们的框架中有两个步骤:预训练和微调。在预训练期间,模型在不同的预训练任务中对未标记的数据进行训练。对于微调,首先用预先训练的参数来初始化ERT模型,然后使用来自下游任务的标记数据来微调所有参数。**每个下游任务都有单独的微调模型,即使它们是用相同的预训练参数进行初始化的。**图1中的问答示例将作为本节的运行示例。
BERT的一个显著特点是其跨不同任务的统一架构。预先训练的体系结构和最终的下游体系结构之间存在微小的差异。

图1:BERT的整体预训练和微调步骤。除了输出层,在预训练和微调中都使用相同的体系结构。对于不同的下游任务,使用相同的预训练模型参数来初始化模型。在微调过程中,所有参数都会进行微调。[CLS]是添加在每个输入示例前面的特殊符号,而[SEP]是特殊的分隔符(例如,分隔问题/答案)。

2.2 BERT架构

BERT 的模型架构是基于 Vaswani 等人(2017) 描述并在 tensor2tensor 库中发布的原始实现构建的多层双向 Transformer 编码器。

在这项工作中,我们将层数(即变压器块)表示为L,隐藏大小为H,自关注头数为A。3我们主要报告了两个模型尺寸的结果:BERTBASE(L=12,H=768,A=12,总参数=110M)和BERTLARGE(L=24,H=1024,A=16,总参数=340M)。

出于比较的目的,选择BERTBASE与OpenAI GPT具有相同的模型大小。然而,关键的是,Bert Transformer使用双向自我关注,而GPT Transformer使用约束性自我关注,其中每个令牌只能关注其左侧的上下文。

2.3 输入/输出表示

为了让 BERT 处理各类下游任务,我们的输入表示能够在一个标记序列中清晰地表示单个句子和句子对(例如〈问题,答案))。在本研究中,“句子”可以是任意连续的文本片段,而非真正的语言句子。“序列”指的是输入给 BERT 的标记序列,它可以是单个句子,也可以是两个句子拼接而成。
我们使用具有30,000个令牌词汇量的WordPiess嵌入(Wu等人,2016)。每个序列的第一个令牌始终是特殊的分类令牌([CLS])。对应于该令牌的最终隐藏状态被用作分类任务的聚集序列表示。句子对被打包成一个单独的序列。我们用两种方法来区分这些句子。首先,我们用一个特殊的令牌([SEP])将它们分开。如图1所示,我们将输入嵌入表示为E,将特殊[cls]标记的最终隐藏向量表示为C∈RH,将第i个输入标记的最终隐藏向量表示为Ti∈RH。
对于给定的令牌,其输入表示是通过对相应的令牌、段和位置嵌入求和来构造的。这种结构的可视化可以在图2中看到。


图2:BERT输入表示。输入嵌入是令牌嵌入、分割嵌入和位置嵌入的总和。

eg:
BERT 看到的每个词,都是三个东西加起来:

  • Token 嵌入:词本身的意思
  • Segment 嵌入:标记这是第 1 句还是第 2 句
  • Position 嵌入:标记这个词在第几个位置
  • 输入:我 喜欢 苹果
    BERT 会变成:
    [CLS] 我 喜欢 苹果 [SEP]
    每个字都由 3 部分拼成:
    我 = 我本身 + 属于第一句 + 在第 2 个位置
    喜 = 喜本身 + 属于第一句 + 在第 3 个位置

3. 预训练bert

与彼得斯等人不同。(2018a)和Radford等人。(2018),我们没有使用传统的从左到右或从右到左的语言模式来预训练伯特。相反,我们使用两个无人监督的任务预先训练Bert,如本节所述。此步骤如图1的左侧所示。

3.1 任务 1:掩码语言模型

直观来看,有理由认为深度双向模型的性能远优于单向模型,也优于单向模型与反向模型的浅层拼接模型。遗憾的是,标准条件语言模型只能按单向(从左到右或从右到左)进行训练,因为双向条件设定会让每个单词间接“看到自身”,模型也能轻易在多层上下文的基础上预测目标单词。
为了训练深度双向表示,我们只需随机掩盖一定比例的输入标记,然后预测这些被掩盖的标记。我们将这一过程称为“掩码语言模型”(MLM),尽管在相关文献中它常被称为完形填空任务(Taylor,1953)。在这种情况下,与被掩盖标记对应的最终隐藏向量会被输到词汇表上的输出 softmax 层中,与标准语言模型的做法一致。在我们所有的实验中,会随机掩盖每个序列中 15%的所有WordPiece 标记。与去噪自编码器(Vincent 等人,2008)不同,我们只预测被掩盖的单词,而非重构整个输入。
尽管这允许我们获得双向预训练模型,但缺点是我们在预训练和微调之间造成了不匹配,因为在微调期间不会出现[掩码]令牌。为了缓解这一问题,我们并不总是用实际的[掩码]令牌替换“掩码”字。训练数据生成器随机选择15%的令牌位置进行预测。如果选择第i个令牌,则我们将第i个令牌替换为1)80% 的概率替换为[MASK] 标记:(2) 10%的概率替换为随机标记;(3) 10% 的概率保持为未修改的第i个标记。随后,会使用交叉 损失来预测原始标记。
eg:
挑中第 i 个单词后,分 3 种情况处理:

  • 80% 的概率 → 换成 [MASK]
    比如原词是 apple → 变成 [MASK]
    让模型猜:这里应该是什么词?
  • 10% 的概率 → 换成一个随机词
    比如原词是 apple → 变成 desk
    故意换错,逼模型必须看上下文,不能死记单词。
  • 10% 的概率 → 不换,保持原词不动
    比如原词是 apple → 还是 apple
    让模型记住这个词真实的样子。

如果全换成 [MASK]:训练和真实使用不一致,效果差
加一点随机词:强迫模型看上下文,不偷懒
留一点原词:让模型记住真实单词

不管换成了 [MASK]、随机词、还是没换,模型都要去预测:这个位置原本的词是什么!

3.2 任务 2:下一句预测(NSP)

许多重要的后续任务,如问答(QA)和自然语言推理(NLI),都是基于对两个句子之间的关系的理解,而不是通过语言建模直接捕获的。

为了训练一个理解句子关系的模型,我们为**二值化的下一句预测任务(两句话是否是前后句)**进行了预训练,该任务可以从任何单语语料库中轻松生成。

具体地,当为每个预训练示例选择句子A和B时,50%的情况B是A之后的实际下一句(标记为IsNext),并且50%的时间是语料库中的随机句子(标记为NotNext)。如图1所示,C用于下一句预测(NSP)。尽管它很简单,但我们证明了这项任务的预培训对QA和NLI都非常有益。6 NSP任务与Jernite等人使用的表征学习目标密切相关。然而,在以往的工作中,只有句子嵌入被转移到下游任务,在下游任务中,BERT传递所有参数来初始化结束任务模型参数。

3.3 预训练数据

预训练过程在很大程度上遵循现有的语言模型预训练文献。对于预训练语料库,我们使用BooksCorpus (800M 单词)(朱等人,2015年)和英语维基百科(2500万字)。

对于维基百科,我们只提取文本段落,忽略列表、表格和标题。为了提取长连续序列,使用文档级语料库而不是打乱的句子级语料库(如十亿单词基准(切尔巴等人,2013年))是至关重要的。

4. 微调bert

4.1 方法

微调过程十分简单,这是因为 Transformer 中的自注意力机制允许 BERT 通过替换适当的输入和输出来建模多种下游任务 —— 无论这些任务涉及单文本还是文本对。

对于涉及文本对的应用,一种常见模式是先对文本对进行独立编码,再应用双向交
叉注意力。

而 BERT 则利用自注意力机制统一了这两个阶段,因为通过自注意力对拼接的文
本对进行编码,可有效包含两个句子间的双向交叉注意力。

BERT 微调很省事,两句话直接拼一起喂进去,靠自注意力就能互相关联。

对于每个任务,我们只需将特定于任务的输入和输出代入 BERT 中,并对所有参数进行端到端的微调。

输入套成 A+B,输出要么用词、要么用开头 [CLS],然后一起训练

在输入层面,预训练中的句子 A 和句子 B分别对应(1)释义任务中的句子对、(2)自然语言推理任务中的假设 - 前提对、(3) 问答任务中的问题 - 段落对,以及(4) 文本分类或序列标注中的退化文本 - 空对。

在输出端,令牌表示被馈送到令牌级任务的输出层,例如序列标记或问题回答,并且[CLS]表示被馈送到输出层用于分类,例如蕴涵或情感分析。

与预训练相比,微调的成本相对较低。

4.2 不同任务的微调


在图4中可以看到在不同任务上微调BERT的图示。我们的特定于任务的模型是通过将BERT与一个额外的输出层相结合而形成的,因此需要从头开始学习最少的参数。在这些任务中,(A)和(B)是句子级任务,而©和(D)是令牌级任务。在图中,E代表输入嵌入,Ti代表令牌I的上下文表示,[CLS]是用于分类输出的特殊符号,[SEP]是分隔非连续令牌序列的特殊符号。

4.3 bert和openai gpt的区别


图3:预训练模型架构的差异。bert使用双向变压器。OpenAI GPT使用从左到右的转换器。ELMO使用独立训练的从左到右和从右到右的LSTM的串联来为下游任务生成要素。在这三种语言中,只有BERT表征在所有层中都同时受到左右语境的联合制约。除了架构上的差异,BERT和OpenAI GPT都是微调的方法,而Elmo是基于功能的方法。
不同:

  • GPT接受了BooksCorpus(8亿字)的培训;Bert接受了BooksCorpus(8亿字)和Wikipedia(25亿字)的培训。
  • GPT使用仅在微调时引入的句子分隔符([SEP])和量词标记([CLS]);BERT在预训练期间学习[SEP]、[CLS]和句子A/B嵌入。
  • GPT训练了100万步,批次大小为3.2万字;Bert训练了100万步,批次大小为12.8万字。
  • GPT在所有微调实验中使用相同的学习速率5e-5;Bert选择在开发集上表现最好的特定于任务的微调学习速率。

5. 实验

5.1 通用语言理解评估(GLUE)基准


表 1:由评估服务器评分的 GLUE 测试结(https://gluebenchmark.com/leaderboard)。每个任务下方的数字代表训练样本数量。“平均值” 列与官方 GLUE 分数略有差异,因为我们排除了有问题的 WNLI 数据集。BERT 和OpenAI GPT 为单模型、单任务模型。QQP 和 MRPC 任务报告 F1 分数, STS-B 任务报告斯皮尔曼相关系数,其余任
务报告准确率分数。我们排除了将 BERT 作为其组成部分之一的条目。

5.2 SQuAD v1.1

斯坦福问题回答数据集(Team V1.1)是10万个众包问题/答案对的集合(Rajpurkar等人,2016年)。给出一个问题和一段来自维基百科的包含答案的段落,任务是预测文章中答案文本的跨度。

表 2: SQuAD 1.1 结果。BERT 集成模型是由7个系统组成,这些系统使用不同的预训练检查点和微调种子。

5.3 SQuAD v2.0

SQuAD 2.0 任务对 SQuAD 1.1 的问题定义进行了扩展,允许在给定段落中不存在简短答案的可能性,这让问题更具现实性。

我们使用一种简单的方法来扩展适用于此任务的TeanV1.1Bert模型。我们将没有答案的问题视为具有以[cls]标记开始和结束的答案范围。开始和结束应答范围位置的概率空间被扩展以包括[CLS]令牌的位置。对于预测,我们将无答案广度的得分:SNUL=S·C+E·C与最佳非零跨度SˆI,j=≥IS·Ti+E·TJ的得分进行比较。当ˆsi,j;Snull+τ时,我们预测非空答案,其中在DEV集合上选择阈值τ以最大化F1。对于这个模型,我们没有使用TriviaQA数据。我们微调了2个纪元,学习率为5e-5,批次大小为48。

5.4 SWAG

具有对抗性生成的情况(SWIG)数据集包含11.3万个句子对完成示例,这些示例评估接地的常识推理(Zellers等人,2018年)。给出一个句子,任务是从四个选项中选择最合理的延续。
在对SWIG数据集进行微调时,我们构建了四个输入序列,每个序列都包含给定句子(句子A)和可能的延续(句子B)的连接。引入的唯一特定于任务的参数是一个向量,该向量与[CLS]令牌表示C的点积表示每个选择的分数,该选择使用Softmax层进行标准化。
我们对模型进行了3个时期的微调,学习率为2E-5,批次大小为16。结果如表4所示。BERTLARGE的性能比作者的基线ESIM+ELMO系统高出27.1%,比OpenAI GPT高出8.3%。


†人类表现是用100个样本来衡量的.

6. 消融实验


图5:多个训练步骤的消融。这显示了微调后的MNLI精度,从已经为k个步骤预先训练的模型参数开始。X轴是k的值。

表8:不同掩蔽策略下的消融

表8显示了结果。在表中,MASK意味着我们用[MASK]符号替换传销的目标令牌;相同的意思是我们保持目标令牌不变;RND意味着我们用另一个随机令牌替换目标令牌。
从表格中可以看出,微调对不同的掩蔽策略具有惊人的健壮性。然而,正如预期的那样,当将基于特征的方法应用于NER时,仅使用掩码策略是有问题的。有趣的是,只使用RND策略的表现也比我们的策略差得多。

6.1 预训练任务的效果


表5:使用BERTBASE架构的培训前任务的消融。“没有NSP”是在没有下一个句子预测任务的情况下训练的。“LTR&No NSP”被训练成从左到右的LM,没有下一句预测,就像OpenAI GPT。在微调过程中,“+BiLSTM”将随机初始化的BiLSTM添加到“Ltr+No NSP”模型的顶部

6.2 模型尺寸的影响


表6:BERT模型尺寸上的消融。#L=层数;#H=隐藏大小;#A=注意头数。“Lm(Ppl)”是隐蔽的Lm困惑的坚持训练数据。

6.3 基于特征的BERT方法

到目前为止,所有的BERT结果都使用了微调方法,即在预先训练的模型中添加一个简单的分类层,并在下游任务上联合微调所有参数。然而,基于特征的方法有一定的优势,其中固定的特征是从预先训练的模型中提取的。首先,并非所有任务都可以很容易地由Transformer编码器体系结构表示,因此需要添加特定于任务的模型体系结构。其次,只需预先计算一次训练数据的昂贵表示,然后在此表示之上使用较便宜的模型进行许多实验,会有很大的计算优势

Feature-based = 冻结 BERT → 提取特征 → 训练自己的小模型
Fine-tuning = 用 BERT + 分类层 → 一起训练

在本节中,我们通过将BERT应用于CoNLL-2003命名实体识别(NER)任务(Tjong Kim Sang和De Meulder,2003)来比较这两种方法。在BERT的输入中,我们使用了大小写保留的WordPiess模型,并且包含了数据提供的最大文档上下文。按照标准做法,我们将其表示为标记任务,但不在输出中使用CRF层。我们使用第一个子令牌的表示作为NER标签集上令牌级分类器的输入。

为了消除微调方法,我们应用了基于特征的方法,从一个或多个层提取激活,而不微调ERT的任何参数。这些上下文嵌入被用作分类层之前随机初始化的两层768维BiLSTM的输入。

结果如表7所示。BERTLARGE采用最先进的方法,具有竞争力。性能最好的方法将来自预训练的变压器的最高四个隐藏层的令牌表示连接在一起,这仅比微调整个模型晚0.3F1。这表明BERT对于微调和基于功能的方法都是有效的。


表7:CoNLL-2003命名实体识别结果。使用开发人员集选择超级参数。使用这些超级参数,报告的开发和测试分数在5次随机重启后取平均值。

7. 总结

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/1 5:09:04

基于Azure AI Studio与RAG架构构建私有数据AI助手实战指南

1. 项目概述:打造你的专属AI助手 你是否曾想过,让ChatGPT这样的AI不仅能回答通用问题,还能成为你的私人知识库,回答关于你公司内部文档、个人笔记或专业资料的特定问题?这个想法听起来很酷,但实现起来似乎…

作者头像 李华
网站建设 2026/6/1 5:04:58

CRAFT框架:大模型驱动的多机器人协同训练技术解析

1. CRAFT框架:大模型驱动的多机器人协同训练新范式在机器人协同控制领域,让多个智能体学会配合完成复杂任务一直是个棘手难题。想象一下让两只机械臂配合抬起一口锅——不仅需要各自精准控制动作,还得实时协调力度和角度,传统方法…

作者头像 李华
网站建设 2026/6/1 4:56:11

Windsurf:免费GPT-4.1驱动的本地优先AI代码编辑器深度解析

1. 项目概述:当“冲浪板”搅动AI编程工具的蓝海最近在开发者圈子里,一个叫Windsurf的工具讨论热度突然上来了。简单来说,它是一款AI驱动的代码编辑器,但它的出现,尤其是其市场策略,正在让整个AI编程辅助工具…

作者头像 李华