具有负相似性的TensorFlow cookbook skip-gram模型

时间:2018-02-10 03:51:10

标签: numpy tensorflow machine-learning nlp word2vec

我目前正在浏览Google的TensorFlow cookbook

这是skip-gram模型的TensorFlow实现。

在第272行,作者决定对相似性矩阵(-sim[j, :])进行负相乘。我有点困惑为什么我们需要在skip-gram模型中负相乘相似性矩阵。有任何想法吗?

for j in range(len(valid_words)):
        valid_word = word_dictionary_rev[valid_examples[j]]
        top_k = 5 # number of nearest neighbors
        **nearest = (-sim[j, :]).argsort()[1:top_k+1]**
        log_str = "Nearest to {}:".format(valid_word)
        for k in range(top_k):
            close_word = word_dictionary_rev[nearest[k]]
            score = sim[j,nearest[k]]
            log_str = "%s %s," % (log_str, close_word)
        print(log_str)

1 个答案:

答案 0 :(得分:3)

让我们一步一步地完成这个例子:

  • 首先,有一个similarity张量。它被定义为嵌入向量之间成对余弦相似性的矩阵:

    # Cosine similarity between words
    norm = tf.sqrt(tf.reduce_sum(tf.square(embeddings), 1, keep_dims=True))
    normalized_embeddings = embeddings / norm
    valid_embeddings = tf.nn.embedding_lookup(normalized_embeddings,valid_dataset)
    similarity= tf.matmul(valid_embeddings,normalized_embeddings,transpose_b=True)
    

    为所有验证词和所有词典词计算矩阵,并包含[-1,1]之间的数字。在此示例中,词汇大小为10000,验证集由5个单词组成,因此similarity矩阵的形状为(5, 10000)

  • 此矩阵计算为numpy数组sim

    sim = sess.run(similarity, feed_dict=feed_dict)
    

    因此,sim.shape = (5, 10000)也是如此。

  • 接下来,这一行:

    nearest = (-sim[j, :]).argsort()[1:top_k+1]
    

    ...计算当前单词top_k的{​​{1}} 最近的单词索引。看看numpy.argsort方法。否定只是排序in descending order的一种简单方法。如果没有减号,结果将是字典中的j 最远字,这并不表示word2vec已经学到了什么。

    另请注意,范围为top_k,而不是[1:top_k+1],因为第0个字是当前验证字本身。印刷中没有意义,最接近“爱”的词是“爱”。

    此行的结果将是[:top_k]之类的数组,对应于单词[ 73 1684 850 1912 326]