TensorFlow Basic word2vec 示例:我们不应该使用权重 [nce_weight 转置] 来表示而不是嵌入矩阵吗?



我正在引用此示例代码
在下面的代码段中:

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函数不过是一个单个隐藏层神经网络,该神经网络在选择层处有软磁性[仅需几个负示例]

该图的这一部分只会更新网络的权重,它不会对"嵌入"矩阵/张量做任何事情。

理想情况下,一旦训练了网络,我们必须先再次通过embeddings_matrix将其通过一次,然后乘以" nce_weights"的转置(将其视为相同的权重自动编码器,在Input&amp&输出层]到达每个单词的隐藏层表示,我们正在调用Word2vec(?(

但是,如果查看代码的后面部分,则使用 embeddings矩阵的值。这个

即使是用于NCE损失的TensorFlow文档,提及输入(我们通过embed,使用embeddings(作为第一层输入激活值。

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

正常的背部传播在网络的第一层停止,NCE损失的实施是否超越并传播到输入值的损失(因此是嵌入(?

这似乎是一个额外的步骤?请参阅为什么我称其为额外的步骤,他也有同样的解释。

想要我弄清楚阅读并通过TensorFlow是

尽管整个过程是单个隐藏层神经网络,但确实是自动编码器。但是我假设的权重没有绑在一起。

编码器由重量矩阵embeddings制成,解码器由nce_weights制成。现在embed不过是隐藏的图层输出,通过将输入乘以embeddings

给出

因此,embeddingsnce_weights都将在图中更新。我们可以选择两个重量矩阵中的任何一个,embeddings在这里更优选。

edit1:

实际上,对于tf.nn.nce_losstf.nn.sampled_softmax_loss,参数,权重和偏差适用于输入Weights(tranpose) X + bias,对于目标函数,可以是logistic回归/softmax函数[请参阅]。

但是,直到您要构建的图形的基础且不仅在功能的权重和偏置上停止,因此后填充/梯度下降发生。因此,tf.nn.nce_losstf.nn.sampled_softmax_loss中的input参数也更新了哪个构建embeddings矩阵。

最新更新