群、环和域:为什么 AI 运算需要规则
了解封闭性、逆元和分配律如何决定哪些张量运算合法,然后使用 NumPy 检验这些思想。
AI 模型能够将两个向量相加、缩放一个权重矩阵,并将一个批次乘过一层,是因为这些张量中的数字遵守一组有用的规则。这些规则很容易被视为理所当然,但它们也正是线性推导可以在不改变含义的情况下重新排列的原因。
学习目标: 从直观层面区分封闭性、逆元和分配律假设,并用它们解释为什么常见的张量运算建立在实数域上。
前置课程是第 10 课:逐行阅读推导,在那里,第一个错误的代数步骤变成了调试线索。这里的问题稍微更早一步:哪些代数步骤一开始就是合法的?官方的 Mathematics for Machine Learning companion 将本课对应到书籍 PDF的第 2.4 节。下面的定义、例子、代码、视觉组件和 AI 解读均为原创内容。
运算前,先问结果属于哪里
运算不只是 或 这样的符号。它还会对输入和输出作出承诺。如果 是一个集合, 是一个运算,那么封闭性表示
这个箭头表示,两个 的成员作为输入,另一个 的成员作为输出。如果结果可以离开 ,那么原本从 开始的表达式就不再完全处于这个系统内部。
例如,非负整数
对加法是封闭的: 仍然是非负数。但它们对减法不封闭: 离开了这个集合。封闭性始终相对于某个具体运算而言;同一个集合可能对一种运算封闭、对另一种不封闭。
运算有效性图
每种结构都会增加一项保证
从左向右阅读:域保留环所展示的全部保证,并额外增加关于非零标量除法的一条规则。
| 结构 | 运算 | 保证 | 实际结果 |
|---|---|---|---|
| 群 | 一个运算,⊙ | 封闭性、结合律、单位元、逆元 | 可以在 ⊙ 下组合元素并撤销操作。 |
| 环 | 加法和乘法 | 加法构成群;乘法对加法满足分配律 | 可以展开并重新组合算术,但除法不是自动成立的。 |
| 域 | 加法和乘法 | 每个非零元素都有乘法逆元的环 | 线性组合中可以约去非零标量。 |
这张图简洁地展示了每个名称提供什么。它并不表示每个带有熟悉符号的集合都自动构成群、环或域。我们仍然必须检查相应的规则。
群让一个运算保持可导航
带加法的整数 构成一个群。单位元是 ,而 的逆元是 ,因为 。带加法的非负整数不构成群:它们有单位元,但 的逆元应为 ,而 不在 中。
带乘法的实数 也不是群,因为 没有乘法逆元。去掉零后, 是一个阿贝尔群:乘法满足结合律和交换律, 是单位元,并且每个非零实数都有倒数。
因此,逆元回答的是一个具体问题:能否在同一个集合内撤销这个运算?这对变换很有用,但一次只涉及一个运算。加法群并不会自动许可除法。
环增加第二个运算
环把加法和乘法放在一起。按照这里采用的约定,环具有乘法单位元 ,并遵守以下规则:
- 其元素在加法下构成阿贝尔群;
- 乘法是封闭且满足结合律的;
- 乘法对加法满足分配律:
整数 在通常的加法和乘法下是一个环。例如,乘法满足分配律,因为
并且
但 不是域。数字 在整数中没有乘法逆元:方程 要求 ,而它不是整数。环允许加法、乘法和分配;它不保证每个非零元素都能被除掉。
域让标量代数完整
域是一个交换环,其中每个非零元素都有乘法逆元。有理数 和实数 都是域,整数不是。
“域”说的是标量,而不是张量的形状。 中的向量有 个实坐标; 中的矩阵有 个实坐标。它们的元素来自一个域,尽管向量和矩阵本身是不同种类的对象。
当推导把标量移过求和,或除以一个非零系数时,这一区分很重要。在域中,这些变换有必需的代数支持;在环中,有些变换有效,有些可能无效。
工作示例:用小数字验证规则
使用两个小测试。首先,模 的加法具有元素 。 的结果在绕回后表示为 。单位元是 ,加法逆元是
这里上标表示模加法下的逆元。其次,检查线性层所依赖的一个实向量恒等式。令
那么
而
两条路径得到相同结果,是因为标量乘法对向量加法满足分配律。这个恒等式并不是这些特定数值的巧合;它是使 成为实数域 上向量空间的规则之一。
为什么张量运算假设一个域
大多数神经网络计算使用向量、矩阵和高维张量,它们的元素是实数的浮点近似。例如,一个稠密层的形式是
矩阵向量乘法展开为实标量的加法和乘法。随后加入偏置时,也使用同样的加法结构。因为标量被建模为 的元素,通常的重新分组和分配规则解释了为什么等价实现会得到相同的数学结果。
这也是形状检查和代数检查属于不同问题的原因:
- 形状兼容性: 和 的内维一致,因此每个点积都有正确数量的项。
- 标量有效性: 元素使用的算术系统具有预期的加法、乘法和标量组合规则。
PyTorch 让契约的这两个层面都清晰可见。张量携带 dtype、设备和布局,torch.matmul 会根据输入是向量、矩阵还是批量矩阵而改变行为;参见 Tensor Attributes 文档和 torch.matmul 参考。库的形状规则并不会取代域模型;它们实现的是一个具体张量运算,而该运算的标量算术通常被设定为近似实数算术。
这就是训练系统能够形成特征、权重和更新的线性组合的代数原因。微积分又增加一层:一个运算还必须可微,或具有定义好的次梯度或反向传播规则,自动微分才能使用它。域使前向算术保持一致,但不保证每个函数都可微。
边界情况:机器浮点数只是模仿实数域
在数学中,实数构成一个域。有限的计算机 dtype 是一个有界且经过舍入的位模式集合,因此不可能精确满足每条实数规则。由此会产生三个实际影响:
- 舍入: 像
0.1这样的值通常没有精确的二进制表示,因此两个数学上相等的路径可能在最后几位不同。 - 溢出: 两个很大的
float32值相乘可能产生inf,这个值超出了推导所使用的普通实数模型。 - 无效的异常算术:
inf - inf这样的表达式会产生nan,所以即使是熟悉的重排也需要数值检查。
这些并不是反驳 是域的定理的反例。它们提醒我们,float32 是 的近似,具有有限范围和由实现定义的舍入行为。在实践中,应使用合适的容差,监控非有限值,并把域规则视为实现所近似的数学契约。
数组代码中还有另一个常见混淆。在 NumPy 中,x * y 表示逐元素乘法,而 A @ x 表示矩阵乘法。两者都可能是有效运算,但数学含义和形状要求不同。成功的广播不能证明运算符合模型的预期代数。
模型代码的小型代数审计
当推导或张量表达式看起来可疑时,按以下顺序审计:
- 命名集合。 这些值是实数、整数、模剩余类、概率,还是别的对象?
- 命名每个运算。 区分加法、标量乘法、逐元素乘法和矩阵乘法。
- 检查封闭性。 每个结果是否仍处于预期集合和形状中?
- 检查所需保证。 是否使用了逆元、分配步骤或交换律交换?指出授权该步骤的规则。
- 检查机器行为。 查找舍入、溢出、
nan、inf以及依赖容差的比较。
这份审计把“公式应该有效”转化为可测试的声明。下一课将使用同样的思路,判断一组表示是否构成向量空间。在那里,对向量加法和标量乘法的封闭性会成为核心检验。
检查你的理解
问题 1
为什么封闭性总是相对于某个具体运算来表述?
显示分步解答
封闭性询问某个已命名运算的结果是否仍留在集合中。例如, 对加法封闭,因为 仍在集合中;但它对减法不封闭,因为 离开了集合。集合没有改变,改变的是运算。
问题 2
(N₀, +) 构成群吗?指出最先失效的群规则。
显示分步解答
这个集合对加法满足封闭性和结合律,并且有单位元 。问题在逆元规则: 在加法下的逆元是 ,但 。因此,即使其他几条群规则成立,这个结构也不是群。
问题 3
为什么在通常的加法和乘法下,Z 是环而不是域?
显示分步解答
首先, 是加法群:每个整数都有整数相反数,加法满足结合律并有单位元 。整数乘法封闭且满足结合律,有单位元 ,并且对加法满足分配律,因此环规则成立。域还要求每个非零整数都有整数倒数。由于 ,域的要求失败了。
问题 4
在模 5 的算术中,4 的乘法逆元是什么?如何验证?
显示分步解答
逐一测试非零剩余类,直到乘积同余于 。因为 且 ,所以 4 在模 5 下的逆元是 4。验证方法就是计算 ,再按模数化简结果。
问题 5
对于 x = [2, -1]ᵀ、y = [1, 3]ᵀ 和 λ = 1.5,计算 λ(x + y) 以及 λx + λy。
显示分步解答
先相加:。缩放得到 。分别计算时,,。把这两个向量相加同样得到 ,验证了这个例子中的分配律。
问题 6
NumPy 程序使用 A * x,而推导要求 A @ x。接受结果前应检查什么?
显示分步解答
检查预期运算和形状。在 NumPy 中,* 逐项相乘,可能使用广播;@ 执行矩阵乘法,并要求内维兼容。因此,广播得到的结果可能在数值上成功,却在语义上错误。把代码与模型方程比较,并检查输出形状是否符合推导出的向量或矩阵。
问题 7
为什么一个实数值张量恒等式在代数上对 R 成立,却可能在最后几位不一致?
显示分步解答
推导把元素视为精确实数,但机器浮点 dtype 存储的是有界、经过舍入的近似值。像 0.1 这样的十进制值可能一开始就不精确,不同的求值顺序也可能在不同步骤进行舍入。恒等式在数学上仍然成立;实现应使用与尺度相关的容差比较结果,监控 nan 和 inf,不要把位级差异解读为代数失败。