从高维球到 Embedding:维数灾难、流形假设与 AI 的几何直觉
从 3Blue1Brown 的高维球视频出发,推导球体积与测度集中,理解 Embedding、内在维度和流形假设,并辨析所谓的黄金维度与 AI 幻觉。
我的疑问,起源于 3Blue1Brown 的一个视频:The most beautiful formula not enough people understand。
它从熟悉的圆和球出发,讨论高维球的体积,最后展示了一些很难用三维直觉理解的现象:单位球的体积会随着维度增加而趋近于零,球内的大部分体积却又集中在靠近表面的薄壳里。
随后,我和 AI 进行了一轮追问:
这和“维数灾难”有什么关系?Embedding 为什么偏偏要用高维向量?如果真实数据其实在低维流形上,为什么不直接用低维表示?所谓 1024~4096 维的“黄金折中”,到底有没有数学依据?
这条追问路径很有价值,但有些回答把严格的数学结论、带条件的统计规律和帮助理解的比喻混在了一起。比如“高维球都是空心的”“流形假设战胜了维数灾难”“大模型幻觉就是跑出了流形”,听起来连贯,却不能直接当作科学结论。
这篇文章重新梳理这条知识链。我们先把几何算清楚,再进入机器学习,最后讨论哪些直觉可以保留,哪些边界必须补上。
一、先从一个概率问题理解高维球
1. 维度,只是描述一个对象需要多少个坐标
一条线上,一个数就能确定位置;平面上需要两个数;三维空间需要三个数。
同样,一张 $256\times256$ 的灰度图片,可以用 65,536 个像素值描述,所以可以看作 $\mathbb{R}^{65536}$ 中的一个点。这里的“维度”不需要对应肉眼能看见的空间方向,它首先是坐标的数量。
定义 $n$ 维半径为 $r$ 的球体:
\[B_n(r)=\left\{x\in\mathbb{R}^n:\sum_{i=1}^{n}x_i^2\le r^2\right\}.\]这里要区分两个对象:球体包括内部,球面只是它的边界。二维球体是圆盘,二维球体的边界才是圆周。
2. 随机数的平方和,就是点到原点的距离
现在独立、均匀地选取 $n$ 个 $[-1,1]$ 之间的随机数:
\[X_1,\ldots,X_n\sim\operatorname{Uniform}[-1,1].\]它们组成的点均匀分布在边长为 2 的超立方体 $[-1,1]^n$ 中。平方和不超过 1,等价于这个点落在单位球体内。
因此:
\[\Pr\left(\sum_{i=1}^{n}X_i^2\le1\right) =\frac{V_n(1)}{2^n}.\]其中 $V_n(1)$ 是 $n$ 维单位球体的体积。
二维时,这就是圆盘面积除以正方形面积,得到 $\pi/4$;三维时,得到 $\pi/6$。
这一步把抽象的高维体积,变成了一个可以计算、可以做实验的概率。
二、高维球的统一公式,究竟从哪里来?
1. 体积与表面积之间,先有一个微积分关系
半径放大 $r$ 倍,每个方向都放大 $r$ 倍,所以:
\[V_n(r)=C_n r^n.\]让半径增加一小段 $dr$,新增体积近似等于“边界面积乘以厚度”。用 $S_{n-1}(r)$ 表示这个球体的边界面积:
\[S_{n-1}(r)=\frac{dV_n(r)}{dr}=nC_n r^{n-1}.\]下标 $n-1$ 提醒我们:$n$ 维球体的边界,本身是一个 $n-1$ 维对象。
所以:
\[V_n(r)=\frac{r}{n}S_{n-1}(r).\]熟悉的三维关系 $V_3(r)=rS_2(r)/3$,只是它的一个特例。
2. 阿基米德的投影,为什么那么漂亮?
把三维球面投影到它的外接圆柱侧面,球面上一个很窄的纬度带,对应圆柱上一条同高的带子。
球面纬圈的周长,比圆柱的周长小;但沿球面走过这条带子的长度,又比竖直高度大。两个比例恰好抵消。因此,球面面积等于外接圆柱的侧面积:
\[S_2(r)=(2\pi r)(2r)=4\pi r^2.\]这不是说“任何投影都保持面积”,而是这个特定几何构造具有精确的面积补偿。
视频把相关的跨维关系形容为“骑士跳跃”。我们可以用一个切片积分,得到同样关键的递推关系,而不必先想象高维曲面。
3. 每次拆出两个坐标,就会出现一个圆
把 $n$ 个坐标分成两组:最后两个坐标组成平面,剩下的 $n-2$ 个坐标组成一个低维空间。
如果最后两个坐标到原点的距离是 $\rho$,那么剩下的坐标必须落在半径为 $\sqrt{r^2-\rho^2}$ 的 $(n-2)$ 维球体内。
对最后两个坐标使用极坐标,面积元是 $2\pi\rho\,d\rho$:
\[\begin{aligned} V_n(r) &=\int_0^r 2\pi\rho\, V_{n-2}\left(\sqrt{r^2-\rho^2}\right)d\rho\\ &=2\pi C_{n-2}\int_0^r \rho(r^2-\rho^2)^{(n-2)/2}d\rho\\ &=\frac{2\pi}{n}C_{n-2}r^n. \end{aligned}\]于是,对于 $n\ge2$:
\[\boxed{V_n(r)=\frac{2\pi r^2}{n}V_{n-2}(r)}.\]结合体积与边界面积的关系,还能得到:
\[S_{n-1}(r)=2\pi r\,V_{n-2}(r).\]这就是“圆周长度乘以低两维球体体积”的精确版本。它是一个面积恒等式,不是说球面在整体拓扑上就是这两个对象的直积。
4. Gamma 函数统一了奇数维与偶数维
从 $V_1(r)=2r$、$V_2(r)=\pi r^2$ 出发不断递推,可以得到:
\[\boxed{ V_n(r)=\frac{\pi^{n/2}}{\Gamma(n/2+1)}r^n }.\]Gamma 函数满足:
\[\Gamma(z+1)=z\Gamma(z),\qquad \Gamma(m+1)=m!,\]并且 $\Gamma(1/2)=\sqrt{\pi}$。
因此,如果把阶乘推广为 $x!=\Gamma(x+1)$,就有:
\[\left(\frac12\right)!=\Gamma\left(\frac32\right) =\frac{\sqrt{\pi}}2.\]视频里的 $\pi^{n/2}/(n/2)!$,正是在这个推广意义下使用阶乘。
同一个公式既给出圆盘面积 $\pi r^2$,也给出球体体积 $4\pi r^3/3$。圆周率、阶乘和维度之间,原来并不是几条互不相干的公式。
三、三种反直觉现象,必须分开理解
1. 单位球的体积变小,不等于“整个空间消失了”
下面的数字都针对半径固定为 1 的球体:
| 维度 $n$ | 单位球体积 $V_n(1)$ | 占 $[-1,1]^n$ 体积的比例 |
|---|---|---|
| 1 | 2 | 1 |
| 2 | 3.14159 | 0.785398 |
| 3 | 4.18879 | 0.523599 |
| 5 | 5.26379 | 0.164493 |
| 10 | 2.55016 | 0.00249039 |
| 100 | $2.36820\times10^{-40}$ | $1.86818\times10^{-70}$ |
在正整数维度中,体积在 5 维达到最大,然后下降。用 Stirling 近似可以看出:
\[V_n(1)\sim \frac{1}{\sqrt{\pi n}} \left(\frac{2\pi e}{n}\right)^{n/2}.\]当 $n$ 足够大时,括号里的数小于 1,指数又越来越大,所以体积迅速趋近于零。
但别把两个数字混淆:100 维单位球的体积约为 $10^{-40}$,随机点落入球内的概率还要再除以 $2^{100}$,约为 $10^{-70}$。
也别把它概括为“维度越高,体积一定越大”或“一定越小”。例如,$[0,1]^n$ 的体积始终为 1,$[-1,1]^n$ 的体积是 $2^n$。必须说明形状、半径、尺度,以及比较的参照物。
2. “橘子皮效应”:球内的体积集中在薄壳
在 $B_n(1)$ 内均匀取一个点 $X$,那么:
\[\Pr(\|X\|\le a)=a^n,\qquad 0\le a\le1.\]所以,最外层厚度为 $\varepsilon$ 的壳,占总体积的比例是:
\[\Pr(1-\varepsilon<\|X\|\le1) =1-(1-\varepsilon)^n.\]取 $\varepsilon=0.01$:
- 100 维时,外面 1% 的半径厚度,包含约 63.4% 的体积;
- 1000 维时,包含约 99.9957%;
- 10,000 维时,内层占比 $0.99^{10000}\approx2.25\times10^{-44}$。
因此,“几乎都在皮上”是有条件的极限结论,不是任何高维球都真的空心。有限维时,球面本身的 $n$ 维体积仍然是零。
更细一点,球内均匀采样时:
\[\mathbb{E}[\|X\|]=\frac{n}{n+1}.\]典型的半径缺口只有 $1/(n+1)$ 量级。维度越高,要包含相同体积比例,壳可以越薄。
这里的概率依赖“均匀采样”。 如果数据人为集中在中心附近,结论就不能照搬。体积集中也只有在密度均匀等条件下,才能直接解释为质量集中。
“样本很少出现在中心”也不意味着“均值失去意义”。这个均匀分布的总体均值恰好就是原点,而且它仍然是最小化平均平方距离的中心。
3. “中心球穿出方盒”:穿出去的并不是内切球
原问答里有一个容易混淆的几何构造,需要把尺寸说清楚。
在超立方体 $[-2,2]^n$ 中,放置 $2^n$ 个半径为 1 的球,球心分别是:
\[(\pm1,\pm1,\ldots,\pm1).\]这些球各自贴着外盒的一组面。它们的球心形成了另一个边长为 2 的内层超立方体。
现在,在原点放一个球,让它与这些球相切。原点到任一角落球心的距离为 $\sqrt n$,所以中心球的半径是:
\[r_{\text{center}}=\sqrt n-1.\]外盒从中心到任一面的距离是 2。于是:
\[r_{\text{center}}>2 \iff n>9.\]9 维时恰好碰到外盒,10 维起就会穿出。
这没有违反内切球的定义,因为中心球只被要求与角落的球相切,并没有被要求留在盒内。 外盒真正的中心内切球,半径始终是 2。
同理,“高维立方体的体积都在顶点”也不够准确。顶点本身的体积为零;典型点到中心很远,不代表它每个坐标都接近某个顶点的坐标。
例如 $X$ 在 $[-1,1]^n$ 中均匀分布时:
\[\mathbb{E}[\|X\|^2]=\frac n3.\]典型半径约为 $\sqrt{n/3}$,而顶点半径为 $\sqrt n$。它们都随 $\sqrt n$ 增长,但不是同一回事。
四、维数灾难:真正困难的是“邻域里还有没有数据”
高维球的现象为我们提供直觉,但“维数灾难”不是某一条球体公式的别名。它概括的是:某些计算、采样或学习任务,其资源需求会随着维度快速增长。
1. 指数增长的,是固定分辨率下的覆盖成本
把单位区间分成 10 段,需要 10 个格子;每个坐标都分成 10 段:
\[\text{格子数量}=10^n.\]二维需要 100 个,三维需要 1000 个,20 维就需要 $10^{20}$ 个。
这时整个单位超立方体的体积仍然是 1。问题不是它的数值体积变大了,而是想保持每个坐标方向的分辨率,需要覆盖的区域数量爆炸了。
类似地,在单位球中,半径为 $h$ 的同心小球,体积比例只有 $h^n$。如果模型依赖局部样本来估计规律,邻域越小、维度越高,获得足够邻居就越困难。
这解释了为什么一些非参数方法在没有结构假设时,会需要随维度急剧增长的数据量。但它不是“所有模型在高维中都必然失效”的定理。线性结构、稀疏性、平滑性和其他先验,都可能改变学习难度。
2. 距离集中:近与远的相对反差变弱
为了给这句话一个明确的适用范围,假设 $X,Y$ 独立、均匀分布在 $[-1,1]^n$ 中。
令:
\[D^2=\|X-Y\|^2=\sum_{i=1}^n(X_i-Y_i)^2.\]可以计算出:
\[\mathbb{E}[D^2]=\frac{2n}{3}, \qquad \operatorname{Var}(D^2)=\frac{28n}{45}.\]因此,平方距离的“标准差除以均值”为:
\[\frac{\sqrt{\operatorname{Var}(D^2)}}{\mathbb{E}[D^2]} =\sqrt{\frac{7}{5n}}.\]它以 $1/\sqrt n$ 的速度变小。换句话说,距离本身增长了,但相对于典型距离的波动缩小了。
如果加入很多独立、无关的噪声特征,它们就可能淹没真正有用的差别,让近邻检索变差。
不过,这个推导没有证明“任意数据集的最近点和最远点都一样远”。极值行为还取决于样本量、分布和维度如何一起增长。经过训练、具有明显类别结构的向量,也不等同于均匀随机噪声。
3. 对机器学习的影响,不止 KNN
局部密度估计需要邻域内有足够样本;最近邻分类需要距离能区分相关与不相关;高维索引需要有效剪枝;拟合模型则需要约束无关自由度。
这些要求都可能受高维影响,但失败机制并不完全相同。
因此,缓解方法也不仅是“压到二维”:还包括特征选择、归一化、正则化、增加有效数据、学习合适的距离,以及利用数据结构。PCA 主要保留线性方差;t-SNE 主要服务于局部邻域的可视化,不能把二维图上的全局远近当作原空间距离的忠实复刻。
五、Embedding:不是给词语编号,而是学习任务需要的几何关系
1. One-hot 的问题,首先是缺少语义几何
假设词表只有“猫、狗、电视”,one-hot 编码分别是:
\[e_{\text{猫}}=(1,0,0),\quad e_{\text{狗}}=(0,1,0),\quad e_{\text{电视}}=(0,0,1).\]任意两个不同词的距离都是 $\sqrt2$。这种表示本身没有表达“猫和狗都是动物”。
但“稀疏”不自动等于“无用”。One-hot 很适合表示离散身份,稀疏文本特征也能支持有效模型。它的存储还可以只记录非零位置,不必真的保存整排零。
Embedding 的关键变化,是通过训练学习一个映射:
\[f_\theta:\text{对象}\longrightarrow\mathbb{R}^d.\]训练希望哪些对象相近,向量空间就倾向于呈现相应的关系。例如,在检索任务中,希望问题更接近真正能回答它的文档,而不是仅仅包含相同词语的文档。
2. 相似性不是向量与生俱来的,而是训练目标塑造的
用 $q$ 表示问题向量,$p$ 表示相关文档,$n_j$ 表示不相关文档。一种示意性的对比学习损失是:
\[\mathcal{L} =-\log \frac{\exp(s(q,p)/\tau)} {\exp(s(q,p)/\tau)+\sum_j\exp(s(q,n_j)/\tau)}.\]$s$ 是相似度,$\tau$ 是温度参数。优化过程提高正样本的相对得分,压低负样本的相对得分。
这也说明了:“语义相似”不是唯一的自然标准。 适合查找同义句的表示,不一定最适合检索法律依据;适合英文网页的模型,也不一定擅长中文医学术语。
向量的含义来自数据、目标和评测,而不是来自“它有很多维”。
3. 一维坐标,通常不对应一个可命名的概念
把某一维解释为“是否动物”、另一维解释为“是否悲伤”,可以帮助入门,但不能当作普遍事实。
现代表示通常是分布式的:一个概念由很多维共同表达,一维也可能参与很多概念。
还有一个简单的数学理由:如果对全部向量施加相同的正交旋转,内积、距离和余弦相似度都不变,但每一维的数值含义已经改变。
因此,不应把坐标轴直接视为模型脑中的“语义抽屉”。
4. 余弦相似度,为什么常用于检索?
两个非零向量的余弦相似度是:
\[\operatorname{cos}(x,y)= \frac{x^\top y}{\|x\|\|y\|}.\]如果都做了单位长度归一化:
\[\hat x=\frac{x}{\|x\|},\qquad \hat y=\frac{y}{\|y\|},\]就有:
\[\|\hat x-\hat y\|^2 =2-2\hat x^\top\hat y.\]所以,对单位向量而言,按余弦相似度排序和按欧氏距离排序等价。
这也是高维球面与检索真正发生联系的地方:归一化后的向量位于单位球面上。它们不是因为“所有 Embedding 天生都在球面上”,更不是因为“球内的体积挤到了表面”,才来到这里。
“国王-男人+女人≈女王”展示过某些词向量的近似线性关系,但不是普遍成立的语义运算法则。模型、数据、偏见以及词语的多义性,都会影响结果。
六、先分清:词向量、上下文表示与检索向量
原问答把这几种表示串成了一个流程,但实际系统里,它们的用途不同。
| 表示 | 主要作用 | 需要注意的边界 |
|---|---|---|
| Token Embedding | 把 token ID 映射为模型初始向量 | 初始查表本身通常不区分完整语境 |
| 上下文隐藏状态 | 在各层中融合位置与上下文信息 | 同一个 token 在不同语境下有不同表示 |
| 句子/文档 Embedding | 把一段内容编码成可比较的向量 | 需要适合检索或相似度任务的训练与聚合方式 |
Sentence-BERT 等工作之所以重要,正是因为:有语言模型,不等于已经有高质量的句子检索向量。
1. “拉扯 Embedding”这个比喻,哪里对,哪里不够?
先给一个更准确的版本:
Self-Attention 根据当前位置的查询,与可见位置的键计算匹配分数,再把这些位置提供的值向量加权汇入当前位置。多头注意力与残差、前馈网络等共同作用,逐层形成依赖上下文的隐藏表示。
这句话比较长,但每个部分都不可省略。
“拉扯”捕捉到了表示会随着上下文变化这一点;但它容易让人误以为模型有一张固定地图,上面标着“水果”和“科技公司”,然后把“苹果”这个点移动到其中一边。
实际情况不是这样。推理时,通常不会因为读了一句话,就去修改词表里“苹果”的 Embedding 参数。变化的是这一次输入中,某个 token 位置的隐藏状态。
设第 $i$ 个位置的初始表示为 $h_i^{(0)}$,经过多层后形成:
\[h_i^{(0)}\longrightarrow h_i^{(1)} \longrightarrow\cdots\longrightarrow h_i^{(L)}.\]它们属于同一次计算的不同层,不应直接看作在一个固定、可解释的地理坐标系里移动的轨迹。不同层的表示方式也可能不同。
另外,“苹果”是否是一个 token,取决于分词器。以下把它视为一个位置,只是为了讲清机制。
2. 一个位置,为什么要同时产生 Q、K、V?
把当前层的全部 token 表示排成矩阵:
\[H\in\mathbb{R}^{T\times d_{\text{model}}}.\]$T$ 是序列长度,$d_{\text{model}}$ 是隐藏表示维度。对一个注意力头,做三组可学习的投影:
\[Q=HW_Q,\qquad K=HW_K,\qquad V=HW_V.\]在暂时省略归一化等细节时,每个位置都得到 $q_i,k_i,v_i$。可以把它们理解成三种角色:
| 角色 | 入门类比 | 在计算中真正做什么 |
|---|---|---|
| Query,查询 $q_i$ | 我现在想找什么信息? | 与其他位置的键计算分数 |
| Key,键 $k_j$ | 我这里有什么信息可供匹配? | 决定当前位置多大程度会选中我 |
| Value,值 $v_j$ | 如果选中了我,我提供什么? | 作为被加权汇总的内容 |
这不是人为给模型填写的标签。$W_Q,W_K,W_V$ 都是在训练中学习出来的,通常也不会直接对应人类能命名的属性。
为什么不直接比较 $h_i$ 和 $h_j$?因为“用什么来匹配”与“匹配后传递什么”可以是两回事。
例如,一个位置可能需要根据语法关系找到主语,再从主语那里取出与后续预测有关的信息。这比直接对原始表示计算相似度更灵活。
而且:
\[q_i k_j^\top=h_iW_QW_K^\top h_j^\top.\]这是一种学出来的匹配方式,通常并不对称:$i$ 关注 $j$,不意味着 $j$ 也同样关注 $i$。它也没有一般性的“必须是余弦相似度”要求。
3. 从一个分数,到一次信息汇聚
对位置 $i$ 来说,先计算它与位置 $j$ 的分数:
\[s_{ij}=\frac{q_i k_j^\top}{\sqrt{d_k}}+M_{ij}.\]$M_{ij}$ 是遮罩项:允许访问的位置通常加 0,不允许访问的位置加 $-\infty$。相对位置等信息也可能通过额外偏置或对 Q、K 的变换进入计算。
然后,对位置 $i$ 能访问的所有位置做 softmax:
\[\alpha_{ij} =\frac{\exp(s_{ij})}{\sum_{m=1}^T\exp(s_{im})}.\]这些权重非负、总和为 1。最后得到:
\[o_i=\sum_{j=1}^T\alpha_{ij}v_j.\]合起来就是:
\[\boxed{ \operatorname{Attention}(Q,K,V) =\operatorname{softmax} \left(\frac{QK^\top}{\sqrt{d_k}}+M\right)V }.\]Q 和 K 决定从哪里取信息,V 决定取到什么信息。 这是理解 Attention 最重要的一步。
权重总和为 1,意味着一个头的这一步输出是值向量的加权平均;但经过输出投影、残差和后续网络以后,就不能再把整个 Transformer 的更新理解为简单平均。
权重也不是“这个词属于水果的概率”,而是在这一层、这个头、这个位置上的信息混合系数。
4. 用“苹果”算一次:上下文怎么进入向量?
为了避免后文将讲到的因果限制,我们先把线索放在“苹果”之前:
1
2
A:水果摊上的苹果……
B:手机厂商苹果……
真实分词会更细,下面把相关上下文简化为三个信息来源。假设某个头在 A 中得到的、已经缩放过的分数如下:
| 信息来源 | 分数 | softmax 权重 |
|---|---|---|
| 水果线索 | 3 | 0.844 |
| 公司线索 | 0 | 0.042 |
| 其他信息 | 1 | 0.114 |
因此:
\[o_{\text{苹果},A} \approx0.844v_{\text{水果}} +0.042v_{\text{公司}} +0.114v_{\text{其他}}.\]在 B 中,如果学出来的匹配关系让公司线索获得更高分,分数变为 $(0,3,1)$,就得到:
\[o_{\text{苹果},B} \approx0.042v_{\text{水果}} +0.844v_{\text{公司}} +0.114v_{\text{其他}}.\]于是,同一个 token 位置可以从不同上下文中获得不同的信息更新。
这只是演示公式的玩具数字,不是某个真实模型的测量结果。 实际模型并没有固定名为“水果线索”的槽位,句子中没有出现的词也不会凭空作为一个可关注位置。这里的来源名称只是对上下文信息的概括。
在第一层,若两个输入中“苹果”的初始表示和位置完全相同,它的查询甚至可以相同;不同上下文的键和值已经足以造成不同输出。更深层中,“苹果”自己的状态也已变化,因此后续查询也能随上下文改变。
这正是“动态”的含义:权重参数在一次普通推理中固定,但由输入计算出的 Q、K、V 和注意力权重在变化。
5. 为什么要除以 $\sqrt{d_k}$?
假设查询和键各分量近似独立、均值为 0、方差为 1,那么:
\[q^\top k=\sum_{\ell=1}^{d_k}q_\ell k_\ell\]的方差约为 $d_k$。
维度越大,点积分数的典型尺度越大。若直接送入 softmax,分布可能过早变得极尖锐,梯度也更容易变小。
除以 $\sqrt{d_k}$,可以在这个近似模型下把分数方差维持在常数量级。这是数值与训练稳定性的考虑,不是“消除维数灾难”,也不是把点积变成余弦。
6. 多头注意力:并行学习不同的信息通道
一个词的含义不只依赖“水果还是公司”,还可能依赖修饰关系、否定、指代、比较对象和更长的语境。
多头注意力为不同头配置不同投影:
\[\operatorname{head}_a =\operatorname{Attention} (HW_Q^{(a)},HW_K^{(a)},HW_V^{(a)}),\]再拼接、投影回模型维度:
\[\operatorname{MHA}(H) =\operatorname{Concat} (\operatorname{head}_1,\ldots,\operatorname{head}_A)W_O.\]这样,模型可以在不同的投影子空间中,并行计算不同的关系。
但不能反过来说“第一个头必然管语法,第二个头必然管水果”。头的功能是学出来的,可能混合、冗余,也可能随输入而变。
标准设计常把总投影宽度分配给多个头,并不是头数增加,隐藏维度就必然成倍增加。一些现代架构还会让多个查询头共享键和值,这也说明“每个头一套完全独立 QKV”是基本解释,不是所有模型的全部细节。
7. 真正的 Transformer 层,还不止 Attention
以一种常见的 Pre-Norm 结构为例:
\[\widetilde H =H+\operatorname{MHA}(\operatorname{Norm}(H)),\] \[H_{\text{next}} =\widetilde H+ \operatorname{FFN}(\operatorname{Norm}(\widetilde H)).\]这里省略了 dropout 等细节。原始 Transformer 采用不同的归一化顺序;实际模型还可能使用 RMSNorm、门控前馈网络等变体。
可以把职责粗略分成:
Attention 负责跨位置取信息。 当前 token 的新状态,可以依赖其他可见位置的内容。
FFN 负责对每个位置的信息做非线性加工。 一个简单形式是:
\[\operatorname{FFN}(x) =\sigma(xW_1+b_1)W_2+b_2.\]它对每个位置分别应用相同的参数;虽然这一步不直接混合 token,但它处理的状态已经通过注意力包含了上下文。
残差保留原状态,并叠加新的计算结果。 这既有助于信息传递,也有助于训练深层网络。归一化则帮助控制数值尺度。
所以,把整个核心层只描述为“Attention 把苹果拉向水果”,会漏掉后续非线性加工和跨层积累。
8. 层数为什么重要:先取到线索,再组合关系
考虑:
1
这家公司生产手机。它最近推出了新的芯片。
为了预测后续内容,模型可能需要把“它”与前面的公司联系起来,再结合“生产手机”“芯片”等信息。
单个注意力层能直接读取可见位置,但在同一层内,各位置的 Q、K、V 是从该层输入计算的,并不是先更新一个位置,再立刻让另一个位置读取它刚更新的输出。
多层堆叠后,一个位置在上一层汇入的信息,就可以在下一层作为新的键、值或查询继续参与计算。这给组合关系与多步信息处理提供了机会。
不过,“第一层一定做词法、第二层一定做语法、最后一层一定做推理”仍然是过度整齐的故事。深度提供能力,具体怎样使用,需要实验分析。
9. 最容易忽略的限制:生成式 LLM 看不到未来
现在回到最初那组句子:
1
2
苹果很好吃。
苹果发布了新手机。
对双向编码器,例如 BERT,完整句子中的“苹果”位置可以关注左右两边。后面的“很好吃”和“发布了新手机”,确实可以帮助形成不同的“苹果”上下文表示。
但对采用标准因果遮罩的 decoder-only LLM:
\[M_{ij}= \begin{cases} 0,&j\le i,\\ -\infty,&j>i. \end{cases}\]当前位置只能看自己和前面的位置。
因此,如果这两个句子前缀、位置等条件相同,在确定性推理下,模型处理第一个“苹果”时,不能利用还没有看见的后文来区分词义。这个位置的隐藏状态在各层中也不会因为未来 token 的出现而追溯性改变。
真正能够不同的是后续位置的表示。例如,“新手机”附近的位置能看到“苹果发布了新手机”这个前缀,生成后续回答的位置则可以读取整个已提供的问题。
即使提示词一次性输入、计算可以并行执行,标准因果遮罩仍然存在。常见的 KV Cache 也正是复用之前算好的键和值,而不是每来一个词就重新改写全部历史表示。
所以,更严谨的说法是:
上下文让模型在可见信息范围内形成不同表示;双向模型可以用右侧上下文更新“苹果”位置,因果模型则由后续位置逐步整合后来出现的消歧线索。
这不是细枝末节,而是理解生成式 Transformer 怎样工作的关键。
10. 位置信息与训练目标,把机制连到语言上
如果只做不带位置的全连接自注意力,它本身对 token 的排列没有足够的顺序辨识能力。“狗咬人”和“人咬狗”却显然不同。
因此,模型需要位置相关机制。它们可以是加入表示的位置编码,也可以是作用于 Q、K 的旋转位置编码(RoPE)等。因果遮罩提供了可见范围约束,但不能简单替代全部位置信息设计。
接下来还有一个问题:模型怎么知道“苹果”应该关注什么?
对典型自回归语言模型,基础训练目标是预测下一个 token:
\[\mathcal L =-\sum_t\log p_\theta(x_{t+1}\mid x_{\le t}).\]最后一层隐藏状态经过输出投影和 softmax,得到词表上的预测分布。预测错误产生的梯度,会反向更新 Embedding、QKV 投影、FFN 等参数。
如果某种信息传递方式有助于在大量样本中降低预测误差,它就可能被训练保留下来。并不是有人直接告诉某个头:“看到苹果就去找科技公司。”
这里有两个不同的 softmax:注意力中的 softmax 在位置之间分配信息权重;输出端的 softmax 在词表中分配下一个 token 的概率。 两者不能混为一谈。
11. 用几何语言收束:动态路由,而不只是移动坐标
Self-Attention 可以看成一种由内容决定的信息路由:
- 通过 Q、K,计算当前位置与可见上下文之间的匹配关系;
- 通过权重,把其他位置的 V 汇入当前位置;
- 经输出投影、残差和非线性网络,形成下一层状态。
由于权重本身依赖输入,整个映射是输入相关的、非线性的。这比“给每个词做同一个固定旋转”强得多。
但它仍然不保证表示形成了可解释的“水果簇”或“公司簇”,注意力热力图也不能独自证明模型为什么得出某个结论。要判断某条信息通路是否真正起作用,往往还需要干预、消融等实验。
因此,“几何扭曲”可以作为入口;更接近机制本身的描述,是:在可见上下文中,动态选择、传递并加工信息。
12. RAG 检索与语言生成,是两个环节
一个简化的 RAG 流程是:
1
2
3
文档 → 分块 → 文档 Embedding → 向量索引
问题 → 查询 Embedding → 召回候选 → 可选的重排
问题 + 相关原文 → 生成模型 → 带依据的回答
检索阶段可以用余弦相似度寻找候选;生成阶段通常根据上下文逐 token 预测后续内容。后者并不是不断在文档向量库里“寻找最近的下一个词”。
检索相近,表示值得查看;不表示材料必然支持答案,更不表示材料中的事实必然正确。
七、流形假设:高维坐标,不等于高维自由度
现在可以进入核心问题:
数据明明有几千、几万个坐标,为什么模型不一定需要覆盖整个高维空间?
1. 先区分三种“维度”
输入维度,是原始对象需要多少个坐标,例如图片的像素数。
表示维度,是模型输出向量的长度,例如 768、1536 或 3072。
内在维度,则描述数据在某种尺度下,真正拥有多少个局部独立变化方向。
这三者可以差别很大。
一个圆周嵌入在二维平面里,需要两个坐标表示,但沿着圆周运动只需要一个局部参数:角度。它的内在维度是 1。
2. 什么是流形?纸张类比有用,但不能用过头
一个 $k$ 维流形,在每个足够小的局部,看起来像 $\mathbb{R}^k$。例如球面局部像平面,但整个球面不能用一张无失真的平面地图表示。
把一张纸弯曲放进三维空间,是理解二维流形的好办法。纸上的蚂蚁只能沿两个局部方向走,尽管它的位置有三个空间坐标。
但“揉成纸团再展平”有几个限制:
- 如果纸发生拉伸,纸上的距离会改变;
- 如果纸自接触,三维中的近邻不一定是沿纸面走的近邻;
- 折痕和自交需要更谨慎的数学处理;
- 不是所有弯曲曲面都能像纸一样全局无失真地展平,球面就是反例。
所以,局部低维,不等于全局可以压成同样维数且保留全部关系。
3. 用一个生成过程,写出流形假设
假设观测数据由少量潜在因素生成:
\[x=g(z)+\eta, \qquad z\in\mathbb{R}^k,\quad x\in\mathbb{R}^D,\quad k\ll D.\]$z$ 是潜在变量,$g$ 是生成映射,$\eta$ 是噪声。
以人脸图片为例,姿态、光照、表情等因素,会共同改变大量像素。像素不是各自独立变化的。
在 $g$ 足够光滑、局部秩为 $k$,并满足适当几何条件时,它的像可以在局部形成一个 $k$ 维结构。加入较小噪声后,数据可能分布在这个结构附近的一条“厚管道”里。
这就是流形假设的基本想法:有意义的数据往往只占据高维空间中的结构化子集,而不是均匀填满整个空间。
它是有用的建模假设,不是深度学习的“物理定律”。真实语言数据可能是多个结构的混合,还包含离散跳变、不同局部维度和噪声,并不保证存在一个光滑、统一的“语义薄膜”。
4. 为什么低维结构能减轻采样困难?
回到前面的覆盖问题。如果数据确实位于一个规则的 $k$ 维流形附近,在合适的小尺度与距离定义下,覆盖它所需的邻域数量,可能近似按:
\[N(h)\propto h^{-k}\]增长,而不再是 $h^{-D}$。
这就有机会把问题从“覆盖整个环境空间”,改成“覆盖数据实际活动的区域”。
但这里有隐藏条件:曲率不能让局部近似过早失效,噪声不能占据大量额外方向,数据分布不能过于不均匀,目标函数也需要适当规律。
一条很长、折叠很多次的低维曲线,仍然可能很难采样和学习。内在维度低,是有利条件之一,不是免除维数灾难的通行证。
5. 距离为什么需要重新学习?
想象一条卷起来的丝带:两点在三维空间中很近,但沿丝带走可能很远。
环境空间中的直线距离,叫欧氏距离;沿流形内部最短路径的长度,叫测地距离。
两者不一致时,直接做最近邻可能“穿过纸张”找错对象。流形学习与表示学习的一个目标,就是让任务相关的关系变得更容易识别。
不过,神经网络不一定在恢复真实的测地距离,也不一定在执行可逆的“展平”。对分类而言,把同一类中无关的变化压掉,反而可能更有用。
八、为什么仍然需要高维?“黄金折中”到底是什么
这里看似有一个矛盾:
既然数据低维,为什么 Embedding 还要几百、几千维?
答案不只一个。低维描述的是局部自由度;表示还需要考虑全局拓扑、距离失真、任务关系、模型可学习性和计算成本。
1. 严格正交只有 $d$ 个,近正交却可以很多
在 $\mathbb{R}^d$ 中,两两严格正交的非零向量,最多只有 $d$ 个。
但如果只要求夹角接近 90°,情况就不同了。对从单位球面独立、均匀抽取的向量 $u,v$:
\[\mathbb{E}[u^\top v]=0,\qquad \operatorname{Var}(u^\top v)=\frac1d.\]典型内积量级约为 $1/\sqrt d$。1024 维时,这个标准差是 $1/32\approx0.03125$。
在适当参数范围内,球面集中的概率界可以写成类似:
\[\Pr(|u^\top v|>\varepsilon) \le 2\exp(-c\,d\varepsilon^2)\]的形式,其中 $c$ 是正常数。
如果有 $M$ 个随机向量,需要照顾约 $M^2/2$ 个点对。利用联合界可看出,要让所有点对以高概率满足近正交条件,所需维度量级为:
\[d=O\left(\frac{\log M+\log(1/\delta)}{\varepsilon^2}\right),\]其中 $\delta$ 是允许的失败概率。
这揭示了高维表示的一种容量优势:固定近正交容差时,可以容纳随维度呈指数数量级增长的可区分方向。
但这不是无限容量。容差收紧,容量就会受影响;近正交向量也不是线性独立向量。不能据此推导“每个方向就是一个独立知识胶囊”,更不能把统计独立性直接等同于向量正交。
2. 高维的红利和灾难,其实有共同来源
随机向量接近正交,意味着可以构造很多干扰较小的编码。
但单位向量满足:
\[\|u-v\|^2=2-2u^\top v.\]当内积都接近 0,距离就都接近 $\sqrt2$。这又是“距离反差变弱”的来源之一。
同一种集中现象,作为编码资源时可能有用,作为未经训练的相似度信号时又可能有害。
训练的任务,就是让有意义的关系从这个随机背景中凸显出来。近正交只提供几何可能性,不会自动提供语义。
3. Johnson–Lindenstrauss 引理,提供了另一种视角
对于一个包含 $M$ 个点的有限欧氏点集,在 $0<\varepsilon<1$ 时,存在映射到:
\[m=O\left(\frac{\log M}{\varepsilon^2}\right)\]维空间的方法,使所有点对满足:
\[(1-\varepsilon)\|x-y\|^2 \le \|f(x)-f(y)\|^2 \le (1+\varepsilon)\|x-y\|^2.\]这就是 Johnson–Lindenstrauss 引理的经典形式。合适的随机投影可以实现这种保距效果。
它说明:保存有限数据集的距离,不一定需要原来的全部维度。
但它既不要求数据位于流形上,也不证明自然语言有多少语义维度;它保留的是原有距离,如果原有距离就不反映任务需求,保留下来也不一定有用。
4. 为什么“1024~4096 是完美黄金区间”不成立?
因为没有这样的普适定理。
例如,OpenAI 对 text-embedding-3-small 和 text-embedding-3-large 给出的默认输出维度分别为 1536 和 3072,并提供缩短输出维度的选项。这是具体模型的设计与能力,不是语义空间的自然常数。
实际选择取决于:
| 考量 | 真正要问的问题 |
|---|---|
| 任务难度 | 需要区分哪些细粒度关系? |
| 模型训练 | 模型是否支持所需维度,是否经过相应训练? |
| 数据领域 | 通用知识还是专业术语、多语言、代码? |
| 检索效果 | 降维后正确材料是否仍能进入候选集合? |
| 工程成本 | 内存、存储、延迟和索引构建是否可接受? |
仅计算 float32 原始向量,100 万条 1536 维向量需要约 6.144 GB,即约 5.72 GiB;3072 维则翻倍。这还不包括索引、元数据和其他开销。
所以,“黄金折中”最好理解为通过评测找到的任务性价比平衡点,而不是几何学预先规定的一段维度区间。
也不能随意截断任何模型的向量。有些模型专门训练过可变维表示;没有这种能力时,直接切掉后面的坐标,可能严重损害效果。
九、再深一层:网络到底怎样改变数据的几何?
“把纸团展开”只是示意。一个更具体的局部工具,是映射的 Jacobian 矩阵。
设某层或整个编码器是 $f:\mathbb{R}^D\to\mathbb{R}^d$。对足够小的输入变化 $\Delta x$:
\[f(x+\Delta x)-f(x)\approx J_f(x)\Delta x.\]因此,输出中的局部平方距离近似为:
\[\|\Delta f\|^2 \approx\Delta x^\top J_f(x)^\top J_f(x)\Delta x.\]这给“网络在拉伸和压缩空间”一个更准确的解释:不同位置、不同方向,可能获得不同的尺度。
如果某些方向对应无关的光照变化,模型可以学着减弱它们;如果某些变化决定类别或检索相关性,模型可以让它们更显著。
如果数据本身由 $x=g(z)$ 生成,沿潜在变量的小变化,还会得到:
\[\|\Delta f\|^2 \approx \Delta z^\top J_g(z)^\top J_f(x)^\top J_f(x)J_g(z) \Delta z.\]这不是说网络一定学到了正确的几何,而是说:它有能力改变数据流形上不同变化方向的可辨识程度;学得对不对,要由目标和数据决定。
1. 内在维度也不是一个随手就能测准的数字
可以在局部邻域内做 PCA,观察主要变化方向;也可以根据邻居距离随半径的变化估计局部维度。
但估计会受邻域尺度、样本量、噪声和曲率影响:邻域太小,可能主要看到噪声;太大,又可能把弯曲结构误认为很多线性方向。
例如,一个圆周内在维度为 1,但整个圆周通常需要两个线性主成分来表示。线性子空间维度和流形维度不是同一个概念。
2. 低维结构,不自动带来泛化
即使所有样本都在一条直线上,如果标签沿直线极其快速、毫无规律地交替,学习仍然很困难。
泛化还需要目标函数在相关区域具有可学习的规律,训练样本提供足够覆盖,模型与优化具有合适的归纳偏置,并且测试分布没有发生无法处理的变化。
所以,“深度学习本质上就是流形对齐”太绝对。流形几何是一个有启发性的观察角度,不是替代优化、统计学习和架构分析的统一答案。
3. 幻觉,也不能简单归因于“走出了流形”
分布外输入可能增加出错风险,但一句完全自然、完全符合语言模式的话,也可以在事实上是假的。
模型可能缺少知识、混合了冲突材料、误读检索证据,或者在生成时选择了流畅却没有依据的续写。语言概率高,不等于事实可信度高。
因此,“流形之外是幻觉,流形之内是真相”没有成立的普遍依据。减少幻觉,需要可靠检索、证据核对、工具验证与不确定性处理,而不是只调整向量维度。
十、把这些认识落到一个知识库检索系统里
假设要构建一个技术文档知识库,比起先问“应该用多少维”,更有效的是:
1. 先定义什么叫“找对”
准备一组真实问题,并标注哪些文档片段确实支持答案。加入容易混淆的样例:词语相似但结论相反、版本过期、产品名称接近、问题无答案等。
只看几个漂亮的最近邻结果,无法判断几何表示是否真正符合业务。
2. 区分语义检索与精确匹配
“如何降低内存使用”适合语义匹配;错误码、配置键、版本号等常常需要关键词精确匹配。
可以比较向量检索、关键词检索以及混合检索,再视需要增加重排。不是把所有字符串都变成向量,系统就自然更聪明。
3. 检查表示与距离是否匹配
查询和文档必须由相互兼容的模型与配置编码。某些模型要求不同的查询、文档前缀或不同编码路径,应遵循其说明。
索引使用余弦、内积还是欧氏距离,也应与模型建议和归一化方式一致。改变模型或维度后,通常需要重建对应索引,而不能混用不兼容向量。
4. 同时测质量与成本
例如比较模型支持的几个维度,观察 Recall@k、MRR 或 nDCG,以及延迟、索引内存和成本。近似最近邻索引本身也可能漏召回,应区分“表示不好”和“索引没有找到”。
如果降维后效果几乎不变、资源明显下降,就有采用价值;如果关键技术差异被压掉,就需要更好的表示、更多维度或不同检索方案。
5. 最后核验证据,而不是迷信相似度分数
余弦相似度不是正确概率,也没有通用于所有模型和领域的固定及格线。高分文档可能只是谈到同一话题,并没有回答问题。
检索负责找候选,重排负责更细的相关性判断,回答阶段仍需核对原文是否支持结论。证据不足时,明确说不足,比编出一段流畅解释更可靠。
十一、一个可以自己运行的小实验
下面只使用 Python 标准库,直接计算文章中的体积、概率和薄壳比例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import math
def log_unit_ball_volume(n):
return (n / 2) * math.log(math.pi) - math.lgamma(n / 2 + 1)
print("维度 | 单位球体积 | 占边长为2的立方体比例")
for n in (1, 2, 3, 5, 10, 100):
log_volume = log_unit_ball_volume(n)
volume = math.exp(log_volume)
probability = math.exp(log_volume - n * math.log(2))
print(f"{n:4d} | {volume:.6g} | {probability:.6g}")
print("\n半径最外侧1%的薄壳,占总体积的比例")
for n in (100, 1000, 10000):
inner_fraction = math.exp(n * math.log(0.99))
shell_fraction = -math.expm1(n * math.log(0.99))
print(f"{n:5d}维 | 内层={inner_fraction:.6g} | 壳层={shell_fraction:.6g}")
这里用 lgamma 在对数域计算,再取指数,可以避免直接计算巨大 Gamma 值时出现的溢出;用 expm1 计算壳层比例,则能改善差值很小时的数值精度。
不建议靠随机撒点来估计 100 维立方体中的内切球比例:命中概率约为 $10^{-70}$,即使运行很久,通常也只会得到零次命中。零次命中不意味着概率等于零,而可能意味着实验规模远远不够。
结语:不是战胜高维,而是学会利用结构
回看这轮追问,最值得留下的不是一句“AI 用高维空间存储知识”,而是下面这条逻辑:
1
2
3
4
5
6
7
8
9
高维几何告诉我们:低维直觉可能失效
↓
维数灾难提醒我们:没有结构时,局部学习可能极其昂贵
↓
Embedding 尝试学习:什么关系值得在表示中保留
↓
流形假设提供线索:真实数据可能只有较少的局部自由度
↓
模型和工程评测决定:哪些几何关系确实对任务有效
高维空间既有稀疏、距离集中的困难,也有大量可区分方向的表示潜力。低维结构能够减轻某些困难,却不会自动让模型理解世界。
对我来说,这次从数学视频出发的追问,还带来一个更实用的提醒:一个解释越流畅、比喻越漂亮,就越值得追问它的条件是什么,哪些部分能被计算和验证。
数学的美,不只是它能把很多现象串起来,还在于它让我们知道,这条线究竟能走到哪里。
参考资料与继续阅读
本文是基于视频引发的个人问题与后续查证所做的重新组织和分析,不是视频逐字稿;数学推导和工程示例为本文展开,不能全部归为视频原作者的主张。
- 3Blue1Brown:The most beautiful formula not enough people understand。本文的起点:高维球体积、跨维关系与反直觉几何。
- NIST DLMF:Gamma Function。Gamma 函数、递推关系与渐近公式的数学参考。
- Bengio、Courville、Vincent:Representation Learning: A Review and New Perspectives。表示学习、流形假设与相关建模观点的综述。
- Dasgupta、Gupta:An Elementary Proof of a Theorem of Johnson and Lindenstrauss。有限点集的随机降维与近似保距,而不是“语义黄金维度”的证明。
- Vaswani 等:Attention Is All You Need。Transformer 与缩放点积注意力的原始论文。
- Reimers、Gurevych:Sentence-BERT。面向句子相似度与检索的表示学习。
- OpenAI:New embedding models and API updates 与 Embedding 使用文档。本文所举默认维度与可缩短输出的具体模型实例,不代表通用最优参数。
- Huang 等:A Survey on Hallucination in Large Language Models。幻觉的分类、成因与挑战,说明其不能归结为单一的几何隐喻。