当前位置: 首页 > news >正文

BERT:用于语言理解的深度双向变形的预训练

摘要

我们引入了一种新的语言表示模型BERT,它代表Bidirectional Encoder Representations from
Transformers。与最近的语言表示模型不同(Peters et al., 2018a;Radford et al., 2018), BERT旨在通过在所有层中对左右上下文进行联合条件反射,从未标记的文本中预训练深度双向表示。因此,预训练的BERT模型可以通过一个额外的输出层进行微调,从而为广泛的任务(如问答和语言推理)创建最先进的模型,而无需对特定于任务的架构进行大量修改。

BERT在概念简单,实操强大。它在11个自然语言处理任务上获得了新的最先进的结果,包括将GLUE得分提高到80.5%(绝对提高7.7%),将多项精度提高到86.7%(绝对提高4.6%),SQuAD v1.1问答测试F1至93.2(1.5分绝对改进),SQuAD v2.0测试F1至83.1(5.1分绝对改进)。

1.介绍

语言模型预训练已被证明对改善许多自然语言处理任务是有效的(Dai and Le, 2015;Peters et al., 2018a;Radford et al., 2018;Howard and Ruder, 2018)。其中包括句子级任务,如自然语言推理(Bowman et al., 2015;Williams等人,2018)和释义(Dolan和Brockett, 2005),其目的是通过整体分析来预测句子之间的关系,以及分词级任务,如命名实体识别和问答,其中需要模型在分词级别产生细粒度输出(Tjong Kim Sang和De Meulder, 2003;Rajpurkar et al., 2016)。

将预训练的语言表示应用于下游任务有两种现有策略:基于特征和微调。基于特征的方法,如ELMo (Peters等人,2018a),使用特定于任务的架构,其中包括预训练的表示作为附加特征。微调方法,如生成式预训练转换器(OpenAI GPT) (Radford等人,2018),引入了最小的任务特定参数,并通过简单地微调所有预训练参数来对下游任务进行训练。这两种方法在预训练过程中具有相同的目标函数,它们使用单向语言模型来学习一般的语言表示。

我们认为当前的技术限制了预训练表征的力量,特别是对于微调方法。主要的限制是标准语言模型是单向的,这限制了在预训练期间可以使用的体系结构的选择。例如,在OpenAI GPT中,作者使用由左到右的架构,其中每个分词只能关注Transformer自关注层中的前一个分词(Vaswani et al., 2017)。这种限制对于句子级任务来说是次优的,并且在将基于调优的方法应用于诸如问答之类的分词级任务时可能非常有害,在这些任务中,结合两个方向的上下文是至关重要的

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

•我们证明了双向预训练对语言表示的重要性。与Radford等人(2018)使用单向语言模型进行预训练不同,BERT使用掩模语言模型来实现预训练的深度双向表示。这也与Peters等人(2018a)形成对比,后者使用独立训练的从左到右和从右到左LMs的浅连接。

我们表明,预训练的表示减少了对许多高度工程化的任务特定架构的需求。BERT是第一个基于调优的表示模型,它在大量句子级和记号级任务上实现了最先进的性能,优于许多特定于任务的架构。

BERT在11个NLP任务中推进了最先进的技术。代码和预训练模型可在https://github.com/ google-research/bert上获得

2. 相关工作

预训练通用语言表示有很长的历史,我们在本节中简要回顾了最广泛使用的方法。

2.1 基于无监督特征的方法

几十年来,学习广泛适用的单词表示一直是一个活跃的研究领域,包括非神经网络(Brown et al., 1992;安藤和张,2005;Blitzer等人,2006)和神经网络 (Mikolov等人,2013;Pennington et al., 2014)方法。预训练词嵌入是现代NLP系统的一个组成部分,与从头开始学习的嵌入相比,它提供了显著的改进(Turian et al., 2010)。为了预训练词嵌入向量,使用了从左到右的语言建模目标(Mnih和Hinton, 2009),以及在左右上下文中区分正确和不正确单词的目标(Mikolov et al., 2013)。

这些方法已经被推广到更粗的粒度,例如句子嵌入(Kiros等人,2015;Logeswaran and Lee, 2018)或段落嵌入(Le and Mikolov, 2014)。为了训练句子表征,之前的工作使用目标对候选的下一个句子进行排序(Jernite et al., 2017;Logeswaran和Lee, 2018),根据前一个句子的表示从左到右生成下一个句子单词(Kiros等人,2015),或者去噪自动编码器派生的目标(Hill等人,2016)。

ELMo及其前身(Peters et al., 2017,2018a)将传统的词嵌入研究从不同的维度进行了概括。他们从从左到右和从右到左的语言模型中提取上下文敏感的特征。每个标记的上下文表示是从左到右和从右到左表示的连接。当将上下文词嵌入与现有的任务特定架构集成时,ELMo在几个主要的NLP基准(Peters等人,2018a)中推进了最先进的技术,包括问答(Rajpurkar等人,2016)、情感分析(Socher等人,2013)和命名实体识别(Tjong Kim Sang和De Meulder, 2003)。Melamud等人(2016)提出通过使用lstm从左右上下文中预测单个单词的任务来学习上下文表示。与ELMo类似,他们的模型是基于特征的,而不是深度双向的。Fedus等人(2018)表明,完形填空任务可以用来提高文本生成模型的鲁棒性。

2.2 基于无监督微调的方法

与基于特征的方法一样,第一种方法只从未标记的文本中预训练词嵌入参数(Collobert和Weston, 2008)。最近,产生上下文分词表示的句子或文档编码器已经从未标记的文本中进行了预训练,并针对监督的下游任务进行了微调(Dai和Le, 2015;Howard and Ruder, 2018;Radford et al., 2018)。这些方法的优点是很少有参数需要从头学习。至少部分由于这一优势,OpenAI GPT (Radford et al., 2018)在GLUE基准的许多句子级任务上取得了以前最先进的结果(Wang et al., 2018a)。从左到右语言建模和自编码器目标已用于预训练此类模型(Howard and Ruder, 2018;Radford et al., 2018;Dai and Le, 2015)。

2.3 从监督数据迁移学习

也有研究表明,从大型数据集的监督任务中有效地转移,例如自然语言推理(Conneau等人,2017)和机器翻译(McCann等人,2017)。计算机视觉研究也证明了从大型预训练模型迁移学习的重要性,其中一个有效的方法是对使用ImageNet预训练的模型进行微调(Deng et al., 2009;Yosinski et al., 2014)。

3 BERT

我们将在本节中介绍BERT及其详细实现。在我们的框架中有两个步骤:预训练和微调。在预训练过程中,模型在不同的预训练任务上对未标记数据进行训练。对于微调,首先使用预训练的参数初始化BERT模型,然后使用来自下游任务的标记数据对所有参数进行微调。每个下游任务都有单独的微调模型,即使它们是用相同的预训练参数初始化的。图1中的问答示例将作为本节的运行示例 。

BERT的一个显著特征是其跨不同任务的统一架构。预训练的体系结构和最终的下游体系结构之间的差别很小。

BERT的模型架构是一个多层双向Transformer编码器,基于Vaswani等人(2017)描述的原始实现,并在tensor2tensor库中发布由于Transformer的使用已经变得很普遍,而且我们的实现几乎与原始版本相同,因此我们将省略模型体系结构的详尽背景描述,并将读者推荐给Vaswani等人(2017)以及优秀的指南,例如“The Annotated Transformer.”。

在这项工作中,我们表示层数(即Transformer块)为L,隐藏大小为H,自注意头的数量为A。我们主要报告两种模型尺寸的结果:BERTBASE (L=12, H=768, A=12, Total Parameters=110M)和BERTLARGE (L=24, H=1024, A=16, Total Parameters=340M)。

为了进行比较,选择BERTBASE与OpenAI GPT具有相同的模型大小。然而,关键的是,BERT Transformer使用双向自注意力,而GPT Transformer使用约束自注意力,其中每个分词只能关注其左侧的上下文。

输入/输出表示为了使BERT处理各种下游任务,我们的输入表示能够在一个分词序列中明确地表示单个句子和一对句子(例如,Question, Answer)。在整个工作中,一个“句子”可以是一个连续文本的任意跨度,而不是一个实际的语言句子。“序列”指的是BERT的输入分词序列,它可以是一个句子或两个句子组合在一起。

我们使用WordPiece嵌入(Wu et al., 2016)和30,000个标记词汇表。每个序列的第一个分词总是一个特殊的分类分词([CLS])。与此对应的分词最终隐藏状态用作分类任务的聚合序列表示句子对被打包成一个单一的序列。我们用两种方法区分句子。首先,我们用一个特殊的分词([SEP])将它们分开。其次,我们为每一个分词添加一个学习嵌入,表明它属于句子a还是句子b。如图1所示,我们将输入嵌入表示为E特殊[CLS]分词的最终隐藏向量表示为C属于H维向量空间,第i个输入分词的最终隐藏向量表示为Ti属于H维向量空间。

未完。。。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • linux系统中USB模块基本原理分析
  • SpingBoot集成kafka-发送读取消息示例
  • JS Blob与ArrayBuffer:深入解析二者关系及应用场景
  • 2024.8.26 Python,最大子数和与动态规划,最小路径和,分割回文串,字典序排数,最长重复子数组(动态规划)
  • Python中csv文件的操作2
  • 3DsMax将两个模型的UV展到一个UV上面
  • 启动kafka
  • 网安新声 | 网易云音乐崩了:网络安全如何守护在线体验
  • 操作系统线程分离
  • 数学建模学习(128):使用Python结合CILOS与熵法的多准则决策权重确定
  • 浏览器发送HTTP请求的过程
  • ABC 368 G - Add and Multiply Queries
  • [Day 63] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
  • PyTorch踩坑记录1
  • SQLserver中的DATEADD使用、avg使用、Round使用
  • ES6之路之模块详解
  • gitlab-ci配置详解(一)
  • HTTP--网络协议分层,http历史(二)
  • Java IO学习笔记一
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • vagrant 添加本地 box 安装 laravel homestead
  • 不上全站https的网站你们就等着被恶心死吧
  • 读懂package.json -- 依赖管理
  • 后端_MYSQL
  • 强力优化Rancher k8s中国区的使用体验
  • 少走弯路,给Java 1~5 年程序员的建议
  • 算法系列——算法入门之递归分而治之思想的实现
  • 推荐一个React的管理后台框架
  • 网页视频流m3u8/ts视频下载
  • 微服务核心架构梳理
  • 赢得Docker挑战最佳实践
  • ionic异常记录
  • ​queue --- 一个同步的队列类​
  • ​zookeeper集群配置与启动
  • ## 基础知识
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • ${factoryList }后面有空格不影响
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (C++)八皇后问题
  • (C语言)球球大作战
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (rabbitmq的高级特性)消息可靠性
  • (强烈推荐)移动端音视频从零到上手(上)
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十)T检验-第一部分
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (四)事件系统
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • .md即markdown文件的基本常用编写语法
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .Net Memory Profiler的使用举例
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET6 开发一个检查某些状态持续多长时间的类