文章目录
- 1 什么是coreference resolution
- 2 框架
- 2.1 Mention Detection
- 2.2 Mention Pair Detection
- 2.3 End-to-End
- 2.4 Span Representation
- 2.5 Pratical Implementation
- 2.6 Result
- 3 应用
本文为李弘毅老师【Deep Learning for Coreference Resolution】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。
下文中用到的图片均来自于李宏毅老师的PPT,若有侵权,必定删除。
文章索引:
上篇 - 7-6 Text Style Transfer
下篇 - 7-8 Deep Learning for Constituency Parsing
总目录
1 什么是coreference resolution
coreference resolution翻译过来就是指代消解,它的目的是搞清楚一句话中的代词指的是什么。比如下图中有两句话,第一句是"The trophy would not fit in the brown suitcase because it was too big.",这里的it显然值得是"trophy";第二句是"The trophy would not fit in the brown suitcase because it was too small.",这里的it显然指的是"suitcase"。我们人很容易区分出来,但是要机器去找"it"指代的是什么就比较困难了。
刚说的是比较通俗的说法,更准确地说coreference resolution是这样的。在一个句子中会有很多的mention,mention就是句子中的一些名词,比如"鍾佳播瞪著樂咖舉起他的拳頭說"这句话中,“鍾佳播”,“樂咖”,“他”,"他的拳頭"都算是mention。这些mention会指向一个实际存在的事物,如果两个或两个以上的mention指向了同一个事物,那么这就叫做corefer。第一个出现的corefer叫做antecedent,之后出现的叫做anaphor。如果某个事物只有一个mention指向它,那么就叫做singleton。
总结一下,指代消解需要模型做两件事情,第一件事情就是把所有的mention都找出来,singletons往往会被忽略掉;第二件事情就是对所有的mention进行分组,把指代同一个事物的mention分到一个组里。
2 框架
2.1 Mention Detection
Mention Detection要做的就是把所有的mention都给找出来,它就是一个Binary Classifier。这个Binary Classifier吃一个span,然后告诉我们这个是不是一个mention。span就是说整个句子中的一段。如果句子的长度为N,那么这个步骤会被重复N(N-1)/2次,也就是概率论中的CN2C_N^2CN2,从N个tokens当中,任选两个作为起始token和结尾token。
为什么要这么做?比如“他的拳头”这个sequence当中,“他”是一个mention,“他的拳头”整句话也是一个mention,为的就是把这两者都找出来。
这里起始我还是有点小疑惑,一是sequence是不是按照标点符号切过的,因为有些标点明显不可能在mention中出现,除了老外的名字中的那个"·";二是这个binary classifier只吃一个span吗?那比如一个人的名字叫做"张小明",那么“张小明”会被当成mention,"小明"也会被当成mention吗?不过这种其实也能通过后处理解决掉。
2.2 Mention Pair Detection
Mention Pair Detection也是一个Binary classifier。不过它吃两个mention,然后吐出这两个mention是不是指向同一个东西,也就是上面所说的cluster的过程。当然这里的mention肯定不知是mention对应的tokens这么简单,应该是两个特征。
加入我们根据上一步得到了K个mentions,那么这里会执行K(K-1)/2次。
2.3 End-to-End
像上述这样分成两步的过程并不是end-to-end的,我们其实可以把这两步合成一步。就是train一个Binary Classifier,它吃两个span,然后在这两个span都是mentions且指向同一个entity的时候,输出yes。
如果是这样的一个模型的话,要运行几次呢?假设我们有N个tokens,那么会有N(N-1)/2个span,记K=N(N-1)/2的话,就会有跑K(K-1)/2次,也就是复杂度为N4N^4N4。
相信说到这里,大家也都是有点疑惑的。那么,这个Binary classifier究竟长什么呢?它就下长下图这样子。先会把整个句子经过一个Pre-trained Model,可以是ELMo或者Bert之类的。然后每个token会有一个对应的输出,这里的每个输出都是包含了全局的信息的。然后我们就选择两个span,分别去抽取特征,这两个特征又会分别经过一个输出Mention分数的网络,这两个特征又会一起进入一个输出Mention Pair分数的网络,然后这三个分数整合之后,得到最终的分数。看了这个图,其实大多数的疑惑都消失了。
2.4 Span Representation
Span Feature Extraction的做法是如何的呢?一种常见的做法是先把头尾两个特征拿出来(下图中x1x_1x1和x4x_4x4),然后对整个span算attention之后,取weighted sum。最后把这三个特征concat起来就是最终的输出了。需要有weighted sum的步骤,是因为这样可以让模型focus在span中讲述entity本质的东西上,比如“湖旁小屋”,这里的本质其实是“小屋”。
2.5 Pratical Implementation
刚才我们说了,假设我们有N个tokens,那么会有N(N-1)/2个span,记K=N(N-1)/2的话,就会有跑K(K-1)/2次,也就是复杂度为N4N^4N4。在实际操作的时候,有两招可以减少运算量。一招是,在inference的时候,先把mentin detection的部分单独拿出来过一遍,可以大大减小K;另一招是限制一个span的最大长度,这个很容易理解。
2.6 Result
那么,这么做的效果如何呢?下面有一些模型输出结果的句子,其中小括号括起来的部分,是模型认为是coreference的部分,用颜色highlight的部分,则是attention权重比较大的部分。下面的有正确的例子,也有错误的例子,总体来说,还是挺棒的~
3 应用
做coreference resolution主要是为了一下下游的任务。比如chatbot。在chatbot当中,往往需要机器去看历史内容,指导此刻人说的话,指的是刚才说过的什么东西。在做chatbot的时候,也有用seq2seq的方法去做的,比如有如下对话:
人:“梅西多高?”
机器:“官方说法他是5英尺7英寸。”
人:“他和C罗谁是最好的球员?”
这个时候,最后一句的他,我们希望可以替换成"梅西",这样机器回答起来会容易很多。这时,有人的做法就是,输入上面这三个句子,让机器输出“梅西和C罗谁是最好的球员?”。