2016-06-07 286 views
7

我试图遵循tensorflow的udacity教程在那里我碰到下面两行来到一个字嵌入模型:Tensorflow负采样

# 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

回答

8

你可以找到tf.nn.sampled_softmax_loss()here的文档。 对TensorFlow here (pdf)提供的候选采样甚至有很好的解释。


它怎么知道的负面标签是什么?

TensorFlow将随机选择所有可能的类(为您,所有可能的单词)中的负类。

是否存在从输入集本身取样的风险?

当您想计算真实标签的softmax概率时,计算:logits[true_label]/sum(logits[negative_sampled_labels]。由于类的数量巨大(词汇大小),因此将true_label作为负标签采样的可能性非常小。
无论如何,我认为TensorFlow在随机抽样时完全消除了这种可能性。 (编辑:@Alex证实TensorFlow默认完成了这些)

+5

“我认为TensorFlow在随机抽样时完全消除了这种可能性。”正确!有一个标志:'remove_accidental_hits':一个布尔。是否删除样本类别等于目标类别之一的“意外命中”。默认值为True.' – Alex

+0

有没有人知道提供取样权重的方法? –

1

Candidate sampling解释采样损失函数是如何计算的:

  • 计算损失函数的子集中的所有训练样本大号Ç,其中C = T×S,T是目标类别中的样本,并且S是所有类别中随机选择的样本。

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

然后,它使用tf.nn.sampled_softmax_loss获得所采样的损失函数:

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

对于一个批次中,目标样品只是train_labelsŤ)。它从embed随机选择num_sampled样本(S)为负样本。

它将从embed统一采样softmax_wiehgt和softmax_bias。由于embed是嵌入[train_dataset](形状[batch_size,embedding_size]),如果嵌入[train_dataset [i]]包含train_labels [i],它可能会被选中,那么它不是负面标签。

根据Candidate sampling第2页,有不同的类型。对于NCE和负抽样,NEG = S,其可能包含部分T;对于采样逻辑,采样softmax,NEG = S-T明确删除T

的确,它可能是从train_set中抽样的一个机会。