购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.12 线性系统和矩阵求逆

机器学习通常是一个迭代的过程。给定一组训练数据,我们的目标是估计出一组能够在训练数据上产生目标值或其近似值的机器参数。由于训练数据和参数集的规模通常非常庞大,我们难以通过求闭型解(一次性求解未知参数)来处理。因此,解决方案往往需要通过迭代来实现。我们从一组初始猜测的参数值开始,通过反复处理训练数据来迭代地优化这些猜测的参数值。

尽管如此,在现实生活中,我们也经常会遇到一些规模较小的问题。对于这类问题,采用更为传统的求闭型解可能会更合适,它们在实现速度和准确性方面更具优势。本节将深入探讨这些技术细节。

现在,让我们回到熟悉的猫脑问题,并参考表2.2中的训练数据。与之前相同,我们仍讨论一个包含三个参数的加权求和模型:权重 w 0 w 1 和偏置 b 。这里,我们仅关注表中的前三行数据,如表2.3所示。

表2.3 基于机器学习的猫脑模型的训练数据集示例

根据训练数据,当硬度为0.11,锋利度为0.09时,系统的输出应该与目标值-0.8相匹配(或接近),以此类推。这表明,我们寻找的理想参数值 w 0 w 1 b 应满足以下条件:

0.11 w 0 + 0.09 w 1 +b= -0.8

0.01 w+ 0.02 w+b= -0.97

0.98 w 0 + 0.91 w 1 +b= 0.89

通过矩阵乘法,上述条件可以转化为以下等式:

那么,如何找到满足该等式的值,即 w 0 w 1 b ?换句话说,我们应该如何解这个方程?虽然存在直接求解这类方程(求解 w 0 w 1 b )的正式方法(我们将稍后讨论)。在这个简单的例子中,你可能会直接“看出”方程的解: w 0 =1, w 1 =1, b =-1,但我们需要一个通用方法来处理这类问题。

这个方程是一个被称为 线性系统 的方程组实例。一个含有 n 个未知数的线性系统可以表示为:

a 11 x 1 +a 12 x 2 +a 13 x 3 +…+a 1 n x n =b 1

a 21 x 1 +a 22 x 2 +a 23 x 3 +…+a 2 n x n =b 2

a n 1 x 1 +a n 2 x 2 +a n 3 x 3 +…+a nn x n =b n

我们可以用矩阵和向量来表达该线性系统,具体如下:

Ax = b

其中,

尽管这两种表达方式等价,但矩阵表示更为紧凑且与维度无关。在机器学习中,我们通常有成千上万个变量,因此这种紧凑性极其重要。此外, Ax = b 与我们熟知的一元方程 ax = b 很相似。实际上,许多直觉可以从一维推广到更高维度。

一维方程的解是什么?你可能在五年级就学过了: ax = b 的解是 x = a -1 b ,其中 a ≠0。

我们可以在所有维度中使用相同的符号。方程 Ax = b 的解是 x = A -1 b ,其中 A -1 是矩阵的逆。逆矩阵 A -1 的行列式为 ,它可作为一个因子。我们不讨论行列式和逆矩阵的计算——你可以在任何线性代数教科书中找到这些内容,在这里,我们会阐述关于行列式和逆矩阵的一些见解:

·逆矩阵 A -1 与矩阵 A 的关系,类似于标量 a -1 与标量 a 的关系,仅当 a ≠0时, a -1 才存在。类似地,如果det( A )≠0,则 A -1 存在,其中det( A )为矩阵( A )的行列式。

·标量 a a 的乘积为1。类似地, AA = A A = I ,其中 I 表示单位矩阵,这是标量算术中1的高维类比。它是一个对角线元素为1而其他所有元素为0的矩阵。 n 维的单位矩阵如下:

当没有下标时,维度可以从上下文推断出来。对于任意矩阵 A IA = AI = A 。对于任意向量 a Ia = a T I = a ,通过矩阵乘法,可以轻松地验证该结论的正确性。

