[论文精读]BERT

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

Abstract

作者介绍了一种新的语言模型, 叫做BERT,是来自transformer双向encoder表示. 和最近的语言表示模型不一样, BERT设计目的是: 用无标签文本训练深度双向表示, 在所有层中综合利用文本左右边两个方向的上下文信息. 这种模型带来的结果是, 预训练的BERT模型可以通过仅仅增加一个额外的输出层, 然后微调, 就能在很多任务上达到最高水平, 比如问答/语言推断,这些任务, 不需要根据大量的任务进行模型结构的修改.

BERT概念上简单, 经验实用性上很强大(empirically). 它在11个自然语言处理任务上获得了最高水平的结果, 使GLUE分数达到80.5%, 提升了7.7%;MultiNLI准确率达到86.7%提升了4.6%,SQuADv1.1问答测试F1达到了93.2提升了1.5个点, SQuADv2.0Test F1达到了83.1提升了5.1个点.

关于双向的理解:
[论文精读]BERT_第1张图片

类似Transfoemer的encoder结构, 只不过里面多了很多的block;

OpenAI GPT是一个语言模型, 是吧Transformer的decoder模块拿出来, 增加了很多的block;

ELMo: 也是双向, 但是是两个语言模型的简单连接.没有做到像BERT每个层都是互相连接. 所以这里称为deep bidirectional representation /jointly conditioning on both left and right context in all layers

1 Introduction

预训练语言模型表现出来能够提升很多自然语言处理任务的效果. 这些包含句子界别的任务, 如自然语言推断和paraphrasing, 目的在于通过分析全局预测句子间的关系, 也有token级别的任务如命名实体识别和问答, 这类任务中模型需要产生token级别精确的输出.

现有两种将预训练语言表示应用在下游任务的方法: feather-based和fine-tuning.feather-based方法, 如ELMo, 使用task-specific架构, 将预训练表示作为额外的特征. fine-tuning方法, 比如Generative Pre-trained Transformer (OpenAI GPT), 引入最小的任务特定的参数, 并且在下游任务上训练, 仅仅微调所有的预训练参数. 这两种方式使用相同的预训练时的目标函数, 即为单向语言模型来学习语言的通用表示.

feather-based: 用图像理解, 就是一个网络结构初始学到的是图像的纹理色彩角点等特征, 这里就是将一个网络的一层或者多层拿走, 在另一个任务上不对这些层进行调整, 而是仅仅进行特征提取, 然后再输入进任务特定构造的网络结构中.(task-specified)

fine-tuning based:bert使用的方式, 到下游任务不对bert模型做大调整, 只在最后加一些简单的层, 然后微调时整个模型包括bert都学习调整.

作者认为, 目前的方法限制了预训练表示的能力, 特别是对微调方法. 主要的限制在于标准的语言模型是单向的, 限制了预训练时的架构选择. 例如, OpenAI GPT的作者使用从左到右的架构, 每一个token只能关注自注意力层前面的token. 这种限制是通过句子级别任务中的可选子模块来实现的, 但对于应用微调到token级别的任务比如问答是有害的, 因为这类任务中联系从两个方向上下文是非常重要的.

在这篇论文中, 作者通过提出BERT:Bidirectional Encoder Representations from Transformers 来提升微调的基础方法. BERT通过masked language model 预训练目标减轻了上面提到的双向限制, 受启发于cloze task. The masked language model 随机mask掉输入的部分token, 目标是通过上下文信息预测出mask的单词. 和从左到右的语言模型与训练不同, MLM的目标是找到一种融合上下文的表示, 这使得能训练一个深度双向transformer. 处理使用masked language model, 我们也使用下一句预测的任务, 联合预训练文本对表示(text-pair representation). 文章主要贡献在于:

  • 揭示了双向预训练语言表示的重要性.不同于使用单向语言模型(unidirectional language model)来预训练, BERT使用masked language model 来预训练深度双向表示. 这也和其他解决这个问题的工作形成对比, 别的工作采用独立训练从左到右和从右到左的语言模型, 然后简单连接.(shallow concatenation)
  • 作者揭示了预训练表示减少了对于特定任务设计特定结构的高工程要求.(heavily-engineered).BERT是第一个在很多句子级别和token级别任务上取得最高水平的微调基本表示模型, 超过很多task-specific 结构.
  • BERT在11个NLP任务上取得最高水平.

