【论文精读】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

news/2025/3/13 7:05:41/文章来源:https://www.cnblogs.com/rh-li/p/18532244

【论文精读】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

作者: Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova
发表会议: NAACL 2019
论文地址: arXiv:1810.04805

BERT是近年来NLP领域影响最大的模型。

在CV领域,很早的时候就可以实现迁移学习。在一个大的数据集上面,例如ImageNet上,预先训练好一个模型,对于一般的CV任务,在预训练模型的基础上稍微改一改,就可以得到很好的效果。

而在NLP领域,很长一段时间内,都需要研究者自己构造神经网络,从零开始训练。

BERT的出现,使得我们终于可以事先训练好一个模型,然后将这个模型应用在各种NLP任务上。既简化了模型训练,也提升了任务性能。

也是就说,BERT出现之后,NLP领域终于也可以用迁移学习了。

目录
  • 【论文精读】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
    • 1. Introduction
      • 1.1 语言模型预训练方法
      • 1.2 BERT的改进和优势
    • 2. BERT
      • 2.1 BERT训练的两个阶段
      • 2.2 BERT基础架构
      • 2.3 输入
      • 2.4 预训练阶段
      • 2.5 微调阶段
    • 3. 实验
      • 3.1 GLUE
      • 3.2 SQuAD
      • 3.3 SWAG
    • 4. 消融实验
      • 4.1 调整预训练任务
      • 4.2 调整模型大小
      • 4.3 把BERT当作基于特征的方法(feature-based)使用
    • 5. 结论

1. Introduction

1.1 语言模型预训练方法

现有的语言模型预训练方法主要分为两类:

  1. 基于特征的方法(Feature-based):
    • 代表模型:ELMo
    • 需要针对具体任务设计特定的神经网络架构
    • 预训练模型的输出仅作为任务模型的额外特征输入
    • 预训练参数在下游任务中保持固定不变
  2. 基于微调的方法(Fine-tuning):
    • 代表模型:OpenAI GPT
    • 不需要针对具体任务设计特定架构
    • 在预训练模型的基础上添加简单的输出层
    • 在下游任务训练时微调全部参数

1.2 BERT的改进和优势

相比传统方法,BERT的改进和优势在于:

  1. 使用了双向注意力:

    • ELMo采用两个单向LSTM(前向和后向),但仅仅将前向表示和后向表示进行简单拼接
    • GPT使用Transformer,但使用单向注意力
    • BERT使用双向Transformer,使用双向注意力机制。
  2. Bert是基于微调的方法,也是第一个超过特定任务架构表现的微调方法。

    "BERT is the first fine-tuning based representation model that achieves state-of-the-art performance on a large suite of sentence-level and token-level tasks, outper-forming many task-specific architectures."

  3. BERT在11个NLP任务中表现良好。

2. BERT

2.1 BERT训练的两个阶段

BERT的训练过程分为两个阶段:预训练(pre-training)和微调(fine-tuning)。

在预训练阶段:模型使用大量的无标注数据,在不同的预训练任务上进行训练。

在微调阶段,首先用预训练好的参数对 BERT 模型进行初始化,然后使用下游任务中的标注数据对BERT中的参数进行微调。

值得注意的是,尽管不同下游任务共享相同的预训练参数,但最终,每个任务都会得到一个独立的微调模型,以适应其特定的目标。

2.2 BERT基础架构

BERT有两个版本。\(BERT_{BASE}\)用来和GPT做比较,\(BERT_{LARGE}\)用来冲榜。

BERT的基础架构是双向Transformer Encoder:

  • \(BERT_{BASE}\): L=12, H=768, A=12, 参数量110M
  • \(BERT_{LARGE}\): L=24, H=1024, A=16, 参数量340M

其中:

  • L: Transformer层数
  • H: 隐藏层维度
  • A: 多头注意力头数

2.3 输入

BERT的输入很灵活,可以是单句输入,也可以同时输入一个句子对。

单句输入和句子对输入分别对应不同的预训练任务。

BERT的输入表示由三部分Embedding相加得到:

  1. Token Embeddings: WordPiece 分词后的词向量
  2. Segment Embeddings: 区分不同句子的Embedding
  3. Position Embeddings: 位置编码

