2. 向量维度与信息容量:维度决定信息量、维度与参数量的关系、维度与计算复杂度的权衡

好,咱们接着聊。上一章我们讲了 Embedding 是什么,这一章我们来啃一个硬核话题——维度

说白了,维度就是向量的长度。比如一个 128 维的向量,就是有 128 个数字排成一排。那问题来了:这个数字到底设多大合适?64?128?512?还是 768?

我个人习惯,先看一个最直观的结论:维度越高,能装的信息越多。但代价也很大——参数爆炸、计算变慢、甚至过拟合。

2.1 维度决定信息量

想象一下,你用一个数字描述一个人。比如「身高 175cm」。信息量很有限,你分不清谁是谁。

再加一个维度:「身高 175cm,体重 70kg」。好了一点,但两个人可能还是撞车。

再加:「身高 175cm,体重 70kg,年龄 28 岁,月薪 2 万,喜欢打篮球,家住北京朝阳区...」。维度越多,这个人的画像就越清晰。

Embedding 也是这个道理。每个维度可以看作一个「隐式的特征」。比如词向量里,某个维度可能编码了「是否与动物相关」,另一个维度编码了「是否与动作相关」。

核心观点:维度数量决定了 Embedding 空间的「容量」。容量越大,能区分的语义细节就越多。

但这里有个坑——维度不是越高越好。我在项目中遇到过,把维度从 128 提到 512,结果下游任务效果反而下降了。为什么?

因为维度太高,数据在空间里变得稀疏。你想想看,100 维的空间里,点与点之间的距离都差不多,区分度反而没了。这就是所谓的「维度灾难」。

维度 信息容量 典型场景
16~32 简单分类、小规模推荐
64~128 词向量、中等规模 NLP
256~512 BERT、GPT 等大模型
768~1024+ 极高 超大模型、多模态

2.2 维度与参数量的关系

这个关系其实很简单——参数量跟维度是平方关系

举个例子。一个简单的 Embedding 层,假设词表大小是 V,Embedding 维度是 d。那参数量就是 V × d。

但如果你用了 Transformer,里面有个 QKV 注意力机制。Q、K、V 的权重矩阵大小都是 d × d。所以光注意力这块,参数量就是 3 × d²。

我算过一笔账:

  • d=128 时,注意力参数量 ≈ 3 × 128² = 49,152
  • d=512 时,注意力参数量 ≈ 3 × 512² = 786,432
  • d=768 时,注意力参数量 ≈ 3 × 768² = 1,769,472

看到了吗?从 128 到 768,维度只涨了 6 倍,参数量却涨了 36 倍。这就是平方增长的威力。

避坑指南:我曾经在一个项目里,为了追求效果,直接把维度从 256 提到了 1024。结果模型从 200MB 膨胀到 3.2GB,训练时间从 2 小时变成 2 天。最后效果只提升了 0.3%。嗯,这波亏大了。

所以我的建议是:先从小维度开始试。比如 64 或 128,跑通流程、验证效果。如果发现模型欠拟合,再逐步往上加。不要一上来就搞 768。

2.3 维度与计算复杂度的权衡

计算复杂度,说白了就是「跑一次模型要算多少次乘法」。这个跟维度也是强相关的。

咱们拿最常用的矩阵乘法来说。两个矩阵相乘,一个形状是 [m, d],另一个是 [d, n],那计算量就是 m × d × n 次乘加操作。

在 Transformer 里,自注意力的计算复杂度是 O(n² × d),其中 n 是序列长度,d 是维度。所以:

  • 序列长度 n 固定时,维度 d 翻倍,计算量翻倍
  • 但维度 d 固定时,序列长度 n 翻倍,计算量翻 4 倍

嗯,这里要注意:很多时候瓶颈在序列长度,而不是维度。我做过一个长文本分类任务,序列长度 2048,维度 128,跑一次前向要 3 秒。后来我把维度降到 64,时间只降到 2.5 秒。为什么?因为 n² 那项太大了,d 的影响被稀释了。

反过来,如果序列很短(比如 16 个 token),那维度的影响就很明显。维度从 128 降到 64,速度能快一倍。

我的经验法则:

  • 短序列任务(< 32 token):维度可以设高一些,256~512 都行
  • 长序列任务(> 512 token):维度尽量控制在 128 以内,否则显存扛不住
  • 实时推理场景:维度不要超过 64,否则延迟会超标

最后说一个我踩过的坑。有一次做语义相似度,我用了 768 维的 BERT Embedding,然后直接算余弦相似度。结果发现,两个完全不相关的句子,相似度也能到 0.7 以上。后来一查,高维空间里所有向量都趋向于正交,但余弦相似度的分布会集中在 0.5~0.8 之间,区分度很差。

解决办法?要么降维(用 PCA 降到 128 维),要么换度量方式(比如用欧氏距离)。

好了,这一章的核心就这些。总结一句话:维度是把双刃剑,高了信息多但参数爆炸,低了跑得快但可能欠拟合。具体选多少,得看你的数据量、任务类型、还有硬件条件。没有银弹,只有权衡。