长了十倍的箭头,也可能是完美匹配。要看你问的是什么。
两份歌单的曲风比例可能相同,总时长却差很多。两篇文章的词语比例也可能相近,但其中一篇长得多。在这些例子里,模式与数量是两件事。数值向量能同时描述它们,而相似度公式决定比较时保留什么。最接近的匹配这句话,经常把这个选择藏了起来。画出四支小箭头,比争论哪种公式最好更容易看清分歧。
方向保留模式,长度保留数量。
四支箭头,两位合理的冠军
查询向量是 (1, 1)。候选 A 为 (10, 10),B 为 (1, 0),C 为 (0.8, 1.2),D 为 (-1, -1)。A 与查询方向完全相同,但长度是十倍;C 的终点很近,方向略有偏差;D 则指向完全相反的方向。从不同角度看,它们各自都展示了相似或不同的合理含义。
坐标刻意保持简单。实验不需要声称箭头理解语言,只需要让保留大小与忽略大小产生不同的排序。两种排序都能计算并检查,也都不需要训练模型。

欧氏距离偏爱相邻的终点
把向量放在共同起点,欧氏距离测量的是两个终点之间的直线间隔。C 到查询约为 0.2828,B 为 1,D 约为 2.8284,A 约为 12.7279。因此 C 最近。A 虽然方向完全一致,却无法用这个优点抵消终点相距很远的事实。
如果坐标数值的大小很重要,这种比较很合理。假如坐标表示需要匹配的实际数量,去掉尺度就可能把原本想发现的差异也扔掉。欧氏距离还会继承坐标的单位和缩放方式,所以它的意义取决于测量所处的空间。
余弦相似度偏爱一致的方向
余弦相似度把点积除以两个向量长度的乘积。对非零向量,它描述的是夹角关系。A 的分数约为 1,C 约为 0.9806,B 约为 0.7071,D 约为 -1。这次 A 获胜。归一化去掉了大小,因此它多出来的长度不再影响比较。
几个边界很好想象:在这里的实数向量情境中,1 表示同方向,0 表示垂直,-1 表示反方向。负分并不是道德评价,也不是说两个人意见相反,只是输入坐标之间的几何关系。

先归一化,两种看法就联系起来了
把所有非零向量缩放到长度一,图中所有终点都会落在单位圆上。对单位向量,欧氏距离的平方等于二减去两倍余弦相似度。因此,在归一化后的向量上,按欧氏距离从小到大排序,与按余弦相似度从大到小排序是一致的。先前的分歧,来自是否保留原始长度。
这是数学关系,不代表归一化一定适合某个应用。总量可能恰好很有价值。另外,全零向量没有方向可供归一化。实际程序需要明确规定如何处理这种情况,而不是除以零,或悄悄给出一个任意分数,再把它当作有意义的匹配。
扩展计算把单位圆关系变成可核对的数字。归一化后,查询到A、C、B、D的距离分别为0、约0.1971、0.7654和2,顺序与余弦一致。D在单位圆上恰好相反,因此达到最大间隔。归一化没有发现隐藏相似性,而是有意移动端点,让径向大小不再影响它们的分离程度。
分数再高,也需要合适的表示方式
如果表示方法遗漏了你关心的信息,相似度分数也救不回来。只记录词频的文档向量,可能漏掉语序、否定和上下文。学习得到的表示可以捕捉更丰富的关系,但分数仍然需要在实际用途上评估。公式本身无法证明语义理解。
分数的形式也容易引起过度解读。余弦值 0.98 不等于匹配概率 98%。它只是一个余弦值。要把它变成校准过的概率,还需要另外的模型和相关证据。这些小箭头演示的是几何关系,不是搜索引擎或推荐产品的可靠性。
移动原点关系,角度的含义也会变
箭头里还藏着一个选择:箭尾从哪里出发。给查询和所有候选同时加(100, 0),彼此坐标差不变,所以欧氏距离完全相同,C仍获胜。但余弦此时也选C。端点组成的图形只是整体移动,从零点发出的射线方向却变了。余弦对各向量的正倍数缩放不变,并不对共同平移不变。
原来A与查询夹角为零,C约11.310度,B为45度,D为180度。平移后,A、C、B、D的实测角差分别约4.627、0.115、0.567、1.146度,连D也几乎与查询同向。两次计算都没出错。实验说明,有意义的原点是角度表示定义的一部分;当数字表示位置,而不是相对自然零点的数量时,这一点尤其重要。

先决定哪些信息可以忘掉
选公式前,可以先问:如果把某个对象的整个向量乘以十,它的相似度应不应该变化?如果代表某项重要数量增加十倍,也许应该;如果只是同样组成的文章写得更长,也许不应该。这个问题,比把某种公式当作普遍更先进的方法更有启发。
本地检查确认了同方向、反方向的情况,也确认两种比较产生不同第一名。一个例子无法替所有问题选公式,但能把取舍说清楚:A 在不同尺度上保留查询的模式,C 则更接近查询的终点。哪位应该获胜,取决于任务到底看重哪件事。
实际比较可分开问两个不变性问题:整体大小改变后,答案该不该不变?全部点加相同偏移后,该不该不变?原始欧氏距离通过第二项、不通过第一项;余弦对正倍数通过第一项,却不通过第二项。单项测试都不能证明有用,但能在漂亮分数分散注意前,揭示公式是否尊重应用认为无关的变换。
