all_lessons/数学的逻辑/24第 25 课 / 共 44 课

第七部分 · 表示与几何

高维的怪相:维度灾难与测度集中

我们一直在把数据往低维压。这一课说破压它的理由:高维空间本身就是个怪地方。在那里,体积都躲到了"皮"上,随机两点几乎永远等距,"最近的邻居"失去了意义——三维里训练出来的几何直觉,到高维全线崩盘。

线性回顾
上一课:我们用 SVD/PCA 把几百维数据压到几维——因为数据其实活在一个低维子空间附近,砍掉小方差方向几乎不丢信息。
留下的问题:可我们一直默认"降维是好事",却没说为什么非降不可。如果高维只是"维度多一点",多算点而已,那直接在原始高维里做不就好了?偏不行。高维空间的几何,和我们在二三维里养成的直觉,是系统性地对着干的。距离、体积、邻居、采样——每一个你以为天经地义的概念,到了高维都会变脸。
本课新增:维度灾难——采样需求随维度指数爆炸测度集中——高维里几乎所有体积都贴在"外壳"上、随机点几乎两两等距。看懂它,就懂了机器学习为什么离不开结构、归纳偏置与正则化。
本课路线
(1) 先让直觉破产:高维立方体的体积几乎全在薄薄一层皮上。(2) 球也一样——高维橙子几乎全是皮、没有瓤。(3) 距离崩塌:随机两点几乎永远等距,"最近邻"变得没意义。(4) 采样的诅咒:要铺满 d 维空间,样本数随 d 指数爆炸。(5) 这就是"维度灾难"。(6) 出路:靠结构、归纳偏置、正则化——为什么 ML 必须这么做。

第一记闷棍:体积都躲到皮上去了

拿一个边长为 1 的立方体,在里面套一个边长 0.9 的小立方体(每面各留 0.05 的边距)。问:留在"外壳"(大立方体内、小立方体外)的体积占多少?

二维(正方形)里,小方块面积 0.9² = 0.81,外壳只占 19%——大部分还在中心。三维,小方块体积 0.9³ ≈ 0.73,外壳 27%。看起来温和。可体积是每多一维就再乘一次 0.9

外壳占比 = 1 − 0.9ᵈ (d 是维数;0.9ᵈ 读作"0.9 的 d 次方")

d = 1000.9¹⁰⁰ ≈ 0.0000266——也就是说,99.997% 的体积都挤在那层薄薄的外壳里,中心区几乎空无一物。0.9 这个数小于 1,自乘一百次就被碾成了尘埃。高维立方体不像我们想的"一个饱满的盒子",它几乎全是皮、几乎没有内部。这不是错觉,是 0.9ᵈ → 0 的铁律。

高维橙子:全是皮,没有瓤

球更夸张。一个半径 1 的球,里面套个半径 0.99 的球,外壳(那 1% 厚的果皮)占多少体积?d 维球体积正比于半径的 d 次方,所以内球占 0.99ᵈ,外壳占 1 − 0.99ᵈd = 10000.99¹⁰⁰⁰ ≈ 0.000043——99.99% 的体积都在最外那 1% 的果皮里

换个角度同样惊人:固定立方体边长,把球塞进去,球占立方体的比例随维度趋于 0。三维里球还占盒子的一半多,到几十维,球的体积相对盒子小到可以忽略——空间几乎全跑到立方体的"角落"里去了,而高维立方体的角落多得吓人(d 维有 2ᵈ 个角)。一个高维盒子,几乎就是一蓬向四面八方伸出去的尖刺。我们脑子里那个圆滚滚、内部饱满的几何,在高维彻底失效。

距离崩塌:最近的邻居不再"近"

这是对机器学习最致命的一击。在低维里,"找最相似的样本"="找距离最近的点",天经地义——推荐、检索、聚类、k-近邻全靠它。可在高维里随机撒一堆点,会发生一件怪事:任意两点之间的距离,几乎都一样。

原因可以一句话点透:两点距离的平方,是每一维上差值平方的总和。维度一高,这是在把几百上千个独立的随机小量加起来——由第 10 课的大数定律,这种和会紧紧地集中在它的平均值附近,几乎不波动。于是不管挑哪两点,那个"总和"都差不多,距离也就都差不多。具体地,最近点距离与最远点距离的比值随维度趋于 1

(最远距离 − 最近距离) / 最近距离 → 0 (当 d → ∞)

