详解torch.mul、torch.mm、torch.bmm、torch.matmul

1. torch.mul —— 逐元素乘法(Element-wise Multiplication)

功能:

对两个 tensor 进行逐个元素的乘法操作。如果维度不同,需要满足广播机制(Broadcasting)的要求。

输入要求:

  • 两个 tensor 的形状相同,或可以广播成相同形状
  • 支持任意维度(1D, 2D, 3D, nD)。

返回结果:

  • 一个新的 tensor,形状与广播结果一致,所有元素是对应位置元素的乘积。

示例:

import torch

# 相同形状
a = torch.tensor([[1, 2], [3, 4]])
b = torch.tensor([[5, 6], [7, 8]])
print(torch.mul(a, b))
# 输出:
# tensor([[ 5, 12],
#         [21, 32]])

# 广播情况
a = torch.tensor([[1], [2], [3]])  # shape: (3, 1)
b = torch.tensor([10, 20])        # shape: (2,)
print(torch.mul(a, b))
# 输出:
# tensor([[10, 20],
#         [20, 40],
#         [30, 60]])

常见应用:

  • 损失函数计算,如平方差损失。
  • 特征掩码、注意力加权等。

2. torch.mm —— 二维矩阵乘法(Matrix Multiplication for 2D Tensors)

功能:

执行标准的二维矩阵乘法(矩阵点乘)。

输入要求:

  • 两个 2D tensor。
  • 第一个 tensor 的形状为 (m, n),第二个为 (n, p)

返回结果:

  • 形状为 (m, p) 的 tensor。

示例:

a = torch.tensor([[1, 2], [3, 4]])  # shape: (2, 2)
b = torch.tensor([[5, 6], [7, 8]])  # shape: (2, 2)

print(torch.mm(a, b))
# 输出:
# tensor([[19, 22],
#         [43, 50]])

计算方式是经典的线性代数矩阵乘法:

[1*5 + 2*7, 1*6 + 2*8] = [19, 22]
[3*5 + 4*7, 3*6 + 4*8] = [43, 50]

常见应用:

  • 神经网络中线性层、前向传播。
  • 线性代数计算中的矩阵乘。

3. torch.bmm —— 批量矩阵乘法(Batch Matrix Multiplication)

功能:

对一批(多个)二维矩阵进行并行矩阵乘法。

输入要求:

  • 两个 3D tensor。
  • 第一个 tensor 形状为 (b, m, n),第二个为 (b, n, p)b 是 batch size。

返回结果:

  • 一个形状为 (b, m, p) 的 tensor,包含 b(m, p) 的结果。

示例:

a = torch.randn(5, 2, 3)  # 5个 (2x3) 的矩阵
b = torch.randn(5, 3, 4)  # 5个 (3x4) 的矩阵

result = torch.bmm(a, b)
print(result.shape)  # 输出:torch.Size([5, 2, 4])

每个 batch 内部等价于 torch.mm(a[i], b[i])

常见应用:

  • RNN 中批量处理时间序列。
  • Transformer 中的批量注意力计算。

4. torch.matmul —— 广义矩阵乘法(General Matrix Multiplication)

功能:

通用乘法接口,自动根据输入的维度来选择:

  • 标量乘法(1D × 1D)
  • 矩阵乘法(2D × 2D)
  • 批次矩阵乘法(3D × 3D 或 nD × nD)

输入规则及行为:

A.shapeB.shape结果行为
(n,)(n,)点积,返回标量
(m, n)(n,)矩阵 × 向量,返回 (m,)
(m, n)(n, p)矩阵 × 矩阵,返回 (m, p)
(b, m, n)(b, n, p)批量矩阵乘,返回 (b, m, p)
广播 nD广播 nD广播后批量矩阵乘

示例 1:向量点积

a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
print(torch.matmul(a, b))  # 输出:32

示例 2:矩阵 × 向量(向量与矩阵的每一个[i,:]向量相乘都是向量点积)

