我正在尝试关注张量流的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
答案 0 :(得分:11)
您可以找到tf.nn.sampled_softmax_loss()
here的文档。 TensorFlow here (pdf)提供的候选人采样甚至有很好的解释。
它如何知道负面标签是什么?
TensorFlow将在所有可能的类中随机选择负类(对你而言,所有可能的单词)。
是否存在从输入集中采样的风险?
如果要计算真实标签的softmax概率,请计算:logits[true_label] / sum(logits[negative_sampled_labels]
。由于类的数量很大(词汇量大小),因此将true_label作为否定标签进行采样的可能性很小。
无论如何,我认为TensorFlow在随机抽样时完全消除了这种可能性。 (编辑:@Alex确认TensorFlow默认执行此操作)
答案 1 :(得分:1)
Candidate sampling解释了如何计算采样损失函数:
您提供的代码使用gulp
来获取输入[batch_size,dim] tf.nn.embedding_lookup
。
然后它使用embed
来获取采样损失函数:
对于一个批次,目标样本只是tf.nn.sampled_softmax_loss
( T )。它随机选择train_labels
num_sampled
个样本( S )作为负样本。
它将从embed
方面统一采样到softmax_wiehgt和softmax_bias。由于embed
是嵌入[train_dataset](形状[batch_size,embedding_size]),如果嵌入[train_dataset [i]]包含train_labels [i],则可能会选择返回,然后它不是负标签。
根据http://guides.rubyonrails.org/asset_pipeline.html第2页,有不同的类型。对于NCE和负采样, NEG = S ,其中可能包含 T 的一部分;对于采样逻辑,采样softmax, NEG = S-T 明确删除 T 。
实际上,它可能是从train_set采样的机会。