image-20241103214817440

Token Embeddings:首先,使用WordPiece进行分词。然后,在输入的最前方加一个特殊标记[cls] 。此外,在句子和句子之间,用特殊标记[sep]分割。

Segment Embeddings:除了用[sep]分割句子之外,BERT还使用了Segment Embeddings来分割句子。例如,输入一个句子对:句子A和句子B。那么对于句子A的全部token,Segment Embedding取相同的值\(E_A\);对句子B的所有token,Segment Embedding取另一个相同的值\(E_B\)

Position Embeddings:和Transformer不同,Transformer采用的是位置编码,即人为的设定好了位置和编码之间的映射关系。而BERT使用Embedding,让模型自己学习位置和编码之间的映射关系。

2.4 预训练阶段

使用两个预训练任务,对BERT进行预训练

  • 任务1,Masked LM(MLM)随机mask(遮盖)一定比例的tokens(输入词元),BERT需要预测这些被mask的token。

    具体来说,需要随机mask 15%的token;在这15%的token中

    • 80%替换为[MASK]标记
    • 10%随机替换为其他词
    • 10%保持不变

    目标是:预测这些被mask的原始token。

    【例】输入是:my dog is hairy,假设我们选中了第四个token进行mask,那么

    有80%的概率:将第四个token替换为[MASK],例如, my dog is hairy \(\rightarrow\) my dog is [MASK]

    有10%的概率:将第四个token随机替换为其他词,例如, my dog is hairy \(\rightarrow\) my dog is apple

    有10%的概率:第四个token保持不变,例如,my dog is hairy \(\rightarrow\) my dog is hairy

  • 任务2,Next Sentence Prediction (NSP)给BERT输入一个句子对。其中,50%是真实的连续句子对(IsNext),50%是随机组合的句子对(NotNext)。

    目标是:判断输入的句子对是否是连续的。

    【例】

    image-20241105123536153

  • 两个预训练任务,MLM和NSP的作用不同:其中MLM负责让BERT捕捉token和token之间的关系;NSP负责让BERT捕捉句子和句子间的关系

2.5 微调阶段

在微调阶段,只需要:

  1. 在预训练的BERT后加一个输出层。(例如,可以在BERT后面加一个线性层)
  2. 调整BERT的输入格式,把BERT的部分输出送入输出层
  3. 微调参数

[CLS] representation表示BERT输出中,对应[CLS]的那部分; token representation表示BERT完整的输出序列。

【例】

  1. 情感分析任务
  • 输入形式: text-∅ 对。text部分为待分析的目标句子,∅表示第二部分为空
  • 输出层: 将 [CLS] representation送入输出层。
  1. 问答任务
  • 输入形式: question-passage 对。question: 输入的问题文本,passage: 包含答案的上下文段落
  • 输出层: 将 token representation送入输出层。
  1. 序列标注任务
  • 输入形式: text-∅ 对。text: 需要进行标注的文本序列,∅表示第二部分为空
  • 输出层: 将 token representation送入输出层。

3. 实验

3.1 GLUE

GLUE:包括判断两句话是蕴含/矛盾/中性关系、判断两个问题是否语义等价、判断句子是否包含问题的答案、情感判断等9个子任务

微调阶段的模型架构:

flowchart TB A["BERT"]-->B["[CLS] representation"] B-->C[分类层] C-->output

性能:

  • \(BERT_{BASE}\)\(BERT_{LARGE}\)在GLUE的所有任务上都显著优于之前的所有系统
  • 相比之前最好的结果,平均准确率分别提升了4.5%和7.0%
  • 在最大规模的MNLI任务上,获得了4.6%的绝对准确率提升
  • 在官方GLUE排行榜上,\(BERT_{LARGE}\)获得了80.5分,而OpenAI GPT为72.8分

3.2 SQuAD

SQuAD :给定一个问题和一段文本,要求从文本中找出问题的答案。

微调阶段的模型架构:

