做传输优化好多年,我曾经天天抱怨信息量不够,维度不够精细,忽悠经理立项,说输入多个维度的信息能更精确刻画链路画像,幸亏大家都不懂,才让我能坑蒙拐骗这多年。
但数学不会骗人,事实上,维度越多,画像越模糊,这就是维度灾难,本文稍详谈。
维度灾难说的是在高维空间中的距离度量失效。随着空间维度升高,随机点对之间的距离呈现均值趋于无穷,波动趋于消失的特征,最终导致距离失去区分样本的能力。
说白了就是高维空间中所有点之间的距离近乎一样,还能刻画个毛。
设 Rd\mathbb{R}^dRd 为 d 维空间,在超立方体 [0,1]d[0,1]^d[0,1]d 内随机采样两点 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∼Uniform[0,1]X_i \sim \text{Uniform}[0,1]Xi∼Uniform[0,1],Yi∼Uniform[0,1]Y_i \sim \text{Uniform}[0,1]Yi∼Uniform[0,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 的统计特性;
根据均匀分布的期望性质,Uniform[0,1]\text{Uniform}[0,1]Uniform[0,1] 分布的期望为 E[Xi]=E[Yi]=12\mathbb{E}[X_i] = \mathbb{E}[Y_i] = \dfrac{1}{2}E[Xi]=E[Yi]=21。由于 XiX_iXi 与 YiY_iYi 相互独立,期望满足线性性质:
E[Zi]=E[Xi−Yi]=E[Xi]−E[Yi]=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} = 0E[Zi]=E[Xi−Yi]=E[Xi]−E[Yi]=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),已知 Uniform[0,1]\text{Uniform}[0,1]Uniform[0,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
根据方差与二阶矩关系:
E[Zi2]=Var(Zi)+(E[Zi])2\mathbb{E}[Z_i^2] = \text{Var}(Z_i) + (\mathbb{E}[Z_i])^2E[Zi2]=Var(Zi)+(E[Zi])2
代入 E[Zi]=0\mathbb{E}[Z_i] = 0E[Zi]=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 相互独立,有:
E[D2]=E[∑i=1dZi2]=∑i=1dE[Zi2]\mathbb{E}[D^2] = \mathbb{E}\left[\sum_{i=1}^d Z_i^2\right] = \sum_{i=1}^d \mathbb{E}[Z_i^2]E[D2]=E[∑i=1dZi2]=∑i=1dE[Zi2]
代入 E[Zi2]=16\mathbb{E}[Z_i^2] = \dfrac{1}{6}E[Zi2]=61,得:
E[D2]=∑i=1d16=d6\mathbb{E}[D^2] = \sum_{i=1}^d \dfrac{1}{6} = \dfrac{d}{6}E[D2]=∑i=1d61=6d
这表明随维度升高,距离平方的平均水平会线性增长。
考虑泰勒展开的合理性。为此,计算相对波动:
Var(D2)E[D2]=O(1d)\dfrac{\sqrt{\text{Var}(D^2)}}{\mathbb{E}[D^2]}=O(\dfrac{1}{\sqrt{d}})E[D2]Var(D2) =O(d 1)
这意味着 D2D^2D2 波动大小远赶不上均值,当维度 d→∞d\to\inftyd→∞,D2D^2D2 波动相对于均值可忽略,所以泰勒展开精度极高。
令 μ2=E[D2]=d6\mu_2 = \mathbb{E}[D^2] = \dfrac{d}{6}μ2=E[D2]=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)
两边取期望,由于 E[D2−μ2]=E[D2]−μ2=0\mathbb{E}[D^2-\mu_2]=\mathbb{E}[D^2]-\mu_2=0E[D2−μ2]=E[D2]−μ2=0,so:
E[D]≈μ2+12μ2⋅E[D2−μ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}E[D]≈μ2 +2μ2 1⋅E[D2−μ2]=μ2
代入 μ2=d6\mu_2 = \dfrac{d}{6}μ2=6d,得:
E[D]∼d6=O(d12)(d→∞)\mathbb{E}[D] \sim \sqrt{\dfrac{d}{6}}=O(d^{\frac{1}{2}}) \quad (d\to\infty)E[D]∼6d =O(d21)(d→∞)
当维度 d 足够大,误差可忽略,距离期望几乎等于 d6\sqrt{\dfrac{d}{6}}6d ,意味着了高维空间中任意两点平均距离趋于无穷大。
变异系数是衡量随机变量波动程度的标准化指标,即 CV(D)=Var(D)E[D]CV(D) = \dfrac{\sqrt{\text{Var}(D)}}{\mathbb{E}[D]}CV(D)=E[D]Var(D) ,以上所有装盘备用的小菜均为求它。
根据方差定义 Var(D)=E[D2]−(E[D])2\text{Var}(D)=\mathbb{E}[D^2]-(\mathbb{E}[D])^2Var(D)=E[D2]−(E[D])2,已知 E[D2]=d6\mathbb{E}[D^2]=\dfrac{d}{6}E[D2]=6d,且 E[D]=d6+O(1)\mathbb{E}[D] = \sqrt{\dfrac{d}{6}} + O(1)E[D]=6d +O(1)。
将 E[D]\mathbb{E}[D]E[D] 代入方差公式,展开:
(E[D])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})(E[D])2=(6d +O(1))2=6d+26d ⋅O(1)+O(1)=6d+O(d )
so,距离方差为:
Var(D)=E[D2]−(E[D])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)=E[D2]−(E[D])2=6d−(6d+O(d ))=O(d )
代入求变异系数:
CV(D)=Var(D)E[D]=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)=E[D]Var(D) =O(d21)O(d41)=O(d−41)
最终结论:
limd→∞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 正是基于此,才能更好得散列。
今天的这篇内容主要是打脸,但早已不问过往,始终也是不会编程,再回想起来,还是有趣的。
最近天天泰勒展开,还买了开普勒的《世界的和谐》,今日又购入小平邦彦的经典《微积分入门》,卡尔波耶的《微积分概念发展史》,这可比编程那些事有意思多了
浙江温州皮鞋湿,下雨进水不会胖。