Token Embedding
token id 如何变成向量、初始化与缩放的规则、weight tying 的现状与 embedding 空间的几何特征
核心要点:
- Embedding matrix $[V, h]$ 查表 =
gather= one-hot × W- 初始化标准 $\mathcal{N}(0, 0.02^2)$,经验值不是推导
- Vaswani √d 缩放原文无理由,现代 LLM 已不做 (Gemma 除外)
- Llama 1/2/3 全系列 NOT tie,GPT-2/3 tie, Qwen 规模阈值
- Token embedding 层学不到 word2vec analogy, analogy 几何在 block 计算后
- 长尾 token embedding 退化是 glitch token 的几何根因
名词定义
本篇共享名词在 3.1 总览 已定义 (Embedding matrix / Weight tying)。本篇新引入:
| 名词 | 定义 |
|---|---|
| Untying (解绑) | 输入 embedding 与 LM head 不共享权重的设计选择,Llama / Qwen 大模型主流做法 |
| Static embedding | 输入端 token embedding 层查表得到的固定向量,与上下文无关;本篇主题 |
| Contextual embedding | Transformer block 计算后,每个位置的 hidden state,随上下文变化;非本篇主题,列出做对比 |
| Anisotropy (各向异性) | embedding 向量集中在向量空间的"细窄锥体" (narrow cone), cosine 相似度普遍偏高 |
| Hubness effect | 高维空间里少数 "hub" 向量与所有其他向量都近;长尾 token embedding 表现出此效应 |
@tbl-embed-glossary 本篇新引入名词
Token id 怎么变成 $h$ 维向量?
核心问题:tokenizer 把字符串变成了 token id 序列 (整数列表),但 Transformer block 吃的是 $h$ 维浮点向量。中间这一步怎么转?
Token embedding 就是一张可学习的查表:矩阵 $W_E \in \mathbb{R}^{V \times h}$,第 $i$ 行是 token id = $i$ 对应的 $h$ 维向量。给定 token id 序列 $[t_1, t_2, \ldots, t_s]$,输出是矩阵 $W_E$ 的第 $t_1, t_2, \ldots, t_s$ 行堆起来,形状 [s, h]。
查表 = gather = one-hot × W 三种等价视角
同一操作有三种数学表述,互相等价,工程实现按效率选 gather:
$$\begin{equation} \text{embed}(t) = W_E[t, :] = e_t^\top W_E = \text{gather}(W_E, t) \label{eq:embed-three-views} \end{equation}$$- 查表 (lookup):把 $t$ 当索引取 $W_E$ 第 $t$ 行,直接寻址
- One-hot × W:把 $t$ 编成 one-hot 向量 $e_t \in \{0,1\}^V$ ($t$ 位为 1 其余为 0),与 $W_E$ 相乘——数学上完全等价于查表
- Gather: PyTorch / TensorFlow 的
gather算子,工程上的实现方式
为什么三种视角都讲:one-hot × W 是理解 LM head 的镜像 (输出端 $h \to V$ 是矩阵乘 $W_E^\top$),让 weight tying 显得自然——同一个 $W_E$ 既能查表又能反向投影;查表视角是工程效率所在 ($O(s)$ 寻址 vs one-hot 矩阵乘的 $O(s \cdot V \cdot h)$ FLOPs); gather 是实际算子名字。
Embedding 是可学习参数,不是预训练
$W_E$ 跟所有 Transformer 权重一起从随机初始化训练,不是单独预训练。这是它跟 word2vec / GloVe 时代的根本不同:
- word2vec / GloVe:用 skip-gram / matrix factorization 单独训练 word embedding,然后冻结喂下游模型
- LLM: $W_E$ 跟 attention / FFN 权重一起被语言建模 loss 训练,训练完才是 LLM 的一部分
后果是:LLM 的 token embedding 学到的不是"通用语义",而是"对 next-token prediction 有用的表示"。这跟 word2vec analogy 直觉差别巨大 (后文详述)。
Embedding 初始化为什么是 0.02? √h 缩放还做吗?
核心问题:$W_E$ 训练前要初始化,用什么分布?Vaswani 2017 原论文有个 "embedding × √d" 的缩放,这是什么?现代 LLM 还做吗?
现代 LLM 全线用 $\mathcal{N}(0, 0.02^2)$ 初始化 embedding,这是工程经验值不是理论推导。GPT-2 / GPT-3 / Llama 1-3 / Qwen 2/3 HuggingFace 实现里 initializer_range = 0.02 是标配。0.02 这个数字的根据是经验:太大 → 初始 logit 爆炸 / 训练崩;太小 → 早期梯度太弱;配合 LayerNorm 整套设计在 0.02 附近稳定。
Vaswani 2017 √d 缩放:原文一句话,无理由
Transformer 原论文 §3.4 写过:
"In the embedding layers, we multiply those weights by √d_model."
就这一句话,全文没解释为什么。引用 [30] 是 Press & Wolf 2017,但那是 weight tying 的论文,不是缩放论文。业界主流推测:让 embedding 的幅度 $O(\sqrt{d})$ 与 sinusoidal position encoding 的 $O(1)$ 在量级上"匹配",但这是社区推测——pi-tau 实现者直接承认"no one knows why"。
现代 LLM 已不做 √d 缩放 (Gemma 除外)
现代主流 LLM forward pass 里 embedding 查表后直接进下一层,不乘 √d:
| 模型 | 初始化方差 | Forward 是否 ×√d |
|---|---|---|
| GPT-2 (OpenAI) | wte: $0.02^2$, wpe: $0.01^2$ | 否 (直接 wte + wpe) |
| nanoGPT (Karpathy) | $0.02^2$ | 否 (line 283: tok_emb + pos_emb) |
| Llama 1/2/3 | $0.02^2$ | 否 |
| Qwen 2/3 | $0.02^2$ | 否 |
| Gemma | 极小,tied | 是 (hidden_states *= sqrt(hidden_size)) |
@tbl-embed-init 主流 LLM embedding 初始化与缩放对比
Gemma 例外的动机也不是 Vaswani 那条:Gemma embedding 与 output projection tied 且初始化方差极小,forward 乘 √d 是为了补偿小方差让 residual stream 量级合理,跟 PE 匹配无关。
为什么现代不做了
根本原因是架构变了,Vaswani 当年的动机已失效:
- Vaswani 用 sinusoidal absolute PE 与 token embedding 相加 → 需要量级匹配 → 缩放 embedding
- 现代 LLM (Llama / Qwen / GPT 系) 用 RoPE 在 attention 内部注入位置 (详见 04-位置编码), token embedding 直接进 block 不再与 PE 相加 → 量级匹配问题消失 → 缩放无意义
这是"老论文里的一行代码被新架构悄悄淘汰" 的典型例子,但教学材料还在反复讲 √d。
Embedding 学习率:理论 vs 实践
理论上 embedding 应该用比其他层更高的学习率。2025 年论文 arXiv:2506.15025 证明最优比例:
$$\begin{equation} \frac{\eta_E}{\eta_W} \approx \sqrt{d_{\text{model}}} \label{eq:embed-lr-ratio} \end{equation}$$对 $d_{\text{model}} = 4096$ 给出 $\eta_E / \eta_W \approx 64$ (实际范围 40-90×)。原因:embedding 是稀疏更新 (一个 batch 只有出现的 token 才有梯度),Adam 的 second moment 估计偏低,等效 LR 被压低。
实践上多数 LLM 用统一全局 LR,没采用这条建议——这是个开放领域,论文新,大模型团队还没普遍跟进。
Weight tying:主流是 tie 还是 untie?
核心问题:输入 embedding 矩阵 $W_E$ 和输出 LM head 投影矩阵 $W_U$ 形状互为转置 ($[V, h]$ vs $[h, V]$),数学上可以共享。这是 GPT-2 时代教科书说的"主流做法"。但 Llama 时代还是吗?
结论:中小模型 tie 是主流,大模型 (Llama / Qwen 7B+) 主流是 untie。这条颠覆了"weight tying 是 LLM 标配" 的常见误解。
Press & Wolf 2017 起源
Weight tying 由两篇论文几乎同时独立提出:
- Press & Wolf 2017 (EACL)[1]:从"output matrix 实际上是 valid word embedding" 的工程观察出发,论证 input/output embedding 学到的是相似的向量空间,应该共享
- Inan et al. 2017 (ICLR)[2]:从损失函数框架的理论推导出发,给出 tying 在概率角度的解释
两篇并列引用,Press & Wolf 实测 PTB 语言模型:tie 后 perplexity 显著下降,机器翻译模型体积缩到不到一半性能不掉。
GPT-2 / GPT-3: tie
GPT-2 / GPT-3 都 tie。Karpathy nanoGPT model.py line 285:
self.transformer.wte.weight = self.lm_head.weight
GPT-2 vocab = 50,257, tie 节省约 38.5M 参数 (≈30% 模型体积)。
Llama 全系列:untie
Llama 1 / 2 / 3 全线 tie_word_embeddings: false, HuggingFace config 可查。即使 Llama 3 vocab 涨到 128,256,额外 LM head 矩阵约 525M 参数 (8B 模型的 ~6.5%),Meta 仍选择不 tie。
Qwen / DeepSeek:规模阈值
Qwen2.5 / Qwen3 用规模阈值策略:
- Qwen2.5: 0.5B / 1.5B tie; 7B+ untie
- Qwen3: 4B tie; 8B+ untie
DeepSeek-V3 主模型不传统 tie (技术报告里唯一的共享是 MTP 辅助模块与主模型共享 embedding 和 output head,属于 multi-token prediction 架构,不是经典 weight tying)。
为什么大模型趋势是 untie
两个层面的原因:
1. 参数占比的成本结构
| 模型 | 总参数 | embedding 占比 | untie 额外成本 |
|---|---|---|---|
| Pythia 70M | 70M | 73.4% | 灾难性 (×2 整个模型) |
| GPT-2 (124M) | 124M | 31% | 痛 (~38M 多) |
| Llama 3 8B | 8B | ~13% | 可承受 (~525M) |
| Llama 3 70B | 70B | ~1.5% | 几乎免费 |
@tbl-embed-tie-cost 不同模型规模下 untie 的额外成本
小模型 embedding 占比高,tie 节省巨大代价可接受;大模型 embedding 占比低,untie 几乎免费——这是工程算账。
2. Tied 训练有 embedding 偏向 output 的副作用
2025 论文 arXiv:2603.26663 量化研究 weight tying 的训练动态[3]:
- Tied 训练里,output 端的梯度占共享矩阵总梯度的约 70%,共享矩阵被向 output 空间偏移
- OLMo-1B 对照实验:tied 矩阵与 untied output 的余弦相似度 = 0.719,与 untied input = 0.525 → tied 矩阵被"output 化",离 input 用途的最优表示更远
- input layer 的 Tuned Lens KL 散度:tied = 9.2 bits vs untied = 7.0 bits,差 2.1 bits → tied 限制了 input 表示能力
这两点 (参数占比 + 训练动态) 合起来解释了为什么大模型不再 tie——节省的参数已不显著,而 untie 给 embedding 和 output 各自最优空间。
Embedding 学到什么样的向量?
核心问题:训练完的 $W_E$ 里这些 $h$ 维向量,几何上长什么样?word2vec 时代的 "king - man + woman ≈ queen" analogy 在 LLM token embedding 里还成立吗?长尾 token 的 embedding 是什么样?
LLM token embedding 跟 word2vec 时代认知差别很大:不学 analogy 几何,整体各向异性,长尾 token embedding 严重退化。
Word2vec analogy 在 LLM token embedding 不成立
直接测 LLM token embedding 做 parallelogram analogy 准确率很低。2025 年实测论文[4]:
- Llama-2-7b 原始 token embedding 层做 king-man+woman=queen 类 analogy: 准确率 47%
- 同模型通过 "concept induction head" 提取的概念子空间 (在 transformer block 计算后):准确率达 80%
结论:analogy 几何能力不在 token embedding 层,而在 transformer block 计算后涌现的语义子空间里。这跟 word2vec 时代的认知正好相反——word2vec 单独训练 embedding 就有 analogy, LLM 时代 embedding 是"为下一步计算准备的原料",自己不长 analogy。
(顺带说:即使 word2vec 当年,king-man+woman=queen cosine 相似度也只 0.568,必须过滤查询词才排到第一[4]——这条 analogy 神话本身就被夸大了。)
Static vs Contextual:解释方差 < 5%
Token embedding 是 static 的 (查表得到的固定向量,与上下文无关),block 后每个位置的 hidden state 是 contextual 的 (随上下文变化)。这两类向量差别有多大?
Ethayarajh EMNLP 2019[5] 在 BERT / ELMo / GPT-2 上量化:
- 所有层中 static embedding 仅解释 contextual representation 方差的 < 5%
- Contextual embedding 占据"细窄锥体 (narrow cone)" 几何结构,下层 cosine 相似度高
- 上层即使 "and" / "the" 这类非多义词也极度 context-specific,不同上下文里的 "and" hidden state 差异巨大
这是"为什么 LLM 比 word2vec 强"的几何根因——同一个词在不同上下文里被 block 计算成不同向量,表达力远超固定查表。
Anisotropy: LLM embedding 普遍各向异性
Static embedding 空间不是各向同性 (isotropic),而是高度各向异性 (anisotropic):
- 不同 token 的 embedding 普遍 cosine 相似度偏高,集中在向量空间的窄锥体
- 成因:高频 token 的梯度主导少数 "outlier dimensions" 的更新,这几个维度方差比其他维度大几个数量级[6]
- 反直觉发现:ICLR 2024 一篇论文主动增加 anisotropy 反而在 3 个 LLM 9 个任务上提升性能——说明 anisotropy 不是 bug 而可能是优化的副产物甚至有用特征
长尾 token embedding 退化 = glitch token 几何根因
低频 / 训练中几乎没见过的 token,它的 embedding 停留在初始化附近,表现出明确几何退化:
- GPT-J 中
SolidGoldMagikarp的 embedding 距整体质心仅 0.063,而正常 token 平均距质心 ~1.4——它实际上靠近质心 (hubness effect:高维空间里"接近所有人") - 推理时 mention 这种 token, embedding 进入 attention 后产生异常激活,模型输出乱码
- GPT-2 xl 有反例 (异常 token 反而离质心最远),说明几何退化的具体表现与初始化方案相关
这就是 02-tokenization 讲的 glitch token (SolidGoldMagikarp) 的几何根因:不是 BPE 词表有 bug,而是 BPE 训练数据让某些 token 进 vocab,模型预训练数据里这些 token 出现太少,它们的 embedding 行没怎么被梯度更新,几何上挤在初始化附近。
SAE 与 feature directions:在哪里找语义?
Anthropic 2024 "Scaling Monosemanticity" 用 Sparse Autoencoder 在 Claude 3 Sonnet 中间层 residual stream 上提取了 3,400 万个 feature directions,每个 direction 跨语言 / 跨模态对应一个明确概念。关键:这些 features 是在 transformer block 计算后的中间层,不是 token embedding 层。
这又一次印证:LLM 的语义是 block 计算"涌现"出来的,不在 static embedding 里。Token embedding 提供的是"原料",不是"语义"。
Takeaway
| 知识点 | 核心结论 |
|---|---|
| 查表机制 | $W_E \in \mathbb{R}^{V \times h}$ 第 $t$ 行 = token $t$ 的向量;gather = one-hot × W 等价 |
| 可学习参数 | $W_E$ 跟所有 Transformer 权重一起训练,不是单独预训练 (与 word2vec 根本不同) |
| 初始化 | $\mathcal{N}(0, 0.02^2)$ 是工程经验值,现代 LLM 全线沿用 |
| Vaswani √d 缩放 | 原文无理由,现代 LLM 不做了 (Gemma 例外),因 RoPE 取代 absolute PE 后动机失效 |
| Embedding LR | 理论最优 $\eta_E / \eta_W \approx \sqrt{d}$ (40-90×),实践用全局 LR |
| Weight tying 起源 | Press & Wolf / Inan 2017 同年提出,小模型 PTB perplexity 显著下降 |
| Weight tying 现状 | GPT-2/3 tie, Llama 1-3 全 NOT tie,Qwen 规模阈值 (7B+ NOT tie), DeepSeek-V3 不 tie |
| Untie 的工程动机 | 大模型 embedding 占比 ~1-13%, untie 几乎免费;且 tied 训练 output 梯度占 70% 把共享矩阵向 output 偏移 |
| Word2vec analogy | LLM 原始 token embedding 不学 analogy (Llama-2 实测 47%);analogy 几何在 block 后涌现 |
| Static vs Contextual | 静态 embedding 仅解释 contextual 方差 < 5%,不同上下文同一 token 的 hidden state 差异巨大 |
| Anisotropy | LLM static embedding 普遍各向异性,高频 token 梯度主导 outlier dimensions |
| 长尾 token 几何退化 | 低频 token embedding 停留在初始化附近,hubness effect (距质心 0.063 vs 正常 1.4),这就是 glitch token 的几何根因 |
开放问题
- 未来大模型是否会出现新的 tie 变种:untying 让 input / output 各自最优,但增加参数;是否有"部分 tie / 投影后 tie / 量化 tie" 等中间设计?还无定论。
- Embedding LR 单独调度:arXiv:2506.15025 理论给出 $\sqrt{d}$ 倍最优比例,但工业大模型团队还没普遍跟进,实证收益是否值得改训练 pipeline 待观察。
- Anisotropy 的反直觉性:ICLR 2024 增加 anisotropy 反而提升性能,这质疑了过去 isotropy 优化的整体方向。embedding 空间的"理想形状" 仍是开放问题。
- 长尾 token 治理:词表越大长尾越长,glitch token 几何退化是必然产物吗?还是某种 init / training 方案能根除?
- Tokenizer 与模型训练数据分布对齐的可工程化:glitch token 本质是分布不一致,强制对齐能解决吗?还是统计上不可避免?
延伸阅读 (本章外链)
- Tokenization 与 BPE (token id 是怎么来的) → 3.2 Tokenization 与 BPE
- 位置编码 (embedding 拿到后下一步怎么注入位置) → 3.4 位置编码
- 完整 LM head 与训练目标 → 06-预训练/02-语言建模目标
- Mechanistic interpretability / SAE feature directions → Anthropic Scaling Monosemanticity 2024 (本篇仅点到为止)
参考资料
- Press, Wolf. Using the Output Embedding to Improve Language Models. EACL 2017. https://arxiv.org/abs/1608.05859
- Inan, Khosravi, Socher. Tying Word Vectors and Word Classifiers: A Loss Framework for Language Modeling. ICLR 2017. https://arxiv.org/abs/1611.01462
- Weight Tying Biases Token Embeddings. 2025. https://arxiv.org/abs/2603.26663
- Vector Arithmetic in Concept and Token Subspaces. 2025. https://arxiv.org/abs/2511.18162
- Ethayarajh. How Contextual are Contextualized Word Representations? Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings. EMNLP 2019. https://arxiv.org/abs/1909.00512
- Outliers Dimensions Driven by Frequency in Pre-trained Language Models. 2022. https://arxiv.org/abs/2205.11380