【论文精读】BERT

摘要

       以往的预训练语言表示应用于下游任务时的策略有基于特征和微调两种。其中基于特征的方法如ELMo使用基于上下文的预训练词嵌入拼接特定于任务的架构;基于微调的方法如GPT使用未标记的文本进行预训练,并针对有监督的下游任务进行微调。

       但上述两种策略都使用从左到右的架构,每个token只能处理self-attention层中的前一个token,这种限制在将基于微调的方法应用于问答等token级任务时可能非常有损性能。故改进为:

  • 使用掩码语言模型(MLM)预训练基于transformer的双向编码器,得到的预训练表示可以改进以往基于单向性约束的(GPT)微调方法,证明了双向预训练对语言表示的重要性
  • BERT的预训练表示减少了许多工程对特定任务模型架构的需求,对其微调后的表示模型,在大量句子级和标记级任务上实现了最先进的性能,超过了许多特定于任务的体系结构

框架

模型架构

       BERT是一个多层双向Transformer编码器,故定义Transformer层数为 L L L,隐层维度为 H H H,自注意力头数为 A A A。实验定义了 B E R T B A S E ( L = 12 , H = 768 , A = 12 , T o t a l P a r a m e t e r s = 110 M ) BERT_{BASE}(L=12,H=768,A=12, Total Parameters=110M) BERTBASE(L=12,H=768,A=12,TotalParameters=110M) B E R T L A R G E ( L = 24 , H = 1024 , A = 16 , T o t a l P a r a m e t e r s = 340 M ) BERT_{LARGE}(L=24,H=1024,A=16, Total Parameters=340M) BERTLARGE(L=24,H=1024,A=16,TotalParameters=340M)两种尺寸的模型。

输入/输出表示方法

image
       对于输入文本序列,使用带有30000个token词汇的WordPiece embedding对序列分片形成输入token序列,token序列的第一个token指定为分类token [ C L S ] [CLS] [CLS],用于作分类任务的聚合序列表示。由于输入文本可以为单个句子或句子对,单个句子可以简单表示,但为了能在一个token序列中无歧义地表示句子对,采用一个特殊的token [ S E P ] [SEP] [SEP]将句子分开。

       随后对分片打包好的序列计算其token embedding,并累加可学习嵌入position embedding和segment embedding得到嵌入 E E E。其中position embedding用于学习token间的相对位置,segment embedding用于学习token属于句子A或句子B。整体流程如上图。

        [ C L S ] [CLS] [CLS]的最终隐层向量为 C ∈ R H C \in \R^H CRH,其余 i t h i^{th} ith个token的最终隐层向量为 T i ∈ R H T_i \in \R^H TiRH

预训练

image

Masked LM

       对于掩码语言模型任务,为了训练网络的双向表示,随机mask一定比例的输入token并记为 [ M A S K ] [MASK] [MASK],然后让模型预测这些被mask的token,与masked token相对应的最终隐层向量通过softmax得到最终预测分布。在所有实验中,随机屏蔽比例设为15%。

       上述设置的缺点是预训练和微调之间存在gap,因为在微调期间不会出现 [ M A S K ] [MASK] [MASK]token,故实际使用并不是简单的用 [ M A S K ] [MASK] [MASK]token替换mask的单词。因为训练数据生成器会随机选择15%的token进行预测,如果选择 i t h i^{th} ithtoken,将会替换为:

  • [ M A S K ] [MASK] [MASK]token(80%概率)
  • 随机token(10%概率)
  • 不变(10%概率)

       损失定义为 i t h i^{th} ithtoken 相对应的最终隐层向量 T i T_i Ti与原始token的交叉熵。整体流程如上图左。

