机器学习编程:从编码到深度学习
上QQ阅读APP看书,第一时间看更新

4.2.1 矩阵乘法

你有没有思考过为什么机器学习程序通常需要在那些巨大的GPU计算架构上完成运行?这是因为机器学习系统的大部分时间都在做一种特定的运算,这种运算就是大规模的矩阵乘法运算,这种运算在GPU上的计算速度特别快。

为介绍矩阵乘法,我们先在这里给出一个“黄金法则”,即当且仅当第二个矩阵的行数与第一个矩阵的列数相同时,才可以将这两个矩阵相乘,如下图所示:

M1是(4,3)矩阵,M2是(3,2)矩阵。二者可以相乘吗?要回答这个问题,我们列出如下矩阵乘法运算的形式:

请看乘法运算中两个矩阵的内部维数。如果这两个矩阵的内部维数相等,就可以把这两个矩阵相乘,乘积的结果将是具有外部维数的矩阵,在本例中是(4,2):

下面让我们来看看具体实例,从简单的矩阵开始,即单行矩阵与单列矩阵的乘法,如下图所示:

首先,检查一下该矩阵乘法是否有效。第一个矩阵是(1,3),第二个矩阵是(3,1)。根据黄金法则,(1,3)乘(3,1)是成立的,并将返回矩阵(1,1)——一个只包含一个元素的矩阵。

要想计算这个元素,需要将M1中的每个元素乘以M2中的每个对应元素——第一个乘第一个,第二个乘第二个,以此类推。然后把它们加起来。

该矩阵乘法的结果如下所示:

剧透预警:聪明的读者也许已经注意到了矩阵乘法与4.1节末尾内容的相似之处。你们可能已经猜到了,这种相似并非巧合。在我们介绍完矩阵乘法之后,将使用这种相似建立多重线性回归模型。

当矩阵包含多个行和多个列的时候又会怎样呢?在这种情况下,我们还是使用相同的行列计算方法,但是会将第一个矩阵的每一行与第二个矩阵的每一列进行运算。运算结果M3中的每个元素(i,j)是矩阵M1的第i行与矩阵M2的第j列的乘积:

具体实例如下所示:

现在我们来检查一下M3中的元素,比如元素M3[0][1]为40。根据黄金法则,M3[0][1]应该是矩阵M1的第0行与矩阵M2的第1列相乘的结果,如下图所示:

相应的行列乘积结果是2*-3+3*12+5*2=40,和我们预期的一样。对矩阵M3中每个元素重复使用这个计算过程,就得到了矩阵乘法的运算规则。

注意,与常规的实数乘法运算不同的是,在矩阵乘法运算中运算对象的次序很重要。如果交换矩阵M1和M2在乘法运算中的次序,那么通常会得到一个不同的结果,而且在多数情况下根本无法进行乘法运算。例如,我们不能计算M2乘M1,因为(3,2)·(4,3)的两个内部维数不相等。

本书会涉及大量的矩阵乘法运算,但是我们将使用工具NumPy获得计算结果,而不是进行手工计算。如果你记住了黄金法则就会容易很多:对于矩阵乘法运算,内部维数必须相同,外部维数是运算结果矩阵的维数。对于我们给出的例子,矩阵(4,3)与矩阵(3,2)相乘,得到的乘积结果是一个(4,2)矩阵。

这就是矩阵乘法的原理。下面我们学习矩阵转置运算。