细看高维空间中距离度量失效

做传输优化好多年,我曾经天天抱怨信息量不够,维度不够精细,忽悠经理立项,说输入多个维度的信息能更精确刻画链路画像,幸亏大家都不懂,才让我能坑蒙拐骗这多年。

但数学不会骗人,事实上,维度越多,画像越模糊,这就是维度灾难,本文稍详谈。

维度灾难说的是在高维空间中的距离度量失效。随着空间维度升高,随机点对之间的距离呈现均值趋于无穷,波动趋于消失的特征,最终导致距离失去区分样本的能力。

说白了就是高维空间中所有点之间的距离近乎一样,还能刻画个毛。

设 Rd\mathbb{R}^dRd 为 d 维空间,在超立方体 0,1d0,1^d0,1d 内随机采样两点 X=(X1,X2,...,Xd)X=(X_1,X_2,\dots,X_d)X=(X1,X2,...,Xd) 与 Y=(Y1,Y2,...,Yd)Y=(Y_1,Y_2,\dots,Y_d)Y=(Y1,Y2,...,Yd),满足:

  • 两点各分量相互独立,即对任意 i=1,2,...,di=1,2,\dots,di=1,2,...,d,XiX_iXi 与 YiY_iYi 相互独立;
  • 各分量均服从区间 0,1 上均匀分布,即 Xi∼Uniform0,1X_i \sim \text{Uniform}0,1Xi∼Uniform0,1,Yi∼Uniform0,1Y_i \sim \text{Uniform}0,1Yi∼Uniform0,1
  • 定义两点间的距离为 D=∥X−Y∥2=∑i=1d(Xi−Yi)2D = \|X-Y\|2 = \sqrt{\sum{i=1}^d (X_i - Y_i)^2}D=∥X−Y∥2=∑i=1d(Xi−Yi)2 ;
  • 单维度分量差为 Zi=Xi−YiZ_i = X_i - Y_iZi=Xi−Yi,则 D=∑i=1dZi2D = \sqrt{\sum_{i=1}^d Z_i^2}D=∑i=1dZi2 ,以观测 ZiZ_iZi 的统计特性;

根据均匀分布的期望性质,Uniform0,1\text{Uniform}0,1Uniform0,1 分布的期望为 EXi=EYi=12\mathbb{E}X_i = \mathbb{E}Y_i = \dfrac{1}{2}EXi=EYi=21。由于 XiX_iXi 与 YiY_iYi 相互独立,期望满足线性性质:

EZi=EXi−Yi=EXi−EYi=12−12=0\mathbb{E}Z_i = \mathbb{E}X_i - Y_i = \mathbb{E}X_i - \mathbb{E}Y_i = \dfrac{1}{2} - \dfrac{1}{2} = 0EZi=EXi−Yi=EXi−EYi=21−21=0

说明各维度两点偏差平均为 0,符合均匀分布的对称性。

根据方差的性质,对于独立随机变量 A 与 B,有 Var(A−B)=Var(A)+Var(B)\text{Var}(A-B)=\text{Var}(A)+\text{Var}(B)Var(A−B)=Var(A)+Var(B),已知 Uniform0,1\text{Uniform}0,1Uniform0,1 分布方差为 Var(Xi)=Var(Yi)=112\text{Var}(X_i) = \text{Var}(Y_i) = \dfrac{1}{12}Var(Xi)=Var(Yi)=121,so:

Var(Zi)=Var(Xi−Yi)=Var(Xi)+Var(Yi)=112+112=16\text{Var}(Z_i) = \text{Var}(X_i - Y_i) = \text{Var}(X_i) + \text{Var}(Y_i) = \dfrac{1}{12} + \dfrac{1}{12} = \dfrac{1}{6}Var(Zi)=Var(Xi−Yi)=Var(Xi)+Var(Yi)=121+121=61

根据方差与二阶矩关系:

EZi2=Var(Zi)+(EZi)2\mathbb{E}Z_i\^2 = \text{Var}(Z_i) + (\mathbb{E}Z_i)^2EZi2=Var(Zi)+(EZi)2

