美团大脑百亿级知识图谱的构建及应用进展

美团大脑百亿级知识图谱的构建及应用进展,第1张

分享嘉宾:张鸿志博士 美团 算法专家

编辑整理:廖媛媛 美的集团

出品平台:DataFunTalk

导读: 美团作为中国最大的在线本地生活服务平台,连接着数亿用户和数千万商户,其背后蕴含着丰富的与日常生活相关的知识。美团知识图谱团队从2018年开始着力于图谱构建和利用知识图谱赋能业务,改善用户体验。具体来说,“美团大脑”是通过对美团业务中千万数量级的商家、十亿级别的商品和菜品、数十亿的用户评论和百万级别的场景进行深入的理解来构建用户、商户、商品和场景之间的知识关联,进而形成的生活服务领域的知识大脑。目前,“美团大脑”已经覆盖了数十亿实体、数百亿的三元组,在餐饮、外卖、酒店、到综等领域验证了知识图谱的有效性。今天我们介绍美团大脑中生活服务知识图谱的构建及应用,主要围绕以下3个方面展开:

--

“美团大脑”是什么?

以下是“美团大脑”构建的整体RoadMap,最先是2018年开始餐饮知识图谱构建,对美团丰富的结构化数据和用户行为数据进行初步挖掘,并在一些重要的数据维度上进行深入挖掘,比如说对到餐的用户评论进行情感分析。2019年,以标签图谱为代表,重点对非结构化的用户评论进行深入挖掘。2020年以后,开始结合各领域特点,逐个领域展开深度数据挖掘和建设,包括商品、美食、酒旅和到综和cross图谱等。

--

在搜索中,通常用户需要将其意图抽象为搜索引擎能够支持的一系列精搜关键词。标签知识图谱则是通过“标签”来承载用户需求,从而提升用户搜索体验。例如,通过标签知识图谱,用户可直接搜索“带孩子”或者“情侣约会”,就可返回合适的商户/内容供给。从信息增益角度来说,用户评论这种非结构化文本蕴含了大量的知识(比如某个商户适合的场景、人群、环境等),通过对非结构化数据的挖掘实现信息增益。该团队以生活服务领域的海量评论数据作为主要知识来源,通过标签挖掘、标签间关系挖掘以及标签-商户关联等关键技术,自下而上梳理用户需求,场景及主要关注点完成图谱构建。

标签知识图谱构建分为以下四个部分:知识抽取、关系挖掘、图谱打标和图谱应用。

① 知识抽取

标签挖掘采用简单的序列标注架构,包括Single span标签挖掘和跳字标签挖掘,此外还会结合语义判别或者上下文判别,采用远监督学习+结果投票方式获取更精准的标签。

② 关系挖掘

同义词挖掘:同义词挖掘被定义为给定包含N个词的池子,M个业务标签词,查找M中每个词在N中的同义词。现有的同义词挖掘方法包括搜索日志挖掘、百科数据抽取、基于规则的相似度计算等,缺乏一定的通用性。当前我们的目标是寻找通用性强,可广泛应用到大规模数据集的标签同义词挖掘方法。

以下是作者给出的同义词挖掘的具体方案,首先将离线标签池或者线上查询标签进行向量表示获取向量索引,再进行向量哈希召回,进一步生成该标签的TopN的同义词对候选,最后使用同义词判别模型。该方案的优势在于降低了计算复杂度,提升了运算效率;对比倒排索引候选生成,可召回字面无overlap的同义词,准确率高,参数控制简单。

对于有标注数据,主流的标签词嵌入表示方法有word2vec、BERT等。word2vec方法实现较为简单,词向量取均值,忽略了词的顺序;BERT通过预训练过程中能捕捉到更为丰富的语义表示,但是直接取[CLS]标志位向量,其效果与word2vec相当。Sentence-Bert对于Bert模型做了相应的改进,通过双塔的预训练模型分别获取标签tagA和tagB表征向量,然后通过余弦相似性度量这两个向量的相似性,由此获取两个标签的语义相似性。

对于无标注数据来说,可以通过对比学习的方法获取句子的表示。如图所示,Bert原始模型对于不同相似度的句子的向量相似度都很高,经过对比学习的调整之后,向量的相似度能够较好地体现出文本相似度。

对比学习模型设计:首先给定一个sentence,对这个样本做扰动产生样本pair,常规来说,在embedding层加上Adversarial Attack、在词汇级别做Shuffling或者丢掉一些词等构成pair;在训练的过程中,最大化batch内同一样本的相似度,最小化batch内其他样本的相似度。最终结果显示,无监督学习在一定程度上能达到监督学习的效果,同时无监督学习+监督学习相对于监督学习效果有显著提升。

同义词判别模型设计:将两个标签词拼接到Bert模型中,通过多层语义交互获取标签。

标签上下位挖掘:词汇包含关系是最重要的上下位关系挖掘来源,此外也可通过结合语义或统计的挖掘方法。但当前的难点是上下位的标准较难统一,通常需要结合领域需求,对算法挖掘结果进行修正。

③ 图谱打标:如何构建标签和商户供给的关联关系?

给定一个标签集合,通过标签及其同义词在商户UGC/团单里出现的频率,卡一个阈值从而获取候选tag-POI。这样会出现一个问题是,即使是频率很高但不一定有关联,因此需要通过一个商户打标判别模块去过滤bad case。

商户打标考虑标签与商户、用户评论、商户Taxonomy等三个层次的信息。具体来讲,标签-商户粒度,将标签与商户信息(商户名、商户三级类目、商户top标签)做拼接输入到Bert模型中做判别。

微观的用户评论粒度,判断每一个标签与提到该标签的评论(称为evidence)之间是正面、负面、不相关还是不确定的关系,因此可当作四分类的判别模型。我们有两种方案可选择,第一种是基于多任务学习的方法, 该方法的缺点在于新增标签成本较高,比如新增一个标签,必须为该标签新增一些训练数据。笔者最终采用的是基于语义交互的判别模型,将标签作为参数输入,使该模型能够基于语义判别,从而支持动态新增标签。

基于语义交互的判别模型,首先做向量表示,然后是交互,最终聚合比较结果,该方法的计算速度较快,而基于BERT的方法,计算量大但准确率较高。我们在准确率和速度上取balance,例如当POI有30多条的evidence,倾向于使用轻量级的方式;如果POI只有几条evidence,可以采用准确率较高的方式进行判别。

从宏观角度,主要看标签和类目是否匹配,主要有三种关系:一定不会,可能会,一定会。一般通过商户层关联结果进行投票结果,同时会增加一些规则,对于准确率要求较高时,可进行人工review。

