理解tf.random.log_uniform_candidate_sampler中true_classes参数的作用
tf.random.log_uniform_candidate_sampler 中 true_classes 参数的具体含义
true_classes 用来传入当前训练批次中每个样本对应的真实正类的索引值,参数形状要求为 [batch_size, num_true],和你传入的num_true参数(每个样本对应的正类数量)对应。
它的核心作用有两个:
- 用于计算损失校正所需的预期采样概率
这个函数除了返回采样得到的候选类别列表外,还会返回两个校正值:sampled_candidates_expected_prob和true_classes_expected_prob,这两个值是用来校正采样版交叉熵损失的核心参数——因为负采样是从全量类别中抽样计算损失,不是遍历全类别,需要根据每个类别被抽中的概率修正损失值,避免最终训练结果出现偏差,而这两个校正值的计算完全依赖你传入的true_classes。
你测试时只观察了返回的采样类别列表,这部分采样逻辑遵循对数均匀分布,本身和true_classes无关,所以看起来不管传入什么值,采样结果都"正常",但如果要将采样结果用于模型训练计算损失,true_classes传入错误会直接导致损失计算不准,模型无法正常收敛。 - 可选控制正类是否出现在采样结果中
当你设置参数remove_accidental_hits=True时,函数会自动从采样得到的负样本列表中剔除和true_classes一致的类别,避免正类被当成负样本参与损失计算,这一逻辑也完全依赖传入的true_classes值。如果开启这个参数再做测试,就能直观看到true_classes对采样结果的影响。
在word2vec的训练场景中,教程里传入的context_class就是当前中心词对应的真实上下文正类,符合参数的设计用途。
内容的提问来源于stack exchange,提问作者user746461
相关产品推荐
相关产品推荐

