- 机器学习编程:从编码到深度学习
- (意)保罗·佩罗塔
- 1053字
- 2021-06-01 17:13:26
4.2.1 矩阵乘法
你有没有思考过为什么机器学习程序通常需要在那些巨大的GPU计算架构上完成运行?这是因为机器学习系统的大部分时间都在做一种特定的运算,这种运算就是大规模的矩阵乘法运算,这种运算在GPU上的计算速度特别快。
为介绍矩阵乘法,我们先在这里给出一个“黄金法则”,即当且仅当第二个矩阵的行数与第一个矩阵的列数相同时,才可以将这两个矩阵相乘,如下图所示:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/045-i.jpg?sign=1739424514-FVfbo7MH7LkQuYaJtDWrJjs7cXUIAlsn-0-335a03083778a1e70c6116dc589a20bb)
M1是(4,3)矩阵,M2是(3,2)矩阵。二者可以相乘吗?要回答这个问题,我们列出如下矩阵乘法运算的形式:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/045-2-i.jpg?sign=1739424514-6OJ9zzzjeNmz12eJ5vpJBkz5Zqc7TP9t-0-ce00299347d86a2862ddd333e7fed591)
请看乘法运算中两个矩阵的内部维数。如果这两个矩阵的内部维数相等,就可以把这两个矩阵相乘,乘积的结果将是具有外部维数的矩阵,在本例中是(4,2):
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/045-3-i.jpg?sign=1739424514-lioCRVIyX9uDUR9qRwSuCaBVdutRCHOr-0-4bccd1020666c0d47f7f1ed6c452fc56)
下面让我们来看看具体实例,从简单的矩阵开始,即单行矩阵与单列矩阵的乘法,如下图所示:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/045-4-i.jpg?sign=1739424514-EPri0xN4lyaJAzu78QhSrAchcBEE5iUf-0-7237f1b5e03204f97b0b2d9bef4464b4)
首先,检查一下该矩阵乘法是否有效。第一个矩阵是(1,3),第二个矩阵是(3,1)。根据黄金法则,(1,3)乘(3,1)是成立的,并将返回矩阵(1,1)——一个只包含一个元素的矩阵。
要想计算这个元素,需要将M1中的每个元素乘以M2中的每个对应元素——第一个乘第一个,第二个乘第二个,以此类推。然后把它们加起来。
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/046-i.jpg?sign=1739424514-PPIZdpUcKkZ5Bxrwkja65f642np2m3G1-0-d5cd776d69cca2553fc9576864be2521)
该矩阵乘法的结果如下所示:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/046-2-i.jpg?sign=1739424514-3fdcwDLxAklJxfHOoMKx3nFVyGru3WqX-0-29a1400869366f13862313dacee83df7)
剧透预警:聪明的读者也许已经注意到了矩阵乘法与4.1节末尾内容的相似之处。你们可能已经猜到了,这种相似并非巧合。在我们介绍完矩阵乘法之后,将使用这种相似建立多重线性回归模型。
当矩阵包含多个行和多个列的时候又会怎样呢?在这种情况下,我们还是使用相同的行列计算方法,但是会将第一个矩阵的每一行与第二个矩阵的每一列进行运算。运算结果M3中的每个元素(i,j)是矩阵M1的第i行与矩阵M2的第j列的乘积:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/046-3-i.jpg?sign=1739424514-s1di9r5kDahU52WMhpynDQ0Nn1A9T2fe-0-eaa85a546cbdcec75d5c80d2a3780387)
具体实例如下所示:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/046-4-i.jpg?sign=1739424514-VYAYTQjaJnDcRX6nPlSm2VrgcQ5BhW9u-0-0087c1e7a0204bf0dac9e877996ff27d)
现在我们来检查一下M3中的元素,比如元素M3[0][1]为40。根据黄金法则,M3[0][1]应该是矩阵M1的第0行与矩阵M2的第1列相乘的结果,如下图所示:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/046-5-i.jpg?sign=1739424514-rVfheCtB4d199DBqXY0D6joWbhkWF1Vo-0-08caf55fd81735ec48d83e84d885d405)
相应的行列乘积结果是2*-3+3*12+5*2=40,和我们预期的一样。对矩阵M3中每个元素重复使用这个计算过程,就得到了矩阵乘法的运算规则。
注意,与常规的实数乘法运算不同的是,在矩阵乘法运算中运算对象的次序很重要。如果交换矩阵M1和M2在乘法运算中的次序,那么通常会得到一个不同的结果,而且在多数情况下根本无法进行乘法运算。例如,我们不能计算M2乘M1,因为(3,2)·(4,3)的两个内部维数不相等。
本书会涉及大量的矩阵乘法运算,但是我们将使用工具NumPy获得计算结果,而不是进行手工计算。如果你记住了黄金法则就会容易很多:对于矩阵乘法运算,内部维数必须相同,外部维数是运算结果矩阵的维数。对于我们给出的例子,矩阵(4,3)与矩阵(3,2)相乘,得到的乘积结果是一个(4,2)矩阵。
这就是矩阵乘法的原理。下面我们学习矩阵转置运算。