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

  前记: 【预训练语言模型】系列文章是对近几年经典的预训练语言模型论文进行整理概述,帮助大家对预训练模型进行全局的理解。本系列文章将不断更新,敬请关注博主。本文将讲解如今最为火爆的预训练模型——BERT,其于2018年底被提出,虽然已经时隔两年但依然被诸多NLP领域任务上使用,且是接下来许多预训练模型改进的出发点和baseline,在当时已经成功地在11个NLP任务上达到SOTA。

  简称Bidirectional Encoder Representation from Transformers

  会议2018NAACL

  开源http://www.goo.gl/language/bert


一、摘要:

  BERT被设计用于预训练语言模型,在每一层上通过结合由左向右和由右向左两个方向的深度编码。预训练的BERT表征则可以仅通过一个额外的输出层来实现微调便可以在大多数的任务上达到SOTA效果。例如在问答、语言推理等任务。

二、动机:

  现阶段有两种策略来使用预训练的语言模型并应用到下游任务中:

  • feature-based:例如ELMo,使用任务具体的架构包含预训练的表征作为额外特征;
  • fine-tunging:例如GPT(Generative Pre-trained Transformer),在下游任务上根据具体任务的目标来调整语言模型的参数;

  先前的这两种策略的所有语言模型都是基于单向的,且共享相同的目标函数。
主要的缺陷在于先前的语言模型是单向的(unidirectional),其限制模型的微调的性能。例如GPT,在做self-attention时只能关注前面的token,使得在具体的任务上不是全局最优的,这对于NLP的任务是毁灭性的(devastating),因此需要双向化。

Bert依然是依赖Transformer模型结构,我们知道GPT采用的是Transformer中的Decoder部分的模型结构,当前位置只能attend到之前的位置。而Bert中则没有这样的限制,因此它是用的Transformer的Encoder部分。

  因此本文提出BERT模型解决双向化的表征预训练。预训练的目标有两个:
(1)masked language model(MLM)(类似完形填空一样对一个句子挖掉一个token,然后去预测该token):

The masked language model randomly masks some of the tokens from the input, and the objective is to predict the original vocabulary id of the masked word based only on its context.

(2)next sentence prediction(NSP):后续句子预测,类似于语义推理工作,根据上文推测下文(或判断下文是否与上文有语义和逻辑先后关系)

  重点:BERT的双向性体现在:其不同于单向的GPT是根据上文预测下一个词,而是使用Transformer将所有词不受长距离依赖地进行了表征,来预测句子中某些被mask的词,因此其双向性体现在预知全文来预测词

三、BERT模型:

  BERT模型的Encoder部分完全使用Transformer的encoder结构,作者提出两种规模的BERT模型:

  • BERT(BASE):12层Transformer block,隐状态维度768,multi-head attention头数为12,参数总量为110M;(参数总量与GPT一致以公平比对)
  • BERT(LARGE):24层Transformer block,隐状态维度1024,multi-head attention头数为16,参数总量为340M;

  模型架构(与GPT和ELMo的对比)如下所示:

3.1 Input Representation
  BERT的输入sequence可以是一个单独的句子sentence(例如在序列标注、文本分类等任务),也可以是一个句子对(a pair of sentences)(例如QA任务),输入的特征包括:

  • WordPiece embedding:词典大小为30000;对每个token进行切分,例如playing切分为play和##ing(参考资料:https://www.cnblogs.com/huangyc/p/10223075.html)
  • position embedding:序列长度最大为512;
  • 首个字符定义为[CLS],对整个序列的隐状态表征进行聚集并表示到[CLS]token上,可用于分类任务;
  • 多个sentence作为一个sequence时,通过两个途径加以区分,一个是在不同的句子之间加入一个特殊字符[SEP],另外添加一个embedding对不同的sentence进行表示,例如句子A的每个token则用A对应的embedding,句子B的每个token则用B对应的embedding;

  输入的样例如图所示:

3.2 Task
(1)masked LM
  我们随机对一个输入sequence中一定数量的token进行mask,具体地,我们对一个sequence的15%的token进行mask;
两个缺点:

  • 在微调时,[mask]标记并没有出现过,因此在mask时并不总是替换为mask,而是80%的概率被替换为mask,10%的概率随机选择一个词替换,10%的概率保持不变;最终所有语料1.5%的token是被替换为错误的单词,但并不影响模型的理解能力;