2 Related Work

通用预训练语言模型表示有很长一段历史, 作者在这一部分概括性的回顾一些广泛使用的方法.

2.1 Unsupervised Feature-based Approaches

学习应用广泛的单词表示是几十年来很活跃的研究领域, 包括非神经网络方法和神经网络方法. 预训练单词嵌入表示是现代NLP系统的重要一部分, 和从头训练训练(from scratch)嵌入表示相比带来了显著的提升. 为了预训练单词embedding 向量, 从左到右的语言模型建模目标已经被使用, 基于纠正上下文错误单词的目标也被建模使用.

这些方法也被泛化到粗粒度(coarser granularities)上, 比如句子embedding, 或者段落embedding. 为了训练句子表示, 以前的工作使用了 候选下一句排序的目标(训练), 在前面句子表示已知情况下从左到右生成下一句的目标, 去噪自编码器等衍生目标(训练).

ELMo和它的祖先生成传统的word embedding研究沿着另一个维度. 他们提取上下文敏感的特征(context-sensitive)通过从左到右和从右到左的语言模型. 每一个token的上下文表示是两个方向的表示的连接. 当将上下文单词表示和现有任务结构融合起来, ELMo取得了几个主要NLP任务的最高水平, 比如问答/情感分析/命名实体识别. 有研究提出用LSTM通过上下文来预测单个单词, 来学习上下文表示.和ELMo类似, 他们的模型是feather-based, 并且没有深度双向. 有研究表明 the cloze task可以被用来提升文本生成模型的鲁棒性.

2.2 Unsupervised Fine-tuning Approaches

伴随着feather-base方法的, 在这个方向上首先有一些工作仅仅从无标签文本预训练word embedding.

最近, 用于进行上下文token表示的句子和文档编码器已经被用来预训练无标签文本, 然后用于有监督的下有任务微调. 这些方法的优势是从头需要学习的参数很少. 至少由于这个优势, OpenAI GPT在很多句子级别的任务上取得了最高水平. 从左到右的语言模型和自编码目标被用作很多预训练模型的目标.

auto-encoder objectives: 恢复原文

语言模型: 预测下一个序列

2.3 Transfer Learning from Supervised Data

也有一些工作展示出大型数据集的有监督任务在迁移上表现很有效, 比如自然语言推断和机器翻译. 计算机视觉研究也展示出从大规模预训练模型的进行迁移学习的重要性, 又掉的方法就是用ImageNet数据集预训练模型进行微调.

3 BERT

作者在这一部分介绍了BERT和它详细的实现过程. 本文提出的框架分为两个步骤:预训练和微调. 在预训练阶段, 作者的模型是在无标签数据上做不同的预训练任务来训练. 在微调阶段, BERT模型首先用预训练参数初始化, 然后所有的参数用有标签数据通过下游任务来微调. 虽然下游任务被初始化为相同的预训练参数, 但每个下游任务有不同的微调模型. 问答将作为例子举证.

什么不同的微调模型?

BERT是一个框架, 作者发布encoder部分, 然后可以在下游任务上做微调, 作者团队通过在现有很多任务上做下游任务测试发现效果很好.

BERT一个显著的特征是跨不同任务使用相同结构. 在预训练架构和下游任务架构中微小差别.

模型结构 BERT的模型结构为过程双向transformer encoder, 基于原始的transformer并在tensor2tensor库中公开. 因为transformers被大量使用, 而且这里的使用几乎和原始论文中相同, 作者这里省略了详细的背景描述, 推荐读者读attention文章详细了解.

