Tensorflow负抽样

时间:2016-06-07 06:27:55

标签: python 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

2 个答案:

答案 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解释了如何计算采样损失函数:

  • 计算所有训练样本 L 的子集 C 中的损失函数,其中 C =T⋃S T < / em>是目标类中的样本, S 是所有类中随机选择的样本。

您提供的代码使用gulp来获取输入[batch_size,dim] tf.nn.embedding_lookup

然后它使用embed来获取采样损失函数:

  • softmax_weights:形状张量[num_classes,dim]。
  • softmax_biases:形状张量[num_classes]。班级偏见。
  • embed:形状张量[batch_size,dim]。
  • train_labels:形状张量[batch_size,1]。目标类 T
  • num_sampled:一个int。每批随机抽样的类数。 S 中的课程麻木。
  • vocabulary_size:可能的类数。
  • sampled_values:默认为log_uniform_candidate_sampler

对于一个批次,目标样本只是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采样的机会。