深度学习之PyTorch实战计算机视觉
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.1 矩阵运算入门

矩阵是线性代数中非常核心的内容,其优势就是能够进行大规模的并行计算,所以将矩阵的计算方式引入计算机中能够很大程度地提升计算机的计算效率。在深度学习方法中有很多的地方会涉及矩阵计算,所以掌握矩阵相关的计算方法和原理对我们理解深度学习的算法流程会有很大的帮助。

受限于篇幅,本章重点介绍在深度学习中涉及的矩阵相关的内容,以便于读者快速理解和上手。

2.1.1 标量、向量、矩阵和张量

在线性代数中,我们必须掌握几个核心概念:标量、向量、矩阵和张量,它们是构成线性代数学科的基石。

(1)标量(Scalar):标量其实就是一个独立存在的数,比如在线性代数中一个实数5就可以被看作一个标量,所以标量的运算相对简单,与我们平常做的数字算术运算类似。

(2)向量(Vector):向量指一列按顺序排列的元素,我们通常习惯用括号将这一列元素括起来,其中的每个元素都由一个索引值来唯一地确定其在向量中的位置,假设这个向量中的第1个元素是x1,它的索引值就是1,第2个元素是x2,它的索引值就是2,以此类推。如下所示就是一个由三个元素组成的向量,这个向量的索引值从1到3分别对应了从x1x3的这三个元素:

向量还有一个特性:向量中的不同数字还可以用于表示不同坐标轴上的坐标值。比如,我们可以把下面这个向量看作三个不同的坐标轴上的坐标值,可以假设2是x轴上的坐标值,3是y轴上的坐标值,8是z轴上的坐标值:

(3)矩阵(Matrix):矩阵就是一个二维数组结构,我们会用括号将其中的全部元素括起来。向量的索引值是一维的,而矩阵的索引值是二维的,所以在确定矩阵中每个元素的位置时需要两个数字。举例来说,假设在一个矩阵的左上角存在一个元素x11,那么确定这个元素的索引值就是由两个1构成的二维索引值,即“11”,这个二维索引值代表矩阵中第1行和第1列交汇处的数字,所以前面的一个数字1可以被定义为当前矩阵的行号,后面的一个数字1可以被定义为当前矩阵的列号。如下就是一个三行两列的矩阵:

在本书中统一使用大写字母来表示一个矩阵的简写,这个矩阵由6个元素组成,其中x11的位置是第1行和第1列的交汇处,所以x11的索引值就是11;同理,x21的位置是第2行和第1列的交汇处,所以x21的索引值就是21;x12的位置是第1行和第2列的交汇处,所以x12的索引值是12;以此类推,最后得到x22的索引值是22,x31的索引值是31,x32的索引值是32。下面举一个具体的实例,有如下矩阵:

如果我们想要获得索引值是12和33的值,则根据之前的索引值定义规则,可以得到其对应的值分别是3和6。

(4)张量(Tensor):若数组的维度超过了二维,我们就可以用张量来表示,所以我们可以将张量理解为高维数组。同理,张量的索引值用两个维度的数字来表示已经不够了,其中的元素的索引值会随着张量维度的改变而改变。

2.1.2 矩阵的转置

矩阵的转置是矩阵在进行相关运算时会采用的一种变换方法。在一般情况下,我们通过在矩阵的右上角加上符号“T”来表示其是一个转置矩阵,如下所示就是矩阵X的转置矩阵表示:

XT

我们对原矩阵X中的元素在经过变换后得到的相应的转置矩阵做如下定义:

(XT)i, j=Xj,i

等号左边括号内的内容是原矩阵的转置表示,括号外右下角的ij分别是原矩阵中元素的行号索引值和列号索引值;等号右边是原矩阵X,但是我们看到它的下标ij调换了位置,这个位置的调换意义在于把原矩阵中所有位置为ij的元素和位置为ji的元素进行对调,在这个过程中完成的全部操作就是原矩阵的转置。

下面通过一个具体的实例来对比矩阵转置前后的元素的位置,这样就能够更清晰地理解转置的过程。如下所示是一个原矩阵X

按照之前的原矩阵的转置变换过程,通过将矩阵内元素的位置进行调换后得到如下结果:

在观察转置矩阵之后我们发现,如果原矩阵的维度是不对称的,那么在转置后的矩阵中不仅元素的位置会改变,维度也会有相应的改变,在如上所示的矩阵中原矩阵的三行两列在转置后变成了两行三列。其实,我们可以通过一种更简单的方法来记忆转置的变换过程,就是把原矩阵沿着对角线进行翻转,在翻转后得到的矩阵就是原矩阵的转置矩阵。

再来看两个实际的实例。首先是一个矩阵行号和列号相同的原矩阵X

我们沿着对角线对原始矩阵进行翻转,其中对角线的矩阵元素是1和4,在翻转后得到原矩阵的转置矩阵如下:

如果矩阵的行号和列号相同,那么对角线上的元素必定在翻转之后还是一样的,而且索引值不会发生变化。我们再来看一个矩阵的行号和列号不相同的实例,原始矩阵X如下:

