1. Transformer Embedding 与向量表示:从原理到实战
在自然语言处理领域,Embedding(嵌入/向量表示)是将离散的文本数据转换为连续向量空间中的数值表示的核心技术。这种转换使得计算机能够"理解"语义信息,为后续的机器学习任务奠定基础。本文将深入探讨词向量的基本原理、位置编码的作用与演进、语义相似度计算方法,以及Embedding在RAG系统和向量数据库中的实际应用。
1.1 词向量:文本的数值化表示
1.1.1 为什么需要词向量?
计算机无法直接处理文字,只能处理数字。为了让机器"理解"文本的含义,我们需要将文字转换为数值形式。想象你要向一个只懂数学的外星人解释"苹果"和"香蕉"的关系。你不能说"它们都是水果",因为外星人不懂"水果"这个词。但你可以说:"苹果的坐标是(3,5,2),香蕉的坐标是(3.2,4.8,2.1),它们在空间中很近,说明它们相似。"这就是词向量的核心思想——用数字坐标表示词义。
1.1.2 从One-Hot到Word Embedding的演进
早期方案:One-Hot编码
最简单的文本数值化方式是One-Hot编码:
code复制词汇表:[苹果, 香蕉, 汽车, 飞机]
苹果 → [1, 0, 0, 0]
香蕉 → [0, 1, 0, 0]
汽车 → [0, 0, 1, 0]
飞机 → [0, 0, 0, 1]
One-Hot的致命缺陷:
- 维度灾难:词汇表有10万个词,每个词就是10万维的向量
- 语义缺失:"苹果"和"香蕉"的向量完全正交,无法体现"都是水果"的语义关系
- 稀疏表示:向量中绝大多数是0,计算效率低
Word Embedding的突破:
Word Embedding将每个词映射到一个低维稠密向量(通常100-1000维),并且语义相近的词在向量空间中距离更近。
1.1.3 Word Embedding的工作原理
核心思想:分布式假设
"一个词的含义由它的上下文决定。"——如果两个词经常出现在相似的上下文中,它们的语义就相近。
通俗理解:如果你在阅读时总是看到"猫追着老鼠跑""狗追着老鼠跑",即使你不知道"猫"和"狗"的具体含义,你也能推断它们有某种相似性——它们都能"追老鼠"。Word Embedding就是用数学方法捕捉这种"上下文相似性"。
Embedding层的数学表示:
Embedding层本质上是一个查找表(Lookup Table):
python复制# 假设词汇表大小V=10000,嵌入维度d=512
embedding_matrix = torch.randn(10000, 512) # 形状:(V, d)
# 查找词"苹果"的向量(假设索引为42)
apple_vector = embedding_matrix[42] # 形状:(512,)
1.1.4 词向量的语义特性
训练好的词向量具备以下语义特性:
语义相似性
语义相近的词在向量空间中距离更近:
code复制cos_similarity(苹果, 香蕉) ≈ 0.85 # 都是水果
cos_similarity(苹果, 汽车) ≈ 0.12 # 毫无关联
语义类比(向量运算)
著名的"国王 - 男人 + 女人 ≈ 女王":
code复制vector(国王) - vector(男人) + vector(女人) ≈ vector(女王)
这说明词向量捕捉到了"性别"这个维度。"国王"减去"男性特征"再加上"女性特征",得到的向量最接近"女王"。
1.2 位置编码:让模型理解词序
1.2.1 为什么需要位置信息?
Transformer的Self-Attention机制有一个关键问题:它对词的顺序是"盲"的。对于Self-Attention来说,"狗咬人"和"人咬狗"是一样的——都是"狗""咬""人"三个词的集合。但这两句话的意思完全相反!所以必须给模型注入位置信息。
1.2.2 绝对位置编码:正弦余弦位置编码
原始Transformer论文使用正弦/余弦函数生成位置编码:
公式:
code复制PE(pos,
