能发出这个post证明了两件事情: 1. 我是个脑瘫 2. 我微笑着面对自己是个脑瘫的事实
所有故事的幕后原因其实就是torch默认的
*
操作其实是element-wise Mult而不是传统的Matmul导致我开始怀疑人生,于是花了一些时间来搞清楚到底他们是干啥的
Matmul的故事
Matrix
- 首先一个正常的矩阵,是这个样子的
shape as [row,col]
- 长这样
Matrix Multiplication一般矩阵乘
-
- 然后正常的矩阵乘法的规则是
[row1, col1]*[row2, col2]
当col1 == row2
的时候,会产生一个[row1, col2]
- Example
- ❕ 注意 Pytorch中tensor直接做
*
包括torch.mul
并不是矩阵乘法!而是我们下面要讲到的逐点积!- 实际对应的是torch.matmul或者是
A @ B
` - torch中还支持了batch形式的matmul,即为torch.bmm(input, mat2); input-[b,n,m]; mat2-[b,m,p]; output-[b,n,p]
- 实际对应的是torch.matmul或者是
Element-Wise Multiplication逐点积
- 也就是所谓的矩阵星号乘,也就是矩阵点积
- torch中的dot方法输入的是1-D的,在这里不能用
- (有的时候也被叫做Hadmard Product / Schur Product)
-
- 规则是对于有一样shape的matrice(2-d Matrix叫做matrice,一维的就是vector啦),做对应位置元素的乘法
- 正常情况下只有完全一致的尺度才可以做
- 但是比较特殊的情况是对于torch来说,当尺度为[1,N]的时候,可以当做一个[N]的vector来处理
- 对第二个矩阵为[X,N]时候可以做乘法
- 相当于做了一个broadcast(经过我的测试貌似只有1维的时候会这么做)
- 对于[N,1]貌似是同理
- 这个骚操作貌似导致
[1,3]*[3,1] -- [3,3]
让我一时以为这是矩阵乘法,但是我发现反过来还是[3,3]于是发现了问题
- 从NN角度思考
- Conv对应的是element-wise
- 当然在Channel维度上还是Matrix Mult
- 而FC的对应的是Matrix Mult
- Conv对应的是element-wise
- 两者的一个对比
Dot Product矩阵内积(点积)
- 内积,点积累,对于两个[n,1]的,其内积等价于 Q.V^T,结果是一个scalar