④ 图谱应用:所挖掘数据的直接应用或者知识向量表示应用

在商户知识问答相关的场景,我们基于商户打标结果以及标签对应的evidence回答用户问题。

首先识别用户query中的标签并映射为id,然后通过搜索召回或者排序层透传给索引层,从而召回出有打标结果的商户,并展示给C端用户。A/B实验表明,用户的长尾需求搜索体验得到显著提升。此外,也在酒店搜索领域做了一些上线实验,通过同义词映射等补充召回手段,搜索结果有明显改善。

主要采用GNN模型实现,在构图中构建了两种边,Query-POI点击行为和Tag-POI关联信息;采用Graph Sage进行图学习,学习的目标是判断Tag和POI是否有关联关系或者Query和POI是否点击关系,进一步依据关联强度进行采样。上线后结果显示,在仅利用Query-POI信息构图时,线上无收益,在引入Tag-POI关联信息后线上效果得到显著提升。这可能是因为排序模型依赖于Query-POI点击行为信息去学习,引入Graph Sage学习相当于换了一种学习的方式,信息增益相对较少;引入Tag-POI信息相当于引入了新的知识信息,所以会带来显著提升。

此外,仅接入Query-POI向量相似度线上效果提升不佳,将Query和POI向量接入后效果得到显著提升。这可能是因为搜索的特征维度较高,容易忽略掉向量相似度特征,因此将Query和POI向量拼接进去后提升了特征维度。

该任务通过当前已知的Item去预测用户点击的Masked Item。比如说获取Item的上下文表征的时候,将相关的Attribute信息也进行向量表征,从而去判断Item是否有Attribute信息。

此外,还可以做Masked Item Attribute 预测,从而将标签的知识图谱信息融入到序列推荐任务中去。实验结果表明,引入知识信息后的准确率在不同的数据集上均有数量级的提升。同时,我们也做了线上转化的工作,将Item表征做向量召回;具体来说,基于用户历史上点击过的Item去召回topN相似的Item,从而补充线上推荐结果,在美食列表推荐页有显著提升。

--

菜品知识图谱的构建目标,一方面是构建对菜品的系统理解能力,另一方面是构建较为完备的菜品知识图谱,这里从不同的层次来说明菜品知识图谱的构建策略。

菜名理解

菜名中蕴含着最精准、获取成本最低的菜品信息,同时对菜名的理解也是后续显式知识推理泛化能力的前提。首先是抽取菜名的本质词/主体菜,然后序列标注去识别菜名中的每个成分。针对两种场景设计了不同的模型,对于有分词情况,将分词符号作为特殊符号添加到模型中,第一个模型是识别每个token对应的类型;对于无分词情况,需要先做Span-Trans的任务,然后再复用有分词情况的模块。

菜名理解是一个较为重要的信息来源,但是所蕴含的知识相对有限,从而提出了基于深度学习模型进行初步字符推断,可实现对不同字面表述的泛化处理。但是对需要专业知识的case表现欠佳,偶尔在字面极其匹配时出现case。

从知识内容丰富的文本中挖掘某些菜谱的基础知识,来构建源知识库;然后通过泛化推理去映射到具体SKU中。在食材推理中,比如菜品种有多道红烧肉,统计10道五花肉中有4道是指五花肉,6道是指带皮五花肉,因此肉就转化为带皮五花肉。对应地,佛跳墙有多道菜谱,先通过统计每种食材出现的概率,可以卡一个阈值,然后表明该菜谱的食谱是什么。

多源数据挖掘,基于菜名理解结果构建solid knowledge triple,同时也依赖菜名理解结果泛化规则。该策略主要适用于处理食材、功效、人群等标签。该方法准确率OK,有一定泛化能力,但覆盖率偏低。

业务内有一些比较好用的训练数据,例如1000万商户编辑自洽的店内分类树。基于该数据可产生5亿的 positive pairs 和 30G corpus。在模型训练中,会随机替换掉菜谱分类的 tab/shop,模型判断 tab/shop 是否被替换;50%的概率drop shop name,使得模型仅输入菜名时表现鲁棒。同时,对模型做了实体化改进,将分类标签作为bert的词进行训练,将该方法应用到下游模型中,在10w标注数据下,菜谱上下位/同义词模型准确率提升了18%。

首先使用ReseNet对菜谱进行编,使用Bert模型对菜谱文本信息做编码,通过对比学习loss去学习文本和店菜的匹配信息。这里采用双塔模型,一方面是下游应用较为方便,单塔模型可独立使用,也可inference出菜品的表示并缓存下来;另一方面是内容单纯,暂无交互式建模的必要。训练目标分别是与店菜匹配、与菜名对齐,与Tab对齐。

可基于多模态信息做菜品品类预测或者菜谱信息补全。比如,预测“猪肉白菜”加上了信息将更加直观和准确。基于文本和视图模态信息进行多视图半监督的菜谱属性抽取,以烹饪方式抽取为例,首先通过产生烹饪方法训练样本(红烧肉-红烧);然后采用CNN模型去训练预测菜谱烹饪方法,指导Bert模型Finetune文本模型或者多模态模型,基于商户/tab/菜品及评论信息预测菜品烹饪方法;最终对两个模型进行投票或者将两个特征拼接做预测。

综上,我们对菜品知识图谱构建进行相应的总结。菜品理解比较适合SKU的初始化;深度学习推理模型和显式推理模型比较适合做同义词、上下位、菜系等;最终是想通过多模态+结构化预训练和推理来解决单模态信息不完整、属性维度多、需要大量标注数据等问题,因此该方法被应用到几乎所有的场景中。

今天的分享就到这里,谢谢大家。

分享嘉宾:

本文主要复述论文["Exploring Pre-trained Language Models for Event Extraction and Generation"] 的内容,以便自我回顾,也希望可以给大噶带来帮助~

这篇文章研究事件抽取的角度是从有标签的训练数据描述的,以往的EE任务依赖于人工标注数据,而不充分的训练数据会影响模型的效果。文章采用了一个预训练语言模型来提取事件触发词,通过角色预测分离方法来处理角色抽取任务中的角色重叠问题,并利用Bert模型的Masked LM来自动生成标签数据。该模型在ACE05数据集上的表现,事件抽取任务上达到了811%的F1值,角色抽取任务上达到了589%的F1值。

ACE05数据集上10%的事件有角色重叠问题,例句 The explosion killed the bomber and three shoppers 中 killed 触发事件 ,元素 the bomber 既可以触发角色 ,又有角色 。之前的工作中会将该元素第一次被预测到的角色类型判定为分类好的角色标签,而没有考虑该角色在多个角色类型中的概率。