对于行列式和逆矩阵的运算,有一套完全精确但烦琐的计算规则。尽管这一概念非常重要,但在生活中,我们很少需要计算它们,因为所有的线性代数软件包都提供了执行这些计算的例程。此外,计算逆矩阵并不是良好的编程实践,因为它在数值上是不稳定的。这里,我们不讨论行列式或逆矩阵的直接计算方法(仅在附录A.2节中,我们展示了如何计算一个2×2矩阵的行列式)。但我们会讨论伪逆,这在机器学习中具有更重要的意义。

2.12.1 行列式为零或接近零的线性系统,以及病态系统

我们之前了解到,对于一个线性系统 Ax = b ,存在解 x = A -1 b 。其中 A -1 有一个 的因子。那么,如果行列式为零会怎样呢?

简单而言,当行列式为零时,线性系统无法精确求解。但我们仍然可以尝试找到一个近似答案(见2.12.3节)。

让我们通过一个例子来更仔细地说明这种情况。考虑以下方程组:

x 1 +x 2 = 2

2 x 1 + 2 x 2 = 4

它可以被重写为一个具有方阵的线性系统:

我们很快就会发现,该方程组无解。第二个方程实际上与第一个方程相同。事实上,我们可以通过将第一个方程乘以标量2来得到第二个方程。因此,我们实际上并没有两个方程,而是只有一个,所以该系统无法求解。现在检查矩阵 A 的行向量,[1 1]和[2 2],会发现它们是线性相关的,因为-2[1 1]+[2 2]=0。然后,检查矩阵 A 的行列式(附录A.2节展示了如何计算一个2×2矩阵的行列式),会发现它同样为0,即2×1-1×2=0。这些结果并非巧合。它们中的任何一个向量都可以推导出另外一个向量。实际上,关于线性系统 Ax = b (其中 A 为方阵),也可以等价地表述为

·矩阵 A 中的行/列,可以表示为其他行/列的加权和。

·矩阵 A 有线性相关的行或列。

·矩阵 A 的行列式为零(这类矩阵称为奇异矩阵)。

·矩阵 A 的逆( A -1 )不存在,则该矩阵 A 被称为奇异矩阵。

·线性系统无法求解。

这个系统让我们了解到,如果实际上的方程数量低于预期,则该方程组无法求解。

有时,行列式虽然不是零,但接近零。虽然理论上可解,但这样的系统在数值上是不稳定的。输入的微小变化会导致结果发生巨大变化。例如,考虑这个近似的奇异矩阵:

A 的行列式值为0.002,接近于零。设 是一个向量。

可以看到, A -1 的元素非常大。这是因为除以了一个极小的行列式,而这也导致了接下来要说明的不稳定性。 Ax = b 的解是 。但如果我们稍微改变 b ,使其变为 ,方程的解将变的截然不同,即 。源自矩阵 A 的近似奇异性,这种情况本质上是不稳定的。这类线性系统被称为病态系统。

2.12.2 用于逆矩阵、行列式以及奇异性测试的PyTorch代码

通过线性代数包linalg的单一函数调用,可以实现矩阵求逆(PyTorch代码如代码清单2.10所示),并计算其行列式。

代码清单2.10 对可逆矩阵(非零行列式)求逆

奇异矩阵是指行列式为零的矩阵。这类矩阵是不可逆的。因此,含有奇异矩阵的线性方程组无法求解。代码清单2.11展示了用于奇异性测试的PyTorch代码。

代码清单2.11 奇异矩阵

2.12.3 机器学习中的超定和欠定线性系统

