系列回顾:前八篇我们把基础数学工具打好了——符号系统、对数、函数、导数、链式法则,以及线性代数的向量、矩阵运算、点积与注意力机制。这一篇聚焦一个让很多初学者困惑的问题:为什么 DeepSeek V3 要用 7168 维的向量来表示一个 token?3 维、128 维不够用吗?高维空间到底是什么感觉?它有哪些反直觉的性质?搞清楚这些问题,你对嵌入向量、注意力维度、以及后面要讲的低秩分解,都会有更深的理解。
我们生活在三维世界:长、宽、高。
一个苹果可以用三个数来定位:它在货架上的 x 坐标、y 坐标、z 坐标。
但描述一个苹果的特征,三个数远远不够。你可能需要:重量、直径、颜色(红绿比例)、甜度、酸度、产地海拔、采摘日期的温度……每一个特征都是一个维度。苹果的"完整描述"是一个很长的向量。
向量的维度,就是你用来描述一个事物的特征数量。
对于 token(语言中的词或子词),它的"特征"是什么?
是它的语义、语法角色、与上下文的关系、在不同语境下的含义变化……这些特征远比苹果复杂,需要更多维度来捕捉。
DeepSeek V3 选择了 7168 维。这个数字不是随意选的——它是模型能力和计算代价之间权衡的结果,背后有深刻的数学逻辑。
1维:一条数轴上的点,一个数字描述位置。
2维:平面上的点,两个数描述位置 $(x, y)$。平面可以画出来,我们能直观感受距离、角度、面积。
3维:空间里的点,三个数 $(x, y, z)$。我们生活在其中,完全有直觉。
4维及以上:无法直接"看见",但数学可以无缝推广。
一个 4 维向量 $(x_1, x_2, x_3, x_4)$ 在数学上和 3 维向量完全类似:可以计算长度(范数)、夹角(点积)、距离。只是我们没有对应的视觉直觉。
7168 维在数学上是完全合法的,只是比 3 维多了 7165 个坐标轴。
假设用向量表示一个词的语义,从低维开始看维度如何决定表达能力:
2维(极度简化):只记录"情感倾向"和"具体程度"
能区分一些语义,但完全混淆了词性、语法功能、搭配关系……
50维:可以开始捕捉词性、词频、基本语义类别,已经能做一些简单的类比推理(king - man + woman ≈ queen)
300维:Word2Vec、GloVe 经典维度,能捕捉丰富的语义关系,在大多数 NLP 任务上表现良好
768维:BERT-base 的隐藏维度,引入了上下文信息,同一个词在不同句子里有不同表示
7168维:DeepSeek V3,模型规模增大,每个 token 的表示需要携带更多信息——不只是语义,还有对长距离上下文的感知、跨层的特征组合、以及支撑 MoE 路由决策所需的细粒度特征差异
高维空间有几个让人出乎意料的性质。理解它们,才能真正理解为什么大模型要用那么高的维度,以及为什么一些直觉上"显然正确"的方法在高维下会失效。
低维球的直觉:一个球,大部分体积在"内部",只有很薄一层是表面。
高维球的现实:随着维度增加,球的体积越来越集中在靠近表面的薄壳里,内部几乎是空的。
数学上,$d$ 维单位球中,半径在 $[1-\varepsilon, 1]$ 的薄壳占总体积的比例是:
$$1 - (1-\varepsilon)^d$$
当 $d = 7168$,$\varepsilon = 0.01$ 时:
$$1 - (1-0.01)^{7168} = 1 - 0.99^{7168} \approx 1 - e^{-71.68} \approx 1$$
薄壳占了几乎 100% 的体积!
换句话说,在 7168 维空间里,从均匀分布中随机采样一个点,它以压倒性的概率落在球的表面附近,而不是内部。
对机器学习的影响:向量初始化时,从高斯分布采样的向量,其范数(长度)高度集中在 $\sqrt{d}$ 附近,而不是在 0 到 $\sqrt{d}$ 之间均匀分布。这就是为什么 Xavier 初始化要除以 $\sqrt{d}$——让初始化向量的范数保持在合理范围内。
低维的直觉:在 2 维平面里随机选两个向量,它们可以有各种夹角——平行、垂直、45度……
高维的现实:在高维空间里,随机选两个向量,它们的夹角以极高的概率接近 90 度(互相垂直)。
定量地说:若 $\vec{u}, \vec{v}$ 是 $d$ 维随机单位向量,它们点积的期望和方差分别是:
$$\mathbb{E}[\vec{u} \cdot \vec{v}] = 0, \quad \text{Var}[\vec{u} \cdot \vec{v}] = \frac{1}{d}$$
当 $d = 7168$ 时,方差为 $\frac{1}{7168} \approx 0.000140$,标准差约 $0.0118$。
两个随机单位向量的点积几乎必然在 $(-0.03, 0.03)$ 范围内——接近于零,即接近垂直。
对机器学习的影响:这意味着高维空间里可以"放下"大量几乎互相正交的向量,而不会相互干扰。这解释了为什么嵌入向量能同时表示成千上万个概念(如词表中所有词的嵌入),而这些向量之间的干扰很小——高维空间提供了足够的"空间"来容纳它们。
低维的直觉:数据点之间的距离有意义——近的点相似,远的点不同。
高维的现实:当维度很高时,数据点之间的最大距离和最小距离趋于相同。
设有 $n$ 个随机点,最近邻距离和最远邻距离之比趋近于 1:
$$\frac{d_{max} - d_{min}}{d_{min}} \to 0 \quad \text{(当 } d \to \infty\text{)}$$
所有点"一样近",最近邻搜索失去了区分能力——这就是维度灾难(Curse of Dimensionality)。
但等等——神经网络为什么能在高维空间工作?
因为神经网络的数据不是随机均匀分布在高维空间里的,而是集中在一个低维的流形(Manifold)上。
所有"真实的"文本 token,并不是 7168 维空间里的随机点,而是分布在一个结构化的低维子流形上——这个子流形的内在维度可能只有几百维(语义的真正自由度)。
这就是为什么神经网络能在高维空间里有效学习:它学到的其实是这个低维流形的结构,而不是整个高维空间。
1维:高斯分布 $\mathcal{N}(0,1)$ 的值集中在 $(-3, 3)$ 附近,中心(0点)附近最密集。
高维:从 $\mathcal{N}(0, I_d)$ 采样一个 $d$ 维向量 $\vec{x}$,它的范数 $\|\vec{x}\|$ 集中在 $\sqrt{d}$ 附近,而不是 0 附近。
证明:$\|\vec{x}\|^2 = \sum_{i=1}^d x_i^2$,每个 $x_i^2 \sim \chi^2(1)$(卡方分布),期望为 1,方差为 2。
$$\mathbb{E}[\|\vec{x}\|^2] = d, \quad \text{Var}[\|\vec{x}\|^2] = 2d$$
由大数定律,$\frac{\|\vec{x}\|^2}{d} \to 1$,即 $\|\vec{x}\| \approx \sqrt{d}$。
当 $d = 7168$ 时,随机高斯向量的范数约为 $\sqrt{7168} \approx 84.7$,而不是 1 或 0。
这解释了为什么注意力机制里的点积 $\vec{q} \cdot \vec{k}$ 的方差是 $d_k$,而不是 1——因为 $\vec{q}$ 和 $\vec{k}$ 的每个分量都有 $O(1)$ 的方差,$d_k$ 个分量求和后方差变成 $d_k$。所以要除以 $\sqrt{d_k}$(第8篇详细推导过)。
理解了高维空间的性质,现在来具体分析 DeepSeek V3 为什么选 7168 维。
模型的参数量决定它能存储多少"知识"。而参数量和维度的关系是平方级的:
一个全连接层(Dense Layer)的参数量是 $d_{in} \times d_{out}$。如果输入输出都是 $d$ 维,参数量是 $d^2$。
注意力机制里,$W_Q, W_K, W_V, W_O$ 各是 $d \times d$ 的矩阵,四个合计是 $4d^2$ 个参数。
维度翻倍,参数量翻四倍。 维度和容量是超线性关系。
DeepSeek V3 是一个 MoE(混合专家)架构,总参数约 671B,但每个 token 只激活约 37B 参数。
关键维度配置:
为什么是 7168 而不是 8192 或 6144?
7168 = 7 × 1024
选择 7168 而非更整齐的 8192,是因为在给定计算预算(H800 GPU 数量、训练时长、参数总量目标)下,7168 是模型能力和训练效率的最优点。更大的维度意味着更多参数和更慢的训练,更小的维度意味着模型容量不足。这是通过大量消融实验确定的。
一个粗略的估算:
7168 维的向量空间里,可以有多少个近似正交的方向(互相区分的"特征槽")?
由随机向量几乎正交的性质,在 $d$ 维空间里,可以找到大约 $d$ 个几乎正交的向量(实际上可以远超 $d$,Johnson-Lindenstrauss 引理告诉我们可以有指数级的近正交向量)。
保守估计:7168 个独立的"特征槽"。
DeepSeek V3 的词表大约有 128K 个 token。每个 token 的嵌入向量是 7168 维。这 128K 个向量需要在 7168 维空间里彼此可区分——7168 维的空间足够装下 128K 个有意义的方向,并且保留足够的"距离"来区分它们。
在 Transformer 模型的 scaling law(规模定律)里,模型性能(用困惑度衡量)随参数量的增加而平滑提升,而参数量和维度成超线性关系。
已有模型的维度演变:
总体趋势:维度随着模型规模增大而增大,但增速不是线性的——因为参数量增大时,增加层数(深度)往往比增加维度(宽度)更高效。
DeepSeek V3 用 7168 而不是更高的维度,是因为它同时增加了层数(61层)和引入了 MoE(256个专家),这两种方式可以在不无限增加维度的情况下扩大模型容量。
矩阵乘法的计算量:$d_{in} \times d_{out} \times \text{序列长度}$
对于注意力机制,计算量约为 $O(n^2 d + n d^2)$,其中 $n$ 是序列长度,$d$ 是维度。
当序列很长时(比如 DeepSeek V3 支持 128K token 的上下文),$n^2 d$ 项主导。维度 $d$ 越大,计算越慢;但维度太小,模型表达能力不足。
7168 维在这个权衡中处于合适的位置:
两个向量的余弦相似度是衡量语义相似性的标准方法:
$$\cos(\theta) = \frac{\vec{u} \cdot \vec{v}}{\|\vec{u}\| \|\vec{v}\|}$$
在低维空间里,余弦相似度的分布比较分散,从 -1 到 1 都有可能。
在高维空间里,不相关的随机向量的余弦相似度集中在 0 附近(由前面的正交性分析),而真正语义相近的向量会明显地聚集到更高的余弦相似度区间。
这使得高维嵌入空间里,语义相似度的信噪比更高——相似的向量点积明显大于随机向量的点积,更容易被注意力机制"找到"。
训练好的嵌入空间有很好的几何结构。经典的例子:
$$\text{vec}(\text{"king"}) - \text{vec}(\text{"man"}) + \text{vec}(\text{"woman"}) \approx \text{vec}(\text{"queen"})$$
这个"类比"结构说明:语义关系("男性→女性"的变换)在嵌入空间里被编码为一个固定的向量偏移。
在 7168 维空间里,这样的语义关系可以有 7168 个独立的"方向"——不同语义关系占据不同的子空间,互不干扰。维度越高,能同时编码的语义关系越多,语言理解能力越强。
这里预先铺垫一下下一篇(第10篇)要讲的低秩分解的直觉基础。
高维空间里的向量,虽然名义上是 7168 维,但实际上往往分布在一个更低维的子空间里——因为真实语言的语义自由度远小于 7168。
直觉:想象 7168 维空间里的一大堆 token 嵌入向量。如果你做 PCA,可能会发现前 512 个主成分已经解释了 90% 以上的方差。这意味着这些向量实际上主要分布在一个约 512 维的子空间里。
这个观察直接启发了 DeepSeek V3 的 MLA 设计:与其缓存完整的 7168 维 KV 向量,不如只缓存 512 维的"压缩表示",推理时再解压回来。真正的信息在 512 维的子空间里,其余的 6656 维大多是可以重建的"冗余"。
这就是低秩(Low-Rank)的本质:高维向量的实际信息量,往往比名义维度低得多。这个洞见,正是下一篇的主题。
为了让高维不再抽象,我们用 Python 做几个小实验,感受高维空间的真实行为:
import numpy as np np.random.seed(42) # ===== 1. 高维随机向量几乎总是正交的 ===== print("===== 随机向量的正交性 =====") for d in [2, 10, 100, 768, 7168]: n_trials = 10000 dots = [] for _ in range(n_trials): u = np.random.randn(d) v = np.random.randn(d) # 归一化 u /= np.linalg.norm(u) v /= np.linalg.norm(v) dots.append(np.dot(u, v)) dots = np.array(dots) print(f"d={d:5d}: 点积均值={dots.mean():.4f}, 标准差={dots.std():.4f}, " f"理论标准差={1/np.sqrt(d):.4f}") # ===== 2. 高维高斯向量的范数集中在 sqrt(d) 附近 ===== print("\n===== 高斯向量的范数集中性 =====") for d in [2, 10, 100, 768, 7168]: norms = np.linalg.norm(np.random.randn(10000, d), axis=1) print(f"d={d:5d}: 范数均值={norms.mean():.2f}(理论={np.sqrt(d):.2f}), " f"标准差={norms.std():.3f}") # ===== 3. 高维球壳现象 ===== print("\n===== 高维球壳现象 =====") for d in [2, 10, 100, 7168]: # 在 [-1,1]^d 的超立方体里均匀采样,计算落在单位球内的比例 # 注意高维下几乎没有点落在单位球内 samples = np.random.uniform(-1, 1, size=(100000, d)) norms = np.linalg.norm(samples, axis=1) in_ball = (norms <= 1).mean() # 还有:半径 [0.9, 1.0] 的球壳占单位球的体积比例 shell_ratio = 1 - 0.9**d print(f"d={d:5d}: 落在单位球内的比例={in_ball:.6f}, " f"外10%球壳占体积={shell_ratio:.4f}") # ===== 4. 维度灾难:最近邻和最远邻距离之比 ===== print("\n===== 维度灾难(距离集中) =====") for d in [2, 10, 100, 768, 7168]: points = np.random.randn(500, d) # 计算第一个点到其他所有点的距离 dists = np.linalg.norm(points[1:] - points[0], axis=1) ratio = (dists.max() - dists.min()) / dists.min() print(f"d={d:5d}: 最大距离={dists.max():.2f}, 最小距离={dists.min():.2f}, " f"(max-min)/min={ratio:.4f}(越小越糟糕)") # ===== 5. 嵌入向量的余弦相似度分布 ===== print("\n===== 模拟嵌入向量的余弦相似度 =====") d = 7168 vocab_size = 100 # 简化:只用 100 个词 # 模拟随机初始化的嵌入(未训练) embeddings_random = np.random.randn(vocab_size, d) embeddings_random /= np.linalg.norm(embeddings_random, axis=1, keepdims=True) # 计算所有对之间的余弦相似度 sims_random = embeddings_random @ embeddings_random.T # 取上三角(排除自身) idx = np.triu_indices(vocab_size, k=1) sims_vals = sims_random[idx] print(f"随机初始化嵌入(d={d}):") print(f" 余弦相似度均值={sims_vals.mean():.4f}(理论=0)") print(f" 余弦相似度标准差={sims_vals.std():.4f}(理论={1/np.sqrt(d):.4f})") print(f" |相似度| > 0.05 的对数={( np.abs(sims_vals) > 0.05).sum()} / {len(sims_vals)}") print(f" → 高维下随机向量几乎不相关,信噪比高")
运行结果解读:
第一个实验会看到:维度越高,随机单位向量点积的标准差越小(接近理论值 $1/\sqrt{d}$),高维向量几乎必然互相正交。
第二个实验:高维高斯向量的范数精确集中在 $\sqrt{d}$ 附近,标准差很小,这印证了"高维球壳"现象。
第三个实验:在超立方体里均匀采样,落在单位球内的概率随维度指数下降——7168 维时几乎是零。外层 10% 球壳的体积占比趋向 100%。
第四个实验:维度升高时,最大距离和最小距离之比趋向 1,距离区分能力消失——维度灾难的直观体现。
第五个实验:7168 维的随机嵌入向量,两两之间的余弦相似度标准差只有约 0.012,说明高维空间里随机向量几乎不"碰撞",给语义信息留下了大量"空间"。
这篇文章从直觉出发,把高维空间的几个关键现象讲清楚了,并联系到 DeepSeek V3 的 7168 维设计决策。
第一,向量的维度就是描述事物的特征数量。token 的语义远比物理坐标复杂,需要几千维才能充分表达。
第二,高维空间有四个反直觉的现象:体积集中在球壳而非内部;随机向量几乎总是正交的;维度灾难导致距离失去区分能力;高斯向量的范数集中在 $\sqrt{d}$ 附近。这些现象既是挑战(需要设计特殊的初始化和归一化),也是优势(高维空间能容纳更多不相干的特征)。
第三,DeepSeek V3 选择 7168 维,是在模型容量(维度越大越强)和计算效率(维度越大越慢)之间的权衡点。7168 维提供了足够的特征空间,同时通过 MoE(增加专家数量而非维度)和 MLA(压缩 KV Cache 维度)来高效利用计算资源。
第四,高维空间里的 token 嵌入实际上分布在一个低维流形上——真实语义的自由度远小于 7168。这个洞见是下一篇要讲的低秩分解(Low-Rank Decomposition)的基础:高维向量可以被低维近似,MLA 正是利用了这一点来压缩 KV Cache。
下一篇预告:
第10篇,我们讲低秩分解(Low-Rank):DeepSeek 用它压缩了什么?
矩阵的"秩"是什么?SVD(奇异值分解)怎么工作?为什么 7168 维的 KV 向量可以被 512 维表示?LoRA 微调的数学原理是什么?这些问题,下一篇全部解答。
高维空间是反直觉的。但正是这些反直觉的性质——向量几乎总是正交、信息高度集中——让深度学习能在高维嵌入空间里有效地表示和操作复杂的语义信息。7168 维不是随意选的数字,是对"如何在高维空间里高效存放语言知识"这个问题的工程答案。
还没有评论,来抢沙发吧!
博客管理员
40 篇文章
还没有评论,来抢沙发吧!