第十四章:向量与Embedding

学习目标

  • 理解标量和向量的基本概念
  • 掌握Embedding的原理和作用
  • 理解向量运算(加法、点积、余弦相似度)
  • 能够使用Python计算向量相似度
  • 了解Embedding可视化的基本方法

前置要求

建议先学习第二章:数学基础,了解基本的数学概念(如坐标系、距离等),有助于理解向量和向量运算。

标量(Scalar)

标量是一个单独的数值,只有大小没有方向。

例子

温度 36.5 度、年龄 25 岁、体重 65 公斤——这些都是标量,因为它们只有一个数值,没有方向。

向量(Vector)

向量是一组有序排列的数值,可以表示方向和大小。在AI中,向量是表示数据的核心方式。

例子

一个二维向量 \([3, 4]\) 可以表示平面上的一个点或方向;一个三维向量 \([1, 2, 3]\) 可以表示空间中的一个位置。在AI中,一个768维的向量可以表示一个词或一句话的语义。

Embedding——向量的AI应用

Embedding(嵌入/向量化)是将文字、图片等非数值数据转换为数值向量的过程。通过Embedding,AI可以将语义相似的内容映射到向量空间中相近的位置。

词向量 Embedding 空间可视化
图14-1 词向量空间可视化:语义相近的词(如"国王"与"女王")在向量空间中距离较近,通过余弦相似度可量化语义关系

为什么用向量表示数据?

计算机只能处理数字,而现实世界的数据(文字、图片、音频)不是数字。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如何捕捉语言含义。

本章小结

  1. 标量是单个数值,只有大小;向量是一组有序数值,可以表示方向和大小。在AI中,向量是表示数据的核心方式。
  2. Embedding将文字、图片等非数值数据转换为数值向量,使计算机能够通过数学运算理解和比较语义关系。
  3. 余弦相似度 \(\cos(\theta) = \frac{A \cdot B}{|A||B|}\) 是衡量向量方向相似性的重要指标,广泛用于文本相似度计算和推荐系统。
  4. sentence-transformers库提供了便捷的API来计算文本Embedding和相似度,是NLP开发中的常用工具。
  5. 通过t-SNE、PCA、UMAP等降维技术,可以将高维Embedding可视化到2D空间,直观展示语义聚类效果。

练习题

  1. 以下关于向量的说法,哪项是正确的?

    A. 标量就是向量的一种特殊形式
    B. 向量只有大小没有方向
    C. 在AI中,向量可以用来表示文本的语义
    D. 向量的维度越高,计算越简单

    答案:C。在AI中,Embedding将文本转换为高维向量,语义相似的文本在向量空间中距离较近。

  2. 余弦相似度的取值范围是什么?当两个向量方向完全相同时,余弦相似度是多少?

    A. [0, 1],完全相同时为1
    B. [-1, 1],完全相同时为1
    C. [0, 1],完全相同时为0
    D. [-1, 1],完全相同时为0

    答案:B。余弦相似度的取值范围是 \([-1, 1]\),方向完全相同为1,方向完全相反为-1,正交为0。

  3. 以下哪种降维技术最适合将高维Embedding可视化到2D空间?

    A. One-Hot Encoding
    B. t-SNE
    C. Batch Normalization
    D. Dropout

    答案:B。t-SNE是一种非线性降维技术,擅长将高维数据映射到低维空间进行可视化,能很好地保持数据的局部聚类结构。