NLP(四十五):keyword_bert
引子
问&答 是人和人之间非常重要的沟通方式,其关键在于:我们要理解对方的问题,并给出他想要的答案。设想这样一个场景,当你的女朋友or老婆大人在七夕前一晚,含情脉脉地跟你说
亲爱的,七夕快到了,可以给我换个新手机吗?
而此时沉迷王者峡谷的你,也许会不假思索地回答
好啊亲爱的~ 昨天刚看到拼多多九块九包邮买一送一可便宜呢~ 多买几个哦一个壳容易坏呀
你话音未落,一记绝杀扑面而来
(王大锤,卒,享年28)
所以,对于生活中这种随处可见的送命题,只要我们惜命&稍微上点心,是不会轻易丢分的。但对于机器来说,这却是个莫大的挑战,因为机器对相似文本的误解非常常见,所以我们的AI也常常被用户戏谑为人工智障(一个听上去很缺AI的称呼)。作为AI背后的男人,我们一直致力于提升AI的能力,让机器早日摆脱智商困境。具体地,针对这种问答场景,我们提出了一套新的方法论和杀手级模型,从而让AI更懂你,远离送命题~
Bert、ArcII、MIX。不同模型的差异性无非就是内部模块的不同(RNN, CNN, Transformer...),大框架上无外乎此。
本文无意探讨两大类模型的优劣,此方面讨论早有珠玉在前。我们重点讨论的,是:
这些模型,能否真正解决开放域问答的两大挑战:覆盖面广和关键信息敏感?
从我们对这些模型的评测结果上看,答案是:不能。
至于深层次的解释,我认为还是受制于数据的制约,所谓 数据决定上限,模型只是逼近这个上限的程度。如果我们不能提供足够的训练样本,去教会模型分辨出关键信息,光凭模型自身的花式 CNN/RNN/Attention,纵使使出浑身解数,在一些很难分辨的 case 上也未必work。而在预测阶段,鉴于开放域的问题覆盖面很广,很容易出现在训练样本中没出现过的问题对儿(即 Out-Of-Vocabulary, OOV问题),主要问题里的关键信息(相似/不相似 的词对儿)没出现过,此时模型只能抓瞎。
https://arxiv.org/ftp/arxiv/papers/2003/2003.11516.pdf
主要内容:
Problem definition
假定现在有一个 query 和相关的候选 question 集合,对于每一个 query pair (q, Qi),计算一个相似度得分 sim(q, Qi) 用于候选排名,为了计算 sim(q, Qi),现在要解决两个问题:
1、如何轻松简单、灵活地获得原始 query 的良好表示形式?
2、如何将 query 表示形式使用到匹配模型中?
本文提出了一个基于领域的关键词抽取方法抽取 query pair 中高质量的关键词解决了第一个问题;使用 keyword-attentive BERT 整合关键词到端到端模型训练解决了第二个问题。
Domain keyword extraction
传统的检索方法例如 TSUBAKI、Elasticsearch 使用 OKAPI BM25 或者 Lucene similarity 衡量 query-question 之间的距离。但是这些方法可能会提取低质量的 "keyword",从而导致检索结果质量较低。如下表,"中国" 和 "GDP" 是关键词,但是搜索引擎倾向于检索形式上看上去更相近的 "similar Q1" 和 "similar Q2",但是显然忽略了重要关键词的匹配。

实际上,开放域 question 的 keywords 是和 question 的领域高度相关的,比如说:经济、政治、体育等等。基于这些,引入了如图所示的基于领域的关键词抽取方法生成领域相关的关键词。并且收集了大型的中文语料库,其中包含数千万条属于特定领域的文章,并且每天对其进行更新以涵盖新的关键字/关键词 (keyword/keyphrase)。

在中文 NLP 场景下,一个中文词语包含几个中文字符,并且没有空格边界,所以分词是中文 NLP 场景下的基础问题。PMI (point-wise mutual information) 是一种衡量两个词紧密程度的常用手段,可以用来发现新词:

第二步,利用领域信息衡量一个词的重要性。首先,计算每个词的 IDF,然后引入 diff-idf 按照如下方式衡量一个领域词的重要性:

标记 ^domain 表示领域外,使用 df 而非 tf 是因为领域中一个词的 df 比 tf 更加重要,也更加合理,这里是要根据领域抽取关键词并不是要统计某个词对某一个文档的重要性。一个词在不是其领域的文档中的 idf 肯定要比领域内文档的 idf 大,当词越具有领域性,这个差距会越大,得分也就越高。
在每个领域语料库中重复以上步骤,创建领域字典,最后合并领域字典形成最终的关键字词典,并应用于搜索引擎。
和其他无监督/监督方法比起来,此方法具有以下优点:
- 可充分利用语料库的领域信息抽取领域关键词
- 无需手动标注关键词,不严重依赖于模型结构
Semantic matching
- Keyword attention mechanism

由于监督信号的不充足,深层模型无法精确地捕捉 query pair 中的关键信息用于有效的相似度辨别。A 句中的每个 token 只能关注到 B 句中的关键词 token,反之同理。下图中 A 和 B 是一个负样本,由于都包含 "扫码" A 和 B 看上去很相似,但是整句含义却不同,A 说的是进微信群,B 说的是加好友微信。而本文提出的 keyword-attentive 机制会强制模型关注 A 和 B 关键词的不同而学习它们之间的差异。这个机制可以简单地通过 self-attention mask 的方式实现。然后对 A 和 B (包括 CLS,SEP token) 进行平均池化生成 A 和 B 的表示,为了模拟两个句子间的差异引入了 keyword difference 向量:

其中中间的符号表示拼接,这个拼接有点迷,前后两者互为相反数,感觉并不能提供更多的特征信息。

通过 keyword-atttentive 层,关键词信息被注入到距离输出更近的位置。最终拼接来自各个模块的表示用于最终的预测:

- Negative sampling approach
随机采样生成负样本比较盲目且容易忽略包含丰富信息的负样本。而我们的目标是通过更好的采样方式训练一个鲁棒的模型。
具体做法是,首先通过把关键词接在原始 query 后面的方式增强在搜索引擎中的检索,例如:原始 query ,keyword
,增强后的搜索 query 则为:
。
然后希望没有人工干预的情况下从搜索引擎中取出负样本。一个直接可以参考的指标是根据搜索引擎获得的相似度得分判断检索的候选 question 是不是够自信。如果相似度得分低于某个阈值,则检索出的候选 question 可能是负样本。另外,本文引入了query 和候选 question 中的 keyword 重叠率,一个好的负样本应该在非重叠和重叠部分有着较好的平衡。最终结合两个指标作为负样本选择的规则:

对于上式,有一点疑问,假设 Q 是一个与 query 完全没有重合的样本,此时,关键词重叠率会趋于无穷大,而相似度得分方面也极有可能小于 α (两个字面完全不重合的句子语义相同的概率比较小),这样的一个负样本应该算是一个非常简单的样本了,但是上面的规则貌似无法过滤掉。我想应该是在第一步使用搜索引擎搜索的时候,这样的样本基本不会被检索出来吧,所以这两个指标都是在尽力去保证检索出来的样本是负样本。
还有一种通过随机替换实体的方式来生成负样本,比如: "What factors will affect China’s GDP?" 被替换为 "What factors will affect America’s GDP?",这个过生成的样本看上去极为相似但实则为负样本。