在这项工作中, 用L表示层数, H为隐藏层数, A为self-attention的头数. 作者主要报道量化总模型尺寸
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 ) 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_{BASE}(L=12,H=768,A=12,Total Parameters=110M) \\ BERT_{LARGE}(L-24,H=1024,A=16,Total Parameters=340M) BERTBASE(L=12,H=768,A=12,TotalParameters=110M)BERTLARGE(L24,H=1024,A=16,TotalParameters=340M)
BERT base模型参数大小和OpenAI GPT相同, 以便比较. 不同的是, BERT Transformer使用双向self-attention, 而GPT Transformer使用加了限制的自注意也就是每个token只能与上文信息联系.

(注释中指出, 在这篇文献中的bidrectional Transformer经常被引用为transformer encoder, 而left-context-only version被引用为transformer decoder因为它可用于文本生成)

Input/Output Representations 为了让BERT能应对广泛的下游任务, 输入表示要能在一个token 序列中没有歧义的表示单个句子或者句子对. 在这项工作中, 一个句子可以是任意跨度的句子, 而不一定是实际的语言句子. 一个序列指的是BERT的输入token序列, 可能是一个句子或者两个句子打包.

作者使用包含30,000个token的WordPiece embedding. 每个句子的第一个token总是一个特殊符号([CLS]). CLS对应的隐藏层的最后一层的输出通常被用作分类任务. 句子对被打包成一个序列. 作者用两种方式来区分两个句子. 首先, 用特殊符号[SEP]分割句子. 第二点, 给每个token添加一个embedding来指示它是句子A或者句子B.
[论文精读]BERT_第2张图片

对于给定的token, 输入表示是由token对应的embedding, 分块部分和位置embedding三部分加和构成的.
[论文精读]BERT_第3张图片

3.1 Pre-training BERT

不同于以往的方法, 作者不使用传统的从左到右或者从右到左语言模型预训练BERT. 而是使用两个无监督任务预训练BERT.

任务1 Masked LM

直观上来看, 深度双向模型比任意一个从左到右模型或者简单连接从左到右和从右到左模型的embedding更好. 但现有条件是只有语言模型, 只能从左向右或者从右向左训练, 语言模型只能单向原因是: 双向条件将使每个位置间接的看到自己,通过一种多层结构的相互连接, 模型就能简单的预测出目标.(多层深度相互连接)

原文理解:

Unfortunately, standard conditional language models can only be trained left-to-right or right-to-left, since bidirectional conditioning would allow each word to indirectly “see itself”, and the model could trivially predict the target word in a multi-layered context.

这里说的能看到自己是什么意思?

解释

语言是通过序列前面的信息预测下一个位置, 具体实现可以通过ngrams求解, 但更贴切的是RNN形式.

对于RNN, 语言模型求解:

对隐藏层上一个状态作为输入求函数值得到当前字符的概率分布. 隐藏层的输入是前一个状态的隐藏层和当前输入:
y ^ t + 1 = p ( w t + 1 ∣ x t , . . . , x 1 ) = g ( h t ) = s o f t m a x ( W 0 h t + b 0 ) h t = f ( x t , h t − 1 ) \hat y^{t+1}=p(w^{t+1}|x^t,...,x^1)=g(h^t)=softmax(W_0h^t+b_0)\\ h^t=f(x^t,h^{t-1}) y^t+1=p(wt+1xt,...,x1)=g(ht)=softmax(W0ht+b0)ht=f(xt,ht1)
而对于双向语言模型, 隐藏层是两个方向的隐藏层的concat:
h ← ( t ) = f ( x t , h t + 1 ) = f ( x t , f ( x t + 1 , h t + 2 ) ) h → = . . . h ( t ) = [ h ← ( t ) , h → ( t ) ] \mathop{h}^{\leftarrow}(t)=f(x^t,h^{t+1})=f(x^t,f(x^{t+1,h^{t+2}}))\\ \mathop{h}^{\rightarrow}=...\\ h(t)=[\mathop{h}^{\leftarrow}(t),\mathop{h}^{\rightarrow}(t)] h(t)=f(xt,ht+1)=f(xt,f(xt+1,ht+2))h=...h(t)=[h(t),h(t)]
这里的 x t + 1 = w t + 1 x^{t+1}=w^{t+1} xt+1=wt+1所以求解时相当于已经看到了自己.“see onself”