如果矩阵 A 不是方阵该怎样处理?这意味着方程数量与未知数数量不匹配。这样的系统是否有意义?令人惊讶的是,这类系统是有意义的,通常,机器学习系统就属于这一类:方程的数量对应于收集到的训练数据实例数量,而未知数的数量则取决于模型中的权重数量,而这又由我们选择用来表示系统的特定模型家族来决定的。这两者是彼此独立的。正如前文所述,我们通常采用迭代的方式来求解这类系统。尽管如此,理解包含非方阵 A 的线性系统仍然重要,这可以帮助我们获得更深入的见解。

假设矩阵 A 的行数为 m ,列数为 n ,则存在两种可能的情况:

·情况1: m n ,即方程多于未知数,称为超定系统

·情况2: m n ,即方程少于未知数,称为欠定系统

例如,表2.2可推导出一个超定线性系统。我们将其表示为如下的方程组形式:

0.11 w 0 + 0.09 w 1 +b= -0.8

0.01 w 0 + 0.02 w 1 +b= -0.97

0.98 w 0 + 0.91 w 1 +b= 0.89

0.12 w 0 + 0.21 w 1 +b= -0.68

0.98 w 0 + 0.99 w 1 +b= 0.95

0.85 w 0 + 0.87 w 1 +b= 0.74

0.03 w 0 + 0.14 w 1 +b= -0.88

0.55 w 0 + 0.45 w 1 +b= 0.00

这些方程可表达为如下的超定线性系统:

这是一个8×3的非方阵线性系统。虽然只有3个未知数需要求解( w 0 w 1 b ),但却有8个方程。该系统的冗余度非常高:理论上,我们只需要三个方程,就能通过线性系统来完成求解(见2.12节)。但关键在于:这些方程并不是完全相容的。没有一组值能同时满足所有方程。换句话说,训练数据是有噪声的。在现实生活中,机器学习系统普遍存在这一现象。因此,我们必须找到一个解,使它在所有方程上都是最优的(尽可能少的误差)。

我们需要求解这个问题,以最小化总体误差 。换句话说,我们的目标是找到一个 x ,使得 Ax 尽可能地接近 b 。这种闭型的解决方案(非迭代的方法)是机器学习和数据科学的重要基础。我们将在多个场景中深入探讨这一概念,特别是在2.12.4节和4.5节中。

2.12.4 矩阵的Moore-Penrose伪逆

伪逆技术可用于解决超定或欠定的线性系统问题。假设我们有一个包含 m × n 矩阵 A 的超定系统,其中 A 不一定为方阵,则有

Ax = b

由于无法确认矩阵 A 是否为方阵,我们通常无法计算其行列式和逆矩阵。因此,常规的 A -1 b 方法变得不再适用。在这种情况下,我们注意到,尽管不能取逆,但对矩阵进行转置总是可行的。因此,让我们将等式两边都乘以 A T

Ax = b A T Ax = A T b

注意, A T A 是一个方阵,它的维度是( m × n )×( n × m )= m × m 。我们先假设它是可逆的,暂时不进行证明,那么

