2

我对噪声对比估计的理解是,我们从词嵌入(负样本)中采样一些向量,然后计算每个向量的对数似然。然后我们想要最大化目标词的概率和每个负样本词的对数似然之间的差异(所以如果我对此是正确的,我们想要优化损失函数,使其尽可能接近1 尽可能)。

我的问题是这样的:

num_classes函数参数的目的是什么nce_loss?我最好的猜测是传入类的数量,以便 Tensorflow 知道我们从中抽取负样本的分布的大小,但这可能没有意义,因为我们只能从变量本身推断分布的大小. 否则,我想不出为什么我们需要知道可能的类总数的原因,特别是如果语言模型只输出 k + 1 个预测(目标词的负样本大小 + 1)。

4

1 回答 1

0

你的猜测是正确的。该num_classes参数用于从对数均匀 (Zipfian) 分布中采样负标签。

这是源代码的链接

# Sample the negative labels.
#   sampled shape: [num_sampled] tensor
#   true_expected_count shape = [batch_size, 1] tensor
#   sampled_expected_count shape = [num_sampled] tensor
if sampled_values is None:
  sampled_values = candidate_sampling_ops.log_uniform_candidate_sampler(
      true_classes=labels,
      num_true=num_true,
      num_sampled=num_sampled,
      unique=True,
      range_max=num_classes)

range_max=num_classes参数基本上定义了此分布的形状以及采样值的范围 - [0, range_max)。请注意,无法从标签中准确推断出该范围,因为特定的 mini-batch 只能有小的单词 id,这会显着扭曲分布。

于 2017-12-26T17:32:58.410 回答