图示:

[论文精读]BERT_第4张图片

BERT这里不是LM, 是基于Transformer的, 里面的attention机制每次求解一个位置也是双向的, 具体操作为通过key和query做dot product然后scale再softmax作为value的权重, 这里的key就是已经"see oneself".

为了训练深度双向表示, 作者按一定比例随机掩盖掉部分tokens, 然后预测被masked掉的tokens. 作者将这种机制叫做masked LM(MLM), 在一些文献中被叫做cloze task.在这种情况下, 被掩盖的tokens对应的隐藏层的最后一层的输出被喂进在整个字典上的output softmax上, 这个操作和标准语言模型一致. 在作者所有的实验中, 随机mask 15%的WordPiece表示的tokens. 和去噪自编码器相对的, 作者仅仅预测masked words而不是重建整个输入.

尽管这建立起双向预训练模型, 存在的缺点是预训练和微调不匹配, 原因在于mask在微调时没有出现. 为了缓解这个, 作者没有将masked的words 直接替换成MASK token.训练时输出生成器随机选择15%的位置用于预测, 被选中的token被替换为:

  1. 80%的概率替换成[MASK]
  2. 随机token: 10%的概率
  3. 不改变:10%

然后, 每个位置用交叉熵预测token,.

任务2 下一句预测

很多重要的下游任务比如问答, 自然语言推断是基于理解句子间关系的,这种关系不能直接被语言模型捕获到. 为了训练模型理解句子间关系, 作者预训练了下一句预测的二分类任务, 这个任务可以从任意单语料中简单的生成. 特殊的, 当选择句子A和B作为预训练例子时, 50%的可能性B是A的下一句, 50%的可能性是语料中的随机句子. 如模型结构图中所示, C被用于句子预测(NSP).尽管简单, 但在5.1张杰展示了这种预训练对QA和NLI很有效.

NSP: next sentence predict

这种NSP任务和有些工作中的表示学习目标联系密切. 但在以前的工作中, 只有句子embedding被迁移到下层任务中, BERT迁移率所有的参数来初始化末端任务参数.

预训练数据

预训练程序和现有文献中的语言模型的预训练基本相同.对于预训练语料, 使用BooksCorpus(800M words)和English Wiki(2500M words).对于Wiki, 作者提取其中的text文章, 忽略列表, 头标题等.使用文档级别的语料而不是打乱的句子级别的Billion Word Benchmark是重要的, 为了提取序列的长依赖.

3.2 Fine-tuning BERT

微调是简单直接的, 因为Transformer中的自注意力机制使得BERT可以匹配很多下游任务–通过替换输入输出来实现, 单个文本或者文本对都能实现(transfoemer只要能够按照输入编码即可). 对于包含文本对的应用, 一种简单的模式式在进入双向attention之前独立编码文本对. BERT而是使用自注意力机制来统一两个阶段, 通过自注意力机制(包含bidirectional联合attention在句子对之间)操作已经连接起来的文本对.

理解: 对于句子对的处理, 原本是将key和query, value单独编码, 然后放进多头注意力中, 这是两个阶段.

而自注意力机制, 是将不同句子按照一定的方式(SPE符号加入等)连接成一个序列作为一个输入, 然后对于一个序列用不同矩阵进行投影, 再用投影完的结果作为Q, V, K.

ref: 解释

对于每个人物, 作者仅仅嵌入任务特定的输入输出到BERT中, 然后端到端的微调所有的参数. 作为输入, 预训练的句子A和B是相似的在以下任务中:

  1. 段落中的句子对
  2. 假设,前提对的文本蕴含识别
  3. 问答中的问题/文章
  4. 文本分类或序列标注中的退化文本-∅对

对于输出,在序列标注或者问答类似的token-level任务中, 一个token表示被输入进输出层;在entailment或者情感分析这列任务中, [CLS]的表示被输入进输出层来做分类.

和预训练相比, 微调相对成本低. 论文中所有的结果在单云TPU上训练不超过1h(使用相同的与新联模型). 第4部分详细描述了每个特定任务的细节.

4 Experiments

