[论文精读]BERT

2023-11-18

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个点.

关于双向的理解:
在这里插入图片描述

类似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.
在这里插入图片描述

对于给定的token, 输入表示是由token对应的embedding, 分块部分和位置embedding三部分加和构成的.
在这里插入图片描述

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这里不是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:

参考

在这里插入图片描述

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[论文精读]BERT 的相关文章

  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • Java将数字金额转换为中文大写

    import java math BigDecimal import java util regex Matcher import java util regex Pattern 2022 5 5 author lf public clas
  • vue对于时间的处理

    2023 08 05 11 25 45 假如这个就是我们要传的时间字符串 比如今天是2023 08 05 同一天 现在把这个时间字符串传入到 formatDate 这个方法 就会给你返回 11 25 比如今天是2023 08 06 前一天
  • 一文综述人脸检测算法(附资源)

    文章来源 SIGAI 本文共9400字 建议阅读10 分钟 本文将和大家一起回顾人脸检测算法的整个发展历史 导读 人脸检测是目前所有目标检测子方向中被研究的最充分的问题之一 它在安防监控 人证比对 人机交互 社交和娱乐等方面有很强的应用价值
  • mysql准确查询出以固定字符开头的数据

    在做开发过程中 我们经常会遇到多种支付方式 为了区分 我们可能会根据订单的前两位或者前几位固定值来区分 在这里我向大家推荐三种方法 使用LEFT函数 函数使用方法如下 str是原串字段 length是要提取的长度 这里只能是正整数 该字段是
  • 检测zookeeper和kafka是否正常

    cd dirname 0 source bash profile count zoo ps ef grep config zookeeper properties grep v grep wc l count kafka ps ef gre

