BERT论文翻译

概述

  1. Bidirectional Encoder Representations from Transformers
  2. 联合所有层的上下文信息从ublabel文本中训练双向表示
  3. 预训练的BERT只需要一个额外的输出层就可以微调,并且无需修改任务架构既可以得到最先进的模型.我觉得这是因为bert主要解决的是NLU问题,所有的文本问题其实还是要依赖与文本理解,文本理解做好了,其他任务只需要把自己的底层修改就可以了

不管是句子层面还是词汇层面的任务,不一定必须从左到右阅读,例如文本分类,只能问答等,因此提出了带掩码的语言模型

如果任务本身就是标准的语言模型,即语言生成模型,那么肯定需要left-to-right,但如果不是,那么就可以用别的方式来建模,这么说的话ELMo其实已经是这种想法了额。

1. 简介

语言预训练模型已经被证明对很多NLP任务是有效的,包括自然语言推理和释义等句子级别的任务,以及命名实体识别和问答等token级别的任务。

将预训的语言表示应用与下游任务的现有策略有两种:基于特征和微调。

  • 基于特征的方法:例如ELMo,使用特定的任务结构,预训练表示作为附加的特征。
  • 基于微调的方法:例如GPT,引入了最小的任务特定参数,并通过简单的微调了所有预训练参数来训练下游任务。

这两种方法在预训练期间有相同的目标函数,都使用单向语言模型去学习通用语言表示

这些结构都是用单向语言模型进行预训练,这限制了预训练潜力,特别是对于fine-turning。例如GPT使用了left-to-right结构,每一个token只能关注到transformer之前的token信息。

单向结构对于句子级别的任务是次优的,但是对于token级别的任务就会有害了,因为token级别的任务中,从两个方向结合上下文是非常重要的

bert受完型填空任务启发,使用MLM(mask lanuage model)预训练来缓解前面提到的单向性约束。MLM随机从输入中mask一些token,目标是通过上下文预测mask位置中原来单词id。left-to-right预训练模型只能使用left来预测right,或者使用right预测left,而MLM使用left和right上下文共同预测缺失的中心词,这样就可以训练一个双向的Transformer。也就是说Transformer训练的时候不需要mask后面的了。除了使用masked language model,也使用了next sentence prediction联合预训练文本对表示

2. 相关工作

2.1 基于无监督特征的方法

广泛使用的词向量一直是个活跃的领域,包括传统方法和神经网络方法(word2vec,fasttext)。预训练的词嵌入是现代NLP任务中不可或缺的一部分,与从头开始学习embedding相比,预训练得到的embedding效果更好。

  • 直接训练一个LM来得到词向量
  • 使用word2vec的方式来得到词向量

这些方法已经推广到了更粗的粒度,包括句子嵌入和段落嵌入

  • 目标是通过对下一个句子进行排序
  • 给定上一个句子的representation,生成下一个句子的representation
  • 去噪自动编码器

ELMo将传统的词嵌入沿不同的维度进行了推广,从左到右,从右到左两个方向提取上下文的相关特征,然后拼接起来得到动态的词嵌入。ELMo提升了几个NLP任务的基准,包括问题问答,情感分析和命名实体识别。ELMo主要是基于特征的,而不是深度双向的。费堵死等人表明完形填空任务可以用于提高文本生成模型的鲁棒性。

2.2 无监督微调方法

从无标签的文本中学习句子和文档的表达,在有简单下游任务中进行fine-turning。left-to-right语言模型和自编码器已经被用在预训练模型中。

2.3 迁移学习

有许多工作表明,从大型数据集训练好的监督模型可以有效的转移到其他任务上。例如自然语言推理和机器翻译。CV研究证明从大型预训练模型迁移学习的重要性,其中一个有效的方法是微调使用ImageNet预训练模型

3. BERT

介绍一下bert的细节,主要分为两个步骤

  1. 预训练(pre-training)通过不同的预训练任务在未标记的数据上进行训练,预训练任务主要未MLM和NSP两个任务。
  2. 微调(fine-tuning)。首先使用预训练的参数进行初始化,然后使用来自下游任务的标记数据对所有参数进行微调。每一个下游任务都会有一个微调模型,但是都是使用相同的预训练模型参数进行初始化

bert的一个显著特点是可以用同一个架构解决不同的NLP任务。预训练任务架构和最终的下游任务架构之间存在细微差别

Model Architecture
使用多层双向Trasnformer编码器。层数使用 L L L,隐含层大小未 H H H,多头注意力个数为 A A A。主要整理了两个模型结果BERT_base( L = 12 , H = 768 , A = 12 L=12,H=768,A=12 L=12,H=768,A=12,参数量为110M)和BERT_large( L = 24 , H = 1024 , A = 16 L=24,H=1024,A=16 L=24,H=1024,A=16,参数量为340M)

BERT_base使用与GPT相同的参数。但是BERT使用双向的self-attention,然后GPT由于使用了单向的语言模型,只能关注左侧的attention