这一部分展示了BERT在11个NLP任务上的微调.

4.1 GLUE

The General Language Understanding Evaluation (GLUE) 是多个自然语言理解任务的集合.

为了微调GLUE, 作者将输入序列(单个句子或者句子对)用第三节描述的方法表示, 然后使用第一个token(CLS)对应的最后一层隐藏层的输出向量C作为聚合表示. 在微调阶段引入的新向量只有分类层采纳数W, R K x H R^{KxH} RKxH. 作者使用C,W计算标准分类损失 l o g ( s o f t m a x ( C W T ) ) log(softmax(CW^T)) log(softmax(CWT)).

作者使用batchsize=32, 微调3个epoch. 对于每一个任务, 选择最优微调学习率(5e-5,4e-5,3e-5,2e-5)在Dev 集合上. 此外, 作者发现 B E R T L A R G E BERT_{LARGE} BERTLARGE​对于某些微调任务不稳定, 作者使用了几个随机重启并在DEV set上选择最优模型. With random restarts, we use the same pre-trained checkpoint but perform different fifine-tuning data shufflfling and classififier layer initialization.9

结果如表. bert的base和large模型都超过现有的模型并拉开了一定距离, 平均取得了4.5%和7%的准确率提升. 值得注意的是, bert base和openAI GPT墨子那个结构几乎一样, 知识bert使用了mask. 但对于最出名和最大的测评任务GLUE bert取得了4.6%的提升. 对于官方测评, bert确定了80.5的分数, GPT只有72.8.

发现bert lasrge显著超过bert base模型, 特别是在那些训练数据很少的模型上. 模型大小的影响在5.2部分被探索.

训练技术, restart:

参考

[论文精读]BERT_第5张图片

restart: 随机开始; 优化手段, 从几个随机的不同地点开始(checkpoint)进行梯度下降, 增大了抵达全局最低点或者是至少到达非常低的局部最低点的概率.

4.2 SQuAD v1.1

The Stanford Question Answering Dataset

(SQuAD v1.1)是多源 问题/答案 匹配对, 共有100k对.给定问题和包含答案wiki文章, 任务是在文章中预测答案的span.

如图bert所示, 在问答任务中, 作者将输入问题和文章作为一个打包序列, 问题为Aembedding, 文章为Bembedding. 在微调过程中, 引入起始向量S和终止向量E. 第i个单词是答案起始的概率通过 T i T_i Ti和S, 然后后面寄一个softmax计算:
P i = e S T i Σ j e S T j P_i=\frac{e^{ST_i}}{\Sigma_je^{ST_j}} Pi=ΣjeSTjeSTi
计算答案终止位置也用了相同的公式. 候选位置(从i到j)的分数通过公式 S T i + E T j ST_i+ET_j STi+ETj计算, 在 j > = i j>=i j>=i的条件下, 最大分数的i,j作为预测答案.训练目标为起始位置和终止位置的log-likelihood的和最小. 作者微调了3个epochs, 学习率5e-5, batchsize=32;

表2任务的最高分数. 但SQuAD最高结果没有公开最优结果的系统描述., 并且在他们的系统训练时可以使用公开数据. 因此, 作者在他们的系统中使用适中的数据增强, 并首先在triviaQA上微调, 然后再在SQuAD上微调.

作者最优表现系统, 在集成上超过榜1 F1 +1.5, 的单个系统超过 +1.3F1.事实上, 作者的的那个BERT模型超过了榜上的集成模型的F1值. 去掉TriviaQA微调, 作者也仅仅降低了0.1-0.4的F1值.仍然超过现有系统一大截.

4.3 SQuAD v2.0

SQuAD v2.0任务拓展了SQuAD1.1的定义, 允许了没有答案存在的情况, 更接近真实情况.