代入 EZi=0\mathbb{E}Z_i = 0EZi=0 与 Var(Zi)=16\text{Var}(Z_i) = \dfrac{1}{6}Var(Zi)=61,得:

$\mathbb{E}Z_i\^2 = \dfrac{1}{6} + 0^2 = \dfrac{1}{6}

装盘备用。

高维距离 D=∑i=1dZi2D = \sqrt{\sum_{i=1}^d Z_i^2}D=∑i=1dZi2 非线性,自然就是线性化,先算 D2=∑i=1dZi2D^2 = \sum_{i=1}^d Z_i^2D2=∑i=1dZi2 期望,再泰勒展开近似获得 D 期望。

由于各 $Z_i 相互独立,有:

ED2=E∑i=1dZi2=∑i=1dEZi2\mathbb{E}D\^2 = \mathbb{E}\left\\sum_{i=1}\^d Z_i\^2\\right = \sum_{i=1}^d \mathbb{E}Z_i\^2ED2=E∑i=1dZi2=∑i=1dEZi2

代入 EZi2=16\mathbb{E}Z_i\^2 = \dfrac{1}{6}EZi2=61,得:

ED2=∑i=1d16=d6\mathbb{E}D\^2 = \sum_{i=1}^d \dfrac{1}{6} = \dfrac{d}{6}ED2=∑i=1d61=6d

这表明随维度升高,距离平方的平均水平会线性增长。

考虑泰勒展开的合理性。为此,计算相对波动:

Var(D2)ED2=O(1d)\dfrac{\sqrt{\text{Var}(D^2)}}{\mathbb{E}D\^2}=O(\dfrac{1}{\sqrt{d}})ED2Var(D2) =O(d 1)

这意味着 D2D^2D2 波动大小远赶不上均值,当维度 d→∞d\to\inftyd→∞,D2D^2D2 波动相对于均值可忽略,所以泰勒展开精度极高。

令 μ2=ED2=d6\mu_2 = \mathbb{E}D\^2 = \dfrac{d}{6}μ2=ED2=6d,则 D2=μ2+(D2−μ2)D^2=\mu_2+(D^2-\mu_2)D2=μ2+(D2−μ2),其中 (D2−μ2)(D^2-\mu_2)(D2−μ2) 可视为扰动,对函数 f(t)=tf(t) = \sqrt{t}f(t)=t 在 t=μ2t = \mu_2t=μ2 处一阶泰勒展开:

f(t)≈f(μ2)+f′(μ2)⋅(t−μ2)f(t) \approx f(\mu_2) + f'(\mu_2) \cdot (t - \mu_2)f(t)≈f(μ2)+f′(μ2)⋅(t−μ2)

其中 f′(μ2)=12μ2f'(\mu_2) = \dfrac{1}{2\sqrt{\mu_2}}f′(μ2)=2μ2 1,代入 t=D2t = D^2t=D2,得:

D=D2≈μ2+12μ2⋅(D2−μ2)D = \sqrt{D^2} \approx \sqrt{\mu_2} + \dfrac{1}{2\sqrt{\mu_2}} \cdot (D^2 - \mu_2)D=D2 ≈μ2 +2μ2 1⋅(D2−μ2)

两边取期望,由于 ED2−μ2=ED2−μ2=0\mathbb{E}D\^2-\\mu_2=\mathbb{E}D\^2-\mu_2=0ED2−μ2=ED2−μ2=0,so:

ED≈μ2+12μ2⋅ED2−μ2=μ2\mathbb{E}D \approx \sqrt{\mu_2} + \dfrac{1}{2\sqrt{\mu_2}} \cdot \mathbb{E}D\^2 - \\mu_2 = \sqrt{\mu_2}ED≈μ2 +2μ2 1⋅ED2−μ2=μ2

代入 μ2=d6\mu_2 = \dfrac{d}{6}μ2=6d,得:

ED∼d6=O(d12)(d→∞)\mathbb{E}D \sim \sqrt{\dfrac{d}{6}}=O(d^{\frac{1}{2}}) \quad (d\to\infty)ED∼6d =O(d21)(d→∞)

