让 AI 算三元组损失:正样本已经更近,为什么还不是零

前天 3阅读

学习检索向量时,“同类更近、异类更远”说出了方向,却没有说够多远。让AI解释三元组损失,可以固定一个锚点与正样本,只移动负样本,逐次核对距离差是否达到margin。

让 AI 算三元组损失:正样本已经更近,为什么还不是零

AI模型生成的概念插图:锚点连向正负样本,间距标记提示还需满足距离余量;不代表软件截图、真实实验或精确数据图。

先约定使用距离,不使用距离平方

设锚点a=(0,0),正样本p=(3,0),负样本n=(0,3.5),采用普通欧氏距离、margin=1、不使用距离交换。本练习按理想数学距离计算,不加入稳定小量;PyTorch相应模块默认含eps,精确对照实现时要把设置写明。

a到p的距离是3,a到n的距离是3.5,正样本已经更近。损失按L=max(d(a,p)-d(a,n)+margin,0),得到max(3-3.5+1,0)=0.5。它要求负样本至少比正样本远1,现在只远0.5,所以还差0.5。

如果把负样本移到(0,4),距离变成4,损失正好为0;移到(0,2),负样本比正样本更近,损失为3-2+1=2。这三个结果可以做成距离尺:同样的正样本,负样本跨过的界线是4,并非只要超过3就足够。

整体放大,也可能把损失降到零

回到n=(0,3.5),把所有向量坐标同时乘2。锚点仍为(0,0),正样本变成(6,0),负样本变成(0,7)。两种距离变成6和7,margin仍为1,损失为0。近远排序没有改变,仅尺度变化就填满了要求的间隔。

这并不说明所有度量学习模型都能任意放大向量;实际方案可能使用向量归一化、正则约束或其他距离函数。它说明报告一个较小损失时,需要同时写出向量尺度和距离定义,不能只给一个孤立数字。

若把平方距离误当普通距离,本例会算出max(9-12.25+1,0)=0,直接漏掉原本的0.5。平方距离版本可以被另行定义,但margin的单位和数值意义也随之变化,不能在同一张计算卡中悄悄替换。

让AI写出距离表与失效解释

可用提示词:“固定a=(0,0)、p=(3,0),负样本依次取(0,3.5)、(0,4)、(0,2)。用不含eps的欧氏距离与margin=1计算triplet loss,不启用swap。列距离、距离差、未截断值和最终损失;再将第一组三点整体乘2复算,比较误用平方距离的结果。”

验收时先确认三个角色没有调换,再检查最后的max操作是否把负值截为0。只有这一组三元组损失为0,不能证明整个数据库都满足检索要求;所谓正负样本也来自给定标注,模型距离本身不会替你证明语义关系一定正确。

资料核对日期:2026年10月2日。数值为原创教学设定,已用独立Python计算复核,不代表真实模型性能测试。

参考资料

PyTorch:TripletMarginLoss

文章版权声明:除非注明,否则均为云鹊BLOG原创文章,转载或复制请以超链接形式并注明出处。