🎯 课程主题
词嵌入(Word Embedding)方法——用低维稠密向量替代高维稀疏独热向量,并学习词的语义表示。
📝 核心知识点
1. 词嵌入矩阵的构建
- 概念说明:构建一个 $V \times D$ 的词嵌入矩阵,将独热向量降维为稠密向量。
- 关键细节:
- $V$:词表中 token 的数量
- $D$:嵌入维度,远小于 $V$(Transformer 中 $D = 512$)
- 对比:独热向量矩阵为 $V \times V$,词嵌入矩阵为 $V \times D$
2. 词嵌入的计算过程
- 概念说明:通过独热向量与词嵌入矩阵相乘,提取对应的嵌入向量。
- 关键细节:
- 词嵌入矩阵初始值随机(如 0.38, 0.6, 0.35 等)
- 独热向量 $[0,0,1,0,...]$ 与矩阵相乘 → 只有第 3 行的值被保留
- 结果:$1 \times D$ 的向量代表该 token
- 本质上是查表操作(Lookup)
3. 词嵌入矩阵是可训练权重
- 概念说明:词嵌入矩阵的值通过模型训练学习得到,而非随机。
- 关键细节:
- 矩阵中的值即权重 $W_{11}, W_{12}, \ldots, W_{VD}$
- 训练后,语义相近的 token 在向量空间中聚集
- 功能:
- 降维:从 $V$ 维降至 $D$ 维,大幅减少计算量
- 语义编码:将 token 映射为有语义的向量,便于相似性计算
4. 词嵌入的语义可视化
- 概念说明:训练后的词嵌入在向量空间呈现语义聚类。
- 关键细节:
- 将 $1 \times D$(如 512 维)降维到 $1 \times 2$(X, Y 坐标)可视化
- 语义相近的词聚集在一起:
- 指代词:"我"、"你"、"他" 聚集
- 动物:"鸡"、"牛"、"猪"、"羊" 聚集
- 球类:各类球聚集
- 量词:数量相关词聚集
🧮 核心公式与推导
词嵌入矩阵:
$$\mathbf{W}_e \in \mathbb{R}^{V \times D}$$
其中 $V$ 为词表大小,$D$ 为嵌入维度(Transformer 中 $D = 512$)。
词嵌入计算(独热向量 × 嵌入矩阵):
$$\mathbf{e}_i = \mathbf{x}_i \cdot \mathbf{W}_e$$
其中 $\mathbf{x}_i \in \mathbb{R}^{1 \times V}$ 为第 $i$ 个 token 的独热向量,$\mathbf{e}_i \in \mathbb{R}^{1 \times D}$ 为对应的词嵌入向量。
维度对比:
- 独热向量:$V \times V$(如 $10000 \times 10000$)
- 词嵌入:$V \times D$(如 $10000 \times 512$),$D \ll V$
物理意义:将高维稀疏的独热表示压缩为低维稠密的语义向量,使语义相近的词在向量空间中距离更近,便于做相似性计算(如余弦相似度)。
🏗️ 模型架构与数据流向
维度变化:
- 输入:Token ID → 独热向量 $1 \times V$
- 词嵌入矩阵:$V \times D$($D = 512$)
- 输出:词嵌入向量 $1 \times D$
💻 代码实战
import torch
import torch.nn as nn
# 词嵌入层示例
class TokenEmbedding(nn.Module):
def __init__(self, vocab_size, d_model):
"""
vocab_size: V, 词表大小
d_model: D, 嵌入维度 (Transformer中为512)
"""
super().__init__()
# nn.Embedding 内部即 V×D 的权重矩阵
# 本质上等价于独热向量与权重矩阵相乘的查表操作
self.embedding = nn.Embedding(num_embeddings=vocab_size,
embedding_dim=d_model)
def forward(self, x):
"""
x: [batch_size, seq_len] token ID 序列
return: [batch_size, seq_len, d_model] 词嵌入向量
"""
return self.embedding(x)
# 使用示例
vocab_size = 10000 # V = 1万
d_model = 512 # D = 512
embed_layer = TokenEmbedding(vocab_size, d_model)
# 输入: batch_size=2, seq_len=4 的 token ID
input_ids = torch.tensor([
[1, 5, 10, 3], # 句子1的token IDs
[2, 7, 8, 1] # 句子2的token IDs
])
output = embed_layer(input_ids)
print(output.shape) # torch.Size([2, 4, 512]) → [batch, seq_len, d_model]
⚠️ 常见问题与避坑指南
- 词嵌入维度 $D$ 需远小于词表大小 $V$,否则失去降维意义
- 词嵌入矩阵的值是可训练参数,不是固定随机的,会随模型训练更新
nn.Embedding本质是查表操作,等价于独热向量与权重矩阵相乘,但效率更高
💡 个人总结与延伸
词嵌入是 NLP 的基础技术,通过将高维稀疏独热向量压缩为低维稠密向量,既降低了计算量,又赋予了 token 语义信息。训练后的词嵌入空间中,语义相近的词自然聚集。这一思想延续至今,现代大模型(如 GPT、BERT)仍使用词嵌入作为输入层,只是分词方法从字/词级演进为子词级(BPE、WordPiece),嵌入维度也更大(如 4096、8192)。