李宏毅老师2020新课深度学习与人类语言处理课程主页:
http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html
视频链接地址:
https://www.bilibili.com/video/BV1RE411g7rQ
图片均截自课程PPT、且已得到李宏毅老师的许可:)
上篇中(P19)我们讲解以 BERT 为代表的语言模型,进行介绍以及模型的微调,文章将从三个方面讲解:
1 What is pre-train model (P19)
2 How to fine-tune (P19)
3 How to pre-train (P20)
并了解了预训练模型有关概念与技术:从BERT、XLNet、MASS/BART、UniLM 到 ELECTRA
而在本篇中,我们讲解 Coreference Resolution,如何“硬train一发”来解指代消解。
Winograd Schema Challenge 威诺格拉德模式挑战赛,它的诞生是为了取代图灵测试,因为现在很多模型都声称已能够通过图灵测试骗过人类了,但其实大多数都是使用一种话术来欺骗人类的,它根本没有理解语言,只是相当于接话。在此问题下,本挑战赛诞生希望模型可以解决更复杂的任务,如指代消解。
上图所示,”这个奖杯在棕色行李箱中放不下因为它太大了。是什么太大了?“ 和 ”这个奖杯在棕色行李箱中放不下因为它太小了。是什么太小了?“,对于人类而言,这两个指代问题,很容易解决。但对于机器而言,这个指代消解任务是很困难的,甚至机器需要对这个物理世界有一定的理解才能解决这个问题。
其实,对于人类而言,当我们在说一段句子的时候,而我们其实是在对方心里面建立一个场景的,会有一些文字片段去指代这个场景里的实体。
如上图,我今天对你说”钟佳播瞪着乐咖举起他的拳头说“,你会知道这个世界上有一个人叫做”钟佳播“,还有另一个人叫”乐咖“,他们之间发生了一些事请,这个构建场景的词汇就叫做mention。如果两个mention指的是同一个实体,如本例中的”钟佳播“和”他“都指的是同一个人,这种现象就叫做corefer,而把这个corefer找出来的过程就叫做 Coreference Resolution。如果这个mention只出现一次,就叫singleton。有指代关系的两个词,先出现的叫做antecedent,后出现的叫做anaphor。
注:请一定要理解上面的术语,下面的训练任务与它有关,不理解mention可能会完全不懂训练任务。笔者个人理解mention不仅仅是人和人的指代,还有一些特别的,但老师没讲,只是说mention的定义是很模糊的,在此你只需将mention理解为人名和人名的指代代词或者其他有意义的词和其代词即可。
其实在 Coreference Resolution 指代消解任务中,是有两个任务目标的:
这样的训练任务是不包含在之前(P17任务精简或17-1、2细节版)讲的八大类经典NLP任务,因此解法也比较不同寻常。
同学问答环节:
提问:如果是复数,那该怎么打标签?就是 组会不会有重叠
回答:不会有重叠,如果今天又加了一个句子,”他们是好朋友“,这里的他们又会是一个新的组 {他们,钟佳播,乐咖}。
提问:找mention的过程与NER命名实体识别会有点像
回答:是也不是,如果是NER的话,只要找出所有的mention就可以了。但是没办法像上图所示,标记出mention间的覆盖关系,如图的下划线,就是”他“和”他的拳头“都是mention。
提问:anaphor,有指代关系的后出现的词一定是代词么
回答:不一定的,如上图的”它不锤倒高墙“改为”人民的法槌不锤倒高墙“,那么此时的第二个组Cluster 2就由{他的拳头,它,它}会变为{他的拳头,人民的法槌,它}
那我们究竟怎么通过“硬train一发”的方法来解决上述的两个任务目标呢?
首先,先考虑任务目标1:找出所有的mention。
其实,这就是一个二分类的问题,我们将N个tokens的sequence序列,依次取其中的一小段span进行二分类检测。但请注意,我们选取的是一小段,而非一个一个的token去做二分类检测,如果仅仅使用单个token去判断是否包含在一个mention里面是不行的,因为这样就没办法考虑到mention间的叠加关系,如“他的拳头”是一个mention,而“他”也是一个mention这样的组合mention。所以我们只能判断整个span。
具体而言,对于N个tokens组成的序列,我们会进行 C n 2 C_{n}^2 Cn2的取法,每一次取两个token作为span一小段的首尾,将这两个token间包括这两个token组成的span段进行二分类的判断是否为mention,因此需要判断 N ( N − 1 ) 2 \frac{N(N-1)}{2} 2N(N−1)个spans。
而在训练时,我们是已经有 有标注的数据集,知道一个序列中,有哪个token会是mention。将那些是mention的作为label标签=1的正样本,将那些不是mention的作为label标签=2的负样本进行训练。
除了找出所有mention这一任务目标外,对于任务目标2:找出哪些mention是同一组的。
这一样是个二分类问题,此时二分类器的输入不再是一个,而是两个mention,去判断这两个mention是否是同一个实体,也就是说是不是该放在同一组里。
对于这句话“钟佳播瞪着乐咖举起他的拳头说:【今天它不锤倒高墙】”
例如,如上图,“钟佳播”和“乐咖”这两个mention作为输入时,将输出No。“钟佳播”和“他”这两个mention作为输入时,将输出Yes。
同样,如果我们从上一个训练任务中,得到了K个mentions,那么我们就需要判断 K ( K − 1 ) 2 \frac{K(K-1)}{2} 2K(K−1)次的二分类。
按照上面的任务目标,分成两个步骤还不能算今天的“硬train一发”的端到端模型架构。我们也要把这两个二分类器组合在一起成为一个二分类器,这样就是一个模型的训练问题了。
具体而言,这个二分类器的输入是两个span段,判断这两个span是否都是mention,这两个mention是不是指的都是同一个实体,如果这两点都满足才能输出Yes,否则No。也就是说即使这两个span都是mention但不属于同一个实体,那也是输出No的。
同样,如果我们有N个tokens,也就有 N ( N − 1 ) 2 \frac{N(N-1)}{2} 2N(N−1)个spans,并假设这个数值就是K。接下来,我们要在这K个span里两两抽取,会抽 C K 2 C_{K}^2 CK2次,也就是说这个二分类器会运行 K ( K − 1 ) 2 \frac{K(K-1)}{2} 2K(K−1)次,时间复杂度大约是O(N^4)。
在训练时,我们只需要依次放入两个spans到二分类器中进行判断,如果这两个span都是mention且指的是同一个实体,就输出Yes。
其实,这里是省略了一个 Mention Ranking Model,如果真的像把指代消解做好的话,是不能仅仅把它当作一个二分类问题,是要把它当作一个Ranking的问题来看。但本门课的重点不是要如何得到一个最好的指代消解模型,而是如何通过深度学习“硬train一发”解决问题的过程。
给一串 token 序列,起手都是先丢给一个预训练模型,如ELMo或者BERT,得到每个token的embedding表示。
接下来,再对这串embedding进行抽取span,这个抽取span的就叫Span Feature Extraction,通过这个span抽取器会把这一段embedding汇聚成一个向量表示,等下再讲这个span抽取器是什么。
然后,还会有一个模块二分类器,判断一个向量是否是一个mention,并给出这个向量是mention的可能性,如上图的 s i , s j s_i,s_j si,sj。
之后,还会有一个模块判断两个spans是否是指同一个实体,并输出一个分数 s i j s_{ij} sij。
最终,将这三个分数组合起来,这里的组合方式有很多种,可以考虑再训练一个DNN或者就直接简单的相加,这个组合起来的分数就是这个二分类器最终的输出。
接下来,让我们看一下 Span Feature Extraction 是怎么做的,当然在实作上有各种做法,不过在指代消解任务中,常见的一种做法如上图。
假设我们有一个4个embedding组成的序列 x 1 , x 2 , x 3 , x 4 x_1,x_2,x_3,x_4 x1,x2,x3,x4,我们会将这4个embedding做加权求和,其中权重参数 α 1 , α 2 , α 3 , α 4 \alpha_1,\alpha_2,\alpha_3,\alpha_4 α1,α2,α3,α4是根据attention训练得到的。再把首尾embedding x 1 , x 4 x_1,x_4 x1,x4和加权求和得到的embeddiing,这三个串起来就是 Span Feature Extraction 的输出。
如果在实际应用中,真的按照2.3端到端模型的训练方式进行训练的话,时间复杂度大约是O(N^4),是有点过大的,那我们能不能简化运算,加快训练速度呢?
其实,在训练整个端到端模型的时候,其中有一部分是mention detection Mention抽取,为了减少运算量,我们可以先做Mention的抽取,先跑 N ( N − 1 ) 2 \frac{N(N-1)}{2} 2N(N−1)次,并仅选取最高分K个mention进行两两的判断是否指同一实体,且有K<
其实,如果仅仅考虑代名词的指代消解,我们只需要把有代名词的句子和对应指代的句子进行seq2seq训练,把有代名词的句子统统训练得到替换代名词的句子,这也是一种暴力解指代消解的方法。
指代消解中还有一些进阶的问题没有解决的,我们在做mention的分组时,是没有真的进行分组的,而是把两两拿出来判断是否是同一组的。这样做可能有这样的问题,假如我们有三个mention的序列“Mr.Lee | Lee | she”,如果两两判断mention,可能会将“Mr.Lee 和 Lee”判断成同一组,把"Lee 和 she"判断成同一组,在"Mr.Lee 和 she"时也判断为同一组,这样就有问题了,因为显然这三个不会是同一组的。需要在组的层级判断。
以及,目前我们讲的指代消解都是有标签的,那能不能用无标注数据进行无监督训练呢?有这样一种方法,我们就把一些代名词直接MASK盖住,然后用一个预训练模型去预测这个被盖住的部分。
至此,指代消解的“硬train一发”技术到此结束。