Knowledge-Injected BERTs

时间秒杀一切 提交于 2020-02-11 21:17:17

1

从任务本身来看,BERT本质上是一个通用的语言模型,在进行预训练时,我们希望它能够学习到词表中每个词的词向量,即对我们平时所接触到的自然语言进行编码(encode),使之转化成模型能理解的语言。

这样的设定本身存在一个小问题:通过模型编码之后的语言向量,人类无法理解,那如何才能确保模型正确地学到我们希望的知识呢?一个解决方案是,我们将模型的输出映射到原来的词表中,然后将概率最大的单词作为模型的预测结果。如果这个单词与我们模型的输入一致,即意为着模型确实知道了这个单词的含义。

BERT将上述解决方案巧妙实现为一个完形填空的过程,即随即遮住一些单词,只给模型上下文信息,让模型去预测这些单词的表示。此外,为了让模型对句子之间的段落关系有更好的理解,我们可以让它去尝试预测两个句子之间的关系:是否连续——我们只需要留出一个token的空位来进行这个二分类训练就可以。

这些设计保证了模型能够同时建模句子内部的词法信息与外部的关系信息,而输入的数据本身除了一个预先定义好的词表外,不需要任何多余的监督信号,所以能在大量语料上进行预训练。合理的任务设计+大量预料的支持,让BERT有了超越同侪的效果。

随着对任务理解的加深,有些人开始提出了这样的问题:

如果完形填空任务中遮住的不是一个单词,而是一个短语,是不是bert就能够更好的对短语进行辨析?如果我们增加可以学习到更多知识的任务,BERT会不会变得更好?——如果我们设计一些任务不停地训练它,让它一直学习下去呢?

从直觉上说,如果我们遮住一个短语(phrase),而非一个单词(word),即便BERT在大部分任务中并没有变好,我们也有理由相信它会在一些需要短语知识的任务中变好(如NER);而如果我们增加更多的任务,尝试给它灌输更多的知识(并且它的复杂度本身又足以支撑它在诸多任务的填鸭式教育中不会头昏)的话,它将同时编码更多方面的信息。

上面的思路似乎值得一试,然而大部分的想法都需要外部知识的支持。例如:如果我们在一个句子的随机位置遮住一个随即长度的短语,这个短语大部分情况下不会具有值得学习的实质性意义——而如果我们有办法将结构化的信息注入到大量的原始语料库中去,我们就能知道哪些短语是有意义的了,以此就可以进行更多的探索性实验。

这也是本文所关注的重点:将外部知识注入到预训练语言模型中。具体而言,将探讨下面三个问题:

  • 我们可以把哪些信息引入BERT的预训练语料中,以使BERT在某些或者全部的任务上有更好的表现?
  • 如何根据这个信息的内容,针对性得设计有意义又易于实现的预训练任务?
  • 这些信息的加入是否能够带来我们预期的模型提升?

本文近探讨着眼于对通用NLP任务提升的paper。在arXiv上也有相当一部分的paper尝试了将结构化的知识注入到BERT中,随后进行一些特定领域的应用(大部分基于commonsense的QA任务,少部分的文档分类或药品推荐任务),有感兴趣的读者可以自行搜索阅读。