Next Sentence Prediction (NSP)

       对于下一个句子预测任务,如问答(Question Answering, QA)和自然语言推理(Natural Language Inference, NLI),都是基于理解两个句子之间的关系,而语言建模无法直接捕捉到这些关系,故设计一个二值分类任务用于预训练。具体为,当为每个预训练示例选择句子对时,50%的概率为A之后的实际下一个句子(标签为IsNext),50%的概率为语料库中的随机句子(标签为NotNext)。如上图左, C C C用于计算分类结果 N S P NSP NSP

预训练数据

       预训练语料库使用BooksCorpus(8亿单词)和只提取文本段落,忽略列表、表格和标题的英语维基百科(2500亿单词)。

微调

       对于单个文本或文本对,Transformer中的自注意力机制允许BERT通过替换合适的输入/输出格式对下游任务建模。故对于任意下游任务,只需将特定于任务的输入和输出插入BERT中,并对所有参数进行端到端的微调。

       对于输入,预训练句子对的句子A和句子B格式类似于:句子释义中的句子对;句子蕴含中的句子对;问答中的句子对;文本分类或序列标注中的句子对。对于输出,token表示形式可以完成token级任务,如序列标记或问题回答。而 [ C L S ] [CLS] [CLS]表示形式可以进行分类,如句子蕴含或情感分析。

       故输入输出都可对应上述格式进行下游任务转换及微调参数。

对比实验

GLUE

       本实验对GLUE进行微调,使用 C C C作为聚合表示。微调过程中引入分类层权重 W ∈ R K × H W \in \R^{ K×H} WRK×H,其中 K K K是类别数量,分类损失定义为 l o g ( s o f t m a x ( C W T ) ) log(softmax(CW^T )) log(softmax(CWT))。 使用32的batch size,对所有GLUE任务的数据进行3个epoch的微调。对于每个任务,最佳的微调学习率(在5e-5、4e-5、3e-5和2e-5中)。

       对于 B E R T L A R G E BERT_{LARGE} BERTLARGE,发现微调在小型数据集上有时不稳定,因此运行了几次随机重启,并选择了最佳模型。对于每次随机重启,使用相同的预训练checkpoint,但执行不同的微调数据打乱和分类器层初始化。
image
       实验结果如上图, B E R T B A S E BERT_{BASE} BERTBASE B E R T L A R G E BERT_{LARGE} BERTLARGE在所有任务上的表现都大大超过了以往系统,与之前的技术水平相比分别获得了4.5%和7.0%的平均精度提高。对于MNLI任务,BERT获得了4.6%的绝对精度提升。

        B E R T L A R G E BERT_{LARGE} BERTLARGE在所有任务中明显优于 B E R T B A S E BERT_{BASE} BERTBASE,特别是在训练数据很少的任务中。

SQuAD v1.1

       斯坦福问答数据集(SQuAD v1.1)是一个有10万组问题/答案对的集合。给定一个问题和一篇来自维基百科的包含答案的文章,任务是预测答案在文章中的文本范围。

       如图1右,在问答任务中,将问题和文章打包为单个输入序列,问题使用 A embedding,文章使用B embedding。在微调过程中,引入开始向量 S ∈ R H S ∈ R^ H SRH和结束向量 E ∈ R H E ∈ R ^H ERH。单词 i i i为答案范围开始的概率定义为通过 T i T_i Ti S S S 的点乘加对文章中所有词的softmax,即 P i = e S ⋅ T i ∑ j e S ⋅ T i P_i=\frac {e^{S \cdot T_i}} {\sum_j e^{S \cdot T_i}} Pi=jeSTieSTi ,答案的末尾 j j j的概率类似,从位置 i i i到位置 j j j的候选评分定义为 S ⋅ T i + E ⋅ T j S·T_i+E·T_j STi+ETj,且 j ≥ i j≥i ji。训练目标是正确开始位置向量和结束位置向量的对数似然的和。微调进行3个epoch,学习率为5e-5,batch size为32。在算法中使用适度的数据增强,首先在TriviaQA上进行微调,然后再对SQuAD进行微调。
