我在引用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为什么我称之为额外的一步,他也有同样的解释。
答案 0 :(得分:1)
想要我已经想出阅读并经历张量流是那个
虽然整个事物是单隐藏层神经网络,但确实是一个自动编码器。但是权重没有限制,我认为。编码器由权重矩阵embeddings
组成,解码器由nce_weights
组成。现在embed
只是隐藏的图层输出,通过将输入与embeddings
相乘得出。
因此,embeddings
和nce_weights
都会在图表中更新。我们可以选择两个权重矩阵中的任意一个,embeddings
在这里更受欢迎。
<强> EDIT1:强>
实际上对于tf.nn.nce_loss
和tf.nn.sampled_softmax_loss
,参数,权重和偏差都是针对输入Weights(tranpose) X + bias
的目标函数,可以是逻辑回归/ softmax函数{{3} }。
但是反向传播/梯度下降发生在您正在构建的图形的基础上,并且不会仅停留在函数的权重和偏差处。因此,input
和tf.nn.nce_loss
中的tf.nn.sampled_softmax_loss
参数也会更新,而embeddings
矩阵的构建也是如此。