向量空间:检验 AI 表示是否满足规则
检验零向量、加法封闭性和数乘封闭性,再用归一化嵌入作为反例,说明有用的表示集合为何不一定是向量空间。
嵌入流程可以将每个非零输出向量强制归一化为长度 。这让相似度计算更方便,却也带来一个容易忽略的问题:在普通向量加法和数乘下,这些归一化后的输出并不构成向量空间。把两个输出相加,或改变一个向量的倍数,结果都可能离开允许的集合。
本课将“向量空间”变成一套检验方法,而不是一个标签。学完后,你将能够检查零向量、加法封闭性和数乘封闭性;在某条规则不成立时构造一个决定性反例;并解释为何归一化嵌入位于一个环境向量空间中,却不能自身构成向量空间。
**学习目标:**检验一个集合是否满足向量空间的封闭性规则。
第 17 课:线性组合生成新向量介绍了运算 。 第 26 课:群、环与域说明有效运算说明了为何必须结合集合及其运算来考虑。官方 Mathematics for Machine Learning 图书第 2.4 节将这些内容形式化为向量空间。下文的检验、嵌入反例、代码、图示和练习均为原创。
向量空间保证线性组合仍属于该集合
设 是一个集合,其元素称为向量。对于实向量空间,有两种运算:
第一种运算将两个向量相加。第二种运算将向量乘以实数,也称为标量。箭头以 为终点表示封闭性:两种运算的结果都必须仍是同一集合的成员。
仅有封闭性并不足以构成完整定义。向量加法还必须有零向量和加法逆元;加法必须满足结合律和交换律;数乘必须满足相应的结合律;并且还要满足熟悉的分配律和单位元规则。
关于每一个标量的规则要求很高。一个集合即使能承受乘以 ,却不能承受乘以 ;或能承受正标量,却不能承受乘以 ,都不是实向量空间。
继承的运算可简化检验
大多数实际问题从候选集合 开始,并使用 中已定义的普通加法和数乘。代数定律由环境空间继承。剩下的工作就是判断运算结果是否会离开 。
使用这项检验时有一个重要的不对称之处:
- 要证明 是向量空间,封闭性论证必须涵盖每个允许的输入。
- 要证明 不是向量空间,一个有效反例就足够。
检查三个方便的向量无法证明普遍封闭性。只要找到一对向量,其和离开了集合,就能立即否定封闭性。
例题:在组合运算下仍成立的约束
考虑集合
中的每个向量都具有 的形式。取 可知零向量属于 。现在任取向量
以及任意标量 。
数值检验时,取 , , , and :
这个计算展示了规则,而符号论证则证明该规则对所有取值都成立。
归一化嵌入未通过同一检验
现在定义单位长度集合
这是环境向量空间 中的单位球面。嵌入库可能会有意返回该集合中的向量。例如,当前 Sentence Transformers 的 encode 文档介绍了 normalize_embeddings 选项,它会将返回向量归一化为长度 。
在二维空间中,取
二者的欧几里得范数均为 ,因此都属于 。它们的和为
由于 ,该和不属于 。数乘封闭性也不成立:
零向量构成第三个失败例子,因为它的范数是 ,而不是 。
静态封闭性反例
单位圆不接受普通线性组合
蓝色圆包含所有欧几里得范数为 1 的二维向量。实线和虚线单位向量起初位于集合内,而它们的和、加倍后的向量以及零向量均不满足成员资格。
| 封闭性检验 | S 中的输入 | 结果 | 结果范数 | 判定 |
|---|---|---|---|---|
| 加法 | e₁ 和 e₂ | e₁ + e₂ = (1, 1) | √2 | 位于 S 之外 |
| 数乘 | 2 和 e₁ | 2e₁ = (2, 0) | 2 | 位于 S 之外 |
| 零向量 | 所需的加法单位元 | 0 = (0, 0) | 0 | 不属于 S |
任意一行都足以否定向量空间成员资格。这三行分别揭示不同要求,因此修复一种失败并不能消除其他失败。
La ilustración usa porque la geometría cabe en una página. El mismo contraejemplo escalar funciona en cualquier dimensión: si , entonces . Por tanto, los embeddings normalizados a longitud unitaria en no son un espacio vectorial con las operaciones habituales.
再次归一化会改变运算
常见流程会先将归一化嵌入相加或求平均,然后再次归一化结果。这种做法可能有用,但最后的归一化是一个新的非线性运算:
前提是分母不为零。未经处理的和会先离开单位球面,再由归一化映射回来。将结果映回 并不能使 对原始加法运算封闭。
零向量的情况很重要。如果 , then ,再除以它的范数就会导致除以零。实现时需要为零行或接近零的行制定明确策略。
NumPy 的 linalg.norm 文档说明了下方使用的 axis 和 keepdims 控制项,用于为每个嵌入计算一个范数,同时保留可广播的列形状:
import numpy as np
def normalize_rows(vectors):
vectors = np.asarray(vectors, dtype=float)
norms = np.linalg.norm(vectors, axis=1, keepdims=True)
normalized = np.divide(
vectors,
norms,
out=np.zeros_like(vectors),
where=norms > 0,
)
return normalized
embeddings = np.array([
[3.0, 4.0],
[-4.0, 3.0],
[0.0, 0.0],
])
normalized = normalize_rows(embeddings)
print(normalized)
print(np.linalg.norm(normalized, axis=1))
输出为
[[ 0.6 0.8]
[-0.8 0.6]
[ 0. 0. ]]
[1. 1. 0.]
前两行落在单位圆上。零行仍为零,因为该函数有意将零作为工程上的回退值。这个回退值属于 ,但不属于 ,因此调用方不能声称每个输出的范数都是单位长度。
可靠的封闭性检查应关注实际运算
当模型说明将一组表示称为“空间”时,先识别集合及其运算,再假设是否具有线性结构。原始嵌入可能位于 中。单位归一化嵌入位于球面上。坐标非负且总和为 的概率向量位于另一受约束的集合中。每种集合都可能支持有用的算法,但普通加法和任意实数数乘不一定会让结果继续满足约束。
下一课将学习子空间:它们是通过封闭性检验、因而保留环境线性结构的受限子集。继续学习前,请用下列问题练习证明普遍封闭性并找出决定性失败。
检查你的理解
问题 1
对于配备普通向量运算的 Rⁿ 非空子集,需要进行哪三项成员资格检查才能确认它是向量空间?
显示分步解答
首先检查零向量是否属于该集合。其次,任取集合中的 和 ,证明 仍属于集合。第三,任取实标量 和集合中的 ,证明 仍属于集合。其余向量空间定律由 继承。
问题 2
证明 U = {(t, −t): t ∈ R} 对线性组合 a u + b v 封闭。
显示分步解答
在 中任取 和 ,并取任意实数 和 。于是
令 。结果为 ,符合 的定义形式。由于输入和标量都是任意的,这就证明了封闭性,而不是只检查一个例子。
问题 3
使用 e₁ = (1, 0) 和 e₂ = (0, 1) 反驳单位归一化向量的加法封闭性。
显示分步解答
两个输入的范数都是 ,因此都属于单位归一化集合。它们的和是 ,其范数为 ,并非 。因此,两个合法成员产生了集合之外的结果。这样一对向量就足以否定加法封闭性。
问题 4
将每个单位向量乘以 −1 能否反驳数乘封闭性?如果不能,请选一个可以反驳的标量。
显示分步解答
不能。如果 ,则 ,所以标量 会让每个单位向量仍在球面上。但数乘封闭性必须对每个实数标量都成立。取 时,,因此 位于单位球面之外,从而反驳封闭性。
问题 5
为什么按行归一化必须明确处理零向量?
显示分步解答
常用公式将 除以 。当 时,范数为 ,因此公式会要求除以零,结果没有定义。代码必须检测这种情况,并选择有文档说明的策略,例如返回零、抛出错误或过滤该行。在某些流程中返回零很实用,但结果并非单位归一化向量。
问题 6
某流程对两个单位嵌入求平均,再将平均值归一化。为什么这不能证明单位球面是向量空间?
显示分步解答
首先计算普通平均值:。它的范数不一定是 ,因此这个线性组合可能离开球面。随后流程再应用单独的归一化映射 返回球面。封闭性检验针对原始加法和数乘;增加修正步骤会改变所研究的运算。
问题 7
非负象限 Q = {(x₁, x₂): x₁ ≥ 0 且 x₂ ≥ 0} 包含零向量,且对加法封闭。Q 是实向量空间吗?
显示分步解答
不是。取属于 的 ,并取实标量 。于是 ,其第一个坐标为负数,因此结果不属于 。尽管该集合包含零向量且对加法封闭,它仍未通过数乘封闭性检验。