Input/Output Representations
用了让BERT可以处理各种NLP任务,在输入中加了一个标记字符 S E P SEP SEP可以明确表示是一个句子还是一对句子<Question,Answer>。句子不一定是完整的一句话,任意截取都可以。【我喜欢中国】是一个完整的句子,【欢中国】也是一个句子,可以随意截取。序列是指输入到bert中的token序列,可以是一个句子,也可以是一对句子。

使用WordPiece方法分词,的带3w个token词汇,每个句子的第一个token都是一个特殊的token([CLS])。该标记对应的最终隐藏状态用作分类任务的聚合序列表示??????
句子对也会被打包成一个句子。有两种方法来区分这个句子

  1. 使用特殊的token[SEP]切分成两个句子
  2. 给每个token添加一个标记,表示属于句子A还是句子B
    每个token对应的embedding记作E,[CLS]得到的输出向量记作C,每个token对应的输出向量记作T。

对于一个给定的token,输入有三部分家和得到

  1. token对应的emebdding
  2. segment(input token type id)用来区分句子A
    还是句子B
  3. position embedding

3.1 预训练BERT

没有使用left-to-right和right-to-left任务去训练bert,而是使用两个无监督任务去训练

Task #1: Masked LM 直觉来讲,双向深度语言模型要比left-to-right要准确。但是标准的条件概率语言模型只能允许left-to-right或者right-to-left。ELMo虽然号称的双向的,但是其实是单向的叠加,训练阶段依然是只能看到左侧或者右侧。

为了训练深度双向表达模型,我们简单的随机屏蔽一定百分比的输入标记,然后预测这些被mask的token,这个任务被称为Maseked LM。不过其他文献一般称之为完形填空任务。被mask的token对应的输出向量最后计算softmax,得到每个词汇的的概率。实验中,随机屏蔽15%的wordpiece词汇。这些被屏蔽的token,最后会用[mask]这个特殊符号来代替,然后继续输入到模型中。例如原本的输入是i love you and you love me,假如屏蔽了love,那么现在的输入就变成了i [mask] you and you [mask] me,长度还是一样的,只不过被love被替换成了[mask]

虽然MLM可以获得双向预训练模型,但是跟实际任务是存在gap的。实际任务中可不存在[mask]字符,为了缓解这种情况,在生成mask对应的token时候,有3中方法

  1. 80%的几率替换成[mask]
  2. 10%的几率随机替换成另一个token
  3. 10%的机会维持原来的token

最后得到的输出想想计算交叉熵损失

Task #2: Next Sentence Prediction(NSP) 许多NLP任务是基于理解两个句子之间的关系的,例如QA和NLI。为了训练一个理解句子关系的模型,我们训练了一个二值话的任务,这个任务的数据可以从任何语料库中生成。从预料中抽去两个相邻的句子A和B,50%的几率将A放到B的前面,对应的标签就是IsNext,50%的几率将B放到A的前面,对应的标签就是NotNext,尽管非常的简单,但是证明这个任务对QA和NLI是非常有效的。

Pre-training data 使用BooksCorpus和English Wikipedia。wiki的数据只抽取了text段落,文档级别的预料更容易提取出长的连续序列。

3.2 Fine-tuning BERT

对于文本对任务,通常会对两个句子进行独立编码,然后使用双向attention机制计算。bert使用self-attention机制合并了这两个阶段,把两个句子打包成了一个句子,通过attention之后其实就相当于对两个句子做了相关性计算

在输入端,预训练的句子A和句子B相当于

  • 文本复述中的句子对
  • 蕴含中的假设对
  • 问答中的问题-段落
  • 文本分类中退化文本
    在输出端,token的输出向量被送到token级别的任务中,例如token标记或者问答问题,[CLS]的输出向量被送到输出层中,以进行分类,例如情感分析

4. 实验

4.1 GLUE(General Language Understanding Evaluation)

为了在GLUE上进行微调,将句子表示成输入序列,使用[CLS]对应的最后隐含层 C C C作为聚合表达,在微调期间,唯一加入的参数是分类层的权重 W W W,其中K是标签的数量,H是隐含层的神经元个数,然计算一个softmax损失 log ( s o f t m a x ( C W T ) ) \text{log}(softmax(CW^T)) log(softmax(CWT))

使用batch_size=32微调3词在所有的GLUE任务数据上。对于每个任务,我们在Dev数据集上选择最好的学习率。我们发现在小数据集上微调BERT_large模型会存在波动,因此多运行几次随机参数,然后选择最佳模型。bert使用双向attention,GPT使用单向attention,除了这点以外,bert和gpt结构几乎相同。

4.2 SQuAD(Stanford Question Answering Dataset) v1.1

斯坦福问大数据集包括了100K个问答数据对,给一个问题和文本段落,段落中包含了问题的答案,这个任务是预测这个问题的答案在段落中的位置。

