PaperWeekly从EMD、WMD到WRD:文本向量序列的相似度计算( 二 )
2.1 基本形式
设有两个句子, 经过某种映射(比如 Word2Vec 或者 BERT)后 , 它们变成了对应的向量序列, 现在我们就想办法用 Wasserstein 距离来比较这两个序列的相似度 。
根据前一节的介绍 , Wasserstein 距离需要知道 三个量 , 我们逐一把它们都定义好即可 。
由于没有什么先验知识 , 所以我们可以很朴素地将让, 所以现在还剩。 显然 ,代表着第一个序列的向量 与第二个序列的向量 的某种差异性 , 简单起见我们可以用欧氏距离, 所以两个句子的差异程度可以表示为:
本文插图
这便是 Word Mover's Distance(WMD)(推词机距离) , 大概可以理解为将一个句子变为另一个句子的最短路径 , 某种意义上也可以理解为编辑距离的光滑版 。 实际使用的时候 , 通常会去掉停用词后再计算 WMD 。
本文插图
▲ Word Mover's Distance 的示意图 , 来自论文 From Word Embeddings To Document Distances
2.2 参考实现
参考实现如下:
defword_mover_distance(x, y):
"""WMD(Word Mover's Distance)的参考实现
x.shape=[m,d], y.shape=[n,d]
"""
p = np.ones(x.shape[ 0]) / x.shape[ 0]
q = np.ones(y.shape[ 0]) / y.shape[ 0]
D = np.sqrt(np.square(x[:, None] - y[ None, :]).mean(axis= 2))
returnwasserstein_distance(p, q, D)
2.3 下界公式
如果是检索场景 , 要将输入句子跟数据库里边所有句子一一算 WMD 并排序的话 , 那计算成本是相当大的 , 所以我们要尽量减少算 WMD 的次数 , 比如通过一些更简单高效的指标来过滤掉一些样本 , 然后才对剩下的样本算 WMD 。
幸运的是 , 我们确实可以推导出 WMD 的一个下界公式 , 原论文称之为 Word Centroid Distance (WCD):
本文插图
也就是说 , WMD 大于两个句子的平均向量的欧氏距离 , 所以我们要检索 WMD 比较小的句子时 , 可以先用 WCD 把距离比较大的句子先过滤掉 , 然后剩下的采用 WMD 比较 。
Word Rotator's Distance
WMD 其实已经挺不错了 , 但非要鸡蛋里挑骨头的话 , 还是能挑出一些缺点来:
- 它使用的是欧氏距离作为语义差距度量 , 但从 Word2Vec 的经验我们就知道要算词向量的相似度的话 , 用 往往比欧氏距离要好;
- WMD 理论上是一个无上界的量 , 这意味着我们不大好直观感知相似程度 , 从而不能很好调整相似与否的阈值 。
最近的论文 Word Rotator's Distance: Decomposing Vectors Gives Better Representations [2]则巧妙地提出 , 在归一化的同时可以把模长融入到约束条件 p,q 里边去 , 这就形成了 WRD 。
3.1 基本形式
首先 , WRD 提出了 “词向量的模长正相关于这个词的重要程度”的观点 , 并通过一些实验结果验证了这个观点 。 事实上 , 这个观点跟笔者之前提出的 simpler glove 模型的观点一致 , 参考《更别致的词向量模型(五):有趣的结果》 [3] 。
而在 WMD 中 ,某种意义上也代表着对应句子中某个词的重要程度 , 所以我们可以设:
本文插图
然后 就用余弦距离: