



在本节中,我们将探讨向量和矩阵的一些基础运算,并且通过一系列示例来阐释它们在图像处理、计算机视觉和机器学习领域中的重要性,旨在深化读者对线性代数知识的理解和应用。然而,这并不意味着我们会对矩阵和向量运算的所有内容进行全面介绍,建议读者参阅线性代数的教材来了解相应的知识。
式(2.2)展示了一个小图像的矩阵
。假设我们想要将图像旋转90°,使其转换成图2.6所示的图像,那么我们需要对矩阵
I
4,9
进行转置操作。原始矩阵
I
4,9
及其转置矩阵
如下所示:
图2.4 PyTorch中的张量和图像
图2.5 裁剪后的图像
图2.6式(2.3)中矩阵 I 4,9 转置后的图像。这相当于将图像旋转了90°
通过比较式(2.2)和式(2.3),我们可以很容易地看出:通过交换矩阵的行和列索引,可以将一个矩阵转换为另一个矩阵。这种操作通常被称为 矩阵转置 。
一个具有
m
行和
n
列的矩阵
A
m
,
n
转置是另一个具有
n
行和
m
列的矩阵,记作
满足
A
T
[
i
,
j
]=
A
[
j
,
i
]。例如,在矩阵
I
4,9
中,第0行第6列的值是48;在转置矩阵中,相同的值出现在第6行第0列,可以用矩阵表示为
。
向量转置是矩阵转置的一个特例,所有的向量都是一个具有 n 个列向量元素的 n ×1矩阵。下面是一个任意向量及其转置的示例:
在1.3节中,我们了解了最简单的机器学习模型,模型的输出是输入值的加权和再加上一个常数偏置。这个模型/机器由权重
w
0
,
w
1
和偏置
b
来进行描述。以表2.2中的数据为例,对于第0行,输入值是面前物体的硬度=0.11和锋利度=0.09。相应的模型输出为
y
=
w
0
×0.11+
w
1
×0.09+
b
。事实上,训练的目标是确定
w
0
,
w
1
和
b
,使得模型输出尽可能地接近已知输出;即
y
=
w
×0.11+
w
×0.09+
b
应尽可能地接近-0.8,
y
=
w
×0.01+
w
×0.02+
b
应尽可能地接近-0.97。也就是说,给定一个输入实例
,模型输出
y
=
x
0
w
0
+
x
1
w
1
+
b
应尽可能接近相应的已知输出结果。
在本章的后续部分,我们将继续使用该模型。然而,在进一步深入讨论之前,我们需要考虑一个新的问题。在当前的示例中,我们只有三个模型参数:两个权重 w 0 , w 1 和一个偏置 b 。因此,直接计算模型的输出 y = x 0 w 0 + x 1 w 1 + b 并不复杂。但是,随着特征向量的增加,即权重参数更多,这种表示方式变得难以处理。是否存在一种紧凑的方式来表示特定输入实例的模型输出结果,而不受输入维度大小的限制呢?
事实证明,答案是肯定的,我们可以利用数学中的“
点积
”运算来解决这个问题。在2.1节中,我们已经了解到,模型的单个输入实例可以通过一个向量来紧凑地表示,例如向量
x
(它可以包含任意数量的输入值)。同样地,我们也可以将权重集合表示为一个向量
w
,其元素的数量与输入向量的数量相同。点积实质上就是将两个向量
x
和
w
的元素逐个相乘。正式地说,给定两个向量
和
,它们的点积定义为
换句话说,两个向量的点积是它们对应元素的乘积之和,记为 a · b 。
注: 点积符号可以将模型输出紧凑地表示为 y = w · x + b 。即使输入和权重的数量很多,该表示法的复杂度也不会增加。
我们再次以熟悉的猫脑模型为例。假设权重向量为
,偏置为
b
=5。那么表2.2中的第0个输入实例对应的模型输出为
。尽管当前选定的权重和偏置参数表现较差——模型输出5.51与期望输出-0.89的差距较大,但这并不是关键。我们很快就会了解到如何选取更合适的参数值。现在,我们只需要注意到,点积为简单的加权求和模型的输出提供了一种简洁的表达方式。
注: 点积运算仅在向量具有相同维度时才有意义。
点积有时也被称为 内积 ,表示为< a , b >。严格来说,“内积”这一术语更为通用,它同样适用于无限维度的向量。在本书中,为了增强读者的理解,我们常常会根据需要灵活使用这些术语,这可能会对数学表述的严谨性造成一定影响。
向量是矩阵的一类特例。因此,矩阵-向量乘法也是矩阵-矩阵乘法的一类特例。我们将从这一点开始进行讨论。
矩阵-向量乘法
在2.5.2节中,我们了解到,给定一个权重向量和偏置,比如
,
b
=5,单个输入实例的加权求和模型输出,比如
,可以表示为向量-向量的点积形式,即
。如式(2.1)所示,在实际的训练过程中,我们可能需要处理数以十万计的输入实例,每个实例可能包含数百个特征值。那么,有没有一种方式可以紧凑地表示整个训练数据集的模型输出,使其不受输入实例的数量和规模的影响呢?
答案是肯定的。我们可以利用数学领域中的矩阵-向量乘法概念。矩阵
X
和列向量
w
的乘积是另一个向量,记作
Xw
。其元素是
X
的行向量与列向量
w
之间的点积。例如,给定模型的权重向量
和偏置
b
=5,通过以下步骤,我们可以获得式(2.1)的猫脑模型在训练数据集上的输出:
增加偏置值5之后,模型在训练数据集上的输出为
通常来说,简单模型的输出(输入元素的加权和加上偏置)可以紧凑地表示为
y = Xw + b 。
矩阵-矩阵乘法
为了进一步推广矩阵-向量乘法的概念,我们定义了矩阵与矩阵的乘法。具体来说,一个具有 m 行和 p 列的矩阵 A m , p ,与一个具有 p 行和 n 列的矩阵 B p , n 相乘,可以得到一个具有 m 行和 n 列的矩阵 C m , n ,记为 C m , n = A m , p B p , n 。请注意,左侧矩阵的列数必须与右侧矩阵的行数相匹配。结果矩阵中的第 i 行第 j 列的元素 C i , j ,是通过矩阵 A 的第 i 个行向量和矩阵 B 的第 j 个列向量进行点积得到的。以下示例说明了这一概念:
在示例中, C 21 的计算被突出显示。
注: 矩阵乘法不满足交换律,即 AB ≠ BA 。
此时,敏锐的读者可能已经注意到,点积是矩阵乘法的一个特例。例如,两个向量
和
之间的点积相当于将这两个向量中的任意一个转置后,再与另一个进行矩阵乘法。换句话说,
这个概念同样适用于更高维度的空间。一般来说,给定两个向量
和
,它们的点积定义为
矩阵乘法的另一个特例是行向量与矩阵的乘法。例如, b T A = c ,即
矩阵乘积的转置
给定两个矩阵 A 和 B ,如果 A 的列数与 B 的行数相匹配,即它们可以相乘,则这两个矩阵的乘积的转置等于各自转置的乘积,但顺序相反。这一规则也适用于矩阵-向量乘法。下式概括了这一规则:
假设一个机器学习模型的目标输出值是
,但实际输出值为
y
。这里,我们关注的是模型产生的误差,即目标输出与实际输出之间的差异。
平方误差
当出现计算误差时,我们只需关注计算值与理想值之间的偏差程度,而不关注计算值是大于还是小于理想值。例如,假设目标(理想)值是2,那么计算值1.5和2.5的误差是相等的——我们对这两个结果都同样满意或不满意。常见的做法是对误差值进行平方处理。因此,如果目标值是2,计算值是1.5,则平方误差是(1.5-2) 2 =0.25。如果计算值是2.5,则平方误差同样为(2.5-2) 2 =0.25。平方操作从本质上消除了误差值的符号差异。接下来,我们可以对误差进行开方处理,但这并不是必须的。
你可能会问:“但是等等,平方操作改变了误差的数值。难道我们不关心误差的准确值吗?”通常情况下,我们只关心误差的相对大小。例如,如果目标值是2,我们关注的是输出值2.1的误差小于输出值2.5的误差。因此误差自身的准确值并不是我们关注的重点。
让我们将这种平方误差的概念应用于机器学习模型产生的误差,如2.5.3节所述,给定模型的权重向量
和偏置
b
=5,对于单个输入实例
,模型的加权求和输出为
。根据表2.2,其目标(理想)输出是-0.8。相应的平方误差为
e
2
=(-0.8-5.51)
2
=39.82。这让我们对模型的参数3,2,5的好坏有了一个大致的了解。如果我们改用另一组权重向量
和偏置
b
=-1,则模型的输出变为
,与目标值完全相同。相应的平方误差为
e
2
=(-0.8-(-0.8))
2
=0。这(零误差)表明,1,1,-1是比3,2,5更好的模型参数选择。
一般来说,带偏置的加权求和模型所产生的误差可以用以下方式来表示:如果
w
表示权重向量,
b
表示偏置,输入实例为
x
,则相应的模型输出可以表示为
y
=
w
·
x
+
b
。设
是相应的目标输出(基准真值)。则平方误差的定义为
。
因此,我们可以通过计算模型输出与基准真值之间的差异,并对其进行平方来计算单个训练实例上的误差。那么该如何将这个概念推广到整个训练数据集上呢?对于整个训练输入集,相应的模型输出集可以表示为
y
=
Xw
+
b
。相应的目标输出向量(包含所有基准真值)可以表示为
y
。基于此,在整个训练集上,目标输出与模型输出之间的差异可以用另一个向量
来表示,详见如下的具体示例:
因此,通过计算输出向量与基准真值向量之间的差值,并且对其元素进行平方并求和,可以得出整个训练数据集上的总平方误差。回想一下式(2.9),如果我们对差值向量与其自身进行点积运算,可以得到同样的结果。这恰好是向量的大小、长度或 L 2 范数的平方定义,即向量与其自身的点积。在前面的例子中,整体训练数据集上的(平方)误差是
正式地说,向量
的长度记为
,定义为
。向量长度有时也被称为向量的
L
2
范数。
特别是,给定一个输出向量
y
和目标向量
的机器学习模型,误差与差值向量的长度或
L
2
范数相同
对于一个二维向量
,如图2.2所示,
L
2
范数
实际上是构成该向量的直角三角形的斜边长度。这种直观的理解同样适用于更高维度的向量。
单位向量
是长度为1的向量。给定任意向量
v
,通过将每个元素除以该向量的长度,可以获得相应的单位向量。例如,给定向量
,则向量长度为
其对应的单位向量为
。单位向量通常代表一个方向。
注:
单位向量通常用帽子符号表示,如
。
在机器学习中,训练的目标通常是最小化误差向量的长度,即模型输出向量与基准真值向量之间的差异。
再次考虑表2.1中描述的文档检索问题。我们有一组文档,每个文档都由其特征向量描述。给定这样一对文档,我们的目标是找到它们之间的相似性。这本质上可以归结为估计两个特征向量之间的相似性。在本小节中,我们将了解到,两个向量之间的点积可以作为它们之间的相似性度量。
以表2.1中的文档5和文档6对应的特征向量
和
为例。它们之间的点积是1×0+0×1=0,这个数值很小,符合我们的直观认知,即它们之间没有共同的兴趣词,相似度很低。另外,文档3和文档4的特征向量之间的点积是
这个数值较大,与我们的直觉相符,这表明它们有许多共同关注的词,具有较高的相似度。由此,我们引入了一个重要概念:简单来说,相似的向量具有较大的点积,而不相似的向量的点积则接近于零。
我们将持续探讨如何评估特征向量之间的相似性,并逐步提出更加精确的解决方案。首先,我们将更深入地研究点积是如何衡量向量之间的相似性的。我们会证明一个向量在另一个向量方向上的分量可以通过点积来计算。利用这一点,我们将证明两个向量之间的“相似性/一致性”可以通过它们之间的点积来估计。特别是,如果两个向量大致指向相同的方向,它们的点积会高于向量互相垂直的情况。如果向量指向相反的方向,则它们的点积将是负值。
点积可用于衡量一个向量在另一个向量方向上的分量
让我们考虑一个特殊情况:一个向量沿坐标轴的分量。通过将向量的长度乘以该向量与相关坐标轴夹角的余弦值,可以得到该分量。如图2.7a所示,在二维空间中,向量 v 可以被分解为沿 X 轴和 Y 轴的两个分量。
请注意,向量的长度是保持不变的,推理如下:
现在,让我们探讨一个更普遍的案例:一个向量在另一个任意向量方向上的分量(见图2.7b)。向量
a
在另一个向量
b
方向上的分量是
其中
θ
是向量
a
和
b
之间的夹角。(这一结论已经在附录A.1节中讨论的二维案例中得到了验证。如果想获得更深入地理解,可参阅该部分内容。)
通过点积来衡量两个向量之间的一致性
点积可以通过向量之间夹角的余弦来表示。给定两个向量 a 和 b , θ 为它们之间的夹角,则有(见图2.7b)
使用余弦来表达点积,我们可以更容易地看出,点积能够衡量两个向量之间的一致性(也称为相关性)。如果两个向量方向相同,则它们之间的夹角为0,余弦值为1,表示最大程度的一致性。随着角度增大,余弦值逐渐减小,直到两个向量互相垂直,此时余弦值为0,表示向量间没有相关性——向量间彼此独立。如果向量间的角度为180°,则余弦值为-1,表明向量之间是负相关的。因此,两个向量的点积与它们方向上的一致性成正比。
图2.7 向量分量和点积
向量长度在该过程中扮演了怎样的角色呢?两个向量之间的点积也与向量的长度成正比。这意味着长度较大的向量之间的一致性评分会更高,例如,美国总统与德国总理之间的一致性比你我之间的一致性评分更高。
如果我们希望一致性评分不受向量长度的影响,可以使用单位向量沿同一方向的归一化点积,即余弦相似度
归一化点积(又称余弦相似度)仅衡量方向一致性,广泛用于文档处理。假设有一些待查阅的文本,我们希望将其与各种归档文档进行匹配,并按照与查询文本的相似度进行排序。此时,可以计算查询文本与每个归档文档的描述符向量之间的点积,以此作为相似度的衡量标准,但为了避免较长的文档在相似度评分中自动获得更高的分数。我们会采用余弦相似度,以消除文档长度对相似度评分的影响。我们将在4.6.1节中详细讨论文档检索和余弦相似度。
点积与两个单位向量之间的差异
为了进一步理解点积如何衡量两个方向之间的一致性或相关性,让我们以两个单位向量
和
为例。它们之间的差异为
。
请注意,由于它们是单位向量,所以
。则它们之间差值向量的长度为
从最后一个等式可以看出,较大的点积意味着较小的差异,即向量之间的一致性更高。