让 AI 拆 InfoNCE 分母:正例没变,重复一个负例为何仍会加大损失
对比学习常被说成“拉近正例、推远负例”。这句话没有说明一批候选怎样一起影响损失。让AI固定正例与负例的评分,只重复一条负例,就能看见InfoNCE衡量的并非孤立的正例距离。
AI模型生成的概念插图:一个锚点同时面对匹配候选与竞争候选;连线粗细和球体大小不表示正文数值,不是模型截图。
先用正评分,避免混淆指数转换
给一个锚点配三张候选卡:一张标注正例P、两张负例N₁和N₂。设它们已经转换为正数的评分f分别是4、2、1。此处不是余弦相似度,也不是归一后的概率;如果前面使用指数打分,4、2、1已是指数之后的结果,不应再求一次指数。
InfoNCE的单组损失取正例所占份额的负对数。分母包含正例和全部负例,因此候选总评分是4+2+1=7,正例份额为4/7,约0.571429;损失为-ln(4/7),约0.559616。漏掉分母中的正例会得到4/3,超过1并产生负损失,已不符合本例的分类含义。
多出的是一个候选位置
保持所有原评分不变,把N₁再放入候选列表一次。现在四个位置的评分为4、2、1、2,总和9;正例份额变成4/9,约0.444444,损失约0.810930。正例与锚点没有移动,损失仍升高,因为竞争项增加了。
这里故意按列表位置计数。若实现先去重,再只留下三个候选,结果会回到0.559616。两种处理不能在同一次核对中混用;应让AI同时给出样本ID、候选位置和评分,区分“又采样到一次”和“同一条记录意外复制”。
再做两项检查。把所有评分同时乘10,份额不变,损失也不变;把三个评分都设为1,正例份额为1/3,损失为ln(3),约1.098612。前者检查是否只保留了相对评分,后者检查分母是否真的包括三个位置。两者都不需要训练任何向量模型。
分母算对以后,还要检查负例身份
实际检索训练可能把同一批里的其他文档当负例,但它们未必全与问题无关。如果两份文档实际上都能回答同一个问题,只把一份标正、另一份塞进负例,算式仍然可以正常执行,学习目标却可能要求模型压低本来合理的匹配。多正例情形需要明确采用哪种损失定义。
让AI核对时,应逐项列分母成员,先验算总和,再报告正例份额和负对数。最后要求它回答:这些分数是原始相似度、指数评分还是概率?负例来自哪里?重复项是否保留?这三个问题比笼统要求“检查对比学习代码”更容易定位差异。
单组损失升高并不等于模型退步,候选数、负例难度和采样规则都会改变它。本文只解释单个锚点的分母;双向训练、温度、批量平均及论文中的互信息分析有额外条件,不能用这三张卡宣布学到了多少语义信息。
资料核对日期:2026年10月2日。算例为原创教学设定,已用独立Python计算复核,不代表真实模型训练或性能测试。
参考资料
van den Oord等:Representation Learning with Contrastive Predictive Coding,第2.3节