随机推荐

  • 常见的八种导致 APP 内存泄漏的问题

    像 Java 这样具有垃圾回收功能的语言的好处之一 就是程序员无需手动管理内存分配 这减少了段错误 segmentation fault 导致的闪退 也减少了内存泄漏导致的堆空间膨胀 让编写的代码更加安全 然而 Java 中依然有可能发生内
  • VUE3快速上手

    目录 1 Vue3简介 2 Vue3带来了什么 1 性能的提升 2 源码的升级 3 拥抱TypeScript 4 新的特性 一 创建Vue3 0工程 1 使用 vue cli 创建 2 使用 vite 创建 项目结构介绍 二 常用 Comp
  • 软件测试行业所需要的技能

    近来 软件测试行业发展迅速 企业越来越重视测试了 越来越多的人加入了测试大军中 很多人也想通过自学来学习软件测试技术加入这个行业 让我们来看一下究竟如何才能学好软件测试吧 一 软件测试基础知识 要想进入测试这个行业 就必须要了解什么是软件测
  • IDEA常用配置之类Tab页多行显示

    文章目录 IDEA常用配置之类Tab页多行显示 IDEA常用配置之类Tab页多行显示 默认在Idea中打开类过多 后面会隐藏显示 这里修改配置 将类设置为多行显示 方便查找已经打开的类 修改后显示样式
  • Redis主从部署及sentinel配置详细教程

    Redis主从部署及sentinel配置详细教程 一 环境介绍 1 三个redis节点的IP规划 2 节点的系统版本 二 安装redis 1 下载Redis源码包 2 解压软件包 3 安装gcc相关模块 4 编译软件目录deps 下内容 5
  • 【亲测】Parallels Desktop 16 / 17在MacOs Big Sur / Monterey下网络初始化失败:您的虚拟机将继续正常运作 解决办法

    场景 Mac升级Big Sur Monterey后 然后再升级Parallels Desktop到16 17版本后 Parallels Desktop开启windows或者其他虚拟机就出现 网络初始化失败 您的虚拟机将继续正常运作 解决办法
  • 使用存储过程返回结果集

    因业务复杂 SQL较为庞大 后改造为存储过程方式 传参 获取结果集 此处只显示存储过程的结构部分 也是最重要部分 CREATE OR REPLACE PACKAGE PKG QUALITYCONTROL IS TYPE retcursor
  • vite + vue3 + setup + pinia + ts 项目实战

    介绍 一个使用 vite vue3 pinia ant design vue typescript 完整技术路线开发的项目 秒级开发更新启动 新的vue3 composition api 结合 setup纵享丝滑般的开发体验 全新的 pin
  • Ubuntu下安装和注册beyond compare 4

    下载 安装 下载安装包网址 Ubuntu上选择Debian安装包 https www scootersoftware com download php sudo dpkg i bcompare 4 4 6 27483 amd64 deb 注
  • 【汽车电子】浅谈车载系统QNX

    目录 1 概述 2 QNX系统介绍 2 1 系统特点 2 2 系统结构 2 3 调度策略 3 QNX内核 4 QNX网络结构 5 QNX网络设备驱动 6 网络设备信息的统计 2 发展历程 3 应用场景 4 相关链接 1 概述 QNX是一种商
  • Stereo-Detection:YOLO v5与双目测距结合,实现目标的识别和定位测距

    简介 Stereo Detection 是一个传统的SGBM深度测距 yolov5目标检测 并部署在Jeston nano的开源教程 它致力于让更多的大四学生毕业 以及让研一学生入门 开源链接 yzfzzz Stereo Detection
  • Visual Studio运行C语言程序(第一个程序)

    以VS2017为例 首先打开VS 新建Visual C 空项目 建议将编写的程序放在一个文件夹里 并以编写程序当天的日期来命名 在Visual C 里选择C 文件 命名为自己容易认出的名称 后缀为 c就行 右击资源管理器的源文件 选择添加
  • 用Python爬取电影数据并可视化分析_python电影数据分析

    文章目录 一 获取数据 1 技术工具 2 爬取目标 3 字段信息 二 数据预处理 1 加载数据 2 异常值处理 3 字段处理 三 数据可视化 四 总结 一 获取数据 1 技术工具 IDE编辑器 vscode 发送请求 requests 解析
  • Spring refresh() 方法详解(启动Spring,bean的创建过程)

    Spring refresh方法详解 一 refresh 方法预览 二 refresh 方法中调用的每个方法 1 this prepareRefresh 激活开启容器 2 this obtainFreshBeanFactory 获取 bea
  • SQL Server 批量插入数据的两种方法

    在SQL Server 中插入一条数据使用Insert语句 但是如果想要批量插入一堆数据的话 循环使用Insert不仅效率低 而且会导致SQL一系统性能问题 下面介绍SQL Server支持的两种批量数据插入方法 Bulk和表值参数 Tab
  • CSAPP学习记录-Course Overview

    这是我开始学习CSAPP的笔记的第一遍 在接下来的内容 我会分享自己在学习CSAPP时的笔记 感受等等 学习资料来自b站 声明 所有内容基于自己的理解 如有错误感谢大家指出 链接 https www bilibili com video B
  • QT中按钮格式QSS代码

    鼠标正常时按钮效果 QPushButton myButton normal 鼠标正常时的效果 color 000000 background color rgb 40 85 20 改变背景色 border style inset 改变边框风
  • Hadoop3.x 之 MapReduce 开发总结(月薪过万)

    Hadoop之 MapReduce开发总结 MapReduce 开发总结 月薪过万 1 输入数据接口 InputFormat 月薪过万 2 逻辑处理接口 Mapper 月薪过万 3 Partitioner 分区 月薪过万 4 Compara
  • 图像分割2021

    cvpr2022总结 CVPR 2022 图像分割论文大盘点 大林兄的博客 CSDN博客 图像分割最新论文 尽管近年来实例分割取得了长足的进步 但如何设计具有实时性的高精度算法仍然是一个挑战 本文提出了一种实时实例分割框架OrienMask
  • [论文精读]BERT

    BERT Pre training of Deep Bidirectional Transformers for Language Understanding Abstract 作者介绍了一种新的语言模型 叫做BERT 是来自transfo