![机器学习编程:从编码到深度学习](https://wfqqreader-1252317822.image.myqcloud.com/cover/201/38335201/b_38335201.jpg)
4.2.1 矩阵乘法
你有没有思考过为什么机器学习程序通常需要在那些巨大的GPU计算架构上完成运行?这是因为机器学习系统的大部分时间都在做一种特定的运算,这种运算就是大规模的矩阵乘法运算,这种运算在GPU上的计算速度特别快。
为介绍矩阵乘法,我们先在这里给出一个“黄金法则”,即当且仅当第二个矩阵的行数与第一个矩阵的列数相同时,才可以将这两个矩阵相乘,如下图所示:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/045-i.jpg?sign=1739142823-wFATrJb5ONvtVLwHMSlNLTr7tui3Hvwa-0-3181ac1665894a5d7c191b081c977c33)
M1是(4,3)矩阵,M2是(3,2)矩阵。二者可以相乘吗?要回答这个问题,我们列出如下矩阵乘法运算的形式:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/045-2-i.jpg?sign=1739142823-xaz6YP3u7Hff8W83YRUTyDGl1dbzGtXk-0-abc7b06295a0dbaf58ff18bfa30c80fa)
请看乘法运算中两个矩阵的内部维数。如果这两个矩阵的内部维数相等,就可以把这两个矩阵相乘,乘积的结果将是具有外部维数的矩阵,在本例中是(4,2):
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/045-3-i.jpg?sign=1739142823-5WvVbGGqb4MZeMkpMCqpBN4QbmqmEsev-0-3cddd082ef7424b6c4d8754cfe1f5448)
下面让我们来看看具体实例,从简单的矩阵开始,即单行矩阵与单列矩阵的乘法,如下图所示:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/045-4-i.jpg?sign=1739142823-OUkGbYHe3Q5g0WsVp99AuXGvESmd12z8-0-e53d830876192daf6af76a045a8bc89b)
首先,检查一下该矩阵乘法是否有效。第一个矩阵是(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=1739142823-ZJvlkJrTNtCS1HbrCnw0tejDqurntKSU-0-a0e0b3416853e0201bbbd2d49cddccd8)
该矩阵乘法的结果如下所示:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/046-2-i.jpg?sign=1739142823-ZyyTXLThdQ6U9EvBhBeCJgMyP2MxhqVx-0-2152545338b4a4aa0dda68adb04df49b)
剧透预警:聪明的读者也许已经注意到了矩阵乘法与4.1节末尾内容的相似之处。你们可能已经猜到了,这种相似并非巧合。在我们介绍完矩阵乘法之后,将使用这种相似建立多重线性回归模型。
当矩阵包含多个行和多个列的时候又会怎样呢?在这种情况下,我们还是使用相同的行列计算方法,但是会将第一个矩阵的每一行与第二个矩阵的每一列进行运算。运算结果M3中的每个元素(i,j)是矩阵M1的第i行与矩阵M2的第j列的乘积:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/046-3-i.jpg?sign=1739142823-ZGrsxyGxMsLmXsTDxStJP8f6cHnuyMnc-0-533b76e60307d87df5688444874b708b)
具体实例如下所示:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/046-4-i.jpg?sign=1739142823-GixSrjSy3xVLFeqD0rQyXPB1svQWOequ-0-44b5ad21d7a8cfeb633987292eb0aa15)
现在我们来检查一下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=1739142823-ph5u4phDpa8n2HjbHTdfT7TbMLAwSMdl-0-799133f83754c69a3227f8787aba19d5)
相应的行列乘积结果是2*-3+3*12+5*2=40,和我们预期的一样。对矩阵M3中每个元素重复使用这个计算过程,就得到了矩阵乘法的运算规则。
注意,与常规的实数乘法运算不同的是,在矩阵乘法运算中运算对象的次序很重要。如果交换矩阵M1和M2在乘法运算中的次序,那么通常会得到一个不同的结果,而且在多数情况下根本无法进行乘法运算。例如,我们不能计算M2乘M1,因为(3,2)·(4,3)的两个内部维数不相等。
本书会涉及大量的矩阵乘法运算,但是我们将使用工具NumPy获得计算结果,而不是进行手工计算。如果你记住了黄金法则就会容易很多:对于矩阵乘法运算,内部维数必须相同,外部维数是运算结果矩阵的维数。对于我们给出的例子,矩阵(4,3)与矩阵(3,2)相乘,得到的乘积结果是一个(4,2)矩阵。
这就是矩阵乘法的原理。下面我们学习矩阵转置运算。