Embedding 是什么
从 Bit 到 AGI · 第五章:Transformer · 词如何把离散符号变成可计算的向量
Tokenizer 把句子切成 token ID(整数),但神经网络只能对浮点数做矩阵乘法。Embedding 层就是这座桥:查表,把每个 ID 映射成 维的稠密向量。没有这一步,Transformer 无从谈起。
直觉:字典里的「坐标」
想象词汇表是一本 30 522 页的字典,每一页只写一行 768 个数字——那就是 BERT-base 的 embedding 矩阵。token ID 2054(「hello」)就是页码;查表得到 768 维向量,表示「hello」在当前模型语义空间里的坐标。
相近含义的词,坐标也相近。训练完成后,「king − man + woman ≈ queen」这类向量算术,正是 embedding 学出来的几何结构。
定义
设词汇表大小为 ,隐藏维度为 。Embedding 是一个可学习矩阵:
对输入序列 ,其中 :
堆叠后得到 ,送入第一层 Transformer。
例子
例 1:BERT-base 尺寸
| 量 | 值 |
|---|---|
| (vocab) | 30 522 |
| 768 | |
| Embedding 参数量 | |
| 单 token 向量字节(fp32) | B |
BERT-base 总参数约 110M,embedding alone 就占约 21%。
例 2:查表 vs one-hot 乘矩阵
One-hot 向量 (第 位为 1)乘以 与直接取 数学等价,但查表只需读一行,内存带宽从 降到 。
import torch
import torch.nn as nn
V, d_model = 30522, 768
embed = nn.Embedding(V, d_model)
# batch=2, seq_len=128
token_ids = torch.randint(0, V, (2, 128))
hidden = embed(token_ids) # shape: (2, 128, 768)
assert hidden.shape == (2, 128, d_model)量化
- 输入:整数 ID,每个 4 B(int32)或 2 B(int16 索引)
- 输出: 个 token → B(fp32)
- 前向 FLOPs:查表几乎不计;若用 one-hot 形式则为 (所以没人这么做)
- 与 Tokenizer 的衔接:第 6 章 BPE 决定 ;中文同样走 ID → embedding,只是 ID 分布不同
Embedding 与输出层(lm_head)权重 tying 时,两者共享同一矩阵,可省约 23M 参数。GPT-2/3 常用此技巧;BERT 的 MLM head 通常独立。
常见误区
- Embedding 等于 Word2Vec:Word2Vec 是预训练方法;Transformer 里的 embedding 是端到端随任务一起训练的参数。
- 维度越高越好: 增大带来参数与计算量线性增长;768 是 BERT-base 在效果与成本间的折中。
- ID 0 一定有特殊含义:取决于 tokenizer;BERT 的
[CLS]、[PAD]各有固定 ID,需查词表而非假设。
小结
Embedding 把离散 token 变成 上的向量,是 Transformer 的第一层。BERT-base 用 维、约 23M 参数的查表矩阵。下一篇讲:向量本身不含顺序,位置信息从哪来?