image
       上图为实验结果,表现最好的算法比之前最优nlnet高出1.5 F1, single BERT高出QANet1.3 F1。 single BERT模型在F1分数方面优于之前顶级集成算法。在没有TriviaQA微调数据的情况下,BERT也只损失了0.1-0.4 F1,仍然大大超过了所有现有算法。

SQuAD v2.0

       SQuAD 2.0任务在提供的文章上,允许出现长答案,从而扩展了SQuAD 1.1的问题定义,让问题更具有现实意义。

       实验采用了类似的方法在这个任务上扩展SQuAD v1.1 BERT微调模型,将没有答案的问题处理为答案范围为起始和终止都在 [ C L S ] [CLS] [CLS]token上,可能的起始终止回答范围从而扩展到包含 [ C L S ] [CLS] [CLS]token的位置。对于预测而言,定义没有答案的分数为 s n u l l = S ⋅ C + E ⋅ C s_{null}=S \cdot C + E \cdot C snull=SC+EC,最好的非空答案(non-null)分数为 s ^ i , j = max ⁡ j ≥ i S ⋅ T i + E ⋅ T j \hat s_{i,j}=\max_{j \ge i}S \cdot T_i +E \cdot T_j s^i,j=maxjiSTi+ETj ,若 s ^ i , j > s n u l l + τ \hat s_{i,j} > s_{null}+\tau s^i,j>snull+τ则预测结果非空,阈值 τ \tau τ通过在测试集上最大化F1选择。

       实验没有使用TriviaQA数据集预训练,采用batch size为48和学习率为5e-5微调2个epochs。
image
       上图为实验结果,与之前的最佳系统相比,F1值提高了5.1。

SWAG

       对抗性生成(SWAG)数据集包含113k个句子对补全示例,实验模型的基础常识推理能力。给定一个句子,任务是在四个选项中选择最合理的下一句。

       在SWAG数据集上微调时,每个句子对构建4个输入序列,每个序列拼接了给定句子(句子A)和可能的下一句(句子B)。引入的唯一特定于任务的参数是一个向量,其和 [ C L S ] [CLS] [CLS]token点乘,再通过softmax层得到归一化的向量。
image
       上为实验结果, B E R T L A R G E BERT_{LARGE} BERTLARGE的性能比ESIM+ELMo提高27.1%,比GPT提高8.3%。

消融实验

Effect of Pre-training Tasks

       实验评估两项预训练目标,证明BERT的深度双向性的重要性,评估过程中使用了和 B E R T B A S E BERT_{BASE} BERTBASE完全相同的预训练数据,微调策略和超参数。

       No NSP:预训练过程采用MLM但不采用NSP任务的双向模型。

       LTR & No NSP:采用标准的Left-to-Right (LTR) LM训练的模型(不采用MLM),左性约束也作用在微调阶段,因为不采用这种策略会导致预训练/微调的gap,而导致下游性能受损,且不采用NSP任务进行预训练。除了训练采用了更大的数据集,不同的输入表征和fine tuning策略,这个模型和GPT非常类似。
image
       上图为实验结果,观察到移除NSP任务将显著地降低QNLI,MNLI,SQuAD 1.1上的性能。LTR & No NSPLTR模型在所有任务上都比MLM模型要差,在MRPC和SQuAD上性能大幅下降。

       对于SQuAD任务,LTR要在token预测上表现极差,这是因为token-level的隐藏状态没有收到右边的语境。其次在LTR系统顶层增加了一个随机初始化的BiLSTM来弥补性能,观察到确实显著地提升SQuAD上的结果,但是结果依然要远远差于预训练的双向模型,BiLSTM结构对GLUE任务上甚至有害。

       另外意识到类似ELMo,可以分别训练LTR和RTL模型(自左向右和自右向左)然后通过将两组表征拼接在一起。但是这样需要单独双向模型两倍的计算量,且对与QA一类的任务违反常识,RTL模型不可能根据回答来解释问题,而且这明显要弱于深度双向模型,因为深度双向模型可以在每一层同时利用双向语境。