flowchart TDA["输入: 问题和段落文本"] --> B["BERT模型处理"]B --> C["得到每个token的表示Ti"]C --> D["起始向量 S"]C --> E["结束向量 E"] D --> F["计算起始位置得分"]subgraph 得分计算F --> G["Pi = exp(S·Ti) / Σj exp(S·Tj)"]endE --> H["计算结束位置得分"]subgraph 结束得分H --> I["Pj = exp(E·Tj) / Σk exp(E·Tk)"]endG --> J["寻找最优得分片段"]I --> JJ --> K["使得S·Ti + E·Tj最大,且j ≥ i"]K --> L["输出答案片段"]

性能:

  • SQuAD v1.1上F1分数达到93.2,超过之前最好成绩1.5个点
  • SQuAD v2.0上F1分数达到83.1,超过之前最好成绩5.1个点

3.3 SWAG

SWAG数据集:给定1句话,和4个可能的后续句子,要求从4个选项中选择最合理的那一个。

微调阶段的模型架构:

flowchart TDA["输入: 给定句子 + 4个候选延续句"] --> B["构建4个输入序列"]B --> C1["BERT #1"]B --> C2["BERT #2"]B --> C3["BERT #3"]B --> C4["BERT #4"]subgraph 每个候选项的处理C1 --> D1["[CLS]表示"]C2 --> D2["[CLS]表示"]C3 --> D3["[CLS]表示"]C4 --> D4["[CLS]表示"]endD1 & D2 & D3 & D4 --> E["得分向量计算层"]E --> F["Softmax归一化"]F --> G["选择得分最高的候选项作为答案"]style C1 fill:#e0f7fastyle C2 fill:#e0f7fastyle C3 fill:#e0f7fastyle C4 fill:#e0f7fa

性能:

  • \(BERT_{LARGE}\)比baseline提高27.1%,比OpenAI GPT提高8.3%

4. 消融实验

4.1 调整预训练任务

结论:MLM和NSP两个预训练任务缺一不可

使用与\(BERT_{BASE}\)相同的设置,评估了两种预训练目标:

  • No NSP:去掉"下一句预测"任务,只保留"掩码语言模型"(MLM)
  • LTR & No NSP:使用传统的从左到右语言模型,而不是MLM,同时也去掉NSP任务

实验结果显示:

  • No NSP vs. \(BERT_{BASE}\) :移除NSP任务显著降低了QNLI、MNLI和SQuAD的性能
  • LTR & No NSP vs. No NSP:从双向MLM改为单向LTR,模型在所有任务上表现都变差,在MRPC和SQuAD上性能下降特别明显。
  • 即使在LTR模型上添加BiLSTM层也无法弥补性能差距

4.2 调整模型大小

对基于微调的模型(如BERT)来说,几乎不存在过拟合问题,更大即更好。

通过改变层数(L)、隐藏单元数(H)和注意力头数(A)来测试不同规模的模型:

  • 发现更大的模型在所有任务上都能带来持续的性能提升。即使在只有3600训练样本的MRPC任务上,大模型仍然更有效

  • 当基于微调的预训练语言模型(如BERT)得到充分预训练后,增大模型规模(如增加层数、扩大隐藏层维度)能够持续提升模型性能。即使在训练样本极其稀少的任务上,更大的预训练模型依然能带来更好的效果。

    PS:对基于特征的预训练方法(feature-based)来说,一味增大模型规模确实不会带来太多效果。但是对基于微调的预训练方法(fine-tuning)来说,模型越大,效果越好。

4.3 把BERT当作基于特征的方法(feature-based)使用

BERT既可以看作基于特征的预训练方法,也可以看作基于微调的预训练方法

  • 两种方法都能取得很好的效果
  • 最佳的特征提取方法与微调方法的效果相差很小
  • BERT既可以用作特征提取器,也可以直接微调

5. 结论

  • BERT是一个深度双向的预训练模型。
  • 使用BERT,可以很好的处理很多NLP任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/828308.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

两种SMB利用方法

Tactits 1. nmap扫描,发现SMB服务2. 尝试空密码 rootAdministrator利用方法1:ADMIN$的利用:Impacket框架中的psexec.pyImpacket包含数十种与Windows交互的工具,适合攻击Windows和AD,其中最常见的是psexec.py。 psexec.py与微软的Sysinternals套件中的PsExec执行相同功能,…