a = torch.tensor([[1, 2], [3, 4]])  # shape: (2, 2)
b = torch.tensor([5, 6])           # shape: (2,)
print(torch.matmul(a, b))  # 输出: tensor([17, 39])

1*5+2*6=17

3*5+4*6=39

示例 3:批次矩阵乘法

a = torch.randn(10, 3, 4)
b = torch.randn(10, 4, 5)
print(torch.matmul(a, b).shape)  # 输出: torch.Size([10, 3, 5])

常见应用:

  • 推荐作为统一接口使用。
  • 自动适配各类矩阵乘操作,不需区分 mm、bmm。

总结表格

函数名称功能说明输入维度返回维度特点
torch.mul逐元素乘法任意维度(支持广播)与输入形状一致element-wise,逐元素乘
torch.mm传统矩阵乘法(2D)(m, n) × (n, p)(m, p)只能用于二维矩阵乘
torch.bmm批量矩阵乘法(3D)(b, m, n) × (b, n, p)(b, m, p)只能用于三维批量操作
torch.matmul广义矩阵乘法(推荐)1D、2D、nD(自动判断)自动推断自动广播,通用、最灵活

如你希望进一步对比实际运行时间、与 NumPy 对照、或在实际模型中如何使用,我也可以继续详细扩展。是否需要我再配合实际神经网络例子来说明?

07-11
### 矩阵乘法操作 `.matmul` 的用途与示例 在 PyTorch 中,`.matmul()` 是用于执行两个张量之间的矩阵乘法运算的函数。它可以处理不同维度的张量,并自动适配运算方式。例如,对于二维张量(矩阵),它执行标准的矩阵乘法;对于高维张量,则按最后两个维度进行矩阵乘法,并广播其余维度。 #### 基本语法 ```python torch.matmul(input, other, *, out=None) → Tensor ``` - `input` 和 `other` 是参与运算的两个张量。 - 运算结果是一个新的张量,表示两个输入张量的矩阵乘积。 #### 示例代码 以下是一些 `.matmul()` 的典型使用场景: ##### 1. 两个二维张量(矩阵)相乘 ```python import torch a = torch.randn(3, 4) b = torch.randn(4, 5) c = torch.matmul(a, b) print(c.shape) # 输出: torch.Size([3, 5]) ``` 该操作等价于传统的矩阵乘法,其中第一个矩阵的列数必须等于第二个矩阵的行数 [^1]。 ##### 2. 一个二维张量与一个三维张量相乘 ```python a = torch.randn(3, 4) b = torch.randn(5, 4, 6) c = torch.matmul(a, b) print(c.shape) # 输出: torch.Size([5, 3, 6]) ``` 在此情况下,`.matmul()` 对最后两个维度执行矩阵乘法,并广播前面的维度。 ##### 3. 两个三维张量相乘 ```python a = torch.randn(2, 3, 4) b = torch.randn(2, 4, 5) c = torch.matmul(a, b) print(c.shape) # 输出: torch.Size([2, 3, 5]) ``` 这里对每个批次分别执行矩阵乘法,输出保留批次维度。 #### 注意事项 - 输入张量的尺寸必须满足矩阵乘法规则:即第一个张量的最后一个维度必须与第二个张量的倒数第二个维度一致。 - `.matmul()` 可以替代 `torch.mm()`,但后者仅支持二维张量,而前者支持更高维度 [^1]。 #### 与其他乘法操作的区别 - `torch.mul()`:逐元素相乘,要求两个张量具有相同的形状或可广播。 - `torch.mm()`:仅支持二维张量的矩阵乘法,不支持广播。 - `torch.bmm()`:批量矩阵乘法,适用于三维张量,其中前两个维度为 `(batch_size, n, m)` 和 `(batch_size, m, p)`,输出为 `(batch_size, n, p)` [^1]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sheldon Chao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值