我将默认读者已经对 BERT 的结构与任务具有一定的了解,不花时间介绍相关的背景知识。对于想了解这些知识的同学,我觉得[ BERT 的原文 ][https://arxiv.org/abs/1810.04805]、 BERT 中的核心结构:Transformer,以及 Transformer 的图形化解读 这三个资料值得一读。

2 Knowledge Enhanced BERTs

overview

正如上文所说,如果要对bert进行改动,更易于尝试的方法就是将mask这个行为从token level提升到phrase level,SpanBERT[1]就进行了这样的一次尝试。尽管SpanBERT中并没有使用到任何外部的知识,我也会对它的预训练策略进行简单的论述——而在了解SpanBERT的思路以后,对于一些殊途同归的实体mask策略就更容易理解了。

图1. Knowledge-injected BERTs的思路简图
图1是大部分模型在进行知识注入时所采取的策略,它们或多或少地修改了传统BERT的任务与结构。

其中,大部分的paper旨在修改模型的预训练任务:与传统BERT的预训练策略不同的是,现在我们能股根据手头上已有的外部知识,来更加精确地选择我们的mask目标——也就是特定的实体了(WKLM [5] / ERNIE-baidu [6]);此外,我们也能人工设计一些预训练任务,来针对性地特高BERT在词法、语法或句法方面的表现(LIBERT [7])。

ERNIE-thu [8]做得更深一步,在增加一项预训练目标的基础上修改了部分的模型结构,将其一半的transformer层用来同时编码token与实体,并注入实体信息到所对其的token上。

K-BERT[9] 在输入的embedding上做了尝试:它直接使用知识库中的信息拓展了原有的输入,然后使用soft-position来对齐插入单词与原有单词之间的距离。由于在绝对位置上,插入的单词仍然影响到了整体的self-attention计算,所以K-BERT也修改了部分的模型结构,以纠正这个负面影响。

最后,尽管没有出现在图中,ERNIE2.0-baidu [10]将预训练任务数量扩展到了7个,然后采用多任务序贯训练模式,来保证模型在所有任务上都有很好的效果。截止本文写作之时(2020.01.20),ERNIE2.0 仍然居于 GLUE benchmark 榜首,紧随其后的是前几天阿里达摩院的 Alice v2。

[5] https://arxiv.org/abs/1912.09637

[6] https://arxiv.org/abs/1904.09223

[7] https://arxiv.org/abs/1909.02339

[8] https://arxiv.org/abs/1905.07129

[9] https://arxiv.org/abs/1909.07606

[10] https://arxiv.org/abs/1907.12412

1)一次简单的试探:SpanBERT

如果要对BERT进行改进,最容易想到的就是修改mask的策略,SpanBERT的思路也非常简单:

1.随即选择一个长度,这个长度是从一个集合分布的中采样出来的;几何分布保证了采样出来的长度更倾向于短而非很长;

2.随即在句子中选择一个起始点,将从这个起始点开始的、指定长度的token(subword在这里不算做一个独立的token)序列全部mask掉;

3.重复1、2两个步骤,直到任务设定的需要mask的数量够了为止。

与BERT相同,SpanBERT也总共mask每个句子中15%的token。在这15%的token(span)中,每个span有80%的概率被直接替换成[MASK],10%的概率被其他随机的span替换,最后10%的概率保留原词不变。

图2. SpanBERT中一次mask的示例
上图是这种mask策略的一个简单示例:在这里,我们随即选择到了一个长度为4的span,选择起始位置在an处,因此我们mask的内容就是:an American football game;我们将这四个单词mask住,然后让模型通过前后文+当前单词表示来尝试复原每个单词。具体操作如下:

在尝试复原单词football时:使用了当前单词的输入x_7来尝试复原football在词表中的下标(这也就是传统bert中的MLM任务);除此以外,SpanBERT的作者提出了一个叫Span Boundary Objective(SBO)的任务,即使用当前span的前后各一个单词的表示,以及当前待预测单词的位置下标来复原当前单词。

与传统的BERT复原单个token的预期不同,作者希望通过人为的设定,能够赋予模型通过上下文来复原整个span的能力——当然,精确到span中每个具体的token时,我们还需要加入当前token的位置信息,这就是整个SBO任务设计的初衷。

通过预期的设定,作者也得到了想要的结果:SpanBERT在GLUE的所有实体相关任务上相对传统BERT有更好的表现:

 图3. SpanBERT的结果。作者在很多数据集上做了比较,在此只截取了部分GLUE数据集上的结果
可以看到,SpanBERT在QNLI和RET两个数据上有非常显著的提升,此外在SQuAD1.1和2.0中也有显著的提升(不在图中)。作者认为SpanBERT在QA任务上的提升是因为同时聚合了token level和phrase level的信息。

