高维空间:为什么箭头越多"量尺",就越谁也不挨着谁
一条走廊里迎面走来一个人,你俩必然撞见。同样两个人扔进一栋十层楼里,一整天可能一次都碰不上——能躲的方向多了,撞上就变成了稀罕事。
🧠 一句话结论
量尺(维度)越多,随便拿两根箭头,它们就越接近互相垂直、点积越接近 0。所以"余弦 0.8"这个数字本身没有意义——在 2 根量尺的世界里它随处可见,在上千根量尺的世界里它是一个几乎不可能巧合出现的强信号。
场景问题
学校要给全校同学做"兴趣配对",把兴趣最像的两个人分到一组。
第一次,老师只问了一个问题:你喜欢运动的程度,1 到 10 分打几分?
结果全校 800 人挤在 10 个格子里,一抓一大把"完全一样"的人。老师说这不行,配出来的组全是碰巧。
第二次,老师问了 50 个问题:运动、看书、画画、打游戏、做饭、养猫、听歌、拼乐高……每项都打分。这回出事了——几乎每两个人算出来都"不太像",连最好的一对朋友,分数看着都挺疏远。
老师有点慌:是不是问题问多了反而不准了?
其实老师没做错任何事。她只是撞上了一件很反直觉的事:当"量尺"从 1 根变成 50 根,"像"这件事本身的稀有程度,被彻底改写了。这一篇就是讲这件事。
实现方案
一根量尺 = 一个维度
先把话说明白:这一篇说的"维度",就是互不干扰的量尺有几根。
- 只问"运动打几分"——1 根量尺,1 维
- 再加一问"看书打几分"——2 根量尺,2 维。这时每个人是方格纸上的一个点,就是第一篇那根箭头
- 问 50 个问题——50 根量尺,50 维
"互不干扰"这个词很关键:运动分怎么变,都不会自动改变看书分。每根量尺各管各的,这才叫多出来一个维度。
50 维的图我们画不出来,但不用画——箭头的一切算法(加减、数乘、点积)在 50 维里跟在 2 维里一模一样,只是每一步多算几项而已。看不见不等于不会算。
量尺一多,格子数就炸了
先看一件最直观的事:每根量尺分成 10 挡,一共有多少种可能的组合?
每加一根量尺,格子数就乘一次 10,不是加。3 根量尺已经 1000 个格子,50 根量尺的格子数是 10 后面跟 50 个 0——比全宇宙的原子数还多得多。
全校 800 人撒进这么多格子里,两个人恰好落在同一格附近,本来就是极小概率的事。老师的第二次配对没做错,只是她在一片汪洋里找两粒挨着的沙子。
量尺一多,随便两根箭头就都快垂直了
格子变稀疏还只是第一步。真正反直觉的在这里。
回到第九篇:两根箭头的余弦衡量它们"有多顺",1 是完全同向,0 是垂直,-1 是完全反向。
现在随便抓两根箭头,算它们的余弦。量尺根数不同时,这个数会长什么样?
2 根量尺时:随便两根箭头,余弦什么值都可能,0.8 一点也不稀奇——在平面上随手画两根箭头,它们夹角小于 37 度的机会本来就有四成左右。
200 根量尺时:几乎所有随机箭头对算出来的余弦都紧贴着 0。也就是说,高维空间里随便两根箭头,几乎必然接近互相垂直。
为什么?回想点积的坐标算法:对应位置相乘再相加。每一项的正负基本是碰运气,200 项正负掺着加,互相抵消得非常干净,总和自然贴着 0。量尺越多,抵消得越彻底。
这就是"十层楼里碰不上"的数学版本:能岔开的方向太多了,正好走同一条道成了稀罕事。
所以"余弦 0.8"到底算不算像
现在可以回答开头老师的困惑了。同一个余弦数值,在不同量尺根数下的含金量完全不同:
| 量尺根数 | 随便两根箭头的余弦通常长什么样 | 这时余弦 0.8 意味着 |
|---|---|---|
| 2 根 | 什么值都常见,0.8 一抓一大把 | 几乎没有信息量,很可能只是碰巧 |
| 50 根 | 大多挤在 0 附近,偏离一点点就算显眼 | 已经比较可疑了 |
| 1000 根以上 | 死死贴着 0,0.1 都算大 | 几乎不可能是巧合,是极强的信号 |
老师第二次的配对没变差,反而变准了——只是她得换一把尺子来读那个分数。50 维下算出 0.6,比 1 维下算出 0.95 有说服力得多。
判断"像不像",永远要连着量尺根数一起看,光看余弦数字大小是读不出结论的。
那量尺是不是越多越好
也不是。量尺变多有个躲不掉的代价,就是前面那张图说的:格子数爆炸,人被摊得越来越稀。
- 量尺太少:大家挤成一团,谁跟谁都"像",分不出差别
- 量尺太多:人人都离得老远,而且每加一根量尺,都需要更多的样本才能看出规律,否则算出来的"像"全是噪声
这个"量尺一多,数据就被摊薄"的麻烦有个名字,叫维度灾难——意思就是"维度太高带来的麻烦",不是什么灾难片。所以实际用的时候总要挑一个中间的根数:多到能分辨,又不至于稀得没法学。
为什么这么做
为什么不干脆多加量尺,反正越多分得越细?
因为每加一根量尺,需要的样本数就得跟着涨一大截,否则你看到的"规律"全是噪声凑出来的。量尺根数是在"分得开"和"喂得饱"之间挑一个折中,不是越大越好。
为什么高维里随机两根箭头几乎垂直,这不是很奇怪吗?
不奇怪,是我们的直觉只在 2、3 根量尺里练过。点积是把对应位置相乘再相加,每一项的正负基本靠碰运气;项数一多,正负互相抵消得越来越彻底,总和自然趴在 0 附近。项数越多,抵消越干净。
为什么这反而是好事,而不是坏事?
正因为"随便两根箭头都接近垂直",一旦某两根箭头的余弦明显不等于 0,那就一定不是碰巧——它们之间真的有关系。高维空间把"巧合"的门槛抬得极高,于是剩下的信号格外可信。这就是为什么用几百上千根量尺来描述一段文字,比用两三根靠谱得多。
为什么别的选择不行
错误直觉一:把 3 维的感觉直接搬到高维
"不就是 3 维再多加几根轴嘛,感觉应该差不多。"
差得远。在 3 维里,随便两根箭头夹角小于 45 度是很常见的事;在 500 维里,这种事的概率小到可以当作永远不会发生。低维里的"常见",在高维里可能是"几乎不可能",反过来也一样。
所以高维里不能靠脑补一个立体图形来判断,只能靠算——好在算法跟 2 维完全一样,多算几项而已。
错误直觉二:以为量尺越多越好
多加量尺看起来只有好处:描述更细致嘛。但每加一根量尺,可能的组合数就乘一次,同样多的样本会被摊得更薄。
摊到最后,任意两个样本都离得老远,你以为算出来的"最像的一对"其实只是噪声里最大的那一坨。量尺根数要够用,但不能超过样本喂得起的程度。
错误直觉三:以为余弦数值可以脱离量尺根数谈大小
"0.8 肯定比 0.3 像啊。"
只有在同一套量尺下比较才成立。跨着量尺根数比大小是没意义的:
- 2 根量尺下的 0.8:随手画两根箭头就能撞上,基本等于没说
- 1000 根量尺下的 0.3:已经是个非常显眼、几乎不可能碰巧的信号
余弦是一个相对量,不是绝对分数。 换了量尺根数,及格线就得跟着换。
沉淀结论
- 维度就是"互不干扰的量尺有几根",箭头的所有算法在多少维里都一样,只是多算几项
- 量尺每加一根,可能的格子数就乘一次——样本被摊得越来越稀,这个麻烦叫维度灾难
- 量尺一多,随便两根箭头就几乎必然接近垂直,余弦紧贴 0——因为正负项互相抵消得很干净
- 正因如此,高维里一个明显偏离 0 的余弦,几乎不可能是巧合,信号格外可信
- 余弦数值必须连着量尺根数一起读:2 维下的 0.8 没信息量,1000 维下的 0.3 是强信号
记忆口诀
维度就是量尺有几根。
量尺每加一根,格子数乘一次,人就被摊稀一层。
量尺一多,随便两根箭头都快垂直,余弦贴着 0。
所以高维里余弦一旦不为 0,就不是碰巧。
看余弦别只看数字,先问一句:几根量尺?
延伸阅读
- embedding 的维度为什么动辄 768、1536:正是本篇的结论在挑那个折中——少了分不开,多了摊太稀。详见大模型核心原理。
- 向量检索为什么敢用余弦当判据:因为在上千根量尺下,余弦明显偏离 0 几乎不可能是巧合。详见RAG 架构。
自测:合上资料能说清楚吗?
- 为什么量尺根数一多,随便抓两根箭头就几乎必然接近垂直?
参考答案
因为点积是对应位置相乘再相加,每一项的正负基本靠碰运气。项数一多,正负项互相抵消得非常干净,总和自然趴在 0 附近,余弦也就贴着 0。项数越多抵消越彻底,所以维度越高越接近垂直。
- 同样是"余弦 0.8",在 2 根量尺下和在 1000 根量尺下,含金量一样吗?
参考答案
完全不一样。 2 根量尺下随手画两根箭头就能撞出 0.8,几乎没有信息量;1000 根量尺下随便两根箭头的余弦死死贴着 0,能到 0.8 几乎不可能是巧合,是极强的信号。余弦是相对量,必须连着量尺根数一起读。
- 既然量尺越多分得越细,为什么不无限加下去?
参考答案
因为每加一根量尺,可能的格子数就乘一次,同样多的样本会被摊得越来越稀。摊到最后任意两个样本都离得老远,算出来的"最像的一对"其实只是噪声里最大的那一坨。这个麻烦叫维度灾难。量尺根数要够用,但不能超过样本喂得起的程度。
- 老师从问 1 个问题改成问 50 个问题后,发现"几乎每两个人都不太像"。她做错了吗?
参考答案
没做错,反而变准了。 1 个问题时全校挤在 10 个格子里,谁跟谁都"像",那种像全是碰巧。50 个问题下大家自然拉开距离,这时候还能算出比较高的分数才是真的像。她只需要换一把尺子读分数:50 维下的 0.6 比 1 维下的 0.95 有说服力得多。
- 高维里"随便两根箭头都接近垂直",这件事对做检索来说是好消息还是坏消息?
参考答案
是好消息。 正因为随机的两根箭头几乎必然垂直,一旦某两根箭头的余弦明显不等于 0,就说明它们之间真的有关系,而不是撞了运气。高维把"巧合"的门槛抬得极高,剩下的信号才格外可信——这正是用几百上千维描述一段文字比用两三维靠谱的原因。