作者使用简单的方式将SQuADv1.1BERT model拓展到这个任务上. 将没有答案的问题视作答案的其实和终止位置都是CLS token. 起始和终止span位置的概率空间拓展到包含CLS token. 对于预测, 作者比较了没有答案的分数 s n u l l = S C + E C s_{null}=SC+EC snull=SC+EC和非空span s i ^ , j = m a x j > = i S T i + E T j s_{\hat i,j}=max_{j>=i}ST_i+ET_j si^,j=maxj>=iSTi+ETj . 预测为非空答案当且仅当 s i ^ , j > s n u l l + σ s_{\hat i,j}>s_{null}+\sigma si^,j>snull+σ , σ \sigma σ在dev上选择来最大化F1值. 不使用TriviaQA预训练. 微调2个epochs, lr=5e-5, batchsize=48.

展示结果如表. 比之前的最好系统F1值超过+5.1.

4.4 SWAG

The Situations With Adversarial Generations(SWAG) 数据集包含113k句子对, 用来评估推理. 给定一个句子, 这个任务是从四个选择中选出一个最可能的接下去的情况.

在SWAG数据集上微调时, 坐着构建了4个输入序列, 每一个都包含给定句子(A)和一个可能的后续选项(B)相连. 对于任务引入特征只有一个向量, 它和CLS对应的表示C的点乘表示一个选项的分数, 分数被通过softmax正则化.

微调模型用了3个epochs, lr=2e-5, batchsize=16. 结果在表4中, large模型比baseline ESIM+ELMo系统 高出+27.1%, 比OpenAI GPT高出8.3%.

5 Ablation Studies

在这一部分, 作者进行了消融实验, 测试了BERT的很多方面来更好理解它们的重要性. 额外的消融实验在附录C中.

5.1 Effect of Pre-training Tasks

作者展示了BERT的深度双向(注意力)的重要性, 通过评价两个预训练目标在相同的预训练数据, 微调方法和超参,方法如下:

No NSP: 双向模型在masked LM上训练, 但没有next sentence prediction(NSP)任务.

LTR&No NSP: 一个 left-context-only 模型使用标准Left-to-Right(LTR)语言模型, 而不是MLM. 只有上文限制也被应用在微调上, 因为移除了这个限制将导致预训练/微调的不匹配, 导致下游性能下降. 此外, 也被在没有NSP任务下预训练. 除了使用更大的训练数据, 输入表示和微调模式, 其他的和GPT相同.

作者首先测试NSP任务的影响. 通过结果可知, 移除了NSP, 在QNLI,MNLI和SQuAD1.1上效果下降. 然后, 通过比较"No NSP"和"LTR&No NSP"测试训练双向表示的影响. LTR模型在所有任务上表现差于MLM, 特别是在MRPC和SQuAD上.

对于SQuAD直观上感觉LTR模型将会在token预测上表现更差, 因为token级别隐藏层状态没有下文信息. 为了确认证实这一点, 作者随机添加了初始化的BiLSTM在最顶层. 这显著提高了SQuAD的结果, 但结果仍然弱于预训练的双向模型. BiLSTM模型破坏了在GLUE任务上的表现.

作者也意识到也可以分别训练两个模型,LTR和RTL模型, 然后将得到的两个表示连接起来, 和ELMo类似处理. 但存在以下问题:

  1. 成本是单个双向模型的两倍
  2. 对某些任务不直观没有解释性: 如问答, RTL模型不能确定问题的答案.
  3. 不如深度双向模型有效, 因为深度双向模型在每一层都使用了上下文信息.

5.2 Effect of Model Size

在这一部分, 作者探索模型大小对微调任务准确率的影响. 作者训练了一些BERT模型用不同的层数, 隐藏单元数, 和attention 头数目, 保证其他参数和原本相同.

在选定的GLUE任务上的结果展示在表中. 使用5个随机重启的fine-tuning结果得到准确率. 可以发现, 更大的模型在四个模型上都带来严格的准确率提升, 甚至对于只有3600标记的MRPC数据集, 它的本质和预训练任务完全不同. 现有最优模型已经很大了, 作者的模型能够再次基础上做出显著的提升是令人惊讶的. 例如, 最大的transformer有100M编码器参数, 整个模型235M参数. 相对的, BERT base包含110M参数, Large包含340M参数.

众所周知, 在机器翻译或者语言模型这类任务中, 随着模型的增大结果也在提升, 这可以通过语言模型困惑度在训练数据中的结果得到证明.