篇幅所限(以及作者太懒),对其他比较实验有兴趣的同学,可以去查看原文的第五部分,里面对 QA / Conreference Resolution / Relation Extraction 三类数据集与 GLUE 都做了详细的评测。另外,作者还在文中详细论证了 NSP 任务在预训练任务中的有效性,得到移除 NSP 任务能使模型学得更好的结论,由于与本文核心主题无关,在此不进行详述。

2)Entity信息的使用:WKLM&ERNIE1.0-baidu

说完SpanBERT,让我们认识它另外两个孪生兄弟:WKLM和ERNIE1.0-baidu、与前者不同,后面两位兄弟都正式使用了知识库中的entity信息,虽然它们的预训练任务的设计与训练目标有所不同,但将他们合在一起讲,能更好的加深对mask entity这一策略的印象。

话说回来,其实在SpanBERT中也已经对mask entity这一想法进行了简单尝试(当然作者首先使用了一个现成的entity抽取工具来抽取句子中的entity,详情参阅原文的Ablation Test部分),但并没有work。

对于这个结果,私以为是预训练的任务objective设计与这个任务并不match(换句话说就是相性不合)导致的。可能造成这种情况的原因是:SBO中只使用了entity前后各一个token,以及其中各个token的位置信息来预测当前token,对于随即截取的span,这个目标设计会work,因为在绝大多数情况下我们阶段了很多有意义的信息,所以前后的那个token将对预测span中的token提供很大的信息量。而对于本身封装了一个很强信息的命名实体来说,前后的token就无法提供那么多的信息了,导致这个预训练任务结果不好。

举例来说:

怎么会这样呢,明明我先来的。

这个句子中,如果我们将“”先是别成了一个人名,并将它mask掉之后,这两个token并不能给模型重新复原出“”这个entity提供很好的信息。其实从直觉上来讲,的后面一般有更大的可能性是,相对还好一些,而这个token,对于复原任务着实不会提供什么帮助。

而如果我们采用SpanBERT中的随即mask,mask掉了我先之后,前后的单词反而对这个span的关联性增强了,对于复原其中每个token就能提供更多的信息。

所以,在WKLM与ERNIE1.0中,由于使用了外部知识库,可以采用更多不同的预训练任务的定义方式:

WKLM

WKLM主要才采取的是同类替换的思路,以期增强模型对于事实知识的建模:具体来说,对于某个entity,我们使用与它同类型的另一个entity来替换它。这样就能构造一个在语法上正确,但在事实上错误的负样本——当然,原始句子是正样本。作为训练目标,我们让模型来判断每个entity是否被替换,这样模型就能够学到因果事实。一个替换的样本如下图所示:
 图4. WKLM构造负样本的一个示例
为了实现这个训练目标,作者定义了增加了一个预训练的而分类任务,即对于每个entity的输出,模型需要判断这个entity是否被经过替换。当然,传统BERT中的MLM任务仍然被保留了下来以建模上下文的关系,但是token得mask只会在entity以外进行,并且mask的概率从15%减小到了5%。

此外,我们需要准备对应的数据以保证训练任务顺利进行。

  • **找到句子中的实体:**在English Wikipedia中本身已经存在了实体的anchor link;我们通过link找到这个实体以及实体所有的别名,并通过字符串匹配将文本中所有的别名也识别出来,都视作entity。
  • 构造负样本:如上文所说,每个原始句子我们都通过替换与原始entity相同类型的另一个entity来构造对应的负样本。负样本的比例是1:10;此外,作者限定在不会出现两个连续的entity同时被mask的情况,以此来减少虽然两个entity都被替换了,但是替换完以后的两个entity所构造的新句子正好符合事实的情况。

在使用外部entity linking工具的情况下,该训练过程可以不仅局限在English WIkipedia数据上,所以这个方法也有很强的扩展性。

作者在QA与entity typing的数据集上进行了测试,并对MLM进行了ablation test,事实证明了模型的有效性(For detail,请查阅原文第三部分)。

