矩阵的乘法运算

阅读 13

PyTorch中,数据常常以矩阵的形式进行存储。因此,就免不了矩阵之间的运算。本篇简要介绍和矩阵相关的乘法运算。

Hadamard 积

有两个形状相同的矩阵,将它们相同位置上的元素进行相乘,得到的结果被称为 Hadamard 积,又称逐元素积。来看一个例子:

import torch

A = torch.arange(20).reshape(5, 4)
B = A.clone()
print(A)

# Hadamard积(Hadamard product)
print(A * B)

矩阵A和B的数据如下:

那么,Hadamard 积的结果如下:

对于第二行第三列的值c23,它是由矩阵A的a23乘以矩阵B的b23所得。

也就是说,Hadamard 积中的元素cij的值是由矩阵A中的元素aij乘以矩阵B中的元素bij所得。

注意:矩阵的 Hadamard 积要求两个矩阵的形状完全相同

点积(dot product)

给定向量x(向量是一组有序的数字,和矩阵的两个维度不同,它只有一个维度和向量y,将它们相同位置的元素相乘,最后,将其和进行汇总,得到的结果被称为点积(dot production),表示为xTy<x, y>。来看一个例子:

x = torch.arange(4, dtype=torch.int64)
y = torch.tensor([4, 3, 2, 1])

print(torch.dot(x, y))
print(torch.sum(x * y))

使用torch.dot方法来求向量x和y的点积,结果是一个标量:0 * 4 + 1 * 3 + 2 * 2 + 3 * 1 = 10。

另外,还可以通过执行按元素乘法,再求和得到它们的点积。所以,上面torch.sum(x * y)得到的结果也是点积。

矩阵-向量积

对于一个m行n列的矩阵A,和一个长度为n的向量x,如何求它们的矩阵-向量积呢?

知道如何计算点积,就能理解矩阵-向量积(matrix-vector product)。

矩阵A用它的行向量表示为:

那么,矩阵向量积Ax就是一个长度为m的列向量,它的第i个元素为其点积aiTx:

在PyTorch中,我们可以使用mv函数来求矩阵-向量积:

x = torch.arange(4, dtype=torch.int64)
A = torch.arange(20, dtype=torch.int64).reshape(5, 4)
z = torch.mv(A, x)

矩阵A的数据如下:

向量A为:tensor([0, 1, 2, 3])。那么,结果 z 的结果为:tensor([ 14, 38, 62, 86, 110])

其第二个值a2Tx为:4 * 0 + 5 * 1 + 6 * 2 + 7 * 3 = 38。

注意:矩阵-向量积有要求:矩阵的列数量和向量的长度必须相同。

矩阵-矩阵乘法

矩阵-矩阵乘法表示为C=AB对于矩阵A(n行k列)和矩阵B(k行m列),最简单的求法是将A表示为行向量,B表示为列向量:

然后,求得C中的每个元素cij。cij的值为点积aiTbj:

来看一个例子:

A = torch.arange(20, dtype=torch.int64).reshape(5, 4)
B = torch.tensor([[4, 4, 4], [2, 2, 2], [3, 3, 3], [1, 1, 1]])
C = torch.mm(A, B)

矩阵A有5行4列:

矩阵B有4行3列:

其结果为5行3列:

注意:两个矩阵相乘,矩阵A的列数量和矩阵B的行数量必须相同!

可以看到,矩阵乘法和Hadamard积得到的结果虽然都是一个矩阵,但是,它们的运算规则和要求都是不相同的。

参考

  • Aston Zhang, Zachary C. Lipton, Mu Li, Alexander J. Smola. 动手学深度学习-PyTorch版,2023。
最后编辑于: 2026-05-05

评论(0条)

(必填)
复制成功