点乘 叉乘 点积 内积 外积的定义
一、点乘(Dot Product)、点积 内积
点乘也称为标量积或内积,是两个等长向量之间的运算。它将两个向量的对应元素相乘,然后将乘积相加,得到一个标量值。点乘只适用于向量。
点积是点乘的另一种说法,通常在数学和物理学中使用,但在深度学习中,点乘和点积可以互换使用。
内积通常指的是点乘,是两个向量之间的运算,得到一个标量值。内积的概念也可以扩展到矩阵,称为矩阵乘法,但矩阵乘法的结果是一个矩阵,而不是一个标量。
1、对应元素相乘,求和
dot:只能张量中向量(一维)操作,结果是一个标量。比如两个embedding求相似度。
import torch
x = torch.tensor([1,2,3])
y = torch.tensor([1,1,2])
z = torch.dot(x,y)
print(z)
## 结果:tensor(9)
k = x*y
m = torch.mul(x,y)
print(k)
print(m)
2、 对应元素相乘,不求和
*和 mul 操作是一样的,要求x,y具有相同的维度(一维向量,二维矩阵都可以)
import torch
x = torch.tensor([[3,3],[3,3]])
y = torch.tensor([[1,2],[3,4]])
k = x*y
m = torch.mul(x,y) #x.mul(x)
print(k)
print(m)
## tensor([[ 3, 6],
[ 9, 12]])
## tensor([[ 3, 6],
[ 9, 12]])
3、 矩阵相乘
@和torch.mm和torch.matmul 作用一样
矩阵相乘有torch.mm和torch.matmul两个函数。其中前一个是针对二维矩阵,后一个是高维。当torch.mm用于大于二维时将报错。
a = [B,E]
b = [E,B]
c = torch.mm(a,b)
C 维度是[B,B]
4、torch.matmul重点解读
matmul 有广播机制
(1)两个 1 维,向量内积
a = torch.ones(3)
b = torch.ones(3)
print(torch.matmul(a,b)) # tensor(3.)
(2)两个 2 维,矩阵相乘
a = torch.ones(3,4)
b= torch.ones(4,3)
print(torch.matmul(a,b))
# tensor([[4., 4., 4.],
# [4., 4., 4.],
# [4., 4., 4.]])
(3)一个 1 维,二个 2 维,矩阵和向量相乘
注意:相靠近的那个维数要相同,比如(7)和(7,8,5),又比如(7,8,5)和(5)
a = torch.ones(3)
b= torch.ones(3,4)
print(torch.matmul(a,b)) # tensor([3., 3., 3., 3.])
a = torch.ones(3,4)
b = torch.ones(4)
print(torch.matmul(a,b)) # tensor([4., 4., 4.])
(4)、高维情况
i)其中一个1维,另一个N维(N>2): 类似3),即需要靠近的那个维数相同,比如(7,)和(7,8,11),又比如(7,8,11)和(11,)
ii)都高于2维,那么除掉最后两个维度之外(两个数的维数满足矩阵乘法,即,(m,p)和(p,n)),剩下的纬度满足pytorch的广播机制。
a=torch.ones(5,3,4,1)
b=torch.ones( 3,1,1)
print(torch.matmul(a,b))