ERNIE1.0-baidu

ERNIE1.0-baidu 采用的思路是多阶段学习,(清华和华为诺亚实验室联合发表的另一篇paper也叫ERNIE,ERNIE-thu)

在知道了SpanBERT和WKLM的预训练思路之后,我们可以来这样总结ERNIE-baidu的设计思路:集百家之长。ERNIE-baidu的预训练分为了三个阶段:

  • 1.Baisc-Level Masking:和传统BERT一样,以15%的概率来mask句子中的token;
  • 2.Phrase-Level Masking:和SpanBERT一样随即mask一些phrase,不同的是ERNIE-baidu中使用了外部工具来辅助识别句子中的phrase,然后mask整个phrase,最后通过模型的输出来复原phrase中的每一个token;
  • 3.Entity-Level Masking:与WKLM相似,随即mask了entity。相较于上下阶段的phrase,entity是一种具体的存在,所以会保有句子中更多更重要的信息。

在依次通过三个阶段的学习过程之后,模型同时具有了词级别的表示能力,短语级别的表示能力与实体级别的表示能力,把更丰富的语法知识集成到了模型中。

如此来看,ERNIE-baidu 主要是在预训练的任务上做了增强。为了进一步增强模型在QA上的效果,ERNIE修改了传统bert中的segment enbedding,将它原有的表示上下两个句子的功能转换为了表示Query—Response的功能;在此设定上,就能够允许模型encode多阶段的对话信息(如QRQ、QRR、QQR等),以期在QA任务上有更好的表现。

作者在语言推理:XNLI、语义相似度:LCQMC、NER:MSRA-NER、情感分析:ChnSentiCorp 与检索式 QA:NLPCC-DBQA 五个任务上进行了效果的测试。

图5. ERNIE-baidu实验结果
结果表明,相对于传统的BERT,ERNIE在五个任务上都有一定的提升,其中在语言推理、NER、情感分析与QA上提升相对比较显著,而在计算语义相似度的任务上提升相对不够明显。

私以为这与预定义的训练目标有着比较直接的关系,因为尽管我们预期的目标是提行模型在语义上的理解,但是实际上mask entity这种形式并不能非常直观的提升模型对于语义的认知(如果mask entity,直接加强的是模型通过上下文来对短语进行完形填空的能力,如果我们通过定义预训练任务来将这种能力不直观地转换到其他目标上。

读者可以通过在 AAAI-20 上发表的 SemBERT来进一步了解如何通过设计预训练任务的方式来直接地提升模型在语法上面的结果,在此不再赘述。

3)词法层面的直接加强:LIBERT

现在我们抛开所有的entity mask策略到一边,重新审视上面引出的问题:

如何借助外部已有的知识,通过预训练任务的方式,来直观地加入一些词法、语法、句法信息到模型中呢》

作为开阔思路的甜点,我们来简单了解下Linguistically——informed BERT(LIBERT)是如何做到的。

除了English WIkipidea之外,我们可以在一些其他的知识库中获得另外的信息,比如:

  • 从WordNet与Roget’s Thesaurus中能过获得同义词对,如:car & automobile.
  • 从WordNet中能获得上下位词对,如:car & vehicle.

LIBERT通过以下步骤来生成额外的训练样本:

    1. 首先,选择一个静态的词向量生成方法,在给定样本后能够产生词的向量表示;使用这个静态的词向量,目的是为了使得我们能够直观地衡量两个词之间的词义距离(如文中使用的最直接的cos相似度方法);
  • 2.我们将同义词对与上下位词都视为正例,将所有词对划分为指定大小的batch;
    在这里插入图片描述
  • 4.直接将词对中两个词合在一起作为一个句子,并在中间插入[SEP]符号,前面的词使用segment id=0来标识,后面的使用1来标识。
    图6. 通过近义词对构造的最终输入形式

4)模型结构的百花齐放:K-BERT与BERT-thu

