第十四章:向量与Embedding
学习目标
- 理解标量和向量的基本概念
- 掌握Embedding的原理和作用
- 理解向量运算(加法、点积、余弦相似度)
- 能够使用Python计算向量相似度
- 了解Embedding可视化的基本方法
前置要求
建议先学习第二章:数学基础,了解基本的数学概念(如坐标系、距离等),有助于理解向量和向量运算。
标量(Scalar)
标量是一个单独的数值,只有大小没有方向。
例子
温度 36.5 度、年龄 25 岁、体重 65 公斤——这些都是标量,因为它们只有一个数值,没有方向。
向量(Vector)
向量是一组有序排列的数值,可以表示方向和大小。在AI中,向量是表示数据的核心方式。
例子
一个二维向量 \([3, 4]\) 可以表示平面上的一个点或方向;一个三维向量 \([1, 2, 3]\) 可以表示空间中的一个位置。在AI中,一个768维的向量可以表示一个词或一句话的语义。
Embedding——向量的AI应用
Embedding(嵌入/向量化)是将文字、图片等非数值数据转换为数值向量的过程。通过Embedding,AI可以将语义相似的内容映射到向量空间中相近的位置。
为什么用向量表示数据?
计算机只能处理数字,而现实世界的数据(文字、图片、音频)不是数字。Embedding将这些数据转换为向量后,计算机就能通过数学运算来理解和比较它们的语义关系。例如,"国王"和"女王"的向量在空间中会很接近,因为它们的语义相似。
向量运算
| 运算 | 公式 | 含义 | AI中的应用 |
|---|---|---|---|
| 向量加法 | \([a_1, a_2] + [b_1, b_2] = [a_1+b_1, a_2+b_2]\) | 两个向量的对应分量相加 | 合并语义信息 |
| 点积(Dot Product) | \(A \cdot B = a_1 b_1 + a_2 b_2 + \cdots\) | 衡量两个向量的相似程度 | 注意力机制的核心计算 |
| 余弦相似度 | \(\cos(\theta) = \frac{A \cdot B}{|A||B|}\) | 衡量方向的相似性(不受长度影响) | 文本相似度、推荐系统 |
常见的向量维度
| 模型/场景 | 向量维度 | 说明 |
|---|---|---|
| Word2Vec | 300 | 经典词向量模型 |
| BERT | 768 | 主流预训练语言模型 |
| GPT系列 | 768 - 12288 | 随模型规模增大 |
| OpenAI Embedding | 1536 / 3072 | text-embedding-3-small / large |
余弦相似度详解
余弦相似度是衡量两个向量方向相似性的指标,取值范围为 \([-1, 1]\):
- \(\cos(\theta) = 1\):两个向量方向完全相同(最相似)
- \(\cos(\theta) = 0\):两个向量正交(无关)
- \(\cos(\theta) = -1\):两个向量方向完全相反(最不相似)
数学公式:
\[ \cos(\theta) = \frac{A \cdot B}{|A| \times |B|} = \frac{\sum_{i=1}^{n} a_i \times b_i}{\sqrt{\sum_{i=1}^{n} a_i^2} \times \sqrt{\sum_{i=1}^{n} b_i^2}} \]其中 \(A \cdot B\) 是向量点积,\(|A|\) 和 \(|B|\) 是向量的模(长度)。
使用sentence-transformers计算相似度
from sentence_transformers import SentenceTransformer, util
# 加载预训练模型
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
# 定义文本
texts = [
"我喜欢吃苹果",
"我爱吃水果",
"今天天气很好",
"这辆车很快"
]
# 计算Embedding向量
embeddings = model.encode(texts)
# 计算余弦相似度
similarity_matrix = util.cos_sim(embeddings, embeddings)
# 打印相似度矩阵
for i in range(len(texts)):
for j in range(len(texts)):
if i < j: # 只打印上三角
score = similarity_matrix[i][j].item()
print(f"'{texts[i]}' vs '{texts[j]}': {score:.4f}")
# 输出示例:
# '我喜欢吃苹果' vs '我爱吃水果': 0.6532 (语义相近)
# '我喜欢吃苹果' vs '今天天气很好': 0.0231 (语义无关)
# '我喜欢吃苹果' vs '这辆车很快': -0.0512 (语义无关)
Embedding可视化
高维向量(如768维)无法直接可视化。常用的方法是通过降维技术将高维向量映射到2D或3D空间中展示:
- t-SNE(t-Distributed Stochastic Neighbor Embedding):非线性降维,擅长保持局部结构,适合可视化聚类
- PCA(Principal Component Analysis):线性降维,速度快,适合初步探索
- UMAP(Uniform Manifold Approximation and Projection):兼顾局部和全局结构,效果通常优于t-SNE
可视化效果
将大量文本的Embedding降维到2D后绘制散点图,你会看到:语义相似的文本(如关于"运动"的句子)会聚在一起形成簇,而语义不同的文本(如关于"科技"的句子)会分布在不同的区域。这种"语义空间"的可视化直观展示了Embedding如何捕捉语言含义。
本章小结
- 标量是单个数值,只有大小;向量是一组有序数值,可以表示方向和大小。在AI中,向量是表示数据的核心方式。
- Embedding将文字、图片等非数值数据转换为数值向量,使计算机能够通过数学运算理解和比较语义关系。
- 余弦相似度 \(\cos(\theta) = \frac{A \cdot B}{|A||B|}\) 是衡量向量方向相似性的重要指标,广泛用于文本相似度计算和推荐系统。
- sentence-transformers库提供了便捷的API来计算文本Embedding和相似度,是NLP开发中的常用工具。
- 通过t-SNE、PCA、UMAP等降维技术,可以将高维Embedding可视化到2D空间,直观展示语义聚类效果。
练习题
-
以下关于向量的说法,哪项是正确的?
A. 标量就是向量的一种特殊形式
B. 向量只有大小没有方向
C. 在AI中,向量可以用来表示文本的语义
D. 向量的维度越高,计算越简单答案:C。在AI中,Embedding将文本转换为高维向量,语义相似的文本在向量空间中距离较近。
-
余弦相似度的取值范围是什么?当两个向量方向完全相同时,余弦相似度是多少?
A. [0, 1],完全相同时为1
B. [-1, 1],完全相同时为1
C. [0, 1],完全相同时为0
D. [-1, 1],完全相同时为0答案:B。余弦相似度的取值范围是 \([-1, 1]\),方向完全相同为1,方向完全相反为-1,正交为0。
-
以下哪种降维技术最适合将高维Embedding可视化到2D空间?
A. One-Hot Encoding
B. t-SNE
C. Batch Normalization
D. Dropout答案:B。t-SNE是一种非线性降维技术,擅长将高维数据映射到低维空间进行可视化,能很好地保持数据的局部聚类结构。