在自然语言处理(NLP)中,Token、向量(Vector)、Encoding(编码) 和 Embedding 是几个紧密关联但不同的概念。它们的核心关系可以用一句话概括:
Encoding将文本分割为Token,Embedding将Token转换为向量,向量作为模型可处理的连续数值表示,编码语义信息。
1. Token
-
是什么:Token 是文本经过分词后的最小单元,可以是单词、子词或符号。
-
例如:句子
"ChatGPT is powerful!"
可能被拆分为["Chat", "G", "PT", " is", " powerful", "!"]
(基于 BPE 分词)。
-
-
作用:Token 是模型处理文本的“原材料”,所有后续计算(如 Embedding)都基于 Token。
2. 向量(Vector)
-
是什么:向量是一个多维数组(如
[0.2, -1.5, 3.0, ...]
),用于在数学空间中表示 Token 的语义和语法特征。-
例如:单词
"king"
的向量可能是[0.8, -0.3, 1.2, ...]
,维度通常为 300、768 或 1024。
-
-
作用:向量是模型理解文本的“数学语言”,通过向量运算(如余弦相似度)可捕捉语义关系。
3. Embedding
-
是什么:Embedding 是将 Token 映射到向量的过程,本质是一个 查找表。
-
每个 Token 对应一个唯一的向量,Embedding 层是模型的组成部分(如神经网络的一层)。
-
例如:在训练好的 Embedding 中,
"dog" → [0.9, -0.2, 0.4]
,"cat" → [0.8, -0.1, 0.5]
,两者向量相似。
-
-
作用:通过 Embedding,模型能将离散的 Token 转换为连续的数值表示,从而进行数学运算。
4. 几者的关系
① 从文本到模型理解的完整流程
原始文本 → Encoding(生成 Token) → Token 序列 → Embedding(生成向量) → 向量序列 → 模型处理
-
简要示例:
-
文本:
"Learn AI"
-
Encoding:Tokenization
["Learn", " AI"]->
[3294, 3849]
-
Embedding:
[[0.3, -0.7, ...], [1.2, 0.5, ...]]
-
模型:基于向量进行预测或生成。
-
② 分步详解及代码案例
假设我们有一个句子 "I love NLP!"
,目标是将其转换为向量供模型处理。
步骤 1:Encoding(生成 Token ID)
-
工具:使用 OpenAI 的
tiktoken
库(GPT-4 的编码方式)。 -
代码:
import tiktoken # 初始化编码器 encoding = tiktoken.get_encoding("cl100k_base") # 原始文本 text = "I love NLP!" # Encoding:文本 → Token ID 序列 token_ids = encoding.encode(text) print("Token IDs:", token_ids) # 输出示例:[40, 3294, 3640, 0]
-
输出:
-
Token 序列为
[40, 3294, 3640, 0]
,其中:-
40
→ "I" -
3294
→ " love" -
3640
→ " NLP" -
0
→ "!"(假设0
是感叹号的 ID)
-
-
步骤 2:Embedding(生成向量)
-
工具:使用 PyTorch 的
nn.Embedding
层。 -
代码:
import torch import torch.nn as nn # 定义 Embedding 层(假设词表大小=100000,向量维度=3) embedding = nn.Embedding(num_embeddings=100000, embedding_dim=3) # 将 Token ID 转换为 Tensor input_ids = torch.tensor(token_ids) # 生成向量 vectors = embedding(input_ids) print("Vectors:\n", vectors)
-
输出:
Vectors: tensor([[ 0.512, -0.231, 0.879], # "I" 的向量 [ 0.193, 0.456, -0.742], # " love" 的向量 [-0.654, 0.321, 0.112], # " NLP" 的向量 [ 0.045, -0.889, 0.433]], # "!" 的向量 grad_fn=<EmbeddingBackward>)
步骤 3:输入模型
-
向量序列可直接输入模型(如 LSTM、Transformer)进行任务处理:
# 示例:LSTM 模型处理 class SimpleLSTM(nn.Module): def __init__(self): super().__init__() self.lstm = nn.LSTM(input_size=3, hidden_size=5) def forward(self, x): output, (hn, cn) = self.lstm(x) return output model = SimpleLSTM() # 调整输入形状为 (序列长度, batch_size, 向量维度) output = model(vectors.unsqueeze(1)) # 输出形状:(4, 1, 5)
关键点总结
步骤 | 输入 | 输出 | 工具/技术 |
---|---|---|---|
Encoding | 原始文本 ("I love NLP!" ) | Token ID 序列 ([40, 3294, 3640, 0] ) | tiktoken , transformers |
Embedding | Token ID 序列 | 向量序列 ((4, 3) ) | nn.Embedding , Word2Vec |
模型输入 | 向量序列 | 模型预测结果 | LSTM、Transformer |
5. Embedding 的核心意义
① 语义捕捉
-
好的 Embedding 会让语义相似的 Token 在向量空间中距离更近。
-
例如:
"dog"
和"puppy"
的向量方向接近,但与"car"
的向量差异较大。
-
② 上下文感知
-
静态 Embedding(如 Word2Vec):一个 Token 始终对应同一向量,无法区分多义词。
-
例如:
"bank"
(银行/河岸)在不同语境中向量相同。
-
-
动态 Embedding(如 BERT):同一 Token 在不同上下文中生成不同向量。
-
例如:
"bank"
在"deposit money in the bank"
和"river bank"
中向量不同。
-
6. 代码示例
① 使用 Embedding 层(PyTorch)
import torch
import torch.nn as nn
# 定义 Embedding 层:5 个 Token,每个 Token 映射到 3 维向量
embedding = nn.Embedding(num_embeddings=5, embedding_dim=3)
# 输入 Token ID(例如 "apple"=0, "banana"=1)
token_ids = torch.LongTensor([0, 1, 2])
# 获取向量
vectors = embedding(token_ids)
print(vectors)
# 输出:tensor([[ 0.5, -0.2, 1.1],
# [ 0.3, 0.8, -0.4],
# [-0.7, 0.1, 0.6]], grad_fn=<EmbeddingBackward>)
② 预训练 Embedding(如 Word2Vec)
from gensim.models import Word2Vec
# 训练一个简单的 Word2Vec 模型
sentences = [["cat", "say", "meow"], ["dog", "say", "woof"]]
model = Word2Vec(sentences, vector_size=3, min_count=1)
# 获取 "cat" 的向量
vector_cat = model.wv["cat"]
print(vector_cat) # 输出例如 [0.9, -0.2, 0.4]
7. 实际应用场景
-
语义搜索:通过向量相似度匹配查询和文档。
-
文本分类:将文本的向量输入分类器(如
[CLS]
向量在 BERT 中)。 -
生成任务:语言模型基于向量序列生成下一个 Token(如 GPT)。
-
推荐系统:用户行为序列的向量化表示。
8. 常见问题
① Token 和向量维度必须一一对应吗?
-
是的。每个 Token 对应一个向量,但动态 Embedding 允许同一 Token 在不同上下文中对应不同向量。
② Embedding 层如何训练?
-
Embedding 是模型的一部分,通过反向传播和梯度下降优化,目标是最小化任务损失(如分类误差)。
③ 为什么需要高维向量(如 768 维)?
-
高维空间能更精细地编码复杂的语义和语法特征,低维可能导致信息损失。
总结
-
Token 是文本的“原子单位”,向量 是 Token 的数学表示,Embedding 是两者的桥梁。
-
Embedding 的质量直接影响模型性能,好的向量表示能捕捉丰富的语义和上下文信息。
-
现代 NLP 模型(如 Transformer)通过动态 Embedding 技术,实现了对复杂语境的理解。