Ax = b A T Ax = A T b x =( A T A -1 A T b

结果还算不错,我们似乎找到了一些思路。实际上,我们刚刚推导出了矩阵 A 的伪逆,记为 A + =( A T A -1 A T 。与矩阵的逆不同,伪逆不需要矩阵是方阵且矩阵中的行线性无关。就像常规的线性系统一样,我们得到了可能是非方阵的方程组的解,即 Ax = b x = A + b

基于伪逆的解确实最小化了误差 。我们将在2.12.5节中证明该结论。同时,你可以编写Python代码来计算( A T A -1 A T b ,并验证它是否能大致给出式(2.18)的预期答案

2.12.5 矩阵的伪逆:一个美丽的几何直观表示

矩阵 A m × m 可以根据其列向量重写为[ a 1 a 2 ,…, a n ],其中, a 1 a 2 ,…, a n 都是 m 维向量。然后,对于向量 ,我们可以得到 Ax = x 1 a 1 + x 2 a 2 +…+ x n a n 。换句话说, Ax 只是矩阵 A 的列向量的线性组合,其中, x 的元素为权重(你可以编写一个3×3的小型系统来验证该结论)。所有形式为 Ax (矩阵 A 的列向量的线性组合)的向量空间被称为矩阵 A 列空间

线性方程组 Ax = b 的解可以被视为寻找使得 Ax b 之间的差异最小化的 x ,即最小化 。这意味着我们试图在 A 的列空间中,找到最接近 b 的点。请注意,这种解释并不假设矩阵 A 是方阵,也不假设 A 具有非零的行列式。比较乐观的情况是,当矩阵 A 是方阵且可逆时,我们可以找到一个向量 x ,使得 Ax b 完全相等,即 如果 A 不是方阵,我们将尝试找到一个向量 x ,使得 Ax A 的列空间中的任何其他向量都更接近 b 。从数学角度来说,可以得出 [1]

从几何学的角度来讲,我们直观地知道,在 A 的列空间中,最接近 b 的点是通过从 b A 的列空间画垂线得到的(见图2.12)。该垂线与 A 的列空间的交点称为 b A 的列空间上的投影。该投影就是我们正在寻找的式(2.19)的解向量 x 。这反过来意味着 b-Ax A 的列空间中的所有向量都是正交(垂直)的(见图2.12)。我们用 Ay 表示矩阵 A 列空间中的任意向量,对于所有这样的 y ,有

图2.12 解一个线性方程组 Ax = b 等同于在 A 的列空间中寻找一个最接近 b 的点。这意味着我们需要从 b A 的列空间画一条垂线。如果 Ax 代表垂线与列空间相交的点,即投影,差值向量 b-Ax 就对应于连接 b 和其投影 Ax 的线。这条线将与矩阵 A 的列空间中的所有向量垂直。等价地,它与任意的 Ay 垂直,其中 y 是任意向量

Ay b-Ax Ay T b-Ax )= 0

y T A T b-Ax )= 0

为了让前述等式对所有向量 y 都成立,我们必须有 A T b-Ax )= 0 。因此,我们得到

A T b-Ax )= 0

A T Ax = A T b

x =( A T A -1 A T b

这恰好是摩尔-彭若斯(Moore-Penrose)伪逆。

对于一个以机器学习为中心的例子,考虑本章前面提到的猫脑模型的超定系统。这里有8个训练样本,每个样本都具有指定的输入和期望输出。

我们的目标是确定三个未知数 w 0 w 1 b ,使得对于每个训练输入 ,模型输出都尽可能地接近期望输出(基准真值)

注: 这里我们使用了一个巧妙的技巧:在输入的右侧增加了一个1,这使得我们能够通过一个紧凑的矩阵向量乘法来描述整个系统(包括偏置)。我们将这种操作称为 增广 ,即在输入行向量的右侧增加一个额外的1。

将所有训练样本汇总起来,我们得到

也可以将其紧凑地表示为

Xw = y

其中 X 是最右列全部为1的增广输入矩阵。目标是最小化 。为此,我们构建了一个超定线性系统:

Xw = y -

注意,这不是一个典型的方程组,它的方程数量多于未知数的数量。因此,我们无法通过矩阵求逆来求解这个问题。然而,我们可以使用伪逆机制,来得到“最佳拟合”或“尽力接近”的解,使得所有训练样本上的总误差最小化。

为了方便参考,再次列出该方程组的确切数值:

我们使用伪逆公式 来求解 w

2.12.6 使用PyTorch代码求解超定系统

注: 本节的完整代码可以从http://mng.bz/PPJ2获取,并且可以使用Jupyter Notebook执行。

代码清单2.12展示了用于求解超定系统的PyTorch代码。

代码清单2.12 使用伪逆求解超定系统 RxHvwzxLwQRSL1BAJ/kaSa8LL4HhFPPZ3EyhkkMoIag3xJ6bpIpi134o7UqyB/pX

点击中间区域
呼出菜单
上一章
目录
下一章
×