这时对角线上的矩阵元素变成了1和6,在翻转后得到的原矩阵的转置矩阵如下:

可以看到,转置矩阵的对角线上的元素仍然没有发生变化,但是转置矩阵的对角线上的元素索引值和原矩阵不同了:矩阵中元素1的索引值还是11,但是矩阵中元素6的索引值从原矩阵的32变成了现在的23。

2.1.3 矩阵的基本运算

我们通常使用的数学算术运算包含加法运算、减法运算、乘法运算和除法运算,不过这些运算和矩阵中的算术运算稍微有些区别,因为在矩阵中是不能直接进行除法运算的,如果要在矩阵中进行除法运算,就要引入矩阵的逆来解决这个问题。本书不过多介绍矩阵的逆,而是重点讲解矩阵的加法运算、减法运算和乘法运算。

在进行矩阵算术运算前,我们先假设存在三个行号和列号都为2的矩阵,分别使用大写字母ABC表示这三个矩阵,其中矩阵A中的元素如下:

矩阵B中的元素如下:

我们把矩阵A和矩阵B进行算术运算后的结果都存储在矩阵C中,矩阵C中的元素如下:

在定义好三个矩阵的结构之后,我们再来看看矩阵中算术运算的公式。

矩阵的加法运算公式如下:

C=A+B

cij=aij+bij

矩阵的减法运算公式如下:

C=A-B

cij=aij-bij

矩阵的乘法运算公式如下:

每个运算公式中的两个公式其实都是矩阵的相应的算术运算法则,只不过第1个公式使用的是矩阵的缩写,而第2个公式使用的是矩阵中的元素,但是为了便于理解,我们平时习惯使用第1种公式。在第2个公式中定义的ij分别是矩阵的行索引值和列索引值。我们观察到这两个矩阵在进行加法运算和减法运算时,矩阵中对应的矩阵元素具有相同的行索引值i和列索引值j,这也是矩阵进行加法和减法运算的前提条件,即参与运算的矩阵必须具有相同的行数和列数。

不过,矩阵乘法运算的前提条件和加法、减法运算不同:在参与运算的元素索引值中多了一个k值,而且这个k值同时出现在两个参与矩阵乘法运算的元素索引值中,前一个元素的k值代表的是列索引值,而后一个元素的k值代表的是行索引值。

不仅如此,我们还能从矩阵的乘法运算中得到如下有用的信息:若两个矩阵能进行乘法运算,那么前一个矩阵的列数必须和后一个矩阵的行数相等,同时矩阵的乘法运算要满足乘法的分配率和乘法的结合律,即

A×(B+C)=A×B+A×C

A×(B×C)=(A×BC

如上所述是常用的算术运算公式,我们需要特别留意矩阵的加法、减法和乘法运算公式之间的区别和联系,下面来看一些实例。

例1:假设存在两个行号和列号相同的矩阵,其中矩阵,矩阵,计算矩阵C=A+B的运算结果。

解答:根据矩阵的加法法则cij=aij+bij,可以得到矩阵,然后将索引值对应的元素代入公式中进行计算,得到计算结果为矩阵

例2:假设存在两个行号和列号相同的矩阵,其中矩阵,矩阵,计算矩阵C=A-B的运算结果。

解答:根据矩阵的减法法则cij=aij-bij,可以得到矩阵,然后将索引值对应的元素代入公式中进行计算,得到计算结果为矩阵

例3:假设存在两个行号和列号相同的矩阵,其中矩阵,矩阵,计算矩阵C=A×B的运算结果。

解答:根据矩阵的乘法运算法则,可以得到矩阵,然后将索引值对应的元素代入公式中进行计算,得到计算结果为矩阵

例4:假设存在两个行号和列号不相同的矩阵,其中矩阵,矩阵,计算矩阵C=A×B的运算结果。

解答:根据矩阵的乘法运算法则,可以得到矩阵,然后将索引值对应的元素代入公式中进行计算,计算结果为矩阵

例5:假设存在三个行号和列号相同的矩阵,其中矩阵,矩阵,矩阵,计算矩阵乘法运算A×(B+C)的运算结果是否和矩阵乘法运算A×B+A×C的运算结果相等,来证明矩阵乘法运算符合乘法的分配律。

解答:根据矩阵的乘法法则,可以计算得到A×(B+C)的矩阵乘法运算结果为

A×B+A×C的矩阵乘法运算结果为

可以看到,矩阵乘法运算A×(B+C)的结果和矩阵乘法运算A×B+A×C的结果是相等的,由此可以证明矩阵乘法运算符合乘法的分配律。

例6:假设存在三个行号和列号相同的矩阵,其中矩阵,矩阵,矩阵,计算矩阵乘法运算(A×BC的运算结果是否和矩阵乘法运算A×(B×C)的运算结果相等,来证明矩阵乘法运算符合乘法的结合律。

解答:根据矩阵乘法的结合律公式,可以计算得到(A×BC的矩阵乘法运算结果为

A×(B×C)的矩阵乘法运算结果为

可以看到,矩阵乘法运算(A×BC的运算结果和矩阵乘法运算A×(B×C)的运算结果相等,由此可以证明矩阵乘法运算符合乘法的结合律。