左边是权重,右边是变量
高维可以看成二维的堆叠
总结:二维是一维的堆叠,三维是二维的堆叠。但似乎是为了引入矩阵,本来应该是左上角是第一组权重和第一组变量的乘积这种表示表示来着,最后成了和列向量乘积(即矩阵乘法必须第一个的列和第二个的行数相等,右矩阵需要转置一下),但更高维度又变了回来,所以之后更高维的维数必须一一对应。
如:(3,5,6,4)的矩阵只可以和(3,5,4,6)的矩阵相乘,每个二维矩阵一一相乘
得到(3,5,6,6)的矩阵。
这应该是为了引入矩阵计算,之后变回来是为了批量化计算
例子:
一个(6x4)的矩阵,每一行是一组权重,有6组权重
和一个(4x3)的矩阵相乘,每一列是一个一维张量,有4列张量
把6看成是批量化处理6次,再具体一点
[1,2,3,4]x[[123],123],[123],[123]]
=【123】+【246】+【369】+【4812】
一个(6x4)的矩阵和一个3x4x3的矩阵相乘
6看成批量化处理
[1,2,3,4]x[[123],123],[123],[123]](有三组),会先把[1,2,3,4]广播三遍
现在换成3x6x4的矩阵和3x4x3的矩阵,此时就是对应矩阵相乘了,得到3x6x3的矩阵
同理更高维度也一样。
下面是我的一些推导。。。🙂🙂
一维张量和一维张量相乘,相当于权重和变量相乘,结果是一个数
数加数,0维可以直接相加,所以最后是一个0维张量
res=torch.matmul(torch.tensor([1, 2]),torch.tensor([1, 2]))
#tensor(5) 0维
二维张量和一维张量相乘,相当于多组权重和变量相乘,结果是一个一维张量。扩维
res=torch.matmul(torch.tensor([[3, 4], [1, 2]]),torch.tensor([1, 2]))
# tensor([11, 5]) torch.Size([2])
如5就是[1,2]和[1,2]对应元素相乘后相加得到的。因为俩个结果是0维,可以相加,
所以最后输出5
二维张量和二维张量相乘,相当于多组权重和多组变量相乘,结果是一个二维张量
向量+向量 ,不可以直接相加,最后是一个二维张量
如[3,6]就是[1,2]和[[1,1],[2,2]]矩阵乘法后相加得到的
这就是矩阵乘法伢,对应元素相乘相加。
res=torch.matmul(torch.tensor([[3, 4], [1, 2]]),torch.tensor([[1, 2], [1, 2]]))
#tensor([[ 7, 14], torch.Size([2, 2])
[ 3, 6]])
最开始我以为应该是下面这样:
左上角是第一组权重和第一组变量的乘积
右上角是最后一组权重和第一组变量的乘积
左下角是第一组权重和最后一组变量的乘积
右下角是最后一组权重和最后一组变量的乘积
但结果表明这就是纯正的矩阵乘法,
或者也可以这么理解吧,右边一维向量时是按列来排序的,上面是简写了
res=torch.matmul(torch.tensor([3, 4]),torch.tensor([[1],[2]]))
res1=torch.matmul(torch.tensor([3, 4]),torch.tensor([1,2]))
#tensor([11])
tensor(11)
似乎确实是这样,只不过最后的结果一个是一维张量,一个是零维张量
一维张量和二维张量相乘
res=torch.matmul(torch.tensor([3, 4]),torch.tensor([[1, 2],[1, 2]]))
tensor([ 7, 14])
torch.Size([2])
发现确实是左侧行向量,右侧列向量。这就是简单的矩阵运算
三维张量以及更高维度的张量看成二维张量的堆叠。
三维张量和二维张量相乘,相当于多批次(每一批次多组)的二维矩阵相乘,结果是一个三维张量
res=torch.matmul(torch.tensor([[[1, 2], [3, 4]],[[1, 2], [3, 4]]])
,torch.tensor([[1, 2], [1, 2]]))
tensor([[[ 3, 6],
[ 7, 14]],
[[ 3, 6],
[ 7, 14]]])
torch.Size([2, 2, 2])
二维张量和三维张量相乘,自动把二维张量扩充到对应维度的三维张量
如[3377]也就是[1234]和矩阵[1111]矩阵乘法后相加得到的
res=torch.matmul(torch.tensor([[1, 2], [3, 4]]),
torch.tensor([[[1, 2], [1, 2]],[[1, 1], [1, 1]]]))
tensor([[[ 3, 6],
[ 7, 14]],
[[ 3, 3],
[ 7, 7]]])
torch.Size([2, 2, 2])
三维张量和三维张量相乘
res=torch.matmul(torch.tensor([[[1, 2], [3, 4]],[[1, 2], [3, 4]]]),
torch.tensor([[[1, 2], [1, 2]],[[1, 1], [1, 1]]]))
tensor([[[ 3, 6],
[ 7, 14]],
[[ 3, 3],
[ 7, 7]]])
torch.Size([2, 2, 2])
矩阵加矩阵,最后是一个三维张量
四维时:
shape=[2,1,4,5],b:shape=[1,1,5,4]相乘,输出的结果中,前两维保留的是[2,1],最终结果shape=[2,1,4,4]