英语与AI中的嵌入详解 | AI生成和翻译
问题: 在一般英语中,“embedding”是什么意思?在LLM语境下它有何不同?
答案
一般英语
嵌入(embedding)= 将某物牢固地放置或固定在另一物内部。“那名记者与军事单位一起驻扎。”该物现在成为更大结构的一部分。
在LLM/AI语境下
嵌入(embedding)= 离散数据(文本、标记、图像)在连续空间中的密集向量表示,由模型学习以捕捉语义含义。
从基本原理出发:
当你将一个标记(词/子词)输入LLM时,你无法对离散符号进行数学运算。因此,你将其转换为一个向量——一组数字列表。这种转换是在训练过程中学习的。含义相似的标记在向量空间中彼此靠近。
数学表示:
token "king" → embedding vector e_king ∈ ℝ^d
其中 d = 嵌入维度(例如,BERT为768,Llama为4096)
e_king ≈ [0.12, -0.45, 0.78, ..., 0.34] # 768个浮点数
著名的性质:
e_king - e_man + e_woman ≈ e_queen
这之所以成立,是因为向量空间编码了语义关系。
实际代码中的体现
import torch
import torch.nn as nn
# 标记嵌入层——每个LLM都会使用
vocab_size = 50_000
embed_dim = 768
embedding = nn.Embedding(vocab_size, embed_dim)
# 输入:标记ID [batch_size, seq_len]
token_ids = torch.tensor([[1, 45, 234]])
# 输出:密集向量 [batch_size, seq_len, embed_dim]
embedded = embedding(token_ids) # 形状:(1, 3, 768)
print(embedded.shape)
print(embedded[0, 0, :10]) # 第一个标记的前10个维度
这个embedding矩阵(50k × 768)是在训练过程中学习的。每一行都是该标记的嵌入向量。
为何这对你的工作很重要
-
标记级操作: LLM中的一切都从这里开始。注意力机制作用于嵌入向量,而非标记本身。你不能对离散符号做点积运算。
-
检索与搜索: 当构建RAG系统时,你将文档嵌入到这个向量空间中,并通过余弦相似度找到近邻。这就是DeepSeek及其他模型对外提供嵌入API的原因。
-
微调效率: LoRA作用于下游的权重矩阵,但理解嵌入有助于你看到语义信息首先在哪里被压缩。
-
推理优化: KV缓存存储的是嵌入向量(经过注意力投影之后),而非原始标记。理解这一层有助于你推理内存/计算之间的权衡。
-
模型内部机制: 嵌入层是离散(标记)与连续(数学)之间的门户。走一遍前向传播,这就是第一次变换。
快速直观理解
可以这样思考:
- 离散标记:
"king"(符号,无法对它进行微积分运算) - 嵌入向量:
[0.12, -0.45, 0.78, ...](语义空间中的向量,现在可以度量距离、应用线性变换等) - 后续层: 应用注意力、MLP、层归一化——所有这些都是在嵌入向量上的矩阵运算。
整个模型不过是在嵌入向量之上进行学习变换。正确理解这一层,语义信息就会流经整个网络。