深入解析Embedding: 词嵌入 vs 上下文嵌入
- [什么是 Embedding?](#什么是 Embedding?)
-
- [1.1 Embedding 的基本概念](#1.1 Embedding 的基本概念)
- [1.2 为什么需要 Embedding](#1.2 为什么需要 Embedding)
- [1.3 Embedding 的数学本质](#1.3 Embedding 的数学本质)
- [词嵌入 (Word Embedding) - 静态嵌入](#词嵌入 (Word Embedding) - 静态嵌入)
-
- [2.1 什么是词嵌入](#2.1 什么是词嵌入)
- [2.2 实现方式](#2.2 实现方式)
- [2.3 经典词嵌入方法](#2.3 经典词嵌入方法)
- [上下文嵌入 (Contextual Embedding) - 动态嵌入](#上下文嵌入 (Contextual Embedding) - 动态嵌入)
-
- [3.1 什么是上下文嵌入](#3.1 什么是上下文嵌入)
- [3.2 实现方式](#3.2 实现方式)
- [3.3 "bank" 的上下文嵌入示例](#3.3 "bank" 的上下文嵌入示例)
- [词嵌入 vs 上下文嵌入:核心区别](#词嵌入 vs 上下文嵌入:核心区别)
-
- [4.1 对比表格](#4.1 对比表格)
- [4.2 可视化对比](#4.2 可视化对比)
- [Transformer 中的嵌入流程](#Transformer 中的嵌入流程)
-
- [5.1 完整流程图](#5.1 完整流程图)
- [5.2 各层输出维度变化](#5.2 各层输出维度变化)
- [常见 Embedding 模型汇总](#常见 Embedding 模型汇总)
-
- [6.1 按类型分类](#6.1 按类型分类)
- [6.2 静态词嵌入模型对比](#6.2 静态词嵌入模型对比)
- [6.3 上下文嵌入模型对比](#6.3 上下文嵌入模型对比)
- [6.4 大语言模型嵌入对比](#6.4 大语言模型嵌入对比)
- [6.5 其他领域嵌入模型](#6.5 其他领域嵌入模型)
- 不同模型的嵌入策略
-
- [7.1 模型对比](#7.1 模型对比)
- [7.2 代码对比](#7.2 代码对比)
- [Embedding 的评估指标](#Embedding 的评估指标)
-
- [8.1 词嵌入评估](#8.1 词嵌入评估)
- [8.2 上下文嵌入评估](#8.2 上下文嵌入评估)
- [Embedding 的可视化](#Embedding 的可视化)
-
- [9.1 t-SNE 降维可视化](#9.1 t-SNE 降维可视化)
- [9.2 语义空间性质](#9.2 语义空间性质)
- 总结
-
- [10.1 核心要点](#10.1 核心要点)
- [10.2 简单记忆](#10.2 简单记忆)
Embedding确实是理解 Transformer 架构的关键基础,需要各位读者详细掌握!让我详细解释两者的区别和实现方式。
什么是 Embedding?
1.1 Embedding 的基本概念
Embedding(嵌入) 是将离散的符号(如单词、物品、用户)映射到连续向量空间的技术。它的核心思想是:让语义相似的实体在向量空间中也彼此接近。
Embedding : 离散符号 → R d \text{Embedding}: \text{离散符号} \rightarrow \mathbb{R}^d Embedding:离散符号→Rd
其中 d d d 是嵌入维度(通常 128、256、512、768、1024 等)。
直观理解:
┌─────────────────────────────────────────────────────────────┐
│ Embedding 的本质 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 现实世界 → 数学世界 │
│ ─────────────── ─────────────── │
│ "猫" [0.23, -0.45, 0.67, ...] │
│ "狗" [0.21, -0.42, 0.65, ...] │
│ "苹果" [0.89, 0.12, -0.34, ...] │
│ │
│ 语义相似 → 向量相似 │
│ cos("猫", "狗") ≈ 0.9 (高相似度) │
│ cos("猫", "苹果") ≈ 0.1 (低相似度) │
│ │
└─────────────────────────────────────────────────────────────┘
1.2 为什么需要 Embedding
问题:计算机只能处理数值,无法直接处理离散符号。
| 表示方法 | 示例 | 问题 |
|---|---|---|
| 字符串 | "cat" | 无法计算相似度 |
| One-hot | [0,0,1,0,...] | 维度灾难、无法表示语义关系 |
| Embedding | [0.23, -0.45, 0.67] | ✅ 低维、✅ 可计算相似度、✅ 捕捉语义 |
One-hot 编码的局限:
假设词汇表大小 ∣ V ∣ = 10000 |V| = 10000 ∣V∣=10000:
"猫" → [0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, ...] (10000 维)
"狗" → [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, ...] (10000 维)
cos("猫", "狗") = 0 (所有 one-hot 向量都正交,无法表示相似关系)
Embedding 的优势:
"猫" → [0.23, -0.45, 0.67, 0.12, -0.34, 0.56, ...] (d=512)
"狗" → [0.21, -0.42, 0.65, 0.11, -0.31, 0.52, ...] (d=512)
cos("猫", "狗") ≈ 0.95 (可以计算语义相似度)
1.3 Embedding 的数学本质
形式化定义 :Embedding 是一个映射函数 f f f:
f : V → R d f: \mathcal{V} \rightarrow \mathbb{R}^d f:V→Rd
其中 V \mathcal{V} V 是符号集合(词汇表), R d \mathbb{R}^d Rd 是 d d d 维欧几里得空间。
嵌入矩阵 :所有符号的嵌入向量堆叠成矩阵 E E E:
E ∈ R ∣ V ∣ × d = [ --- e 1 --- --- e 2 --- ⋮ --- e ∣ V ∣ --- ] E \in \mathbb{R}^{|\mathcal{V}| \times d} = \begin{bmatrix} --- & e_1 & --- \\ --- & e_2 & --- \\ & \vdots & \\ --- & e_{|\mathcal{V}|} & --- \end{bmatrix} E∈R∣V∣×d= ---------e1e2⋮e∣V∣---------
查找操作 :给定符号索引 i i i,获取其嵌入向量:
embedding ( i ) = E [ i ] ∈ R d \text{embedding}(i) = E[i] \in \mathbb{R}^d embedding(i)=E[i]∈Rd
词嵌入 (Word Embedding) - 静态嵌入
2.1 什么是词嵌入
词嵌入是将离散的词元 (token) 映射到连续向量空间的技术:
Word Embedding : Vocabulary → R d \text{Word Embedding}: \text{Vocabulary} \rightarrow \mathbb{R}^d Word Embedding:Vocabulary→Rd
核心特点:
| 特性 | 说明 |
|---|---|
| 静态 | 每个词有固定的向量表示 |
| 与上下文无关 | "bank" 在任何句子中向量都相同 |
| 预训练或随机初始化 | 可在训练前预训练,也可随机初始化后学习 |
| 查找表实现 | 本质是一个可学习的矩阵 |
2.2 实现方式
Embedding 层本质是一个查找表:
词汇表 (Vocabulary)
┌─────────────┬───────────────────────────────┐
│ Token ID │ Embedding Vector (d 维) │
├─────────────┼───────────────────────────────┤
│ 0 │ [0.12, -0.45, 0.78, ...] │ ← "king"
│ 1 │ [0.11, -0.40, 0.75, ...] │ ← "queen"
│ 2 │ [-0.65, 0.23, 0.12, ...] │ ← "apple"
│ ... │ ... │
│ 30522 │ [0.33, -0.12, 0.89, ...] │ ← "bank"
└─────────────┴───────────────────────────────┘
数学表示:
E ∈ R ∣ V ∣ × d E \in \mathbb{R}^{|V| \times d} E∈R∣V∣×d
- ∣ V ∣ |V| ∣V∣:词汇表大小 (如 30522, 50257, 100000+)
- d d d:嵌入维度 (如 512, 768, 1024)
代码实现 (PyTorch):
python
import torch
import torch.nn as nn
# 定义 Embedding 层
vocab_size = 30522 # 词汇表大小
embed_dim = 512 # 嵌入维度
embedding = nn.Embedding(num_embeddings=vocab_size,
embedding_dim=embed_dim)
# 输入:token IDs [batch_size, seq_len]
input_ids = torch.tensor([[101, 2345, 6789, 102],
[101, 3456, 7890, 102]]) # batch_size=2, seq_len=4
# 输出:embeddings [batch_size, seq_len, embed_dim]
embeddings = embedding(input_ids) # shape: (2, 4, 512)
底层原理:
Embedding 层本质是矩阵查找:
python
# 方法 1: 直接查找 (高效)
embedding_weight = torch.randn(vocab_size, embed_dim)
token_id = 5
vector = embedding_weight[token_id] # 直接取第 5 行
# 方法 2: one-hot × 矩阵 (理论等价,但效率低)
one_hot = torch.zeros(vocab_size)
one_hot[token_id] = 1
vector = one_hot @ embedding_weight # 结果相同
2.3 经典词嵌入方法
| 方法 | 年份 | 特点 |
|---|---|---|
| Word2Vec | 2013 | CBOW/Skip-gram,局部上下文 |
| GloVe | 2014 | 全局共现矩阵 + 最小二乘 |
| FastText | 2016 | 考虑子词 (subword) 信息 |
Word2Vec 示例:
训练语料: "the cat sat on the mat"
Skip-gram 目标: 给定中心词预测上下文
- 输入: "cat" → 输出: ["the", "sat"]
训练后:
- "cat" → [0.25, -0.88, 0.13, ...]
- "dog" → [0.23, -0.85, 0.15, ...] ← 与 cat 接近
- "mat" → [0.10, 0.45, -0.32, ...] ← 与 cat 较远
上下文嵌入 (Contextual Embedding) - 动态嵌入
3.1 什么是上下文嵌入
上下文嵌入根据词语在句子中的具体语境动态生成向量表示:
ContextualEmbedding : ( Token , Context ) → R d \text{ContextualEmbedding}: (\text{Token}, \text{Context}) \rightarrow \mathbb{R}^d ContextualEmbedding:(Token,Context)→Rd
核心特点:
| 特性 | 说明 |
|---|---|
| 动态 | 同一个词在不同句子中向量不同 |
| 与上下文相关 | "bank" 在"河岸"和"银行"语境中向量不同 |
| 通过模型计算 | 由 Transformer/类 Transformer 架构生成 |
| 捕捉多义词 | 能区分一词多义 |
3.2 实现方式
上下文嵌入 = 词嵌入 + 位置编码 + Transformer 层
┌─────────────────────────────────────────────────────────────┐
│ 上下文嵌入生成流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 输入句子: "I deposited money at the bank" │
│ │
│ Step 1: Tokenization │
│ ["I", "deposited", "money", "at", "the", "bank"] │
│ │
│ Step 2: 词嵌入查找 (静态) │
│ E["I"], E["deposited"], E["money"], E["at"], E["the"], E["bank"]
│ │
│ Step 3: + 位置编码 │
│ E["I"]+PE[0], E["deposited"]+PE[1], ... │
│ │
│ Step 4: Transformer 层处理 (Self-Attention) │
│ 每个 token 的向量被更新,融合了上下文信息 │
│ │
│ Step 5: 输出上下文嵌入 │
│ H["bank"] = f(E["bank"], E["deposited"], E["money"], ...) │
│ │
└─────────────────────────────────────────────────────────────┘
数学表示:
H = Transformer ( E + P E ) H = \text{Transformer}(E + PE) H=Transformer(E+PE)
- E E E:词嵌入矩阵 [ n × d ] [n \times d] [n×d]
- P E PE PE:位置编码矩阵 [ n × d ] [n \times d] [n×d]
- H H H:上下文嵌入矩阵 [ n × d ] [n \times d] [n×d]
代码实现 (简化版 Transformer):
python
import torch
import torch.nn as nn
class ContextualEmbedding(nn.Module):
def __init__(self, vocab_size, embed_dim, num_heads, num_layers):
super().__init__()
# Step 1: 词嵌入层 (静态)
self.token_embedding = nn.Embedding(vocab_size, embed_dim)
# Step 2: 位置编码 (可学习或固定)
self.position_embedding = nn.Embedding(512, embed_dim)
# Step 3: Transformer Encoder 层
encoder_layer = nn.TransformerEncoderLayer(
d_model=embed_dim,
nhead=num_heads,
batch_first=True
)
self.transformer = nn.TransformerEncoder(encoder_layer, num_layers)
def forward(self, input_ids):
# input_ids: [batch_size, seq_len]
# Step 1: 词嵌入查找
token_embeds = self.token_embedding(input_ids) # [batch, seq, dim]
# Step 2: 位置编码
positions = torch.arange(input_ids.shape[1], device=input_ids.device)
pos_embeds = self.position_embedding(positions) # [seq, dim]
# Step 3: 相加
embeds = token_embeds + pos_embeds # [batch, seq, dim]
# Step 4: Transformer 处理
contextual_embeds = self.transformer(embeds) # [batch, seq, dim]
return contextual_embeds
# 使用示例
model = ContextualEmbedding(vocab_size=30522, embed_dim=512,
num_heads=8, num_layers=6)
input_ids = torch.tensor([[101, 2345, 6789, 102]]) # 包含 "bank"
contextual_embeds = model(input_ids) # 输出上下文嵌入
3.3 "bank" 的上下文嵌入示例
句子 1 : "I sat by the bank of the river"
句子 2: "I deposited money at the bank"
词嵌入 (静态):
- E [ "bank" ] = [ 0.33 , − 0.12 , 0.89 , . . . ] E[\text{"bank"}] = [0.33, -0.12, 0.89, ...] E["bank"]=[0.33,−0.12,0.89,...] ← 两个句子中相同
上下文嵌入 (动态):
- H 1 [ "bank" ] = [ 0.45 , 0.23 , 0.67 , . . . ] H_1[\text{"bank"}] = [0.45, 0.23, 0.67, ...] H1["bank"]=[0.45,0.23,0.67,...] ← 偏向"河岸"含义
- H 2 [ "bank" ] = [ 0.12 , − 0.56 , 0.91 , . . . ] H_2[\text{"bank"}] = [0.12, -0.56, 0.91, ...] H2["bank"]=[0.12,−0.56,0.91,...] ← 偏向"银行"含义
向量相似度:
- cos ( H 1 [ "bank" ] , E [ "river" ] ) > cos ( H 2 [ "bank" ] , E [ "river" ] ) \cos(H_1[\text{"bank"}], E[\text{"river"}]) > \cos(H_2[\text{"bank"}], E[\text{"river"}]) cos(H1["bank"],E["river"])>cos(H2["bank"],E["river"])
- cos ( H 2 [ "bank" ] , E [ "money" ] ) > cos ( H 1 [ "bank" ] , E [ "money" ] ) \cos(H_2[\text{"bank"}], E[\text{"money"}]) > \cos(H_1[\text{"bank"}], E[\text{"money"}]) cos(H2["bank"],E["money"])>cos(H1["bank"],E["money"])
词嵌入 vs 上下文嵌入:核心区别
4.1 对比表格
| 维度 | 词嵌入 (Word Embedding) | 上下文嵌入 (Contextual Embedding) |
|---|---|---|
| 表示 | 静态,固定向量 | 动态,随上下文变化 |
| 一词多义 | ❌ 无法区分 | ✅ 可以区分 |
| 实现 | Embedding 查找表 | Transformer + Self-Attention |
| 计算成本 | 低 ( O ( 1 ) O(1) O(1) 查找) | 高 ( O ( n 2 ) O(n^2) O(n2) 注意力) |
| 代表模型 | Word2Vec, GloVe | BERT, GPT, ELMo |
| 训练方式 | 预训练后固定或微调 | 端到端训练 |
| 信息融合 | 无上下文信息 | 融合整个句子信息 |
4.2 可视化对比
┌─────────────────────────────────────────────────────────────┐
│ 词嵌入 (静态) │
├─────────────────────────────────────────────────────────────┤
│ │
│ "bank" (河岸) ──→ [0.33, -0.12, 0.89, ...] │
│ "bank" (银行) ──→ [0.33, -0.12, 0.89, ...] ← 相同! │
│ │
│ 问题:无法区分多义词 │
│ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 上下文嵌入 (动态) │
├─────────────────────────────────────────────────────────────┤
│ │
│ "I sat by the bank of the river" │
│ "bank" ──→ [0.45, 0.23, 0.67, ...] ← 偏向自然/地理 │
│ │
│ "I deposited money at the bank" │
│ "bank" ──→ [0.12, -0.56, 0.91, ...] ← 偏向金融/商业 │
│ │
│ 优势:根据上下文动态调整 │
│ │
└─────────────────────────────────────────────────────────────┘
Transformer 中的嵌入流程
5.1 完整流程图
┌─────────────────────────────────────────────────────────────┐
│ Transformer 嵌入处理流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 输入文本: "The cat sat on the mat" │
│ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Tokenization │ ["The", "cat", "sat", "on", "the", "mat"]
│ └────────┬────────┘ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Token IDs │ [101, 2345, 6789, 3456, 102, 7890] │
│ └────────┬────────┘ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 词嵌入查找 │ E[101], E[2345], E[6789], ... │
│ │ (静态) │ [batch, seq_len, d_model] │
│ └────────┬────────┘ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ + 位置编码 │ PE[0], PE[1], PE[2], ... │
│ │ (RoPE/绝对) │ [batch, seq_len, d_model] │
│ └────────┬────────┘ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Transformer │ Self-Attention 融合上下文 │
│ │ Encoder 层 │ [batch, seq_len, d_model] │
│ └────────┬────────┘ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 上下文嵌入 │ H[0], H[1], H[2], ... │
│ │ (动态) │ 每个 token 的向量已融合上下文信息 │
│ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
5.2 各层输出维度变化
假设: batch_size=2, seq_len=10, d_model=512
| 步骤 | 操作 | 输出维度 |
|---|---|---|
| Step 1 | 输入 token IDs | [ 2 , 10 ] [2, 10] [2,10] (int64) |
| Step 2 | 词嵌入查找后 | [ 2 , 10 , 512 ] [2, 10, 512] [2,10,512] (float32) |
| Step 3 | + 位置编码后 | [ 2 , 10 , 512 ] [2, 10, 512] [2,10,512] (float32) |
| Step 4 | Transformer Encoder (6 层) 后 | [ 2 , 10 , 512 ] [2, 10, 512] [2,10,512] (float32) ← 上下文嵌入 |
| Step 5 | 输出层 (可选) | [ 2 , 10 , v o c a b _ s i z e ] [2, 10, vocab\_size] [2,10,vocab_size] (logits) |
常见 Embedding 模型汇总
6.1 按类型分类
| 类型 | 代表模型 | 特点 | 适用场景 |
|---|---|---|---|
| 静态词嵌入 | Word2Vec, GloVe, FastText | 每个词固定向量 | 传统 NLP 任务、特征工程 |
| 上下文嵌入 | BERT, GPT, RoBERTa | 动态、上下文相关 | 现代 NLP、理解任务 |
| 多模态嵌入 | CLIP, ALIGN | 图文对齐 | 图文检索、多模态任务 |
| 图嵌入 | Node2Vec, GCN | 图结构编码 | 社交网络、推荐系统 |
| 知识图谱嵌入 | TransE, ComplEx | 关系推理 | 知识补全、问答系统 |
| 代码嵌入 | CodeBERT, CodeT5 | 代码理解 | 代码生成、代码搜索 |
6.2 静态词嵌入模型对比
| 模型 | 年份 | 参数量 | 维度 | 训练方法 | 特点 |
|---|---|---|---|---|---|
| Word2Vec | 2013 | ~1M | 100-300 | CBOW/Skip-gram | 局部上下文,效率高 |
| GloVe | 2014 | ~1M | 50-300 | 共现矩阵分解 | 融合全局统计信息 |
| FastText | 2016 | ~1M | 100-300 | Skip-gram + subword | 处理未登录词,支持子词 |
6.3 上下文嵌入模型对比
| 模型 | 年份 | 参数量 | 维度 | 架构 | 最大长度 | 特点 |
|---|---|---|---|---|---|---|
| ELMo | 2018 | 94M | 1024 | 双向 LSTM | - | 早期上下文嵌入 |
| BERT | 2018 | 110M-340M | 768-1024 | Transformer Encoder | 512 | 双向上下文,奠基之作 |
| GPT-2 | 2019 | 124M-1.5B | 768-1600 | Transformer Decoder | 1024 | 单向,生成能力强 |
| RoBERTa | 2019 | 125M-355M | 768-1024 | Transformer Encoder | 512 | BERT 优化版 |
| ALBERT | 2019 | 12M-235M | 768-4096 | 共享参数 | 512 | 参数共享,更小 |
| XLNet | 2019 | 110M-340M | 768-1024 | 排列语言模型 | 512 | 融合 AR 和 AE |
| T5 | 2019 | 60M-11B | 512-1024 | Encoder-Decoder | 512 | 统一文本到文本框架 |
| DeBERTa | 2020 | 140M-1.5B | 768-1536 | 解耦注意力 | 512 | 分离内容和位置 |
6.4 大语言模型嵌入对比
| 模型 | 年份 | 参数量 | 维度 | 位置编码 | 注意力类型 | 上下文长度 |
|---|---|---|---|---|---|---|
| GPT-3 | 2020 | 175B | 12288 | 可学习位置编码 | MHA | 2048 |
| LLaMA | 2023 | 7B-65B | 4096-8192 | RoPE | GQA | 2048-4096 |
| LLaMA-2 | 2023 | 7B-70B | 4096-8192 | RoPE | GQA | 4096 |
| LLaMA-3 | 2024 | 8B-70B | 4096-8192 | RoPE | GQA | 8192-128K |
| Qwen-1.5 | 2023 | 1.8B-72B | 2048-8192 | RoPE | GQA | 32K |
| Qwen-2 | 2024 | 0.5B-72B | 2048-8192 | RoPE + YaRN | GQA | 128K |
| Qwen-2.5 | 2024 | 0.5B-72B | 2048-8192 | RoPE + YaRN | GQA | 128K |
| Qwen-3 | 2024 | 0.6B-236B | 2048-16384 | RoPE + YaRN | GQA | 256K+ |
| DeepSeek-V2 | 2024 | 16B-236B | 2048-7168 | RoPE | MLA | 128K |
| DeepSeek-V3 | 2024 | 16B-671B | 2048-7168 | RoPE | MLA + MoE | 128K-1M |
| Gemini | 2023 | 1.5T (MoE) | 6144 | RoPE | MQA | 32K-1M |
| Claude-3 | 2024 | - | - | RoPE | - | 200K |
6.5 其他领域嵌入模型
| 领域 | 模型 | 年份 | 特点 |
|---|---|---|---|
| 图嵌入 | Node2Vec | 2016 | 图结构随机游走 |
| 图嵌入 | GraphSAGE | 2017 | 归纳式学习 |
| 图嵌入 | GCN | 2017 | 图卷积网络 |
| 知识图谱 | TransE | 2013 | 关系三元组嵌入 |
| 知识图谱 | ComplEx | 2016 | 复数空间嵌入 |
| 多模态 | CLIP | 2021 | 图文对比学习 |
| 多模态 | ALIGN | 2021 | 大规模图文对齐 |
| 代码 | CodeBERT | 2020 | 代码-文本双向 |
| 代码 | CodeT5 | 2021 | 代码生成和理解 |
| 代码 | CodeLLaMA | 2023 | 代码专用 LLaMA |
不同模型的嵌入策略
7.1 模型对比
| 模型 | 词嵌入 | 位置编码 | 上下文嵌入 |
|---|---|---|---|
| Word2Vec | ✅ 静态 | ❌ 无 | ❌ 无 |
| ELMo | ✅ 双向 LSTM | ✅ 位置 | ✅ LSTM 上下文 |
| BERT | ✅ 可学习 | ✅ 绝对位置 | ✅ Transformer Encoder |
| GPT-2/3 | ✅ 可学习 | ✅ 绝对位置 | ✅ Transformer Decoder |
| LLaMA | ✅ 可学习 | ✅ RoPE | ✅ Transformer Decoder |
| Qwen | ✅ 可学习 | ✅ RoPE + YaRN | ✅ Transformer Decoder |
| DeepSeek | ✅ 可学习 | ✅ RoPE | ✅ Transformer Decoder + MLA |
7.2 代码对比
Word2Vec (静态嵌入):
python
from gensim.models import Word2Vec
# 训练
sentences = [["the", "cat", "sat"], ["the", "dog", "ran"]]
model = Word2Vec(sentences, vector_size=300, window=5, min_count=1)
# 获取嵌入 (静态)
king_vector = model.wv["king"] # 固定向量
queen_vector = model.wv["queen"] # 固定向量
# 任何上下文中 "king" 的向量都相同
BERT (上下文嵌入):
python
from transformers import BertModel, BertTokenizer
# 加载模型
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
# 句子 1
text1 = "I sat by the bank of the river"
inputs1 = tokenizer(text1, return_tensors='pt')
outputs1 = model(**inputs1)
bank_embed1 = outputs1.last_hidden_state[0, -2] # "bank" 的上下文嵌入
# 句子 2
text2 = "I deposited money at the bank"
inputs2 = tokenizer(text2, return_tensors='pt')
outputs2 = model(**inputs2)
bank_embed2 = outputs2.last_hidden_state[0, -2] # "bank" 的上下文嵌入
# 两个向量不同!
print(torch.cosine_similarity(bank_embed1, bank_embed2)) # < 1.0
Embedding 的评估指标
8.1 词嵌入评估
| 指标 | 类型 | 说明 |
|---|---|---|
| Word Similarity | 内在评估 | 计算词对相似度与人工评分的相关性 |
| Word Analogy | 内在评估 | "king - man + woman = queen" 准确率 |
| Downstream Task | 外在评估 | 在具体任务(分类、NER)上的表现 |
Word Analogy 示例:
king ⃗ − man ⃗ + woman ⃗ ≈ queen ⃗ \vec{\text{king}} - \vec{\text{man}} + \vec{\text{woman}} \approx \vec{\text{queen}} king −man +woman ≈queen
8.2 上下文嵌入评估
| 指标 | 说明 |
|---|---|
| GLUE | 通用语言理解评估(9 个任务) |
| SuperGLUE | 更难的语言理解任务 |
| SQuAD | 阅读理解任务 |
| BLEU / ROUGE | 生成任务评估 |
| Perplexity | 语言模型困惑度 |
Embedding 的可视化
9.1 t-SNE 降维可视化
┌─────────────────────────────────────────────────────────────┐
│ 词嵌入 t-SNE 可视化 │
├─────────────────────────────────────────────────────────────┤
│ │
│ animal │
│ │ │
│ cat ─────── dog │
│ │ │
│ pet │
│ │
│ fruit vehicle │
│ │ │ │
│ apple─banana car ─── truck │
│ │ │ │
│ orange bus │
│ │
└─────────────────────────────────────────────────────────────┘
9.2 语义空间性质
向量算术:
巴黎 ⃗ − 法国 ⃗ ≈ 罗马 ⃗ − 意大利 ⃗ \vec{\text{巴黎}} - \vec{\text{法国}} \approx \vec{\text{罗马}} - \vec{\text{意大利}} 巴黎 −法国 ≈罗马 −意大利
语义相似度:
cos ( 猫 ⃗ , 狗 ⃗ ) > cos ( 猫 ⃗ , 汽车 ⃗ ) \cos(\vec{\text{猫}}, \vec{\text{狗}}) > \cos(\vec{\text{猫}}, \vec{\text{汽车}}) cos(猫 ,狗 )>cos(猫 ,汽车 )
总结
10.1 核心要点
┌─────────────────────────────────────────────────────────────┐
│ 核心要点总结 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1️⃣ 什么是 Embedding │
│ • 将离散符号映射到连续向量空间 │
│ • 实现语义相似 → 向量相似 │
│ • 解决 one-hot 的维度灾难和语义缺失问题 │
│ │
│ 2️⃣ 词嵌入 (Word Embedding) │
│ • 静态查找表,每个词固定向量 │
│ • 实现:nn.Embedding(vocab_size, dim) │
│ • 无法区分一词多义 │
│ • 代表:Word2Vec, GloVe │
│ │
│ 3️⃣ 上下文嵌入 (Contextual Embedding) │
│ • 动态计算,随上下文变化 │
│ • 实现:词嵌入 + 位置编码 + Transformer │
│ • 可以区分一词多义 │
│ • 代表:BERT, GPT, LLaMA, Qwen │
│ │
│ 4️⃣ Transformer 中的流程 │
│ Token IDs → 词嵌入 → +位置编码 → Transformer → 上下文嵌入│
│ │
│ 5️⃣ 常见 Embedding 模型 │
│ • 静态:Word2Vec, GloVe, FastText │
│ • 上下文:BERT, GPT, LLaMA, Qwen, DeepSeek │
│ • 多模态:CLIP, ALIGN │
│ • 图嵌入:Node2Vec, GCN │
│ • 代码:CodeBERT, CodeT5 │
│ │
└─────────────────────────────────────────────────────────────┘
10.2 简单记忆
| 概念 | 类比 |
|---|---|
| Embedding | 将世界万物映射到数学空间 |
| 词嵌入 | 字典里每个词的固定定义 |
| 上下文嵌入 | 根据具体语境理解词的含义 |
| 静态 vs 动态 | 照片 vs 视频 |
现代大模型 (Qwen、LLaMA、DeepSeek 等) 使用的都是上下文嵌入,这是它们能够理解复杂语义的关键!🚀