Effect of Model Size

       本实验研究不同模型尺寸在微调任务上的精度。实验采用不同的层数、隐藏尺寸数、注意力头数配比上训练了一组BERT模型,和之前的描述采用了完全相同的超参数和训练策略。
image
       实验结果如上图,实验选择了5组随机重启微调模型均值作为结果。可以看到在4个数据集上,获得严格的性能提升。另外发现即使是在和现有的文献中相比已经非常大的模型上,也能够取得非常大的性能提升。

       实验证明随着模型尺寸的增加,在大规模数据集上的任务比如机器翻译和语言模型上,将会不断地获得模型性能的提升。同时也首次证明了巨大的模型尺寸,在小规模数据集任务上微调也能获得巨大地性能提升,说明模型已经被充分地预训练了。

Feature-based Approach with BERT

       上述实验的所有BERT结果都使用了微调方法,即在预训练模型中添加一个简单的分类层,并在下游任务上联合微调所有参数。但是,基于特征的方法直接从预训练模型中提取固定特征相比于微调具有一定的优势。首先,不是全部任务可以很容易地由Transformer编码器架构表示,因此需要添加特定于任务的模型架构;其次,基于特征的方法只需预先进行一次预训练,就可以直接运行在这种表示之上的模型。

       本实验通过将BERT应用于CoNLL-2003命名实体识别(NER)任务来比较这两种方法。 在BERT的输入中,使用case-preserving WordPiece模型,并包含数据提供的最大化的文档上下文,并将其表述为标记任务,但在输出中不使用CRF层。使用第一个 sub-token的表示作为NER标签集上token-level分类器的输入。

       为了削弱微调方法,实验应用基于特征的方法从一个或多个层中提取特征值,而无需微调BERT的任何参数。这些上下文嵌入被用作分类层之前随机初始化的两层768维BiLSTM的输入。
image
       实验结果如上图,表现最好的基于特征方法拼接了预训练Transformer的最后四层隐藏层的token表示,与微调整个模型相比只降低了0.3 F1。这表明BERT对于微调和基于特征的方法都是有效的。

详细配置

Comparison of BERT, ELMo, and OpenAI GPT

image
       上图比较了ELMo、OpenAI GPT和BERT的结构。BERT和GPT都是微调方法,而ELMo是基于特征的方法。GPT在大型文本语料库上采用了LTR Transformer LM,BERT和GPT中的核心不同在于双向性训练任务,其他一些的不同有:

  • GPT在BooksCorpus(800M词),而BERT在BooksCorpus(800M词)和Wikipedia(2500M词)上训练得到
  • GPT采用了一种句子分隔符 [ S E P ] [SEP] [SEP]和分类器token [ C L S ] [CLS] [CLS],这些只在微调阶段使用;而BERT则在预训练过程中学习 [ S E P ] [SEP] [SEP] [ C L S ] [CLS] [CLS]和句子 A/B embedding
  • GPT训练1M步,batch size为32000词;BERT也训练1M步,但batch size为128000词
  • GPT对所有的微调采用相同的学习率5e-5;而BERT采用了在测试集上表现最好的作为任务相关的微调学习率

Illustrations of Fine-tuning on Different Tasks

image
       上图为不同任务上BERT的微调表示。在所有任务中,(a)、(b)是sequence level的任务,(c)和(d)是token level的任务。在图中E表示输入embedding, T i T_i Ti表示token i i i的语境表示, [ C L S ] [CLS] [CLS]是分类输出的特殊符号, [ S E P ] [SEP] [SEP]是分割非连续token序列的特殊符号。

Effect of Number of Training Steps

