Tensorflow负采样
我正在尝试遵循tensorflow的udacity教程,在其中遇到了以下两行文字嵌入模型:
# 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/tensorflow/tensorflow/blob/master/tensorflow/examples/udacity/5_word2vec.ipynb
-
您可以在
tf.nn.sampled_softmax_loss()
此处找到文档。TensorFlow此处(pdf)甚至提供了关于
候选采样 的很好解释。
它如何知道负面标签是什么?
TensorFlow将在所有可能的类别(对您来说,所有可能的单词)中随机选择否定类别。
难道没有从输入集中采样的风险吗?
当您要计算真实标签的softmax概率时,请计算:
logits[true_label] / sum(logits[negative_sampled_labels]
。由于类别数量巨大(词汇量大),因此将true_label用作否定标签的可能性很小。
无论如何,我认为TensorFlow在随机采样时完全消除了这种可能性。(编辑:@Alex确认TensorFlow默认执行此操作)