监督学习下的事件抽取依赖于大量人工标注的数据集,而ACE数据集当中给出的事件标签数量有限。为了解决这一问题,之前也有工作通过远程监督的方法来生成事件类型标签扩充训练集,但这一方法也是依赖于源数据集的数量与质量。

论文提出了预训练语言模型,利用从语料库中获得的知识来进行事件生成。预训练语言模型包括事件抽取模型与角色抽取模型,角色重叠问题通过计算角色类型与事件类型之间的关系,来重置角色分类的概率值。事件类型标签也是通过这个预训练语言模型实践,将原训练集作为样本,通过参数替换和辅助token重置这两步生成新的事件类型。

事件抽取部分是直接用Bert模型得到词向量表示,最后加个分类器完成触发词的提取。值得说明的是,这里每个token的输入由三部分组成: word embedding + segment + position ,整个模型基于句子级别,这里的 segments 设为0。其他设定则与Bert保持一致。

对于第一阶段提取到的触发词,这里会提取与其相关的成分的所有可能角色。作者总结的元素提取有三个难点:1元素对触发词的依赖性;2元素大多由长名词短语构成;3角色重叠。模型框架设定与前一阶段相似,也是需要注意的一点:特征表示输入的 segment 将触发词所在的span设为1。

分类器则是设为所有角色标签的集合,即为对每个元素判断所有角色类型的概率,并在其分类器上设置一个二元组,用来判定该角色下的token的span,该跨度由 (start, end) 组成。通过对每种可能的角色标签进行计算,改善角色重叠问题。

判定角色的span,也就是如何更准确得到每个token的 (start, end) 域值。首先,对于每一个token ,经softmax分别计算在角色 下的起始点的概率 与结束点的概率 :

论文中处理一个元素有多种角色时应该被分类的角色标签,依据了同一事件中每种角色出现的可能性会大不相同这一事实。因此文中给出了当前角色在一个事件中的重要性判定条件:RF-IEF(这一定义与词频的TF-IDF类似),。由这一指标可以得到角色 在事件类型 中的重要程度 :

生成新的标签是将原有数据集作为样本,通过模型学习到新的之前没有标签的词并加入到训练集中,以起到扩充语料的作用。这里是采用了Bert的Mask预训练方法,通过两个步骤:1句中的元素替换为有相同角色标签的其他元素;2利用Bert的fine-tune替换触发词的辅助token。这里需要注意的几点:

1辅助token是原有样本数据集里未被识别成触发词或角色的token,除了词、数字,还可以包括标点。

2元素替换是将具有相同角色标签的元素进行代换。因此需要预先统计所有的实体以及对应标签构成 {arg : role} 字典集,并且这个字典集不包括有角色重叠的元素。

3这里的数据集扩充并非给没有标签的数据加上标签,而是保持触发词与角色的个数不变,通过辅助元素的替换将触发词与角色所在句子的成分做更改,获得同样有标签的句子,以达到数据集的扩充。

这篇论文比较有趣的一点是他统计了所有角色与事件类型之间的关系RF-IEF,虽然相较于以前的工作,这里会需要把多种不同标签都给计算一遍,但通过人为处理也是一个不错的选择。我认为理解这篇文章的难度在于需要掌握Bert的原理,由于我之前也没好好研究过这个,所以看起来也特别费劲,事实证明Bert是真的很优秀,这里的触发词识别与分类模块就将F1值提高了10个百分点。句子生成这块我觉得也是和Bert的Masked预训练原理结合的很巧妙,大多与Bert有关的我就没有描述了,这里贴一个 Bert模型讲解 ,可以迅速上手~

还是新手,水平有限,若有错误还望不吝赐教~

论文标题:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

论文链接: https://arxivorg/abs/181004805

BERT(Bidirectional Encoder Representations from Transformers)通过预训练来学习无标注数据中的深度双向表示,预训练结束后通过添加一个额外的输出层进行微调,最终在多个NLP任务上实现了SOTA。

预训练语言模型在实践中证明对提高很多自然语言处理任务有效,其中包括句子层级的任务,比如自然语言推断(natural language inference)和复述(paraphrasing),还有token层级的任务,比如命名实体识别(named entity recognition)和问答(question answering)。

在下游任务中应用预训练语言模型表示的方法有两种:feature-based的方法和fine-tuning的方法。举例来说,ELMo这种预训练语言模型使用feature-based的方法,通过将ELMo的预训练的表示作为额外的特征输入到特定于任务的模型中去;GPT使用fine-tuning的方法,通过引入少量的特定于任务的参数,在下游任务中训练时所有的预训练参数。

截止BERT之前的预训练语言模型都是单向的(unidirectional),包括GPT和ELMo,这样的方法对句子层级的任务不是最优的,而且对于token层级的任务比如问答非常有害。BERT使用masked language model(MLM)的方法来预训练,这种方法能够训练一个双向的(directional)语言模型。除了masked language model的预训练的方法,BERT还使用了next sentence prediction的预训练方法。

BERT的使用分为两个阶段:预训练(pre-training)和微调(fine-tuning)。预训练阶段模型通过两种不同的预训练任务来训练无标注数据。微调阶段模型使用预训练参数初始化,然后使用下游任务(downstream task)的标注数据来微调参数。

BERT的一个显著特点是它在不同的任务上有统一的架构,使用时只需要在BERT后面接上下游任务的结构即可使用。

BERT的模型架构是一个多层双向的Transformer的encoder。我们标记模型的层数(每一层是一个Tranformer的block)为 ,模型的hidden size为 ,self-attention head的数量为 。两个比较通用的BERT架构为 和 。

对比GPT,BERT使用了双向self-attention架构,而GPT使用的是受限的self-attention, 即限制每个token只能attend到其左边的token。

BERT的输入表示能够是一个句子或者是一个句子对,这是为了让BERT能够应对各种不同的下游任务。BERT的输入是一个序列,该序列包含一个句子的token或者两个句子结合在一起的token。

具体地,我们会将输入的自然语言句子通过 WordPiece embeddings 来转化为token序列。这个token序列的开头要加上 [CLS] 这个特殊的token,最终输出的 [CLS] 这个token的embedding可以看做句子的embedding,可以使用这个embedding来做分类任务。

由于句子对被pack到了一起,因此我们需要在token序列中区分它们,具体需要两种方式:

①在token序列中两个句子的token之间添加 [SEP] 这样一个特殊的token;