image
       上图显示了MNLI测试精度,实验为在一个预训练k步的checkpoint上进行微调的结果。观察到, B E R T B A S E BERT_{BASE} BERTBASE在1M步上比500k步上提高1%的精度;MLM模型比LTR模型收敛的稍微慢一些,但MLM的绝对精度几乎是在瞬间就超过了LTR模型。

Ablation for Different Masking Procedures

image
       上图为不同masking策略的对照实验,其中MASK表示将目标token用 [ M A S K ] [MASK] [MASK]符号进行替换,SAME表示保持token不变,RND表示随机替换。左边部分的数字表示MLM预训练中所采用的策略的概率(BERT采用了80%,10%,10%),右边的部分表示结果。对于feature-based的方法,将最后4层的BERT的输出作为特征。

       可以看到,微调方法对于不同masking策略有很好的鲁棒性。只使用MASK策略在NER数据集上使用基于特征的方法会有问题。只采用RND策略会大幅降低性能。

reference

Devlin, J. , Chang, M. W. , Lee, K. , & Toutanova, K. . (2018). Bert: pre-training of deep bidirectional transformers for language understanding.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习——聚类问题

📕参考:西瓜书ysu老师课件博客(3)聚类算法之DBSCAN算法 - 知乎 (zhihu.com) 目录 1.聚类任务 2.聚类算法的实现 2.1 划分式聚类方法 2.1.1 k均值算法 k均值算法基本原理: k均值算法算法流程: 2.2 基于…

代码随想录算法训练营第31天|● 理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

文章目录 理论基础分发饼干思路:代码: 摆动序列思路一 贪心算法:代码: 思路二:动态规划(想不清楚)代码: 最大子序和思路:代码: 理论基础 贪心算法其实就是没…

Android Jetpack Compose 沉浸式状态栏的实现

目录 概述效果展示代码实现总结 概述 说到沉浸式状态栏,很多小伙伴可能不太熟悉,其实让Android的状态栏的颜色和APP的主题颜色相同,给人感觉状态栏和APP就是一体的。沉浸式的状态栏让页面看起来更舒服,实现沉浸式状态栏也很简单&…

精品jsp+ssm基于Java的疫苗接种管理系统