然而, 作者相信这是第一次有工作表明增大模型大小在一些小尺度模型上同样也能取得很好的结果提升, 在保证充分预训练的情况下.有实验使用预训练的bi-LM模型增大尺寸, 在下游任务中表现出有提升和没有提升的混合结果. 之前的工作都是feather-based, 作者猜想只要模型在被下游任务充分微调后, 并调价少量的随机初始化参数, 特定任务的模型能够从更大的预训练表示中获得效果提升, 机试任务的数据量很小.

5 random restarts of fifine-tuning: 是优化手段, 为了增大得到全局最优解的概率.

5.3 Feature-based Approach with BERT

所有bert的结果到现在为止都是用的fine-tuning放水阀, 通过在预训练模型上加一个简单分类层然后联合微调所有的下游任务的参数来实现. 然而, feather-based方法, 通过在预训练模型中提取特定的特征也有特定的优势. 首先, 不是所有的任务都能被表示成transformer encoder架构, 因此需要任务特定的模型结构. 第二点, 计算优势仅在一次预训练成本较高的表示, 然后在下游很多基于这种表示的简单模型上运行多次试验得以体现.(once-many)

在这一部分中, 作者通过将BERT应用到CoNLL-2003NER任务中比较了两种方式. 在BERT输入中, 作者使用了case-preserving WordPiece模型, 并最大程度保留数据提供的上下文. 和标准做法相一致的, 作者将这个作为标注任务, 但不使用CRF层. 使用第一个sub-token表示作为token级别分类器的输入来打标签.

first sub-token:

关于tokenize目的: 是为了避免需要用无限的字典来表示单词; 对于常见单词保留原表示, 对于稀有单词, 进行tokennize拆解成具有意义的sub-token:比如:

infrequently–>[in,##frequent,##ly]

这里打标签的意思是: 设原标签是’B-count’, 拆解后的标签为[B-count,X,X]

X在后面计算损失或者F1矩阵时不计数.

ref: first-subtoken参考

关于token意义的解释

WordPiece模型: 也就是文章使用的tokenize方法得到初始的token representation

为了做微调方法的消融实验, 作者使用了feather-based方法来提取一层或者多层的特征, 而不采取微调操作. 这些上下文embedding被用作随机初始化的两层768维的BiLSTM的输入, BiLSTM后面接上分类层.

结果显示BERT LARGE表现出最高水平. 最优表现的方法连接了预训练transformer最高的4个隐藏层的token表示, 取得的结果只比整个微调transformer模型低0.3F1值.这说明BERT在feather- based和fine-tuning上都表现优秀.

6 Conclusion

最近由于在语言模型上迁移学习而带来结果的提升表明: 丰富的, 无监督预训练时语言理解系统重要组成部分. 特别的, 这些结果使得对于少量资源的任务也能从深度单向结构中获益. 作者的主要贡献在于进一步将这些基础泛化到深度双向结构中, 使得同样预训练的模型能够在广泛的NLP任务上表现良好.

其他

语言模型论文:A Neural Probabilistic Language Model

结果只比整个微调transformer模型低0.3F1值.这说明BERT在feather- based和fine-tuning上都表现优秀.

6 Conclusion

最近由于在语言模型上迁移学习而带来结果的提升表明: 丰富的, 无监督预训练时语言理解系统重要组成部分. 特别的, 这些结果使得对于少量资源的任务也能从深度单向结构中获益. 作者的主要贡献在于进一步将这些基础泛化到深度双向结构中, 使得同样预训练的模型能够在广泛的NLP任务上表现良好.

附录

大牛的文章在附录里也有很多值得学习的东西

附录分为以下几块:

  • BERT实现细节
  • 实验细节
  • 更多的消融实验
    • 训练数step的影响
    • 不同mask消融实验

各种实验设置与消融实验十分值得学习, 不过这一部分是对于实验的指导,等到写完实验之后出实验专题.

其他

语言模型论文:A Neural Probabilistic Language Model

你可能感兴趣的:(论文精读,bert,自然语言处理,深度学习)