维数统计独立方向的数量
区分嵌入坐标数与样本数,并了解为什么仅凭矩阵形状无法判断其中的向量张成了多少个独立方向。
一个嵌入批次可以有四行,每行包含数百个坐标。第一个数字表示编码了多少个输入;第二个数字表示每个输出的坐标宽度。单独看这两个数字,都无法说明观测到的向量实际使用了多少个独立方向。
本课将分别解读这些计数,将维数与基中的向量数量联系起来,并说明为什么形状相同的两个数组可以张成维数不同的空间。阅读嵌入 API、估算一个批次能提供多少信息,或描述某种表示而不把已存储的样本与容纳它们的空间混为一谈时,这一区别很重要。
上一课介绍了基如何为每个向量提供坐标描述。第 31 课:基提供紧凑的坐标系确立了这里所需的关键概念:基能够张成一个空间,且没有冗余方向。Mathematics for Machine Learning 官方配套网站在书籍 PDF第 2.6 节中讲解了维数。本课的小型数据集、代码、可视化和评估题均为原创。
基通过计数定义维数
回顾一下,基是由线性无关向量组成、能够张成一个向量空间的集合。如果空间 中的每个向量都能用基 来描述,那么 的维数就是该基所含向量的数量:
记号 表示“集合 中元素的数量”,并不统计写出某个基向量时所用的分量个数。有限维空间的每组基都含有相同数量的向量,尽管具体的基向量可以不同。正是这个数量使维数成为空间本身的性质,而不是某一种特定坐标系的性质。
上面的每个向量都含有三个坐标,但这不是维数的定义。决定维数的是这三个向量构成了一组基:它们共同生成 中的每个向量,并且其中任何一个都不是另外两个的线性组合。另一组基可以指向不同的方向,但仍然恰好含有三个向量。
四个样本仍然可以位于三维空间
假设编码器在 中返回四个向量:
将每个向量作为矩阵的一行存储:
它的形状是 :四行三列。这里,每行表示一个样本,每列保存该样本的三个坐标。前三行是标准基,因此四个样本张成整个 。第四行增加了一个样本,却没有增加新的独立方向,因为 。向量空间的维数是三;批次包含四个示例。
现在对比这个批次:
它的形状相同,也是 ,但每一行都是 的倍数。一个向量 就能张成全部四个样本,因此它们的张成空间是一条一维直线。环境坐标空间仍是 ;这些特定样本只占据其中一个一维子空间。
嵌入维数与批次形状
同为四乘三的形状,可以张成三个方向,也可以只张成一个
两个批次都包含四个样本,每个样本有三个坐标。坐标表给出精确数值;示意图则概括各行使用了多少个独立方向。
三个独立方向
形状:4 个样本 × 3 个坐标
| 样本 | 坐标 1 | 坐标 2 | 坐标 3 |
|---|---|---|---|
| x₁ | 1 | 0 | 0 |
| x₂ | 0 | 1 | 0 |
| x₃ | 0 | 0 | 1 |
| x₄ | 1 | 1 | 1 |
样本张成空间的维数3 个方向
一个独立方向
形状:4 个样本 × 3 个坐标
| 样本 | 坐标 1 | 坐标 2 | 坐标 3 |
|---|---|---|---|
| x₁ | 1 | 0 | 0 |
| x₂ | 2 | 0 | 0 |
| x₃ | −1 | 0 | 0 |
| x₄ | 3 | 0 | 0 |
样本张成空间的维数1 个方向
行数统计输入,列数统计已存储的坐标,基向量数统计独立方向。表格给出精确数据;方向小图仅为示意。
形状说明数组的存储方式,却无法揭示各行是否线性无关;张成空间的维数由数值及其关系决定。
这幅图将三个问题分开:编码了多少个输入、每个输出含有多少个坐标,以及这些具体输出张成了多少个方向。两个数组形状相同,但只有第一个批次覆盖了 中的所有方向。
NumPy 报告形状,而不是基
NumPy 的 ndarray.shape 属性是一个元组,其中包含数组每个轴的长度。对于一个按 行存储、每行含有 个坐标的二维矩阵,该元组为 (N, d)。形状告诉我们数值是如何排列的。要确定张成空间的维数,我们还需要判断某些行是否能由其他行构造出来。
下面是直接用 NumPy 编写的合成示例:
import numpy as np
full = np.array([
[1.0, 0.0, 0.0],
[0.0, 1.0, 0.0],
[0.0, 0.0, 1.0],
[1.0, 1.0, 1.0],
])
line = np.array([
[1.0, 0.0, 0.0],
[2.0, 0.0, 0.0],
[-1.0, 0.0, 0.0],
[3.0, 0.0, 0.0],
])
print(full.shape, line.shape)
print(np.allclose(full[3], full[0] + full[1] + full[2]))
print(np.allclose(
line,
np.array([1.0, 2.0, -1.0, 3.0])[:, None]
* np.array([1.0, 0.0, 0.0]),
))
输出为:
(4, 3) (4, 3)
True
True
第一行确认两个矩阵都有四行,且每行包含三个坐标。第一个 True 验证了 full 的最后一个样本等于三个基向量行之和。第二个结果验证了 line 的每个样本都是 的相应标量倍数。这些关系解释了它们的张成空间维数:full 为三,line 为一。
NumPy 形状文档将形状定义为数组各轴长度组成的元组。这只是存储描述,并不保证所有坐标都彼此独立地变化。快速查看 len(full.shape) 会得到二,因为 full 有两个数组轴。这个数字也不同于其嵌入空间的三维。
批次轴不是嵌入轴
真实 AI 代码中也会遇到这种区别。Sentence Transformers 使用文档用 all-MiniLM-L6-v2 编码三个句子,并报告嵌入数组的形状为 [3, 384]。第一个长度对应提供的三个句子;第二个长度表示输出坐标宽度。模型 API 提供 get_embedding_dimension() 以获取输出宽度,而其 encode 方法会为给定输入返回嵌入。
如果使用同一个编码器存储一百万篇文档,语料库可以有一百万行,而每行仍然只有 384 个数字。扩大语料库会增加向量数量,却不会让嵌入空间变成一百万维。反过来, 中的四个输出不可能张成全部 384 维,因为四个向量最多只能提供四个独立方向。如果一些输出方向重复,或是其他向量的线性组合,它们实际张成的维数还可能更少。
还要注意另一个边界:输出宽度描述的是所选模型及其配置,并非文本的普遍属性。Sentence Transformers 允许在 encode 中设置输出截断维数;改变此配置后,返回结果的坐标宽度也会改变。encode API说明了 truncate_dim 选项。比较向量时仍需确保它们处于兼容的坐标空间中。仅仅维数更大,并不保证嵌入保留了更多有用含义;要确认这一点,必须针对预定任务评估这种表示。
维数统计基中的独立方向。形状统计数组轴的长度,批次统计样本数量。将这些量分别理解后,下一个问题就更容易提出:实际各行包含多少个独立方向?第 33 课将介绍矩阵秩,以便系统地统计这种有效维数。
检查你的理解
问题 1
一个向量空间的基 B 含有五个向量。这个空间的维数是多少?为什么一个基向量内部写出的坐标数量不能定义它?
显示分步解答
这个空间的维数是五,因为维数定义为基中向量的数量:。坐标列表描述的是某个向量相对于坐标系的表示。列表中的分量不是 中彼此独立的基向量,因此统计分量回答的是另一个问题。
问题 2
编码器返回形状为 (7, 12) 的数组,其中每行是一个嵌入。共有多少个样本?每个嵌入含有多少个坐标?环境坐标空间的维数是多少?
显示分步解答
形状的第一个数表示有七行,因此共有七个样本。第二个数表示每行含有十二个坐标。如果这些是编码器输出坐标中的普通稠密向量,那么环境空间为 ,其维数是 12。七个样本不会改变该坐标空间的维数。
问题 3
给定 x₁ = (1, 0, 0)、x₂ = (0, 1, 0)、x₃ = (0, 0, 1) 和 x₄ = (1, 1, 1),共有多少个样本?它们张成的空间维数是多少?请写出你使用的依赖关系。
显示分步解答
共有四个样本。前三个是 的标准基向量,因此它们线性无关,并张成三维空间。第四个满足 ,所以它没有增加新的方向。它们的张成空间维数是三,而不是四。
问题 4
四行数据的形式都是 (c, 0, 0),其中 c 分别为 1、2、−1 和 3。它们的张成空间维数是多少?你可以给出什么基?
显示分步解答
每一行都等于 。因此,所有向量都位于直线 上。非零向量 张成这条直线,单元素集合 就是一组基。该张成空间的维数为一。
问题 5
两个数据矩阵的形状都是 (4, 3)。它们的行张成空间可以有不同的维数吗?请用本课的两个例子具体说明。
显示分步解答
可以。在 full 中,前三行是三个标准基向量,因此它们张成 ,行张成空间的维数为三。在 line 中,四行都是 的倍数,所以它们张成一条直线,维数为一。形状记录行数和列数,却不记录行值之间的线性关系。
问题 6
若 N 个向量位于 ℝᵈ 中,请解释为什么它们张成空间的维数 r 不能超过 N,也不能超过 d。
显示分步解答
这 个向量本身就是其张成空间的一组生成集。移除冗余向量后,最多留下 个线性无关的基向量,因此 。此外,该张成空间是 的子空间,而 的维数为 ,因此 。综合两个上界可得 。
问题 7
Sentence Transformers 文档给出了三个已编码句子的输出形状 [3, 384]。哪个数字表示样本数,哪个数字表示嵌入宽度?这三个输出能张成整个 ℝ³⁸⁴ 吗?请解释。
显示分步解答
这里有三个句子样本,每个输出向量有 384 个坐标。环境嵌入空间是 。三个向量最多只能张成三个独立方向,所以无法张成全部 384 维。如果部分输出线性相关,它们张成的维数还可能小于三。
问题 8
NumPy 数组 X 的形状为 (5, 9)。为什么 len(X.shape) 等于 2,却不表示嵌入的维数是 2?
显示分步解答
X.shape
对数组的每个轴都包含一个数:五行和九列。因此该数组有两个轴,
len(X.shape)
统计的就是这两个轴。如果每行是含有九个坐标的嵌入,那么环境嵌入空间为 ,维数是九。数组轴数与向量空间的基方向数是不同的计数。