②我们为每个token添加一个用来学习的embedding来区分token属于句子A还是句子B,这个embedding叫做segment embedding。

具体地,BERT的输入由三部分相加组成:token embeddings、segment embeddings和position embeddings。如下图所示:

BERT使用两个无监督的任务进行预训练,分别是Masked LM和Next Sentence Prediction(NSP)。如下图所示,我们定义输入的embedding为 ,BERT最终输出的 [CLS] 的embedding为 ,最终输出的第 个token的embedding为 。

我们有理由相信一个深度双向模型比left-to-right模型和left-to-right和right-to-left简单连接的模型的效果更加强大。不幸的是,标准的条件语言模型只能够够left-to-right或者right-to-left地训练,这是因为双向条件会使每个token能够间接地“看到自己”,并且模型能够在多层上下文中简单地预测目标词。

为了能够双向地训练语言模型,BERT的做法是简单地随机mask掉一定比例的输入token(这些token被替换成 [MASK] 这个特殊token),然后预测这些被遮盖掉的token,这种方法就是Masked LM(MLM),相当于完形填空任务(cloze task)。被mask掉的词将会被输入到一个softmax分类器中,分类器输出的维度对应词典的大小。在预训练时通常为每个序列mask掉15%的token。与降噪自编码器(denoising auto-encoders)相比,我们只预测被mask掉的token,并不重建整个输入。

这种方法允许我们预训练一个双向的语言模型,但是有一个缺点就是造成了预训练和微调之间的mismatch,这是因为 [MASK] 这个token不会在微调时出现。为了缓解这一点,我们采取以下做法:在生成训练数据时我们随机选择15%的token进行替换,被选中的token有80%的几率被替换成 [MASK] ,10%的几率被替换成另一个随机的token,10%的几率该token不被改变。然后 将使用交叉熵损失来预测原来的token。

一些重要的NLP任务如Question Answering (QA)或者Natural Language Inference (NLI)需要理解句子之间的关系,而这种关系通常不会被语言模型直接捕捉到。为了使得模型能够理解句子之间的关系,我们训练了一个二值的Next Sentence Prediction任务,其训练数据可以从任何单语语料库中生成。具体的做法是:当选择句子A和句子B作为训练数据时,句子B有50%的几率的确是句子A的下一句(标签是 IsNext ),50%的几率是从语料库中随机选择的句子(标签是 NotNext )。 [CLS] 对应的最后一个隐层输出向量被用来训练NSP任务,这个embedding就相当于sentence embedding。虽然这个预训练任务很简单,但是事实上在微调时其在QA和NLI任务上表现出了很好的效果。在前人的工作中,只有sentence embedding被迁移到下游任务中,而BERT会迁移所有的参数来初始化下游任务模型。

Transformer的self-attention机制允许BERT建模多种下游任务。对于包含句子对的任务,通常的做法是先独立地对句子对中的句子进行编码,然后再应用双向交叉注意(bidirectional cross attention)。而BERT使用self-attention机制统一了这两个过程,这是因为对拼接起来的句子对进行self-attention有效地包含了两个句子之间的双向交叉注意(bidirectional cross attention)。

对于每个任务来说,我们只需要将任务特定的输入输出插入到BERT中然后端到端地微调即可。举例子来说,BERT的预训练输入句子A和句子B在微调时可以类比为:

①paraphrasing任务中的句子对;

②entailment任务中的hypothesis-premise对;

③question answering任务中的question-passage对;

④text classification或者sequence tagging任务中的text-∅对(也就是只输入一个text,不必一定需要两个句子)。

对于BERT的输出,对于一些token-level的任务,BERT的token表示将被输入到一个输出层,比如sequence tagging或者question answering任务;对于entailment或者sentiment analysis这样的任务,可以将 [CLS] 对应的表示输入到一个输出层。

我们使用 [CLS] 这个token的最后一层的隐层向量 作为聚合的表示,可以认为是sentence embedding。在微调时只引入一个新的权重 ,这里的 代表标签的数量,然后计算标准分类损失 。下图展示了BERT在GLUE上的效果:

在这个数据集上,我们将question和passage拼接起来作为一个输入序列(中间是 [SEP] )。在微调时引入一个start向量 和一个end向量 ,计算 和 的点积然后通过 函数作为word 是答案的span起始位置的概率: 。答案的终止位置也做上述类似处理。从 到 的候选区间的得分记作 ,我们挑选 的最大得分区间作为预测的结果。下图展示了BERT在SQuAD v11上的效果:

SQuAD v20有的question在提供的passage中没有答案存在。在微调时我们设置没有答案的问题的span的起始和结束位置都是 [CLS] 这个token,也就是start和end的可能性空间包含进了 [CLS] 的位置。在预测时,我们比较没有答案的span得分 和最优的有答案得分 。当 时,我们预测这是一个有答案的问题,这里的 用来在dev set上选择最优的 。下图展示了BERT在SQuAD v20上的效果:

微调时我们为BERT构建4个输入序列,每一个是所给的句子(句子A)和一个可能的延续(句子B)。然后引入一个向量,该向量和每一个输入对应的 [CLS] 的embedding的点积再通过一个 层来得到每个选择的得分。下图展示了BERT在SWAG上的效果:

BERT它是一种从大规模语料库中学得语言表征的模型,但是,在专业领域表现不佳。为了解决该问题,作者提出了一个基于知识图谱的语言表示模型K-BERT

但是,过多的考虑领域知识可能导致语句语义出现错误,这个问题被称为知识噪声(Knowledge noies, KN)。为了解决KN问题,K-BERT引入了soft-position和可视化矩阵(visible matrix)来限制来现在领域知识的影响。

BERT是基于大规模开放预料的预训练模型,对于下游任务,只需微调就可吸收专业领域知识。但是由于预训练和微调之间存在领域知识差异,因而在领域知识驱动型任务上,BERT无法取得满意的表现。

一种解决办法就是基于领域知识的语料库进行预训练,但是这样做耗时耗力,对大多数用户是不能承受的。

因此作者认为 引入知识图谱来使得模型成为领域专家 是一个很好的解决方案,因为:

但是,这种方法面临2个挑战:

于是作者提出了K-BERT模型,K-BERT可以加载任意BERT模型,然后很容易植入领域知识,而不需要在进行预训练。

随着2018年Google推出BERT模型,很多人从预训练过程和编码器两方面进行了优化,具体列举如下:

另一方面,知识图谱与词向量结合的研究早在预训练LR(Language Representation)模型之前就有人在做了:

上述方法的主要缺点是:

