LLM 底层原理从零到精通 · Day 4|表示学习与 Embedding:离散 token 如何变成向量
系列总目录:《LLM 底层原理 · 系列学习计划》 · 上一篇:Day 3
Day 1 说过:模型读的是 token ID(整数)。神经网络需要的是实数向量才能做矩阵乘。Embedding(嵌入) 就是把「第 个词」映射成 里一个点 —— 且这个映射是学出来的,不是手写规则。
本篇目标
- 说明 one-hot 表示的局限,以及为何要用低维稠密向量。
- 写出 词嵌入矩阵 ,并解释 查表(lookup) 与 参数 的对应关系。
- 把 embedding 看成 Day 2 的线性层特例:(one-hot 左乘矩阵)。
- 理解一整句 token 序列进入网络前,形状大致是「长度 × 」的矩阵。
- 知道位置信息还要另加(Day 9),embedding 只管「这个词学的是什么向量」。
1. 从 one-hot 说起
词表大小记为 (vocabulary size)。最朴素的编码:one-hot —— 第 个 token 对应向量 ,第 维为 1,其余为 0。
问题(直觉版):
- 维数巨大: 可达几万~几十万,每个向量极稀疏,后续线性层权重也巨大。
- 没有「相近」概念:任意两个不同 token 的 one-hot 点积都是 0,距离相同,无法表达「猫 vs 狗」比「猫 vs 会计」更相关。
- 不随数据改进:编码是固定的,没有学习。
我们希望:维数降到 (如 768、4096),且在训练过程中调整向量,让用法相近的词在几何上靠近 —— 这就是表示学习的第一步。
2. 嵌入矩阵与查表
设模型维度为 (常叫 hidden size / model dim)。定义矩阵:
第 行 就是 token 的 embedding 向量(行向量或列向量约定依实现而定,这里按「第 行是 」理解即可)。
前向:给定 token ID ,取出:
在 PyTorch 里通常是 nn.Embedding(|V|, d),前向传入整型索引,底层就是查表,比真的构造 one-hot 再乘矩阵更省算。
参数量:。例如 ,,仅输入嵌入就约 1.3 亿 参数 —— 在 7B 模型里是一大块,但不是全部(大头在注意力与 FFN,后面会拆)。
3. 与线性层的关系(Day 2 回扣)
若把 one-hot 行向量 看成 ,则:
也就是说:Embedding 层 = 对 one-hot 做一次线性变换,且没有加偏置; 就是权重矩阵。反向传播时,只有被用到的那些行会收到梯度(同一 batch 里出现多次的 token,梯度会累加)。
4. 序列:从 ID 列表到张量
一句话 token 化后得到 ,每个 。
经过 embedding 后,得到 个 维向量,可堆成:
(实现里常为 batch × seq × d,batch 维 Day 5~8 再系统化。)
重要:到这一步为止,若只看 embedding,模型还不知道「第几个位置」—— 交换两格 token,得到的矩阵只是行交换,没有额外信息区分位置。因此 Transformer 会加 位置编码(Day 9),与 token embedding 相加后再进注意力层。
5. 输入嵌入 vs 输出侧(预告)
语言模型最后要预测「下一个 token 在词表上的分布」,往往有一层 lm_head:把隐藏状态 映到 (logits)。有的实现把 lm_head 与 embedding 矩阵共用(weight tying),减少参数并常带来更好泛化;也有的分开两套矩阵。读模型卡时看到 tied embeddings 指的就是这类设计。
自测题
Q1. Embedding 矩阵的行数、列数各由什么决定?
要点
行数 ≈ 词表大小 |V|;列数 = 模型维度 d。
Q2. 为什么说 embedding 是「可训练参数」而不是查静态词典?
要点
矩阵 E 的元素随损失与反向传播更新,向量会适应语料中的用法。
Q3. 同一 batch 里同一个 token 出现两次,反向时 的更新会怎样?
要点
对该 token 对应行的梯度会 累加(两次 lookup 各贡献一条路径)。
Q4. 仅使用 token embedding、不加位置信息,交换序列中两个 token 的位置,网络在「结构上」能区分吗?
要点
若后续子层对位置不敏感(纯对集合做对称运算),则区分不了;Transformer 标准做法要加 位置编码。
Q5. ,,仅输入 embedding 大约多少参数?
要点
(约 5120 万)个标量。
延伸阅读(可选)
- 在 PyTorch 文档里扫一眼
torch.nn.Embedding的说明,对照本文「查表 vs one-hot 乘矩阵」。 - 打开任意开源 LLM 的
config.json,找vocab_size与hidden_size,算一遍 。
下一篇
Day 5 把 语言建模目标 说透:自回归 、交叉熵、困惑度,以及和「最后一个位置预测下一个 token」的对应关系。发布后见 系列计划 中的 Day 5 条目。