我对噪声对比估计的理解是我们从单词嵌入(负样本)中采样一些向量,然后计算每个向量的对数似然。然后我们想要最大化目标词的概率和每个负样本词的对数似然之间的差异(所以如果我对此正确,我们希望优化损失函数,使其接近1尽可能)。
我的问题是:
num_classes
函数的nce_loss
参数的用途是什么?我最好的猜测是传入类的数量,以便Tensorflow知道我们绘制的负样本的分布大小,但这可能没有意义,因为我们可以从变量本身推断分布的大小。否则,我想不出为什么我们需要知道类的总数可能的原因,特别是如果语言模型仅输出k + 1个预测(负样本大小+目标词的1)。
答案 0 :(得分: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)
。请注意,标签中的范围无法准确推断,因为特定的小批量只能包含较小的单词ID,这会严重影响分布。