K-BERT的模型结构如下图所示:

模型结构包含如下4层:

Knowledge layer(KL)的作用是1)将知识图谱注入到句子中;2)完成句子树的转换。

给定知识图谱 ,输入一句话 ,经KL层后输出句子树

该过程分为两步:知识查询(K-Query)和知识注入(K-Inject)

公式化表示为:

Embedding layer(EL)的作用是将句子树转换成嵌入表达。和BERT一样,K-BERT的嵌入表示包括三部分:token embedding, position embedding 和 segment embedding。 关键是如何将句子树转换成一个序列,同时保留它的结构信息。

这种简单的处理使得句子失去了其结构信息,作者通过soft-position和visible matrix解决该问题。

Seeing layer是K-BERT和BERT的最大区别,也是本文方法有效的关键!

前文已经讲了引入KG可能造成KN问题,于是Seeing layer层的作用就是通过一个visible matrix来限制词与词之间的联系。

visible matrix 的定义如下:

表示两个词在同一支路上; 表示两个词不在同一支路上。 和 是hard-position index

Note: soft-position index 和 hard-position index 见图2

因为Transformer的编码器不能接收visible matrix作为输入,因此作者对其进行了改造,称为Mask-Transformer所谓Mask-Transformer,其实就是 mask-self-attention 块的堆叠。

符号定义同BERT:

Mask-Self-Attention

Mask-Self-Attention的数学定义如下:

其中:

如果 对 不可见,则 ,从而注意力

Mask-Transformer的实体图如下:

从上图可以看到, 对 是不可见的。但是 是可以间接影响到 的。

作者在12个中文NLP任务上对K-BERT进行了测试。

为了反应KG和RL(Representation Language)模型之间的角色关系,作者在训练X-BERT时保持与BERT的参数一致。

需要说明的是:在训练K-BERT时并不会加入KG。<font color=red>因为KG会将相关的两个实体绑定在一起,从而训练时被掩码的两个词意思相近或相等,从而导致语义损失??</font>KG是在接下游任务微调时或推理时加入的。

在开放域的8个中文NLP任务上对Google BERT和K-BERT做了比较,结果如下表:

总结如下:

作者分别在金融、法律和医学领域的NLP任务做了测试,见下表:

引入KG确实能带来效果的提升,尤其是医学领域的提升比较明显。

这一节作者主要对soft-position-index和visible matrix的效果进行了变量消除研究,结果如下图所示:

符号说明:

作者总结实验结果如下:

(1)消除soft-position或visible matrix的任何一项,效果都不及K-BERT;

(2)在Law_Q&A任务中,没有visible matrix的K-BERT的效果比BERT还差,证明了KN(Knowledge noise)问题的存在;

(3)在Law_Q&A任务中,K-BERT的收敛速度比BERT快。

作者将KG中的知识注入句子中,通过soft-postion-index和visible matrix控制知识的可见范围。实验怎么KG确实对知识驱动的专业领域任务有帮助。另外因为K-BERT可以做到和BERT参数共享,因此免去了K-BERT的预训练。

改进方向:

(1)查询知识时过滤掉一些不重要的知识;

(2)将方法拓展到其它语言模型。

大模型(Large Model)是指具有数百万或数十亿个参数的深度神经网络模型,这种模型经过专门的训练过程,能够对大规模数据进行复杂的处理和任务处理。

大模型需要占用大量的计算资源、存储空间、时间和电力等资源来保证它的训练和部署。相比之下,小模型(Small Model)是指具有较少参数的深度神经网络模型。小模型常常运行速度更快,也更加轻便,适用于一些计算资源和存储空间较少的设备或场景,例如移动设备或嵌入式设备。

在实际应用中,选择大模型或小模型取决于需要解决的问题和可用资源。大模型通常在自然语言处理、计算机视觉、推荐系统等方面表现良好,它们通常需要高性能计算资源的支持,例如标准的GPU或云端集群。

小模型适合解决一些简单的、小规模的问题,例如信用卡欺诈检测等,它们具有更快的推理速度,可以在低功耗设备上运行,例如智能手机或物联网设备。

大模型能解决的问题

大规模预训练可以有效地从大量标记和未标记的数据中捕获知识,通过将知识存储到大量的参数中并对特定任务进行微调,极大地扩展了模型的泛化能力。在应对不同场景时,不再从0开始,只需要少量的样本进行微调。

再比如BERT已经训练好了,我们要做下游任务,做一个句子的情感分析。那么就会在BERT的输入token中加入一个 class token,这个和vit的做法一样,encoder以后用class token的向量做一下linear transoformation 和softmax和gt做损失训练,所以这一步可以直接初始化BERT模型的预训练参数做finetune,效果要更好。收敛的又快,loss又低。

Albert,xlnet,bert,word2vec

通过预训练模型实现迁移学习,迁移学习本质上是在一个数据集上训练模型,然后对该模型进行调整,以在不同的数据集上执行不同的自然语言处理功能。

1 word2vec

线性模型

很神奇的地方,从而也说明高维空间映射的词向量可以很好体现真实世界中token之间的关系。如:king-man = queen-woman

负采样

由于训练词向量模型的目标不是为了得到一个多么精准的语言模型,而是为了获得它的副产物——词向量。所以要做到的不是在几万几十万个token中艰难计算softmax获得最优的那个词(就是预测的对于给定词的下一词),而只需能做到在几个词中找到对的那个词就行,这几个词包括一个正例(即直接给定的下一词),和随机产生的噪声词(采样抽取的几个负例),就是说训练一个sigmoid二分类器,只要模型能够从中找出正确的词就认为完成任务。

这种负采样思想也应用到之后的BERT里,只不过从word-level变成sentence-level,这样能获取句子间关联关系。

缺点是上下文无关(static):

因而为了让句子有一个整体含义(context),大家会在下游具体的NLP任务中基与词向量的序列做encoding操作。

下面是一个比较表格,模型不细讲了,预测目标这里的next word下一个词,是所有传统语言模型都做的事——寻找下一个词填什么。

BERT模型进一步增加词向量模型泛化能力,充分描述字符级、词级、句子级甚至句间关系特征。

真正的双向encoding:

Masked LM,类似完形填空,尽管仍旧看到所有位置信息,但需要预测的词已被特殊符号代替,可以放心双向encoding。

Transformer做encoder实现上下文相关(context):

使用transformer而不是bi-LSTM做encoder,可以有更深的层数、具有更好并行性。并且线性的Transformer比lstm更易免受mask标记影响,只需要通过self-attention减小mask标记权重即可,而lstm类似黑盒模型,很难确定其内部对于mask标记的处理方式。

