我目前正在浏览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)
答案 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]
。