在用公共参照连接向量模型的设计中,各个模型分别描述一段文本与同一组参照的关系。这样,彼此不必共享原始坐标,也能比较那些关系。
参照因此承担了一项很实际的工作:告诉系统从哪些方向观察对象。要理解它的代价,可以先把复杂模型暂时放下,只看一张平面。
两个不同对象,得到同一个数
取两个单位向量:
x = (0.6, 0.8)
y = (0.6, -0.8)
它们的第二个坐标不同,彼此的点积为 −0.28。现在只选一个单位参照 a = (1, 0),以余弦相似度表示对象与参照的关系。结果是:
x 与 a 的关系 = 0.6
y 与 a 的关系 = 0.6
两个不同对象被表示成了同一个数。后续系统无论怎样精细处理这个数,都无法仅凭它恢复已经丢掉的区别。
增加另一个参照 b = (0, 1) 后,关系表示变为:
x → [0.6, 0.8]
y → [0.6, -0.8]
这一次区别重新可见。例子中的计算是精确的;它证明的是选定表示可能丢失信息,并不声称两个真实人群已经遭遇了这种排序结果。
重复参照没有补回新信息
如果第二个参照仍是 (1, 0),只是换了一个编号,两份信息完全相同。如果新增的参照都接近同一个方向,表示长度增加,也可能只是在反复描述原本已经看见的区别。
因此,参照数量与有效区分能力之间,还隔着参照是否互补、当前任务需要哪些区别,以及模型能否表达这些区别。
文本空间比这个平面复杂得多。一段参照文本并不对应由人精确指定的语义轴;不同模型对它的理解也未必一致。二维例子的用途,是帮助我们提出实验问题:某组参照是否把任务相关的两个对象压得过近?换一组以后,哪些关系发生了变化?
从数学问题走到人的处境
设想一个协作目录,长期使用销售、推广、增长等参照来描述能力。修理旧物的人可以与其中某些词产生关系,但诊断故障、延长寿命、恢复使用的区别,可能表达得不够清楚。
这是一项待检验的推演。它提示我们,系统中的“难以找到”可能有几种来源:资料没有收录,描述没有写清,表示丢失了关键区别,或者排序目标本来就不奖励那种贡献。不同来源,需要不同修复。
只增加维修者数量,无法必然修复表示中的盲点;只修改参照,也无法替代缺失的资料。把故障定位到正确一层,才能知道下一项工作应该是补材料、换表示,还是调整任务判断。
而“谁决定什么区别重要”又是一项设计选择。如果系统服务于修理课程,就应能分辨安全拆卸、诊断与教学;如果服务于设备采购,条件会不同。一套公共参照可以帮助互通,但公共并不意味着对所有任务同样合适。
一次有判断力的替换实验
要判断参照选择是否真的影响了发现,可以保持请求、候选、模型、检索预算和评价方法不变,只替换参照集合。
首先观察表示:哪些原先挤在一起的候选变得可以区分?随后观察名次:变化是否进入实际使用的前十名或前一百名?最后回到任务:新增候选究竟提供了所需能力,还是只是把另一组噪声推到前面?
平均分之外,还应查看事先关心的任务类型。一个集合可能提高总体表现,却让某种小众任务持续变差。反过来,为少数任务增加专用参照也会引入存储、计算和版本成本。结果应当帮助决定在哪里使用公共部分,哪里需要补充。
这些选择可以通过实验逐步改善。参照集合不必一次完美,也不必因发现遗漏而整个废弃;关键是让遗漏有机会被发现,让版本变化能够被比较。
让遗漏成为可以检验的意见
我希望公共参照有两个性质:足够稳定,让不同参与者能够相互理解;也允许人指出“用这组东西描述我,漏掉了一件影响任务的重要事情”。
后一种反馈需要具体对象。提出一项遗漏时,可以带上一对应该被区分的材料、一项受影响的任务,以及加入什么参照后可能改善的猜想。这比争论一套词表是否代表所有人,更容易转化为可运行的检验。
最初那对向量提供了一个简单起点:拿出系统目前分不开、但任务确实需要分开的两个对象。参照是否值得更新,可以从这项具体差别开始讨论。