PyTorch 矩阵乘法的方法总结 & 问题解答


在机器学习和深度学习中时,矩阵运算是最常见、有效提高计算效率的方法。因为特征和权重都以向量储存,矩阵运算就显得尤为重要,诸如梯度下降、反向传播、矩阵因子分解等重要的机器学习方法,都需要基于矩阵运算。


在深度学习中,神经网络将权重储存在矩阵当中,基于线性代数的运算在 GPU 上,可以对矩阵进行简单迅捷的计算处理。

小规模的矩阵运算,可以用 for 循环来快速运算。但是一旦遇到巨大的数据量,循环语句就会拖慢运算速度,这时候我们常常使用矩阵乘法,它可以极大提高运算的效率。

常见矩阵、向量、标量相乘方法

  • torch(mm)  二维矩阵乘法

torch.mm(mat1,ma2,out=None), 其中 mat1(n*m), mat2(m*d),  输出 out  的维度是 (n*d)。
注:计算两个二维矩阵的矩阵乘法,而且不支持广播。

  • torch.bmm()  三维带 Batch 矩阵乘法

torch.bmm(bmat1,bmat2,out=None),其中 bmat1(b*n*m), bmat2(B*m*d), 输出 out  的维度是 (B*n*d)。
注:该函数的两个输入必须是三维矩阵且第一维相同(表示 Batch 维度),不支持广播。

  • torch.matmul()  混合矩阵乘法 

torch.matmul(input,other,out=None),该方法较为复杂建议参考文档,两个张量的矩阵乘积,计算结果取决于张量的维度,支持广播。

  • torch.mul() 矩阵逐元素乘法 

torch.mul(mat1,other,out=None),其中 other  乘数可以是标量也可以是任意维度的矩阵,只要满足最终相乘即可,支持广播。

  • torch.mv() 矩阵向量乘法

torch.mv(mat, vec, out=None) ,对矩阵 mat 和向量 vec 进行相乘。如果 mat 是一个 n×m 张量,vec 是一个 m 元的一维张量,将会输出一个 n 元的一维张量,不支持广播。

  • torch.dot() 张量点乘法

torch.dot(tensor1, tensor2) ,计算两个张量的点乘, 两个张量都为 1-D 向量,不支持广播。

论坛热门问题

 Q:不用 for 循环,如何进行批数据向量相乘 ?
input shape:N x M x VectorSizeweight shape:M x VectorSize x VectorSize 目标 output shape:N x M x VectorSize
N 表示批尺寸,M 表示向量数量,VectorSize 则代表向量的大小。
如下图所示: 解决思路:

N, M, V=2, 3, 5a = torch.randn(N, M, V)b = torch.randn(M, V, V)a_expand = a.unsqueeze(-2)b_expand = b.expand(N, -1, -1, -1)c = torch.matmul(a_expand, b_expand).squeeze(-2)

原帖地址:https://discuss.pytorch.org/t/batch-matrix-vector-multiplication-without-for-loop/112841
 

Q:计算矩阵向量乘以批向量输入,出现 RuntimeError 报错 
给定:

# (batch x inp)v = torch.randn(5, 15)# (inp x output)M = torch.randn(15, 20)

计算:

# (batch x output)out = torch.Tensor(5, 20)for i, batch_v in enumerate(v):    out[i] = (batch_v * M).t()

但是 (i) 乘法对于两个维度相同的输入,都会出现:RuntimeError: inconsistent tensor size at /home/enrique/code/vendor/pytorch/torch/lib/TH/generic/THTensorMath.c:623
为什么会出现这个报错?有没有能避免行向量循环的方法?

  解决思路:
* 表示 elementwise 乘法,如果你用的是 Python3,可以使用 @ 算子可以用作矩阵-向量乘法和矩阵-矩阵乘法。

也可以使用 batch_v.mm(M),因为批向量矩阵(batched vector matrix)即矩阵-矩阵乘法。
此外还可以借助 bmm、 baddbmm 等方法消除 Python 中的循环操作。

原贴地址:https://discuss.pytorch.org/t/matrix-vector-multiply-handling-batched-data/203
 Q:不使用循环语句的前提下,如何计算矩阵向量相乘?
求 2×2 的矩阵乘以 3 个大小为 2 的向量,如果不使用循环,该如何实现?

备注:
1、使用循环语句时代码如下:

A=torch.tensor([[1.,2.],[3.,4.]])b=torch.tensor([[3.,4.], [5.,6], [7.,8.]])res = []for i in range(b.shape[0]):    res.append(torch.matmul(A, b[i]))

2、经尝试 torch.matmul (A.repeat ((2,1,1)) ,b) 行不通。

  解决思路:
可以通过 a.matmul (b.t ()) 实现。
原帖地址:https://discuss.pytorch.org/t/vectorize-matrix-vector-multiplication/88051


本公众号将持续更新 PyTorch 最新资讯和开发技巧,欢迎关注!