Token Embedding 是将文本中的每个 Token(词元)映射到一个固定维度的向量表示(通常是高维连续向量)。这些向量表示捕捉了 Token 的语义信息和上下文关系,是自然语言处理(NLP)模型的核心输入。
在 NLP 模型中,Token Embeddings 是将离散的文本数据转换为模型可以理解的数值表示的关键步骤。例如,在 BERT、GPT、SBERT 等基于 Transformer 的模型中,Token Embeddings 是输入文本的第一步处理结果。
什么是 Token?
Token 是模型处理文本的基本单元,可以是:
- 单词(如 "cat"、"running" 等)。
- 子词(如 "run", "##ning",用于词干和后缀分解)。
- 字符(如 "c"、"a"、"t",在某些字符级模型中)。
- 特殊标记(如 [CLS], [SEP], <PAD>)。
在 BERT 等模型中,Token 通常由 子词分词器(如 WordPiece 或 Byte Pair Encoding)生成。
Token Embedding 的生成过程
分词(Tokenization)
-
- 输入文本被分解为若干 Token。例如:
- 输入文本:"I love coding"
- 分词结果:["I", "love", "coding"]
- 输入文本被分解为若干 Token。例如:
查找嵌入矩阵
-
- 每个 Token 被映射到一个预定义的嵌入向量。这些向量是模型的一部分,通常是一个 嵌入矩阵(Embedding Matrix):
- 形状为 (V, d),其中 V 是词汇表大小,d 是嵌入向量的维度(如 768
- 每个 Token 被映射到一个预定义的嵌入向量。这些向量是模型的一部分,通常是一个 嵌入矩阵(Embedding Matrix):
Token: "I" "love" "coding"
Embedding: [0.1, 0.2] [0.4, 0.5] [0.8, 0.9]
上下文感知调整(如适用)
-
- 在 Transformer 模型中,Token Embeddings 会进一步通过自注意力机制调整,生成上下文相关的表示。
输出
-
- 每个 Token 的最终表示是一个固定长度的向量(如 768 维),捕捉了该 Token 的语义和上下文信息。
Token Embedding 的组成
在模型(如 BERT)中,Token Embedding 通常由以下三部分组成:
Token Embedding(词嵌入)
-
- 表示 Token 的基本语义信息,来源于嵌入矩阵。
- 例如:"love" -> [0.1, 0.4, 0.7, ...]
Position Embedding(位置嵌入)
-
- 表示 Token 在句子中的位置,帮助模型捕捉句子顺序信息。
- 例如:Token "love" 在句子中的第 2 位,其位置嵌入可能为 [0.03, 0.05, ...]。
Segment Embedding(片段嵌入)
-
- 表示句子对的句子标记,用于区分句子对的 Token(例如 NLI 任务中的两个句子)。
- 如果 Token 属于句子 1,其嵌入可能为 [0.1, 0.0, ...],属于句子 2 则可能为 [0.0, 0.1, ...]。
最终的 Token 表示是这三部分嵌入的加和:
Token Representation = Token Embedding + Position Embedding + Segment Embedding
Token Embeddings 的特点
固定维度:每个 Token 的嵌入向量有相同的长度(如 768 维)。
上下文相关:在预训练模型(如 BERT、GPT)中,Token Embeddings 会通过 Transformer 的自注意力机制更新,生成上下文感知的表示。
初始化:嵌入矩阵的初始权重通常随机生成,模型通过训练逐渐学习语义关系。
Token Embeddings 示例
示例:生成 Token Embeddings
以下代码示例展示了如何使用 Transformers 库生成 Token Embeddings:
from transformers import AutoTokenizer, AutoModelimport torch
# 加载预训练模型和分词器
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
# 输入文本
text = "I love coding"
# 分词并转换为张量
inputs = tokenizer(text, return_tensors="pt", add_special_tokens=True)
# 获取 Token Embeddings
outputs = model(**inputs)
token_embeddings = outputs.last_hidden_state
print("Token Embeddings Shape:", token_embeddings.shape)
输出:
- 如果输入句子长度为 5(包括特殊标记),嵌入维度为 768,结果形状为 (1, 5, 768)。
示例分词结果:
plaintext
复制代码
输入句子: "I love coding"
分词结果: ['[CLS]', 'i', 'love', 'coding', '[SEP]']
嵌入结果: 每个 Token 对应一个 768 维向量
Token Embeddings 的应用场景
语义理解:Token Embeddings 提供了语义丰富的表示,是各种 NLP 任务(如情感分析、机器翻译、语义相似度计算)的基础。
文本分类:通过对 Token Embeddings 聚合(如池化),生成句子或文档级别的表示。
问答系统:用于生成问题和答案的嵌入,以匹配用户查询。
信息检索:Token Embeddings 可以帮助构建高效的语义检索系统。
总结
Token Embeddings 是现代 NLP 模型中的重要组成部分,通过将离散文本(Token)转换为连续向量,为语义表示奠定了基础。在像 BERT、SBERT、GPT 等模型中,Token Embeddings 不仅捕捉了词元的语义信息,还结合了上下文关系,从而广泛应用于各类 NLP 任务。