通过上面的了解,我们已经对外部知识所能起到的作用,以及如何基于此设计合适的预训练任务有了充分的了解。接下来,K-BERT与ERNIE-thu将给我们以结构上的启发:如何通过修改模型结构,以更匹配我们所想要制定的预训练任务呢?

ERNIE-thu给出了一种思路:将entity的信息在模型预训练时注入到所对齐的token中。具体来说,保留了传统BERT中前6层的transformer来建模token的上下文信息,并将之后的六层改成了下图的结构:
 图8. ERNIE-thu模型结构,使用右侧的Aggregator替换了原来的BERT后6层transformer
想要把entity信息注入到原有token’中,需要解决三个问题:

  • 如何从句子中提取出一个entity,并将其与句子中的token对其?
  • 在增强token信息时,如何提取出entity中蕴含的信息?
  • 如何具体实现这个增强?

首先,提取entity的途径有很多,上文已经介绍了基于Wiki的anchor link与外部的NER工具,ERNIE-thu中使用了前者进行实体的提取与对齐。值得注意的是,如图中所示,作者仅将entity于其第一个token进行对其,也即entity中的信息只会与这个token发生直接的交互。

为了简单直接地获得entity中所包含的信息,作者使用了一个知识图谱的embedding工具:TransE 来通过原始的知识图谱就获得entity的向量表示,随后作者在模型预训练过程中控制这个表示不变,来进行信息的交互。这样做的目的是可以直接地观察到仅仅将entity的信息注入到原始文本中,将对模型产生什么影响。

在训练过程中,句子极其对应的entity将同时放入上图的Aggregator中,entity随后将通过一个Multi-Head Attention来建模所有entity之间的关系信息,随后与前面对其的token,共同喂到一个Information Fusion层(从模型结构上来看,这个Fusion层替换了Transformer中原来的FFN)

最后,作者将变换吼输出的entity embedding经过softmax之后,映射到输入句子所有的entity中的一个。

K-BERT从模型的输入出发,将输入的句子进行了巧妙地重新排列,来实现了注入外部知识的目的。

对于一个已经做完知识图谱对其的句子输入,K-BERT所做的事情不可谓不简单粗暴:它直接将与当前实体e相关的知识加入到e的后头,就如下图所示:
图11. K-BERT的输入
当然这样的做法会带来两个很严重的问题:

1.首先,外部的关系(如:CEO、Apple、is_a等)的表示会严重影响原有句子的分布,加入了很多无关的信息,导致模型学习效果变差;

2.其次,在做MHA的时候,插入的一些token影响了原本句子之间的位置关系,比如原来Cook与is之间的距离差为1,现在变成了3。

K-BERT做了两个十分巧妙地变换,解决了上述两个问题:

首先,除了传统BERT中的positional encoding方法(对应于上图的hard-position encoding)以外,作者提出了另一种编码模式soft-position encoding,即上图红色表示的数字。这种编码体系的好处在于允许token出现在同一位置,保持了原有token之间的位置信息不变。可以看到,这种编码体系下,Cook与is之间的距离仍保持为1;

其次,尽管我们使用soft-position encoding的方式保持了相对位置不变,但是喂到bert模型中做MHA时,在绝对位置上Apple仍然影响了is的信息,因此作者提出了可视矩阵(Visible Matrix),控制了相关的知识之间的相互影响,从而避免了知识对原有句子的分布产生影响。

最后之前:ERNIE2.0-baidu

ERNIE2.0-baidu实属预训练任务定义值王者,大力出奇迹之践行者。百度毫不吝啬地在文中提出了高达7中预训练任务,涵盖了单词级别的大小写识别、频率识别与entity mask,结构级别的句子重排序任务、句间距离预测任务,语义级别的修辞关系与检索相关度任务,目前仍霸榜GLUE benchmark。

为了很好地平衡所有预训练任务之间的关系,不让模型遗忘训练顺序靠前的任务,作者也提出了多阶段多任务warm-up式训练过程。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!