通过关于udacity的word2vec教程,从论文中可以看出,输入字向量和输出有单独的矩阵。
例如。 ['the','cat','sat','on','mat']
。
这里输入向量$ w_i $,'the','cat','on','mat'
将预测'sat'
的输出向量$ w_o $。它通过如下所示的采样softmax来实现,其中|context|
是上下文单词的大小(在这种情况下为4)。
因此,一旦完成训练,可能有两个矢量用于sat
作为输入矢量,另一个矢量用于输出矢量。 问题是为什么没有一个矩阵。这将确保相同单词的输入和输出向量将对齐。
如果有帮助,张量流代码附加在下面(为什么不设置softmax_weights = embedding和softmax_biases = 0):
# Variables.
embeddings = tf.Variable(tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))
softmax_weights = tf.Variable(tf.truncated_normal([vocabulary_size, embedding_size],
stddev=1.0 / math.sqrt(embedding_size)))
softmax_biases = tf.Variable(tf.zeros([vocabulary_size]))
# Model.
# Look up embeddings for inputs.
embed = tf.nn.embedding_lookup(embeddings, train_dataset)
# Compute the softmax loss, using a sample of the negative labels each time.
loss = tf.reduce_mean(tf.nn.sampled_softmax_loss(softmax_weights, softmax_biases, embed,
train_labels, num_sampled, vocabulary_size))
我没有单独的输出矩阵来实现它,结果看起来仍然很好:https://github.com/sachinruk/word2vec_alternate。 我认为现在的问题应该是数学原因,为什么输出矩阵应该是不同的。