"最近"和"最远"挤到了一块儿。这意味着"最近邻"这个概念在高维里失去了意义——既然大家都差不多远,"离我最近的点"就成了一句空话,靠它做判断和掷骰子没两样。这正是测度集中:高维空间里,一个由许多维度加总出来的量(体积、距离、范数)会反常地集中在一个固定值附近,几乎不再有"近"和"远"的分别。

亲手把直觉碾碎:拉高维度 d,看怪相飙升
滑块调维度 d(从 1 拉到 200)。蓝条:边长 1 立方体里,体积落在"外壳薄层"(厚 0.05)的比例 = 1 − 0.9ᵈ——很快冲到 100%。绿条:在 d 维里随机撒一批点,最近邻距离 ÷ 最远距离 的比值——很快逼近 1(大家一样远)。两条都是真算出来的:蓝条按公式,绿条对随机点实测。
外壳占体积 (1 − 0.9ᵈ)
最近 ÷ 最远 距离比
铺满网格所需样本(每维10格)

采样的诅咒:维度灾难的本相

"维度灾难"这个名字(贝尔曼,1957)最初说的就是采样。想"了解"一个空间,你得在里面撒足够密的样本。一维上每隔 0.1 放一个,需要 10 个点就能铺满 [0,1]。二维要 10² = 100 个,三维 10³ = 1000 个。到 d 维:

铺满所需样本数 ≈ 10ᵈ (每维分 10 格;10ᵈ 读作"10 的 d 次方")

d = 20 就要 10²⁰ 个样本——比地球上所有沙粒还多。一张小图片是几千维,你永远凑不齐"铺满"它的数据。所以在高维里,你的数据注定是极度稀疏的:无论收集多少样本,它们在那个浩瀚空间里都只是几粒孤零零的尘埃,彼此隔着大片从未被采到的虚空。"用足够多的样本把空间填满、然后内插"这条低维里行之有效的路,在高维被指数墙彻底堵死。

那机器学习是怎么活下来的

读到这儿你该不安了:数据稀疏成这样、距离又失效,机器学习凭什么还能成?答案藏在一个救命的事实里——真实数据并不会均匀地撒满整个高维空间。一张真实人脸照片是几千维,但所有"长得像脸"的照片,只占据这个巨大空间里一片极薄、极低维的"流形"(弯曲的低维面);随便填进去的随机像素,几乎永远是雪花噪点,不是脸。数据有结构,它远比它所在的空间低维——这正是上一课 PCA 能把几千维压到几十维的根本原因。

于是机器学习的全部本事,可以重述成一句话:对抗维度灾难。它靠三件法宝——一是降维 / 表示学习(把数据搬回它真实的低维老家,正是第七部分一路在做的);二是归纳偏置(把"图像有局部性""语言有顺序"这类先验结构焊进模型,让它不必在整个高维虚空里盲目搜索);三是正则化(逼模型偏爱简单解,别去硬记那一点点稀疏样本——这一招后面讲优化时还会专门登场)。没有这三样,任何模型在高维里都只能对着稀疏的尘埃过拟合。维度灾难不是某个算法的小毛病,它是悬在所有高维学习头顶的那把剑,也是这整门学科要绕开的那堵墙

常见误解

一句话带走
高维空间和二三维直觉系统性地作对:体积几乎全挤在"外壳"上(0.9ᵈ → 0),随机两点几乎永远等距(测度集中,"最近邻"失效),要铺满空间所需样本随维度指数爆炸10ᵈ)——这就是维度灾难。机器学习能活下来,全靠真实数据其实低维:用降维、归纳偏置、正则化把它拉回低维老家。
下一步
第七部分到此收官。我们用整整六课,把数据稳稳地放进了空间:一个样本是一个点(19),点张成子空间(20),变换有主轴(21),高维能被压扁(22),而高维本身怪相重重、逼着我们靠结构求生(23)。表示,搞定了。可一个根本问题还没碰:机器到底怎么"学"?说穿了,学习就是不停地调参数,把"预测错得多严重"这个损失,一点点降到最低——而"沿着一个函数往最低处走",正是数学里一门成熟到发亮的学问:优化。要往低处走,第一步得知道"此刻往哪个方向是下坡"——那是多元微积分里的梯度。表示之后,是优化。→ 第 25 课《往哪儿下坡:多元微积分与梯度》(进入第八部分 · 学习就是优化)。