【1】这么做的原因是如果句子中的某个Token100%都会被mask掉,那么在fine-tuning的时候模型就会有一些没有见过的单词。加入随机Token的原因是因为Transformer要保持对每个输入token的分布式表征,否则模型就会记住这个[mask]是token ’hairy‘。至于单词带来的负面影响,因为一个单词被随机替换掉的概率只有15%*10% =1.5%,这个负面影响其实是可以忽略不计的。
【2】

  • 每个batch中15%的token需要预测,因此不得不需要模型多次训练来达到收敛,虽然兼顾双向表征增加训练时间,但效果却超过现有方法

(2)Next Sentence Prediction
  输入一个句子配对(A,B),任务目标是判断句子B是否是A的下文,语料中50%是正样本(label=IsNext),随机挑选B句子组成50%是负样本(label=NotNext)
例如:

四、预训练步骤:

  语料:BooksCorpus(800M words)和English Wikipedia(2500M words);采样两个sentence,长度总和不超过512,对于句子B有50%概率是A的后文,有50%概率则不是;在wordpiece embedding上对15%的token进行mask;

微调:
  如上图,针对不同的下游任务使用不同的输出部分。

  重点:与GPT的区别:

  • BERT在更大的语料上预训练;
  • BERT在预训练阶段便使用CLS和SEP的token,而GPT只在微调阶段使用;
  • BERT每个batch训练的token数量更大;
五、实验数据:

(1)GLUE(通用自然语言理解数据集):
  MNLI(自然语言推理数据集)、QQP(问题匹配)、QNLI(问题推理)、SST-2(情感分析)、CoLA(文本分类)、STS-B(情感文本匹配)、MRPC(文本相似匹配)、RTE(文本推理)、WNLI(自然语言推理)

(2)SquAD机器阅读理解:
  任务定义:给定一个问题和段落,在段落中预测答案的区间。BERT微调过程中,将问句视为A,段落视为B,在B的输出,对每个token计算其为start和end的概率。

(3)实体识别
  在每个token上加一个分类器,并不使用自回归和CRF模型

(4)SWAG(Situations With Adersarial Generations)场景推理,给定一个上文和4个候选下文,预测最合适的下文。

注:参考:Bert: 双向预训练+微调


  对于本文如若有疑难,错误或建议可至评论区或窗口私聊,【预训练语言模型】 系列文章将不断更新中,帮助大家梳理现阶段预训练模型及其重点。

GitHub 加速计划 / tra / transformers
130.24 K
25.88 K
下载
huggingface/transformers: 是一个基于 Python 的自然语言处理库,它使用了 PostgreSQL 数据库存储数据。适合用于自然语言处理任务的开发和实现,特别是对于需要使用 Python 和 PostgreSQL 数据库的场景。特点是自然语言处理库、Python、PostgreSQL 数据库。
最近提交(Master分支:2 个月前 )
33868a05 * [i18n-HI] Translated accelerate page to Hindi * Update docs/source/hi/accelerate.md Co-authored-by: K.B.Dharun Krishna <kbdharunkrishna@gmail.com> * Update docs/source/hi/accelerate.md Co-authored-by: K.B.Dharun Krishna <kbdharunkrishna@gmail.com> * Update docs/source/hi/accelerate.md Co-authored-by: K.B.Dharun Krishna <kbdharunkrishna@gmail.com> * Update docs/source/hi/accelerate.md Co-authored-by: K.B.Dharun Krishna <kbdharunkrishna@gmail.com> --------- Co-authored-by: Kay <kay@Kays-MacBook-Pro.local> Co-authored-by: K.B.Dharun Krishna <kbdharunkrishna@gmail.com> 21 小时前
e2ac16b2 * rework converter * Update modular_model_converter.py * Update modular_model_converter.py * Update modular_model_converter.py * Update modular_model_converter.py * cleaning * cleaning * finalize imports * imports * Update modular_model_converter.py * Better renaming to avoid visiting same file multiple times * start converting files * style * address most comments * style * remove unused stuff in get_needed_imports * style * move class dependency functions outside class * Move main functions outside class * style * Update modular_model_converter.py * rename func * add augmented dependencies * Update modular_model_converter.py * Add types_to_file_type + tweak annotation handling * Allow assignment dependency mapping + fix regex * style + update modular examples * fix modular_roberta example (wrong redefinition of __init__) * slightly correct order in which dependencies will appear * style * review comments * Performance + better handling of dependencies when they are imported * style * Add advanced new classes capabilities * style * add forgotten check * Update modeling_llava_next_video.py * Add prority list ordering in check_conversion as well * Update check_modular_conversion.py * Update configuration_gemma.py 1 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