问答任务中,将问题和段落打包成一个序列,其中问题使用A嵌入,段落使用B嵌入。在微调期间引入一个起始向量S和一个结束向量E。单词i作为答案的起始概率为
P i = e S ⋅ T i ∑ j e S ⋅ T j P_i=\frac{e^{S \cdot T_i}}{\sum_j e^{S \cdot T_j}} Pi=jeSTjeSTi,单词j作为结束的概率类似。i,j作为候选范围的分数为 S ⋅ T i + E ⋅ T j S \cdot T_i + E \cdot T_j STi+ETj,目标就是最大化这个分数,训练目标是

4.3 SQuAD v2.0

SQuAD v2.0任务是v1.0的扩展,v1.0问题的答案肯定在给定的段落中,2.0v中的答案可能不在给定的段落中,所以更加现实。做一个简单的扩展,将没有答案的问题认为是开始结束都是指向[CLS]。之前的时候i和j的范围在[CLS]和[SEP]之间,现在i和j可以指向[CLS]
预测的时候,首先计算没有答案的分数 s null = S ⋅ C + E ⋅ C s_{\text{null}}=S \cdot C+E \cdot C snull=SC+EC
然后计算有答案时候的分数
s i j = m a x j > i S ⋅ T i + E ⋅ T j s_{ij}=max_{j>i}S \cdot T_i + E \cdot T_j sij=maxj>iSTi+ETj
如果KaTeX parse error: Undefined control sequence: \tao at position 17: …_{ij}>s_{null}+\̲t̲a̲o̲,可以认为段落中包含了答案,否则认为没有包含答案。KaTeX parse error: Undefined control sequence: \tao at position 1: \̲t̲a̲o̲在Dev数据集上进行调试。

4.4 SWAG

SWAG(Situations With Adversarial Generations)
包含113k的句子对,用于评估基于常识的推理。给定一个句子,任务是在四个选项中选择最合理的一个。
微调时,构造四个输入序列,每个序列包含给定的句子和可能的选项,然后输入到BERT中,最后得到的[CLS]的输出向量C经过一个softmax层得到每个选项的分数。

5 Ablation Studies

对BERT多个方面进行消融实验

5.1 Effect of Pre-training Tasks

证明BERT的深度双向性的重要性

  • No NSP: 使用MLM训练双向模型,但是没有使用NSP
  • LTR & No NSP: 使用标准的left-to-right方式训练LM(language model),而不是训练MLM。left-only constraint应用于微调,因为移除它会造成pre-train和fine-tune不匹配。此外,这个模型没有使用NSP训练。这可以与GPT直接科比,但是使用了更大的训练数据集,我们的输入格式和微调方案。

首先NSP任务会带来影响,移除NSP会损害QNLI,MNLI和SQuAD 1.1的性能。然后通过比较No NSP和LTR & No NSP来评估深度双向表示的影响。LTR模型在所有任务上的表现都比MLM模型差。在MRPC和SQuAD上的下降幅度很大。

对于SQuAD,很明显LTR模型在预测token级别的任务效果不佳,这是因为token级别的隐含状态没有获取right侧的上下文。为了更准确的加强LTR系统,我们在顶部添加了一个随机初始化的BiLSTM。这确实显著改善了SQuAD的结果,但是结果仍然比双向模型差的多。

可以单独训练left-to-right和right-to-left模型,并且将两个模型token的隐含层拼接到一起,就像ELMo一样但是

  1. 参数比单个双向模型要翻倍
  2. 对于QA这样的任务来说不是很直观,QA本身就不是生成模型,一般的LM模型都是条件概率,即 p ( x k ∣ x k − 1 , . . . x 1 ) p(x_k|x_{k-1},...x_1) p(xkxk1,...x1),但是QA不受这种约束,所以不合适使用LM来建模
  3. 严格来说不如深度双向模型强大,因为可以在每一层使用上下文?????

5.2 Effect of Model Size

探索不同模型尺寸在微调任务上的性能。训练一个BERT使用不同的层数,隐含层数量和attention head,但是超参和训练过程时一致的。模型尺寸越大,提升的效果越好,但是增加到一定的程度将不会再有所提升。

5.3 Feature-based Approach with BERT

前面提到的所有任务都是使用微调的方式,即再预训练模型之后添加一个简单的分类层,然后将所有参数在下游任务上进行联调。然而,从预选连模型中提取固定特征具有一i的那个的优势,首先,并不是所有的任务都很容易用一个Transformer编码器架构来表示,因此需要添加一个特定任务的模型架构,其次,预先在大规模数据集上训练得到特征,然后在此特征之上使用更简单的模型运行许多实验,这有很大的计算优势。简单的说就是

  1. 预训练模型得到特征
  2. 根据下游任务设计模型结构
  3. 使用预训练特征作为模型输入

个人猜测

  • 基于微调:在预训练模型上增加下游任务结构,然后更新所有参数
  • 基于特征:预训练模型保持不变,只是输入出特征,相当于是word2vec,只更新下游模型参数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值