tensorflow基本word2vec例子:我们不应该使用权重[nce_weight Transpose]来表示而不是嵌入矩阵吗?

时间:2017-05-05 12:14:19

标签: python tensorflow nlp word2vec

我在引用this sample code
在下面的代码段中:

embeddings = tf.Variable(tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))
embed = tf.nn.embedding_lookup(embeddings, train_inputs)

# Construct the variables for the NCE loss
nce_weights = tf.Variable(tf.truncated_normal([vocabulary_size, embedding_size],stddev=1.0 / math.sqrt(embedding_size)))
nce_biases = tf.Variable(tf.zeros([vocabulary_size]))

loss = tf.reduce_mean(
    tf.nn.nce_loss(weights=nce_weights,
    biases=nce_biases,
    labels=train_labels,
    inputs=embed,
    num_sampled=num_sampled,
    num_classes=vocabulary_size))

optimizer = tf.train.GradientDescentOptimizer(1.0).minimize(loss)

现在NCE_Loss函数只是一个隐藏层神经网络,在optput层有softmax [知道只需要少量负样本]

图的这一部分只会更新网络的权重,它对“嵌入”矩阵/张量没有任何作用。

理想情况下,一旦网络被训练,我们必须首先通过embeddings_matrix再次传递一次,然后乘以“nce_weights”的转置[将其视为相同的权重自动编码器,输入和输入到达每个单词的隐藏层表示,我们称之为word2vec(?)

但是如果查看代码的后半部分,embeddings矩阵的值正在使用单词表示。 This

即使是tensorflow doc for NCE loss,也会提到输入(我们传递的embed,它使用embeddings)作为第一层输入激活值。

inputs: A Tensor of shape [batch_size, dim]. The forward activations of the input network.

正常的反向传播停在网络的第一层, 这种NCE损失的实现是否超出并将损失传播到输入值(从而传播到嵌入)?

这似乎是一个额外的步骤? Refer this为什么我称之为额外的一步,他也有同样的解释。

1 个答案:

答案 0 :(得分:1)

想要我已经想出阅读并经历张量流是那个

虽然整个事物是单隐藏层神经网络,但确实是一个自动编码器。但是权重没有限制,我认为。

编码器由权重矩阵embeddings组成,解码器由nce_weights组成。现在embed只是隐藏的图层输出,通过将输入与embeddings相乘得出。

因此,embeddingsnce_weights都会在图表中更新。我们可以选择两个权重矩阵中的任意一个,embeddings在这里更受欢迎。

<强> EDIT1:

实际上对于tf.nn.nce_losstf.nn.sampled_softmax_loss,参数,权重和偏差都是针对输入Weights(tranpose) X + bias的目标函数,可以是逻辑回归/ softmax函数{{3} }。

但是反向传播/梯度下降发生在您正在构建的图形的基础上,并且不会仅停留在函数的权重和偏差处。因此,inputtf.nn.nce_loss中的tf.nn.sampled_softmax_loss参数也会更新,而embeddings矩阵的构建也是如此。