采桂花的小猫

午休过后的我,习惯性的会发会呆,醒醒神,所以我翻开了相册,突然一只正在采桂花的小猫映入我的眼中,哈哈哈,好可爱,桂花,小猫,阳光,全是我喜欢的元素,居然那么巧合的都出现在同一个画画,那一瞬间我心都化了(~ ̄▽ ̄)~曾经的记忆也随之而来,依稀记得好像也是这个季…

欢迎 Stable Diffusion 3.5 Large 加入 Diffusers

作为 Stable Diffusion 3 的改进版本,Stable Diffusion 3.5 如今已在 Hugging Face Hub 中可用,并可以直接使用 🧨 Diffusers 中的代码运行。 本次发布包含 两套模型参数:一个大型的模型 (large,8B) 该模型经过时间步蒸馏的版本,仅需几步推理即可生成图片在本文中,我们将…

IDEA远程运行使用rsync异常:rsync: connection unexpectedly closed (0 bytes received so far) [sender]

前提:已经使用了Cygwin64且IDEA版本2023、2024均有这个问题发生这个问题可能是使用的是windows自带的C:\Windows\System32\OpenSSH\ssh.exe 安装Cygwin64时,需要同时选择安装rsync和ssh。第一次安装没选也没关系,可以再次运行安装程序安装,不用删除上一次的安装。或者使用C…

代码随想录一刷day7 哈希表day1

遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。 但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。 常见三种实现哈希表的数据结构:数组 set集合 map映射 下面是set map的红黑树是一种平衡二叉…

SpringCloud入门到高级

服务注册与发现 服务调用和负载均衡(LoadBalancer/OpenFeign) LoadBalancer 案例:80通过轮询负载访问8001/8002/8003LoadBalancer 在工作时分成两步: 第一步,先选择ConsulServer从服务端查询并拉取服务列表,知道了它有多个服务(上图3个服务),这3个实现是完全一样的, 默认…

探索高效项目管理新境界:项目管理应用深度解析

在当今这个快节奏、高效率的时代,项目管理已成为企业成功的关键要素之一。无论是初创公司还是大型企业,都需要借助高效的项目管理工具来确保项目按时、按质、按量完成。今天,我们将一起探索几款备受推崇的项目管理应用,它们各自拥有独特的优势和功能,旨在帮助团队提升协作…

Wgpu图文详解(02)渲染管线与着色器

在本系列的第一篇文章中(《Wgpu图文详解(01)窗口与基本渲染》),我们介绍了如何基于0.30+版本的winit搭建Wgpu的桌面环境,同时也讲解了关于Wgpu一些基本的概念、模块以及架构思路,并基于wgpu库实现了一个能展示有颜色背景的窗体。而在本篇文章中,我们将开始介绍Wgpu中的…

ES IK分词器配置本地词典 远程词典

修改IK分词器配置文件路径一般在:xxx/plugins/xxx/config/IKAnalyzer.cfg.xml 配置本地词典本地词典,放到同级目录下,重启ES服务即可;配置远程词典新建springboot工程,将文件放到statis目录下;远程词典,放到其他共享地址也可以哈~,没必要非得springboot工程中修改配置配…

(触摸屏cMT2079x + 路由器DAYUA-BE30) 实现PC,手机,平板端的设备监控

1, 华为路由器设置 2, 威纶通触摸屏cMT2079x设置 (1)网络连接, 可以连接LAN1, 也可以连接LAN2, 同网段即可;

移远EC200U-EU欧洲版 CAT1模组使用

1. 外观如下,CAT1模组,主要是用来做一个欧洲的电压检测设备

UE5 GameFeature示例项目《古代山谷(Valley of the Ancient)》中Action_SpawnActor无法动态拔插的问题

前因 最近在研究GameFeature这个功能,UE官方推荐的是《古代山谷》这个项目,因为在其中用到了很多的新功能,GameFeature也在其中。观察到原来的GameFeature默认提供的action中其实功能比较有限,于是就从《古代山谷》拷贝了一些Action来用,结果Action_SpawnActor并无法在我自…