嵌入层与表示学习
token 经过分词后是一串整数 ID,模型怎么把「离散符号」变成「能计算的向量」?答案是嵌入层(embedding)。它是大模型的输入门户,也藏着权重绑定、表示空间、参数占比等高频细节题。分词见 Tokenizer,检索用的句向量见 Embedding 与向量数据库。
一、嵌入层:从 ID 到向量
分词后每个 token 是一个整数 ID。嵌入层本质是一张查找表(矩阵),形状 [词表大小 V, 隐藏维度 d]:
token "猫" → ID 1234 → 取嵌入表第 1234 行 → 一个 d 维向量 [0.2, -1.1, ...]- 这个向量是可学习参数,训练中不断调整,让语义相近的 token 向量靠近。
- 整句话变成
[序列长度, d]的矩阵,送进 Transformer。 - 嵌入是模型「理解」token 的起点——离散 ID 本身没有数值意义,嵌入赋予它可计算的语义表示。
二、词嵌入 vs 上下文表示
要区分两个概念(高频混淆点):
| 静态词嵌入 | 上下文表示 | |
|---|---|---|
| 例子 | word2vec、嵌入层查表结果 | Transformer 各层的隐状态 |
| 「苹果」 | 永远同一个向量 | 「吃苹果」vs「苹果公司」向量不同 |
| 来源 | 查表 | 经过注意力,融合了上下文 |
嵌入层给的是静态的初始向量;经过 Transformer 各层后,同一个 token 在不同语境下会得到不同的表示——这正是 Transformer 强于 word2vec 的地方:表示随上下文动态变化(见 Transformer)。
三、输出层与权重绑定(Weight Tying)
模型最后要把隐状态映射回「词表上的概率分布」,这需要一个输出投影矩阵 [d, V]——形状正好是嵌入表的转置。
权重绑定(tied embeddings):让输入嵌入层和输出投影层共享同一份权重。
- 好处:省下一大块参数(V×d 很大)、且经验上还略微提升效果(输入输出表示空间一致)。
- 很多模型采用(尤其中小模型,嵌入占比高时收益大)。
四、嵌入占了多少参数?(高频估算题)
嵌入参数量 = 词表大小 V × 隐藏维度 d。词表一大,这块就很可观:
- 词表 128K、d=4096 → 嵌入约 5.2 亿参数(输入输出各一份,不绑定就翻倍)。
- 对小模型,嵌入可能占总参数的相当比例(如某些 1B~8B 模型嵌入占百分之十几);对大模型占比则小。
- 这解释了「大词表的代价」:词表越大,嵌入参数越多、低频 token 越难训练充分(见 Tokenizer 和 LLaMA 与 Qwen 的词表权衡)。
五、位置信息从哪来?
嵌入层只编码「是什么 token」,不编码「在第几位」。位置信息由位置编码单独注入:早期用可学习/正弦位置嵌入加到词嵌入上,现代主流用 RoPE 在注意力内部注入(见 位置编码)。所以「词嵌入 + 位置编码」共同构成模型对输入的完整表示。
六、表示空间:模型「理解」的几何
训练好的嵌入/隐状态空间有有趣的几何性质:
- 语义相近 → 距离相近:「猫」「狗」靠近,「猫」「汽车」远离。
- 线性结构:经典的「国王 − 男 + 女 ≈ 女王」类比(word2vec 时代的发现)。
- 这套「语义可用向量运算表达」的思想,正是 RAG 向量检索的基础(见 Embedding 与向量数据库)——只不过那里用的是整句的上下文表示,而非单个 token 的静态嵌入。
高频追问
Q:嵌入层到底是什么? 一张可学习的查找表,形状 [词表大小, 隐藏维度]。把每个 token ID 映射成一个稠密向量,作为 Transformer 的输入。它让离散的 token ID 获得可计算的语义表示,语义相近的 token 在训练后向量也相近。
Q:word2vec 的词向量和大模型的表示有什么区别? word2vec 是静态的——一个词永远一个向量,不分语境;大模型的嵌入层给的初始向量也是静态的,但经过 Transformer 各层注意力后,同一个 token 会根据上下文得到不同的表示(「苹果公司」vs「吃苹果」)。动态上下文表示是 Transformer 的关键优势。
Q:什么是权重绑定(tied embeddings)?为什么用? 让输入嵌入矩阵和输出(解码到词表的)投影矩阵共享同一份权重。好处:省下 V×d 量级的参数,且输入输出表示空间一致、经验上略提效果。中小模型嵌入占比高时收益尤其明显。
Q:为什么大词表对小模型「不划算」? 嵌入参数 = 词表 × 隐藏维度。词表 128K 时这块就有数亿参数,对一个 1B 小模型可能占很大比例,挤占了用于「真正计算/推理」的参数;且低频 token 在小模型上更难训练充分。所以小模型和大模型在词表大小上的权衡不同。
Q:嵌入向量编码位置信息吗? 不编码。嵌入层只表示「是哪个 token」,位置信息由独立的位置编码注入(绝对位置嵌入相加,或现代的 RoPE 在注意力里旋转)。最终输入表示 = 词嵌入 + 位置信息。
Q:嵌入和 RAG 里的「向量」是一回事吗? 同源但不同。这里说的是模型内部单个 token 的嵌入/表示;RAG 检索用的是把整段文本编码成一个句向量(通常取专门 embedding 模型的输出)。两者都基于「语义→向量、相近→距离近」的思想,但粒度和用途不同,见 Embedding 与向量数据库。