《[含文档PPT源码等]精品jspssm基于Java的疫苗接种管理系统[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功! 使用技术: 开发语言:Java 框架:ssm 技术:JSP JDK版…

2024年!PyCharm快捷键大全

收藏!PyCharm快捷键大全 工欲善其事必先利其器,PyCharm 是最popular的Python开发工具,它提供的功能非常强大,是构建大型项目的理想工具之一,如果能挖掘出里面实用技巧,能带来事半功倍的效果。 本文主要向大…

PLC_博图系列☞FBD

PLC_博图系列☞FBD 文章目录 PLC_博图系列☞FBD背景介绍FBD优势局限性 FBD 元素 关键字: PLC、 西门子、 博图、 Siemens 、 FBD 背景介绍 这是一篇关于PLC编程的文章,特别是关于西门子的博图软件。我并不是专业的PLC编程人员,也不懂电路…

Linux程序地址空间

引言 以下为示意草图 下面以代码验证一下&#xff1a; 1 #include<stdio.h> 2 #include<stdlib.h>3 …

C++数据结构与算法——双指针法

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

Flutter 动画(显式动画、隐式动画、Hero动画、页面转场动画、交错动画)

前言 当前案例 Flutter SDK版本&#xff1a;3.13.2 显式动画 Tween({this.begin,this.end}) 两个构造参数&#xff0c;分别是 开始值 和 结束值&#xff0c;根据这两个值&#xff0c;提供了控制动画的方法&#xff0c;以下是常用的&#xff1b; controller.forward() : 向前…

【开源】在线办公系统 JAVA+Vue.js+SpringBoot+MySQL

目录 1 功能模块1.1 员工管理模块1.2 邮件管理模块1.3 人事档案模块1.4 公告管理模块 2 系统展示3 核心代码3.1 查询用户3.2 导入用户3.3 新增公告 4 免责声明 本文项目编号&#xff1a; T 001 。 \color{red}{本文项目编号&#xff1a;T001。} 本文项目编号&#xff1a;T001。…

前端vue3实现本地及在线文件预览(含pdf/txt/mp3/mp4/docx/xlsx/pptx)

一、仅需实现在线预览&#xff0c;且文件地址公网可访问 &#xff08;一&#xff09;微软office免费预览&#xff08;推荐&#xff09; 支持doc/docx/xls/xlsx/ppt/pptx等多种office文件格式的免费预览 //示例代码//​在https://view.officeapps.live.com/op/view.aspx?src…

骨传导耳机是什么?如何选择骨传导耳机不会踩雷?

骨传导耳机是利用骨传导技术研发而成一种新型蓝牙耳机&#xff0c;其传声方式很独特&#xff0c;不通过空气传导&#xff0c;而是通过人体骨骼来传递声音。 详细传声原理请看下图&#xff1a; 随着骨传导耳机逐渐热门&#xff0c;如何选购耳机成为了问题&#xff0c;下面跟大家…

计算机设计大赛 深度学习YOLO图像视频足球和人体检测 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov5算法5 数据集6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习YOLO图像视频足球和人体检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非…

1_opencv3环境搭建与测试

之前2020年5月写过一次&#xff0c;时隔3年多&#xff0c;有机会再重新写一次。相比之前&#xff0c;应该是有一点儿进步的。之前是使用默认安装路径&#xff0c;所以无需配置共享库的搜索路径。这次是自定义安装路径&#xff0c;略有区别。随着写程序的时间增长&#xff0c;编…

Dockerfile 常用指令

1、FROM 指定base镜像。 2、Docker history 显示镜像的构建历史&#xff0c;也就是Dockerfile的执行过程。 Missing 表示无法获取IMAGE ID&#xff0c;通常从Docker Hub下载的镜像会有这个问题。 3、调试Dockerfile&#xff0c;使用sudo docker run -it XXXX&#xff0c;XXXX…

036-安全开发-JavaEE应用第三方组件Log4j日志FastJson序列化JNDI注入

036-安全开发-JavaEE应用&第三方组件&Log4j日志&FastJson序列化&JNDI注入 #知识点&#xff1a; 1、JavaEE-组件安全-Log4j 2、JavaEE-组件安全-Fastjson 3、JavaEE-基本了解-JNDI-API 演示案例&#xff1a; ➢Java-三方组件-Log4J&JNDI ➢Java-三方组件-Fa…

【开源】SpringBoot框架开发大学生相亲网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询会员4.2 查询相亲大会4.3 新增留言4.4 查询新闻4.5 新增新闻 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的大学生相亲网站&#xff0c;包含了会员管理模块、新闻管…

炬芯ATS2819 soundbar音响系统开发完全手册

加我微信hezkz17,可申请加入数字音频系统研究开发交流答疑群,赠送音频项目核心开发资料 ATS2819音响系统开发完全手册 1 硬件原理实现 图1 硬件原理框图 2 SOC ATS2819介绍 3 E800 板子项目实物…

黑群晖一键修复:root、AME、DTS、转码、CPU型号等

食用方法&#xff1a;SSH连接群晖使用临时root权限执行 AME3.x激活补丁 只适用于x86_64的&#xff1a;DSM7.x Advanced Media Extensions (AME)版本3.0.1-2004、3.1.0-3005 激活过程需要下载官方的解码包&#xff0c;过程较慢&#xff0c;耐心等待。。。 DSM7.1和7.2的AME版…

【前端设计】炫酷导航栏

欢迎来到前端设计专栏&#xff0c;本专栏收藏了一些好看且实用的前端作品&#xff0c;使用简单的html、css语法打造创意有趣的作品&#xff0c;为网站加入更多高级创意的元素。 html <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…