当维度 d 足够大,误差可忽略,距离期望几乎等于 d6\sqrt{\dfrac{d}{6}}6d ,意味着了高维空间中任意两点平均距离趋于无穷大。

变异系数是衡量随机变量波动程度的标准化指标,即 CV(D)=Var(D)EDCV(D) = \dfrac{\sqrt{\text{Var}(D)}}{\mathbb{E}D}CV(D)=EDVar(D) ,以上所有装盘备用的小菜均为求它。

根据方差定义 Var(D)=ED2−(ED)2\text{Var}(D)=\mathbb{E}D\^2-(\mathbb{E}D)^2Var(D)=ED2−(ED)2,已知 ED2=d6\mathbb{E}D\^2=\dfrac{d}{6}ED2=6d,且 ED=d6+O(1)\mathbb{E}D = \sqrt{\dfrac{d}{6}} + O(1)ED=6d +O(1)。

将 ED\mathbb{E}DED 代入方差公式,展开:

(ED)2=(d6+O(1))2=d6+2d6⋅O(1)+O(1)=d6+O(d)(\mathbb{E}D)^2 = \left(\sqrt{\dfrac{d}{6}} + O(1)\right)^2 = \dfrac{d}{6} + 2\sqrt{\dfrac{d}{6}} \cdot O(1) + O(1) = \dfrac{d}{6} + O(\sqrt{d})(ED)2=(6d +O(1))2=6d+26d ⋅O(1)+O(1)=6d+O(d )

so,距离方差为:

Var(D)=ED2−(ED)2=d6−(d6+O(d))=O(d)\text{Var}(D) = \mathbb{E}D\^2 - (\mathbb{E}D)^2 = \dfrac{d}{6} - \left(\dfrac{d}{6} + O(\sqrt{d})\right) = O(\sqrt{d})Var(D)=ED2−(ED)2=6d−(6d+O(d ))=O(d )

代入求变异系数:

CV(D)=Var(D)ED=O(d14)O(d12)=O(d−14)CV(D) = \dfrac{\sqrt{\text{Var}(D)}}{\mathbb{E}D} = \dfrac{O(d^{\frac{1}{4}})}{O(d^{\frac{1}{2}})} = O(d^{-\frac{1}{4}})CV(D)=EDVar(D) =O(d21)O(d41)=O(d−41)

最终结论:

lim⁡d→∞CV(D)=0\lim_{d\to\infty} CV(D) = 0limd→∞CV(D)=0

这表明,随维度升高,高维随机点对之间距离波动相对于其均值越来越小,趋于0,意思是所有点对的距离都集中在均值附近,不再有远近之分,这就是距离度量失效。

这是数学算出来的结果,再违反直觉也得信,这就是数学的力量,它能让你确认你感受不到的东西。但既然算出来了,还是希望能去感受一下这意味着什么,当然,这些是工科生,特别是编程的人所最为不屑的。

如上所述,即使想直观感受高维,也要借助于数学,所谓结构决定行为,我们的大脑处在 3 维空间,如果大脑皮层的褶皱展现了分形,大脑至多 3.x < 4 维,无能感受更高维,但数学有能力击穿我们的 3 维大脑。

设想一个 n 维单位立方体,不管 n 为多少,其体积恒为 1,它有一个内接球,我们求一下这个内接球的体积,半径为 1/2,这里直接给公式:

Vn=πn/2Γ(n2+1) 2n=(π/4)n/2Γ(n2+1)V_n =\dfrac{\pi^{n/2}}{\Gamma\left(\frac{n}{2}+1\right)\,2^n}=\dfrac{(\pi/4)^{n/2}}{\Gamma\left(\frac{n}{2}+1\right)}Vn=Γ(2n+1)2nπn/2=Γ(2n+1)(π/4)n/2

求相邻比,大段整理式子,得:

Vn+1Vn∼πn+1\dfrac{V_{n+1}}{V_n}\sim \dfrac{\sqrt{\pi}}{\sqrt{n+1}}VnVn+1∼n+1 π

