9. 理解 Embedding
大模型中的 Embedding(词嵌入)到底是什么?
如果说 Transformer 是大模型的大脑,那么 Embedding 就是大模型的“词典”。
所有文本进入模型的第一步:
"我爱机器学习"
│
▼
Tokenizer
│
▼
[123, 456, 789]
│
▼
Embedding
│
▼
[768维向量]
[768维向量]
[768维向量]
Transformer 根本不认识文字。
它只认识数字。
Embedding 的作用就是:
把离散的 Token ID 转换成连续的向量(Vector)。
一、为什么需要 Embedding?
先想一个问题:
Tokenizer 输出的是什么?
"cat" → 1234
"dog" → 5678
模型看到的是:
1234
5678
但这里有个巨大问题:
1234 和 5678
只是编号。
就像:
张三 → 员工001
李四 → 员工002
不能因为:
002 > 001
就说明李四比张三厉害。
Token ID 没有任何语义。
所以需要转换成:
cat → 向量
dog → 向量
例如:
cat
↓
[0.3, 1.2, -0.7, ...]
这样模型才能进行数学运算。
二、从 One-Hot 到 Dense Embedding 的演进
这是 NLP 历史上的一次重大进步。
第一代:One-Hot
假设词表:
["cat","dog","apple","car"]
共有:
V = 4
那么:
cat
↓
[1,0,0,0]
dog
↓
[0,1,0,0]
问题1:太稀疏
如果词表:
V = 100000
那么:
cat = [0,0,0,0,0,0,1,0,0,...]
99999 个 0。
浪费内存。
问题2:没有语义
cat = [1,0,0,0]
dog = [0,1,0,0]
距离:
√2
而:
cat
car
距离也是:
√2
模型认为:
cat ≈ dog ≈ car
完全不合理。
三、Dense Embedding 的出现
2003 年 Bengio 在《A Neural Probabilistic Language Model》中首次系统使用了神经网络词向量思想,随后 Word2Vec 将其发扬光大。(Reddit)
思想:
不要用 100000 维 One-Hot 改成300维连续向量
例如:
cat
↓
[0.21,
1.34,
-0.53,
...
]
此时:
cat
dog
可能变成:
cat = [0.2,1.3,-0.5]
dog = [0.3,1.1,-0.4]
距离很近。
而:
car = [-2.5,0.8,4.1]
距离很远。
于是:
语义相似
↓
向量接近
这就是 Embedding 的核心思想。Word2Vec 通过上下文预测学习出这种语义空间,使得相似上下文中的词拥有相近向量。(en.wikipedia.org)
四、Embedding 本质是什么?
很多人学到这里会觉得很神秘。
实际上:
本质就是一个矩阵
假设:
词表大小 V = 50000
隐藏维度 d = 768
那么:
Embedding shape = [50000,768]
即:
768列
┌─────────────────┐
│ token0 │
│ token1 │
│ token2 │
│ ... │
│ token49999 │
└─────────────────┘
每一行:
一个 Token 的向量
五、nn.Embedding 的本质
很多人以为:
nn.Embedding
很复杂。
其实源码逻辑约等于:
weight[token_id]
例如:
embedding.weight.shape = [50000,768]
输入:
ids = [100,200,300]
输出:
embedding.weight[100]
embedding.weight[200]
embedding.weight[300]
拼起来:
[3,768]
本质:
查表
仅此而已。
六、为什么 Embedding 比 One-Hot 高效?
One-Hot:
50000维
Embedding:
768维
压缩比例:
50000
─────
768
≈ 65倍
同时还保留语义信息。
因此:
One-Hot
↓
Dense Embedding
成为 NLP 的标准方案。(pmc.ncbi.nlm.nih.gov)
七、d_model = 768 到底是什么意思?
例如 BERT Base:
d_model = 768
意思是:
每个 Token 用768个数字表示
即:
token
↓
[768维向量]
Transformer 整个网络都围绕这个维度运行:
Embedding
│
▼
[B,L,768]
Attention
│
▼
[B,L,768]
FFN
│
▼
[B,L,768]
768 维可以理解为:
768个特征槽位
例如(仅示意):
维度17 → 动物属性
维度32 → 国家属性
维度105 → 动词属性
真实模型中的维度不会这么明确,而是分布式表示。
八、Embedding 参数量怎么算?
公式:
例如:
词表 V = 50000
d_model = 768
则:
即:
3840万参数
如果 FP16:
3840万 × 2字节 ≈ 76.8MB
可以发现:
Embedding层
其实非常占参数
九、什么是 Weight Tying(权重共享)?
这是很多人第一次看 GPT 代码时最困惑的地方。
输入时:
Token ID
│
▼
Embedding
│
▼
768维向量
使用矩阵:
输出时:
Transformer 最终得到:
hidden state
[B,L,768]
需要预测:
下一个 Token
于是:
768
↓
50000
即:
其中:
发现了吗?
形状完全一样:
Embedding
[V,d]
Output Layer
[V,d]
于是 Press & Wolf(2016)提出:
直接共用同一个矩阵
即:
这样可以减少参数量并提升语言模型效果。(Hugging Face)
十、Weight Tying 为什么有效?
原来
Input Embedding 50000×768
+
Output Projection 50000×768
参数:
7680万
共享后
只保留一个矩阵
参数:
3840万
直接减半。
另外:
输入和输出本质上都在描述:
Token 的语义空间
共享后语义更一致。(Hugging Face)
十一、Word2Vec 和 Transformer Embedding 的区别
很多初学者容易混淆。
Word2Vec
训练目标:
根据上下文预测单词
或者:
根据单词预测上下文
(CBOW / Skip-Gram)(en.wikipedia.org)
得到:
一个静态向量
例如:
bank
永远同一个向量
Transformer
Embedding 初始也是:
一个静态向量
例如:
bank
先查表得到:
e_bank
随后经过:
Layer1 Attention
Layer2 Attention
...
LayerN Attention
不断更新。
最终:
bank(金融)
和
bank(河岸)
会变成不同向量。
即:
Word2Vec
静态Embedding
bank = 固定向量
Transformer
上下文Embedding
bank(金融) ≠ bank(河岸)
这是 Transformer 最大的进步之一。(quantml.org)
一张图看懂 Embedding

一句话总结:
Embedding 本质上就是一个大小为 [词表大小 × 隐藏维度] 的可训练查找表。Word2Vec 让 NLP 从 One-Hot 进入 Dense Vector 时代,而 Transformer 则在此基础上通过 Attention 将静态词向量进一步演化为上下文相关的动态语义表示。(en.wikipedia.org)