Matmul的故事

学着学着学傻了...

Posted by tianchen on November 29, 2019

能发出这个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]

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
  • 两者的一个对比

Dot Product矩阵内积(点积)

  • 内积,点积累,对于两个[n,1]的,其内积等价于 Q.V^T,结果是一个scalar