3. 词元嵌入
Tip
学习和实践 AWS 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
词元嵌入
在对文本数据进行 tokenization 之后,为像 GPT 这样的大型语言模型 (LLMs) 准备训练数据的下一个关键步骤是创建 词元嵌入。词元嵌入将离散的 token(例如单词或子词)转换为模型可以处理和学习的连续数值向量。下面的解释分解了词元嵌入、它们的初始化、使用方式,以及位置嵌入在增强模型对 token 序列理解中的作用。
Tip
第三阶段的目标非常简单:为词汇表中每个先前的 token 分配一个用于训练模型的目标维度向量。 词汇表中的每个单词将在一个 X 维空间中对应一个点。
注意,最初这些单词在空间中的位置只是“随机”初始化的,这些位置是可训练的参数(会在训练过程中被优化)。此外,在词元嵌入过程中会创建另一层嵌入,用于表示(在本例中)单词在训练句子中的绝对位置。这样,处于句子不同位置的同一单词将有不同的表示(含义)。
什么是词元嵌入?
词元嵌入是在连续向量空间中对 token 的数值表示。词汇表中的每个 token 都关联一个固定维度的独特向量。这些向量捕捉了 token 的语义和句法信息,使模型能够理解数据中的关系和模式。
- Vocabulary Size: 模型词汇表中唯一 token 的总数(例如单词、子词)。
- Embedding Dimensions: 每个 token 向量中的数值个数(维度)。更高的维度可以捕捉更细致的信息,但需要更多计算资源。
示例:
- Vocabulary Size: 6 tokens [1, 2, 3, 4, 5, 6]
- Embedding Dimensions: 3 (x, y, z)
初始化词元嵌入
在训练开始时,词元嵌入通常用小的随机值初始化。这些初始值会在训练过程中被调整(微调),以根据训练数据更好地表示 token 的含义。
PyTorch 示例:
import torch
# Set a random seed for reproducibility
torch.manual_seed(123)
# Create an embedding layer with 6 tokens and 3 dimensions
embedding_layer = torch.nn.Embedding(6, 3)
# Display the initial weights (embeddings)
print(embedding_layer.weight)
输出:
luaCopy codeParameter containing:
tensor([[ 0.3374, -0.1778, -0.1690],
[ 0.9178, 1.5810, 1.3010],
[ 1.2753, -0.2010, -0.1606],
[-0.4015, 0.9666, -1.1481],
[-1.1589, 0.3255, -0.6315],
[-2.8400, -0.7849, -1.4096]], requires_grad=True)
说明:
- 每一行对应词汇表中的一个 token。
- 每一列表示嵌入向量的一个维度。
- 例如,索引为
3的 token 的嵌入向量为[-0.4015, 0.9666, -1.1481]。
访问 token 的嵌入:
# Retrieve the embedding for the token at index 3
token_index = torch.tensor([3])
print(embedding_layer(token_index))
我没有收到要翻译的文件内容。请粘贴 src/AI/AI-llm-architecture/3.-token-embeddings.md 的内容,我会按要求将相关英文翻译成中文,并严格保留原有的 Markdown/HTML 语法、标签、链接和路径。
tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=<EmbeddingBackward0>)
解释:
- 索引为
3的 token 由向量[-0.4015, 0.9666, -1.1481]表示。 - 这些值是可训练的参数,模型会在训练中调整它们,以更好地表示该 token 的上下文和含义。
Token Embeddings 在训练期间的工作原理
在训练期间,输入数据中的每个 token 都会被转换为其对应的嵌入向量。然后在模型内部的各种计算中使用这些向量,例如注意力机制和神经网络层。
示例场景:
- 批次大小(Batch Size): 8(同时处理的样本数量)
- 最大序列长度(Max Sequence Length): 4(每个样本的 token 数)
- 嵌入维度(Embedding Dimensions): 256
数据结构:
- 每个 batch 表示为一个形状为
(batch_size, max_length, embedding_dim)的 3D 张量。 - 对于我们的示例,形状为
(8, 4, 256)。
可视化:
cssCopy codeBatch
┌─────────────┐
│ Sample 1 │
│ ┌─────┐ │
│ │Token│ → [x₁₁, x₁₂, ..., x₁₂₅₆]
│ │ 1 │ │
│ │... │ │
│ │Token│ │
│ │ 4 │ │
│ └─────┘ │
│ Sample 2 │
│ ┌─────┐ │
│ │Token│ → [x₂₁, x₂₂, ..., x₂₂₅₆]
│ │ 1 │ │
│ │... │ │
│ │Token│ │
│ │ 4 │ │
│ └─────┘ │
│ ... │
│ Sample 8 │
│ ┌─────┐ │
│ │Token│ → [x₈₁, x₈₂, ..., x₈₂₅₆]
│ │ 1 │ │
│ │... │ │
│ │Token│ │
│ │ 4 │ │
│ └─────┘ │
└─────────────┘
解释:
- 序列中的每个 token 用一个 256 维向量表示。
- 模型处理这些嵌入以学习语言模式并生成预测。
位置嵌入:为 token 嵌入添加上下文
虽然 token 嵌入捕捉了单个 token 的含义,但它们并不固有地编码 token 在序列中的位置。理解 token 的顺序对于语言理解至关重要。这正是 位置嵌入 发挥作用的地方。
为什么需要位置嵌入:
- Token 顺序很重要: 在句子中,含义通常依赖于单词的顺序。例如,“The cat sat on the mat” vs. “The mat sat on the cat.”
- 嵌入的局限性: 没有位置信息时,模型会把 tokens 当作“词袋”处理,忽略它们的顺序。
位置嵌入的类型:
- 绝对位置嵌入:
- 为序列中的每个位置分配一个唯一的位置向量。
- 示例: 任意序列中的第一个 token 具有相同的位置嵌入,第二个 token 有另一个,依此类推。
- 用于: OpenAI 的 GPT 模型。
- 相对位置嵌入:
- 编码 tokens 之间的相对距离,而不是它们的绝对位置。
- 示例: 表示两个 token 相隔多远,而不考虑它们在序列中的绝对位置。
- 用于: 像 Transformer-XL 和某些 BERT 变体的模型。
位置嵌入如何整合:
- 相同维度: 位置嵌入与 token 嵌入具有相同的维度。
- 相加: 它们与 token 嵌入相加,将 token 身份与位置信息结合起来,而不增加整体维度。
添加位置嵌入的示例:
假设一个 token 嵌入向量为 [0.5, -0.2, 0.1] 且其位置嵌入向量为 [0.1, 0.3, -0.1]。模型使用的组合嵌入将是:
Combined Embedding = Token Embedding + Positional Embedding
= [0.5 + 0.1, -0.2 + 0.3, 0.1 + (-0.1)]
= [0.6, 0.1, 0.0]
位置嵌入的优点:
- 上下文感知: 模型能够根据标记的位置区分不同的标记。
- 序列理解: 使模型能够理解语法、句法和依赖上下文的含义。
现代 LLM 中的位置嵌入
Rotary Positional Embeddings (RoPE)
RoPE 通过对 query/key 向量中成对的维度应用位置相关的旋转来编码位置,将绝对位置转换为相对相位差。这样在保持嵌入维度不变的同时提供相对位置信息,并被广泛用于最近的 decoder-only LLMs。
有关 token 与位置嵌入在模型内部如何结合的内容,参见 the LLM architecture page。
在基于 RoPE 的模型中扩展上下文窗口
近期研究表明,上下文长度常常受限于位置编码方案,而不是 token 嵌入矩阵本身。
- Position Interpolation (PI): 重新缩放位置索引,使更长的序列映射到训练时看到的范围内,从而在仅需最小微调的情况下实现扩展。示例:
# Position Interpolation (PI) intuition
orig_ctx = 2048
new_ctx = 8192
scaled_pos = pos * (orig_ctx / new_ctx)
- YaRN: 一种计算高效的 RoPE 扩展策略,通过修改 RoPE 的缩放/插值来在更少的额外训练步骤下外推到更长的上下文。
代码示例
下面是来自 https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb 的代码示例:
# Use previous code...
# Create dimensional emdeddings
"""
BPE uses a vocabulary of 50257 words
Let's supose we want to use 256 dimensions (instead of the millions used by LLMs)
"""
vocab_size = 50257
output_dim = 256
token_embedding_layer = torch.nn.Embedding(vocab_size, output_dim)
## Generate the dataloader like before
max_length = 4
dataloader = create_dataloader_v1(
raw_text, batch_size=8, max_length=max_length,
stride=max_length, shuffle=False
)
data_iter = iter(dataloader)
inputs, targets = next(data_iter)
# Apply embeddings
token_embeddings = token_embedding_layer(inputs)
print(token_embeddings.shape)
torch.Size([8, 4, 256]) # 8 x 4 x 256
# Generate absolute embeddings
context_length = max_length
pos_embedding_layer = torch.nn.Embedding(context_length, output_dim)
pos_embeddings = pos_embedding_layer(torch.arange(max_length))
input_embeddings = token_embeddings + pos_embeddings
print(input_embeddings.shape) # torch.Size([8, 4, 256])
参考文献
Tip
学习和实践 AWS 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。