提升至句子级别:

学习句子/句对关系表示,句子级负采样。首先给定的一个句子,下一句子正例(正确词),随机采样一句负例(随机采样词),句子级上来做二分类(即判断句子是当前句子的下一句还是噪声),类似word2vec的单词级负采样。

二、BERT细则

这里主要介绍BERT的三个亮点Masked LM、transformer、sentence-level。

1 Masked Language Model

原本叫cloze test,是完形填空的意思。

随机mask语料中15%的token,然后将masked token 位置输出的最终隐层向量送入softmax,来预测masked token。

这样输入一个句子,每次只预测句子中大概15%的词,所以BERT训练很慢。。。(但是google设备NB。。)

而对于盖住词的特殊标记,在下游NLP任务中不存在。因此,为了和后续任务保持一致,作者按一定的比例在需要预测的词位置上输入原词或者输入某个随机的词。如:my dog is hairy

2 Transformer —— attention is all you need

Transformer模型是2018年5月提出的,可以替代传统RNN和CNN的一种新的架构,用来实现机器翻译,论文名称是attention is all you need。无论是RNN还是CNN,在处理NLP任务时都有缺陷。CNN是其先天的卷积操作不很适合序列化的文本,RNN是其没有并行化,很容易超出内存限制(比如50tokens长度的句子就会占据很大的内存)。

下面左图是transformer模型一个结构,分成左边Nx框框的encoder和右边Nx框框的decoder,相较于RNN+attention常见的encoder-decoder之间的attention(上边的一个橙色框),还多出encoder和decoder内部的self-attention(下边的两个橙色框)。每个attention都有multi-head特征。最后,通过position encoding加入没考虑过的位置信息。

下面从multi-head attention,self-attention, position encoding几个角度介绍。

multi-head attention:

将一个词的vector切分成h个维度,求attention相似度时每个h维度计算。由于单词映射在高维空间作为向量形式,每一维空间都可以学到不同的特征,相邻空间所学结果更相似,相较于全体空间放到一起对应更加合理。比如对于vector-size=512的词向量,取h=8,每64个空间做一个attention,学到结果更细化。

self-attention:

每个词位的词都可以无视方向和距离,有机会直接和句子中的每个词encoding。比如上面右图这个句子,每个单词和同句其他单词之间都有一条边作为联系,边的颜色越深表明联系越强,而一般意义模糊的词语所连的边都比较深。比如:law,application,missing,opinion。。。

position encoding:

因为transformer既没有RNN的recurrence也没有CNN的convolution,但序列顺序信息很重要,比如你欠我100万明天要还和我欠你100万明天要还的含义截然不同。。。

transformer计算token的位置信息这里使用正弦波↓,类似模拟信号传播周期性变化。这样的循环函数可以一定程度上增加模型的泛化能力。

但BERT直接训练一个position embedding来保留位置信息,每个位置随机初始化一个向量,加入模型训练,最后就得到一个包含位置信息的embedding(简单粗暴。。),最后这个position embedding和word embedding的结合方式上,BERT选择直接相加。

3 sentence-level representation

在很多任务中,仅仅靠encoding是不足以完成任务的(这个只是学到了一堆token级的特征),还需要捕捉一些句子级的模式,来完成SLI、QA、dialogue等需要句子表示、句间交互与匹配的任务。对此,BERT又引入了另一个极其重要却又极其轻量级的任务,来试图把这种模式也学习到。

句子级负采样

句子级别的连续性预测任务,即预测输入BERT的两端文本是否为连续的文本。训练的时候,输入模型的第二个片段会以50%的概率从全部文本中随机选取,剩下50%的概率选取第一个片段的后续的文本。 即首先给定的一个句子(相当于word2vec中给定context),它下一个句子即为正例(相当于word2vec中的正确词),随机采样一个句子作为负例(相当于word2vec中随机采样的词),然后在该sentence-level上来做二分类(即判断句子是当前句子的下一句还是噪声)。

句子级表示

BERT是一个句子级别的语言模型,不像ELMo模型在与下游具体NLP任务拼接时需要每层加上权重做全局池化,BERT可以直接获得一整个句子的唯一向量表示。它在每个input前面加一个特殊的记号[CLS],然后让Transformer对[CLS]进行深度encoding,由于Transformer是可以无视空间和距离的把全局信息encoding进每个位置的,而[CLS]的最高隐层作为句子/句对的表示直接跟softmax的输出层连接,因此其作为梯度反向传播路径上的“关卡”,可以学到整个input的上层特征。

segment embedding

对于句对来说,EA和EB分别代表左句子和右句子;对于句子来说,只有EA。这个EA和EB也是随模型训练出来的。

如下图所示,最终输入结果会变成下面3个embedding拼接的表示。

首先,XLNet 是一个类似 BERT 的模型,而不是完全不同的模型。但这是一个非常有前途和潜力的。总之,XLNet是一种通用的自回归预训练方法。

那么什么是自回归(AR)语言模型?

AR语言模型是一种使用上下文词来预测下一个词的模型。但是在这里,上下文单词被限制在两个方向,前向或后向。

AR 语言模型的优势是擅长生成式自然语言处理任务。 因为在生成上下文时,通常是前向的。AR 语言模型很自然地适用于此类 NLP 任务。

但AR语言模型有一些缺点,它只能使用前向上下文或后向上下文,这意味着它不能同时使用前向和后向上下文。

自回归语言模型有优点有缺点,缺点是只能利用上文或者下文的信息,不能同时利用上文和下文的信息,当然,貌似ELMO这种双向都做,然后拼接看上去能够解决这个问题,因为融合模式过于简单,所以效果其实并不是太好。它的优点,其实跟下游NLP任务有关,比如生成类NLP任务,比如文本摘要,机器翻译等,在实际生成内容的时候,就是从左向右的,自回归语言模型天然匹配这个过程。而Bert这种DAE模式,在生成类NLP任务中,就面临训练过程和应用过程不一致的问题,导致生成类的NLP任务到目前为止都做不太好。

与 AR 语言模型不同,BERT 被归类为自动编码器(AE)语言模型。

AE 语言模型旨在从损坏的输入重建原始数据。

损坏的输入意味着我们在预训练阶段用 [MASK] 替换原始词 into 。目标是预测 into 得到原始句子。

AE 语言模型的优势是,它可以从向前和向后的方向看到上下文。