单调性结论:

  • 当 n+1<π≈3.1416n+1 < \pi\approx3.1416n+1<π≈3.1416,即 n=1,2:Vn+1>Vn,严格递增n=1,2:\quad V_{n+1}>V_n,\quad \text{严格递增}n=1,2:Vn+1>Vn,严格递增;
  • 当 n+1>πn+1 > \pin+1>π,即 n≥3:Vn+1<Vn,严格递减n\ge3:\quad V_{n+1}<V_n,\quad \text{严格递减}n≥3:Vn+1<Vn,严格递减;

这意味着,3 维之后,它正式成球,维度越高,内接球体积占单位立方体体积单调快速减小,指数级趋于 0。

就这一个结论已经表明了一个震惊的效果:

  • 一个试图撑满整个超立方体的球,最终几乎失去了所有体积,沦为一个奇点;
  • 高维空间立方体,内部竟然空了,体积几乎分布在表面,n 维和 n -1 维不再区别:
  • 超高维空间,体积就是表面积;

如果你在一个 d = 10000 维的立方体的一个顶点,希望到达它的 "对角顶点",会发现沿着表面绕行走和穿透中心走对角线的距离几乎毫无差别,这就是高维距离度量失效的观感。

随机在高维超立方体内采样,会发现几乎没有点落在内部,所有点都几乎分布在数量为 d 的 2 倍(1 维 2 个端,2 维 4 条边,3 维立方体 6 个面,4 维 8 个面,...)的某一个薄面上,神不神奇。

形而上思考,高维空间的反直觉现象,本质上是人类低维直觉的局限性,人的直觉反而是空间存在形式的扭曲解。

我们习惯了 3 维空间的实心,中心和边缘,可这只是低维的特例,维度每升高 1,空间的形式就被连续重构:

  • 中心越发不重要,内部越发失去意义,差异越发被抹平;

仍然站在固有的 3 维认知,问题马上就来:

如果 100 维超立方体里有 10000 个点呢,数量远超维数的 2 倍,总有点落在同一个面,总不至于这些同一个面上的点之间距离都近乎相等吧?

这也是一个反直觉的事,问题在于,100 维空间的面和 3 维空间的面是不同的,正如我们无法感受 100 维的体一样,我们也无法感受 100 维的面,它事实上就是 99 维的体,你能感受吗?

事实是,一个 100 维面上可以有很多点对,不同面上也可以有点对,点与点仍然有远近,只是远近差别被维度抹平了,这是计算出来的。

非要感受一下俩俩等距的观感,可考虑:

  • 三棱锥 3 维,4 个点分布在顶点或每个面的中心,俩俩等距,但降到 2 维,4 个点便做不到了,最多只能 3 个点两两等距,逆推回去,高维,想必更多的点有机会两两等距,直到所有的点近乎等距;

如果脱离几何空间,进入逻辑空间或许更加容易理解高维空间中距离度量失效。描述一个人可以有多个维度:

  • 1 个身高维度,很容易区分高矮;
  • 2 个身高,体重维度,种类更多但依然能区分;
  • 10 个特征维度,身高,体重,年龄,职业,皮鞋,...,种类开始稀疏;
  • 10000 个特征维度,几乎每个人自成一类,难有两两相似;

与此类似,Bloom filter 正是基于此,才能更好得散列。

今天的这篇内容主要是打脸,但早已不问过往,始终也是不会编程,再回想起来,还是有趣的。

最近天天泰勒展开,还买了开普勒的《世界的和谐》,今日又购入小平邦彦的经典《微积分入门》,卡尔波耶的《微积分概念发展史》,这可比编程那些事有意思多了

浙江温州皮鞋湿,下雨进水不会胖。

相关推荐
码智社7 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海7 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖8 小时前
JDK 26 新特性详解
java·开发语言
马优晨9 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区11 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大11 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai11 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜12 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa12 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio
一次旅行12 小时前
Python+大模型端到端自动化日报系统
开发语言·python·自动化