首页 > 解决方案 > 张量流嵌入中单词之间的距离

问题描述

我想使用 TensorFlow Hub 上的模型之一来查看单词之间的距离(特别是这个https://tfhub.dev/google/nnlm-en-dim128/1)。但是我找不到一个很好的例子来说明如何找到两个词或两组词之间的距离......这是否可以通过这样的嵌入来实现?

我 100% 不是数据科学家,所以这可能是完全缺乏理解,如果这是一个愚蠢的问题,我深表歉意。

理想情况下,我想看看一个单词与两组不同单词的距离。

标签: tensorflow

解决方案


我认为两个嵌入向量之间距离的最常见度量是余弦相似度

我们可以使用以下公式计算余弦相似度:

来自维基百科页面的余弦距离公式的 img

我们可以将其转换为 tensorflow 代码,如下所示:

def cosine_similarity(a, b):
  mag_a = tf.sqrt(tf.reduce_sum(tf.multiply(a, a)))
  mag_b = tf.sqrt(tf.reduce_sum(tf.multiply(b, b)))
  return tf.reduce_sum(tf.multiply(a, b)) / (mag_a * mag_b)

所以我们有一个完整的例子如下:

import tensorflow as tf
import tensorflow_hub as hub

embed = hub.Module("https://tfhub.dev/google/nnlm-en-dim128/1")
embeddings = embed(["cat is on the mat", "tiger sat on the mat"])

def cosine_similarity(a, b):
  mag_a = tf.sqrt(tf.reduce_sum(tf.multiply(a, a)))
  mag_b = tf.sqrt(tf.reduce_sum(tf.multiply(b, b)))
  return tf.reduce_sum(tf.multiply(a, b)) / (mag_a * mag_b)

a = embeddings[0]
b = embeddings[1]

cos_similarity = cosine_similarity(a, b)

with tf.Session() as sess:
  sess.run(tf.initialize_all_tables())
  sess.run(tf.global_variables_initializer())

  print (sess.run(cos_similarity))

哪个输出0.78157

请注意,有些人主张对公式进行重新排列,以得到相同的结果(+/- 微小的“舍入误差”),并且可能会或可能不会稍微更好地优化。

此替代公式计算如下:

def cosine_similarity(a, b):
  norm_a = tf.nn.l2_normalize(a,0)        
  norm_b = tf.nn.l2_normalize(b,0)
  return tf.reduce_sum(tf.multiply(norm_a,norm_b))

就个人而言,我看不出除了可以忽略不计的差异之外,我碰巧知道第一个配方,所以我倾向于坚持使用它,但我当然没有声称它是最好的,也不声称知道哪个是最快的!:-)


推荐阅读