但 AE 语言模型也有其缺点。它在预训练中使用 [MASK] ,但这种人为的符号在调优时在真实数据中并不存在,会导致预训练-调优的差异。[MASK] 的另一个缺点是它假设预测(掩蔽的)词 在给定未屏蔽的 词 的情况下彼此独立。例如,我们有一句话“它表明住房危机已经变成银行危机”。我们掩蔽“银行业”和“危机”。在这里注意,我们知道掩蔽的“银行业”和“危机”包含彼此的隐含关系。但 AE 模型试图预测“银行业”给予未掩蔽的 词,并预测“危机”分别给出未掩蔽的 词。它忽略了“银行业”与“危机”之间的关系。换句话说,它假设预测(掩蔽)的标记彼此独立。但是我们知道模型应该学习预测(掩蔽)词之间的这种相关性来预测其中一个词。

作者想要强调的是,XLNet 提出了一种让 AR 语言模型从双向上下文中学习的新方法,以避免 MASK 方法在 AE 语言模型中带来的缺点。

XLNet的出发点就是:能否融合自回归LM和DAE LM两者的优点。就是说如果站在自回归LM的角度,如何引入和双向语言模型等价的效果;如果站在DAE LM的角度看,它本身是融入双向语言模型的,如何抛掉表面的那个[Mask]标记,让预训练和Fine-tuning保持一致。当然,XLNet还讲到了一个Bert被Mask单词之间相互独立的问题,我相信这个不太重要,原因后面会说。当然,我认为这点不重要的事情,纯粹是个人观点,出错难免,看看就完了,不用较真。

AR 语言模型只能向前或向后使用上下文,那么如何让它从双向上下文中学习呢?

语言模型包括两个阶段,即预训练阶段和调优阶段。XLNet 专注于预训练阶段。在预训练阶段,它提出了一个名为排列语言建模的新目标。我们可以从这个名称知道基本思想,它使用排列。

这里我们举一个例子来解释。序列的次序是 [x1, x2, x3, x4] 。这种序列的所有排列如下。

因此对于这 4 个词的([上传失败(image-c7a4e0-1570519576567)]

)句子,有 24([上传失败(image-d738b7-1570519576567)]

)个排列。

情景是我们想要预测 x3 。因此在 24 个排列中有 4 种模式,分别 x3 位于第 1 位,第 2 位,第 3 位,第 4 位。

当然,上面讲的仍然是基本思想。难点其实在于具体怎么做才能实现上述思想。首先,需要强调一点,尽管上面讲的是把句子X的单词排列组合后,再随机抽取例子作为输入,但是,实际上你是不能这么做的,因为Fine-tuning阶段你不可能也去排列组合原始输入。所以,就必须让预训练阶段的输入部分,看上去仍然是x1,x2,x3,x4这个输入顺序,但是可以在Transformer部分做些工作,来达成我们希望的目标。具体而言,XLNet采取了Attention掩码的机制,你可以理解为,当前的输入句子是X,要预测的单词Ti是第i个单词,前面1到i-1个单词,在输入部分观察,并没发生变化,该是谁还是谁。但是在Transformer内部,通过Attention掩码,从X的输入单词里面,也就是Ti的上文和下文单词中,随机选择i-1个,放到Ti的上文位置中,把其它单词的输入通过Attention掩码隐藏掉,于是就能够达成我们期望的目标(当然这个所谓放到Ti的上文位置,只是一种形象的说法,其实在内部,就是通过Attention Mask,把其它没有被选到的单词Mask掉,不让它们在预测单词Ti的时候发生作用,如此而已。看着就类似于把这些被选中的单词放到了上文Context_before的位置了)。具体实现的时候,XLNet是用“双流自注意力模型”实现的,细节可以参考论文,但是基本思想就如上所述,双流自注意力机制只是实现这个思想的具体方式,理论上,你可以想出其它具体实现方式来实现这个基本思想,也能达成让Ti看到下文单词的目标。

上面说的Attention掩码,我估计你还是没了解它的意思,我再用例子解释一下。Attention Mask的机制,核心就是说,尽管当前输入看上去仍然是x1->x2->x3->x4,但是我们已经改成随机排列组合的另外一个顺序x3->x2->x4->x1了,如果用这个例子用来从左到右训练LM,意味着当预测x2的时候,它只能看到上文x3;当预测x4的时候,只能看到上文x3和x2,以此类推……这样,比如对于x2来说,就看到了下文x3了。这种在输入侧维持表面的X句子单词顺序,但是其实在Transformer内部,看到的已经是被重新排列组合后的顺序,是通过Attention掩码来实现的。如上图所示,输入看上去仍然是x1,x2,x3,x4,可以通过不同的掩码矩阵,让当前单词Xi只能看到被排列组合后的顺序x3->x2->x4->x1中自己前面的单词。这样就在内部改成了被预测单词同时看到上下文单词,但是输入侧看上去仍然维持原先的单词顺序了。关键要看明白上图右侧那个掩码矩阵,我相信很多人刚开始没看明白,因为我刚开始也没看明白,因为没有标出掩码矩阵的单词坐标,它的坐标是1-2-3-4,就是表面那个X的单词顺序,通过掩码矩阵,就能改成你想要的排列组合,并让当前单词看到它该看到的所谓上文,其实是掺杂了上文和下文的内容。这是attention mask来实现排列组合的背后的意思。

ALBERT相比于BERT的改进

ALBERT也是采用和BERT一样的Transformer的encoder结果,激活函数使用的也是GELU,在讲解下面的内容前,我们规定几个参数,词的embedding我们设置为E,encoder的层数我们设置为L,hidden size即encoder的输出值的维度我们设置为H,前馈神经网络的节点数设置为4H,attention的head个数设置为H/64。

在ALBERT中主要有三个改进方向。

1、对Embedding因式分解(Factorized embedding parameterization)

在BERT中,词embedding与encoder输出的embedding维度是一样的都是768。但是ALBERT认为,词级别的embedding是没有上下文依赖的表述,而隐藏层的输出值不仅包括了词本生的意思还包括一些上下文信息,理论上来说隐藏层的表述包含的信息应该更多一些,因此应该让H>>E,所以ALBERT的词向量的维度是小于encoder输出值维度的。

在NLP任务中,通常词典都会很大,embedding matrix的大小是E×V,如果和BERT一样让H=E,那么embedding matrix的参数量会很大,并且反向传播的过程中,更新的内容也比较稀疏。

结合上述说的两个点,ALBERT采用了一种因式分解的方法来降低参数量。首先把one-hot向量映射到一个低维度的空间,大小为E,然后再映射到一个高维度的空间,说白了就是先经过一个维度很低的embedding matrix,然后再经过一个高维度matrix把维度变到隐藏层的空间内,从而把参数量从O(V×H) O(V×H)O(V×H)降低到了O(V×E+E×H) O(V×E+E×H)O(V×E+E×H),当E<<H时参数量减少的很明显。

下图是E选择不同值的一个实验结果,尴尬的是,在不采用参数共享优化方案时E设置为768效果反而好一些,在采用了参数共享优化方案时E取128效果更好一些。

2、跨层的参数共享(Cross-layer parameter sharing)

在ALBERT还提出了一种参数共享的方法,Transformer中共享参数有多种方案,只共享全连接层,只共享attention层,ALBERT结合了上述两种方案,全连接层与attention层都进行参数共享,也就是说共享encoder内的所有参数,同样量级下的Transformer采用该方案后实际上效果是有下降的,但是参数量减少了很多,训练速度也提升了很多。

下图是BERT与ALBERT的一个对比,以base为例,BERT的参数是108M,而ALBERT仅有12M,但是效果的确相比BERT降低了两个点。由于其速度快的原因,我们再以BERT xlarge为参照标准其参数是1280M,假设其训练速度是1,ALBERT的xxlarge版本的训练速度是其12倍,并且参数也才223M,评判标准的平均值也达到了最高的887

除了上述说了训练速度快之外,ALBERT每一层的输出的embedding相比于BERT来说震荡幅度更小一些。下图是不同的层的输出值的L2距离与cosine相似度,可见参数共享其实是有稳定网络参数的作用的。

3、句间连贯(Inter-sentence coherence loss)

BERT的NSP任务实际上是一个二分类,训练数据的正样本是通过采样同一个文档中的两个连续的句子,而负样本是通过采用两个不同的文档的句子。该任务主要是希望能提高下游任务的效果,例如NLI自然语言推理任务。但是后续的研究发现该任务效果并不好,主要原因是因为其任务过于简单。NSP其实包含了两个子任务,主题预测与关系一致性预测,但是主题预测相比于关系一致性预测简单太多了,并且在MLM任务中其实也有类型的效果。

这里提一下为啥包含了主题预测,因为正样本是在同一个文档中选取的,负样本是在不同的文档选取的,假如我们有2个文档,一个是娱乐相关的,一个是新中国成立70周年相关的,那么负样本选择的内容就是不同的主题,而正样都在娱乐文档中选择的话预测出来的主题就是娱乐,在新中国成立70周年的文档中选择的话就是后者这个主题了。

在ALBERT中,为了只保留一致性任务去除主题识别的影响,提出了一个新的任务 sentence-order prediction(SOP),SOP的正样本和NSP的获取方式是一样的,负样本把正样本的顺序反转即可。SOP因为实在同一个文档中选的,其只关注句子的顺序并没有主题方面的影响。并且SOP能解决NSP的任务,但是NSP并不能解决SOP的任务,该任务的添加给最终的结果提升了一个点。

4、移除dropout

除了上面提到的三个主要优化点,ALBERT的作者还发现一个很有意思的点,ALBERT在训练了100w步之后,模型依旧没有过拟合,于是乎作者果断移除了dropout,没想到对下游任务的效果竟然有一定的提升。这也是业界第一次发现dropout对大规模的预训练模型会造成负面影响。

参考链接:

彻底搞懂BERT

什么是 XLNet,为何它会超越 BERT?

XLNet:运行机制及和Bert的异同比较

一文揭开ALBERT的神秘面纱

不懂word2vec,还敢说自己是做NLP?

前期知识准备 :RNN, CNN, BERT, SemEval-2010 Task 8数据集, F1值

关系分类是一个重要的NLP任务,其主要目标是提取出实体之间的关系。最先进的关系分类方法主要是基于CNN或RNN。最近,预训练BERT模型在许多NLP的分类和序列标注任务中都获得了非常好的结果。关系分类不同于其他NLP任务的主要原因是它既依赖于句子的信息,又依赖于两个目标实体的信息。在本文中,我们提出了一个用来解决关系分类任务的模型,它既利用了预训练的BERT语言模型,又结合来自目标实体的信息。我们定位目标实体并通过预训练结构传递信息,同时还结合了两个实体的相关编码。在SemEval-2010 Task 8任务上,相比目前的最优模型我们的方法获得了有效的提升。

R-BERT的预训练完全采用BERT模型,输入句子为单句,因此不需要添加[SEP]。其输出分为三部分,分别是[CLS]隐含状态向量和两个实体的隐含状态向量。作者认为第一部分可以保存句子的语义内容,后两个部分可以保存两个实体的信息。

其中,i ,j分别为第一个实体的首、尾字符位置;k,m分别为第二个实体的首、尾字符位置。神经网络中,权重系数和偏置系数均共享,即 W0 = W1 = W2,b0 = b1 = b2。

该数据集包含9类语义关系和一个Other类别,规定某关系如果不属于9类语义关系中的一种,则其属于Other类别。9类关系分别是:Cause-Effect、Component-Whole、Content-Container、Entity-Destination、Entity-Origin、Instrument-Angency、Member-Collection、Message-Topic和Product-Producer。数据集中共有10717个句子,8000个句子为训练集,2717个句子为测试集,每个句子包含e1和e2两个名词以及与该句子相关的关系类型。需要注意的是,关系是有向的,即关系(e1, e2)和关系(e2, e1)不同。

作者还在相同的数据集上比较了其他多种模型,其中包括:SVM、RNN、MVRNN、CNN+Softmax、FCM、CR-CNN、Attention CNN、Att-Pooling-CNN和Entity Attention Bi-LSTM,以F1值作为评测标准,其结果如下:

可见,R-BERT的F1值达到了8925,相比于其他方法有着明显的优势。

为了探究BERT模型之外的部分对最后识别结果的影响,作者分别进行了如下额外实验,并得到结论:

(1)去除了实体前后的标识符,这种做法会使模型的F1值从8925%降到8798%,说明了标识符可以帮助提供实体信息。

(2)在BERT输出层仅使用[CLS]句子向量而不利用实体向量,这样会使得模型F1值从8925%降到8799%,说明主动明确实体信息对模型是有帮助的。

想办法给模型明确实体的位置对于关系抽取问题精度的提升是有帮助的。

https://zhuanlanzhihucom/p/78445887

https://blogcsdnnet/qq_36426650/article/details/96629835

欢迎分享,转载请注明来源:浪漫分享网

原文地址:https://hunlipic.com/qinggan/1076018.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-07-12
下一篇2023-07-12

发表评论

登录后才能评论

评论列表(0条)

    保存