余弦相似度 0.82 说明什么?在减去零模型之前,它什么也不说明
【锚点】这一篇只钉一个判断:【余弦相似度不是「语义距离」的读数,而是「共享均值方向 + 高方差维度」的读数;不报零模型基线的相似度结论,是不可复现的仪器噪声。】
【显式】先给一个能在草稿纸上验算的算术。设每个表示 x = m + r,m 是所有表示共享的均值方向、‖m‖=1,r 是与 m 垂直的残差、‖r‖=ε、方向随机。那么任意两个表示: cos(x,y) ≈ (1 + ε²·c) / (1 + ε²),其中 c 是残差间余弦,高维下 c≈0。 取 ε=0.5,得 cos ≈ 1/1.25 = 0.80。
【隐式】也就是说:只要「共享方向」的模长是「个体差异」的两倍,任意两个毫不相干的文本,余弦相似度就已经是 0.8。你测到的 0.82 里,0.80 来自坐标系本身,只有 0.02 来自你关心的东西。
【细微】这不是假想的病。Ethayarajh (2019) 测过 BERT/ELMo/GPT-2 各层的各向异性:随机词对的平均余弦相似度随层深单调上升,高层普遍落在 0.8 以上的量级,底层接近 0。而「用最后一层算语义相似度」这个默认操作,恰好挑中各向异性最强的那一层。
【极难发现】更糟的是「流氓维度」。Timkey & van Schijndel (2021) 发现 BERT/GPT-2 里少数几个维度的方差比其他维度大几个数量级,余弦相似度几乎完全由这几个维度决定:删掉它们,最近邻排序会大幅重排。换句话说,你报告的「语义邻域」可能只是「某两个高方差轴上的投影邻域」,而高方差轴往往编码位置、频率、标点、句长这类非语义因素。
【流程节点链路】(可复现的最小流程) 起点:原始表示矩阵 X(n 个文本 × d 维) → 节点1:估计均值向量 μ = mean(X) → 节点2:中心化 X’ = X − μ → 节点3:对 X’ 做 SVD,看前 k 个奇异值的方差占比 → 节点4:若前 k 个占比超过阈值(我习惯用 50%),剔除这 k 个方向得 X’‘(all-but-the-top,Mu & Viswanath 2018) → 节点5:在 X’’ 上算余弦 → 节点6:构造零模型(随机文本对 / 同长度随机串 / 打乱标签) → 节点7:报 z = (cos_obs − μ_null)/σ_null,并报零模型的 95 分位 终点:只有 z 显著、且 cos_obs 超过零模型 95 分位的相似度,才允许被解释为「语义接近」。
【隐式】注意这条链的终点不是「相似度是多少」,而是「相似度比随机高多少」。零模型是计算社会科学里最便宜、也最容易被跳过的一步。
【细微】数字人文最常见的翻车场景:议会记录、书信集、报刊语料。体裁、长度、作者、时期都是高方差方向,它们先把空间撑开,然后你在残差里看到的「主题聚类」其实是体裁聚类。修法不是换模型,是把体裁/长度/说话人先回归掉——就像 Rerandomization 里先平衡协变量,而不是祈祷随机化。
【极难发现】一个反直觉的推论:换归一化方式(无 / 中心化 / all-but-the-top)之后,下游结论的翻转率本身就是一个可发表的数字。如果「唐诗 vs 宋词」的分类在三种归一化下都稳,结论是真的;一换就翻,你测的是仪器。
【待验证点】我没找到系统报告「数字人文语料上余弦相似度的零模型基线分布」的论文。这是个便宜、可做、审稿人会喜欢的实验:同一批语料报三条曲线(原始余弦、中心化后余弦、对零模型的 z),看结论在三条曲线上是否同号。
结尾问题:如果语义相似度必须先减去零模型,那「语义空间」里还剩多少是语言本身的结构,多少是测量仪器的几何?我倾向于认为这不可先验回答,只能靠翻转率回答——而这恰恰意味着,测量模型的选择就是理论承诺,不是技术细节。







0 Comments