计算出句向量再计算相似度只写一下原理
最新语言表示学习方法XLNet,在20项任务上超越BERT
https://blog.csdn.net/qq_31456593/article/details/93015488
提取关键词之后,嵌入成词向量,然后不是计算jaccard相似度,而是迁入后,计算cos等其他的相似度。
对 BERT 原始论文(BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding )的解读。
BERT(Bidirectional Encoder Representations from Transformers)是一种预训练模型,旨在通过考虑所有层中的双侧上下文信息来得到深度的双向表示。该表示连接上一层输出层后,仅需微调训练就可以在很多 NLP 任务中取得惊人的效果。在介绍模型之前,我们需要先简单了解 BERT 的提出背景。
背景
基于语言模型的预训练(pre-training)已经被证明可以有效提升各种 NLP 任务的表现。而将预训练得到的表示用于下游任务时有两种策略:基于特征(feature-based)和微调(fine-tuning)。基于特征的策略使用任务特定的架构,将预训练的表示作为额外的特征,其代表为 ELMo;基于微调的策略使用最少的任务特定参数,通过简单的微调预训练参数来训练下游任务,其代表 OpenAI GPT。
之前的研究的局限性在于,其在预训练时使用的目标函数均基于单向语言模型,没有同时考虑到双向的上下文信息。BERT 模型旨在解决这一局限性,通过提出一种新的预训练目标:masked language model(MLM)。简单来说,MLM 随机地从输入中遮蔽一些词语,然后训练目标是基于被遮蔽词语的双侧上下文来预测该词语在词典中的 id。此外,BERT 模型还引入了一个 next sentence prediction 任务,来预训练文本对的联合表示。
下图给出了 BERT、ELMo 和 OpenAI GPT 三者之间的结构比较。只有 BERT 真正同时使用了左右两侧上下文的信息。
模型
本节将介绍 BERT 模型的实现细节。在 BERT 中,总共包括两个步骤:预训练和微调。在预训练中,模型基于无标签数据,在不同的预训练任务上进行训练。在微调中,模型首先基于预训练得到的参数初始化,然后使用来自下游具体任务的标签数据对所有参数进行微调。每个下游任务都拥有独立的微调模型,即便其使用相同的预训练参数初始化。BERT 的特征在于对于不同的任务,其模型结构统一,预训练架构与最终的下游架构仅存在细微差别。下图以智能问答为例,给出了 BERT 的整体架构。
模型结构
BERT 模型的结构是一个多层双向 Transformer encoder,基于原始论文(Attention is all you need)实现。Transformer encoder 的特点是其关注了双侧的上下文,而 Transformer decoder 则仅使用了左侧的上下文(通过 masked 方法)。在本研究中,定义 Transformer 堆叠层数为 [公式],隐藏向量维数为 [公式],自我注意力头部数量为 [公式],全连接网络隐藏层维数为 [公式]。本研究包括了两种大小的 BERT 模型:
其中 BERT base 选择了与 OpenAI GPT 同样的大小,方便两者之间的比较。
输入/输出表示
为了让 BERT 能够处理一系列的下游任务,模型的输入表示需要能够在一个序列中明确地表示单个句子以及句子对(如问题-答案)。注意在本研究中,一个”句子“并不一定是实际的句子,可以是任意范围内的连续文本;一个”序列“表示 BERT 中的输入 token 序列(即词语序列),可以是单个句子,也可以是两个句子打包在一起。
本研究中使用了 WordPiece 嵌入(大小为 30000 的词典)来生成词嵌入向量。每个序列的第一个 token 为一个特殊的分类标志 [公式],该 token 的最终隐藏状态用来聚合序列,执行分类任务。句子对被打包到单个序列中,通过两种方式进行区分:第一种是两个句子间插入一个特殊标志 [公式],第二种是对于每个 token,添加一个学习到的嵌入向量来表示其属于句子 A 还是 B。如图 1 所示,输入嵌入向量标记为 [公式],特殊标志 [公式] 的最终隐藏向量标记为 [公式],第 [公式] 个输入 token 的最终隐藏向量标记为 [公式].
对于一个给定的 token,其输入表示由三部分相加得到,如下图所示。第一个是词嵌入(基于 WordPiece 生成),第二个是 segment 嵌入(表示该 token 所属的句子),第三个是位置嵌入(表明该 token 在序列中的位置信息)。
预训练 BERT
我们使用两个无监督任务来预训练 BERT,如图 1 左侧所示。
任务一:Masked LM
对于标准的条件语言模型,其只能进行单向训练,否则词语会”看到它们自己“,引起模型训练的混乱。为了同时利用双侧上下文的信息,原文提出了一种方案:将输入序列的部分 token 随机遮挡起来,然后预测这些被遮挡起来的 token。该方法被称为 ”masked LM“ (MLM),其思想来源于著名的 Cloze task。在该任务中,被遮挡的 token 的最终隐藏向量会被转换为一个词典长度的 softmax 向量输出,用于预测词语 id。在原文的试验中,随机遮挡了每个序列中 15% 的 WordPiece 向量。
MLM 任务可以允许模型利用双侧上下文的信息进行预训练,但是其存在着一个问题:预训练和微调存在着不匹配,因为 [公式] token 并不会出现在微调训练中。为了减轻这一影响,我们并不总是用 [公式] token 来替换被遮挡的词语。如之前所述,训练数据生成器随机选择 15% 的 token 位置用于预测,如果第 [公式] 个位置的 token 被选中,则其会按照如下策略进行替换:
80% 的可能使用 [公式] token
10% 的可能使用随机 token
10% 的可能保持 token 不变
之后,输出 [公式] 会被用于预测原始的 token,使用交叉熵损失函数。
任务二:Next Sentence Prediction (NSP)
很多重要的下游任务,如智能问答(QA)和自然语言推理(NLI),都是基于理解两个句子之间的联系,而标准的语言模型并不能直接捕捉这一联系。BERT 提出了一种二元 next sentence prediction 任务进行预训练,能够在任意单语言语料库上实现。具体来说,当选择每个训练样本的句子对 A 和 B 时,B 有 50% 的概率是 A 的真实的后一句(标签为 [公式]);有 50% 的概率是语料库中的随机一句(标签为 [公式])。如图 1 所示,[公式] 用来预测是否为下一个句子。虽然这种方法很简单,但是在 QA 和 NLI 上均取得了不错的效果。
预训练数据
预训练语料库采用了 BooksCorpus (800M 词语)以及 English Wikipedia(2500M 词语)。需要注意的是作者使用了文档层面的语料库而非打乱的句子层面的语料库,因为预训练需要提取序列之间的关系。
微调 BERT
得益于 Transformer 的自我注意力机制,BERT 的微调过程比较直接。对于每个任务,只需要将任务对应的输入及输出拖入 BERT结构,然后端对端微调所有参数即可。举例来说,对于输入,预训练中的句子对 A 和 B 对应于:
文本复述任务(paraphrasing)中的句子对
文本蕴涵(entailment)任务中的 hypothesis-premise 对
智能问答任务中的 question-passage 对
文本分类或序列标注任务中的 text-∅ 对(即单个句子)
而对于输出,token 的表示被注入到一个输出层中,用于 token-level 的任务,如序列标注或智能问答。而 [公式] 表示则被注入到输出层中,用于分类任务,如文本蕴涵、情感分析等。下图给出了不同下游任务下 BERT 微调结构的不同,其中 a 和 b 对应序列层面的任务,c 和 d 对应词语层面的任务。
与预训练相比,微调部分的算力要求相对较低,如果你有一块 TPU,最多一个小时就可以复现原文中的所有结果(基于预训练模型)。
实验 & 消融研究
文章的第 4-5 节描述了 BERT 模型在各下游任务上的表现以及针对模型本身的消融实验,这里仅作简单的介绍。
原文中展示了 BERT 微调结构在 11 个 NLP 任务上的表现,包括 GLUE (包括 9 个任务)、SQuAD v1.1、SQuAD v2.0 以及 SWAG,结果都十分的牛批。下表给出了 GLUE 的测试结果。
在消融实验中,原文主要进行了三个实验:第一个实验是预训练任务的影响,结果如下表所示。可以看到同时执行 BERT 所提出的两项预训练任务的表现要优于其他模型。
第二个实验是模型大小的影响。结果如下表所示。作者指出当针对下游任务时模型仅需要微调时(即仅使用很小一部分随机初始化的参数),模型越大取得的结果越好,即便下游任务的数据量很小。而基于特征的方法可能存在模型大小的上界,即增加到一定程度后效果并不会变好。
第三个实验探索 BERT 在基于特征的方法中的应用,结果如下表所示。可以看到 BERT 对于微调方法和基于特征的方法均可以取得较好效果。