einsum is all you need-einsum函数在数值计算中的应用示例说明

在深度学习框架和numpy等数值计算库中,记住不同的矩阵计算,如内积(dot products)、外积(outer products)、矩阵转置(transposes ),矩阵和向量相乘,以及矩阵和矩阵的乘法这些运算的函数名称和参数是容易混淆的一件事情,而爱因斯坦和(einsum)是通过一种领域语言(domain-specific language),用一种优雅的方式去解决这个问题,同时更进一步还可以描述更复杂的tensor的操作。

einsum函数采用如下的格式,einsum(equation,operands),下面为一个模板:result=einsum(“□□,□□□,□□->□□”,arg1,arg2,arg3)。其中□为占位符,表示张量的一个维度,如前面的equation的形式为“□□,□□□,□□->□□”,表示的含义为由三个输入参数,第一个和第三个为矩阵,第二是阶数为3的张量。计算的结果为矩阵。

下面将解释一些使用示例:

torch.einsum('ij->ji', [a])//矩阵转置
torch.einsum('ij->', [a])//矩阵所有元素求和,右边没有表示标量
torch.einsum('ij->j', [a])//矩阵列求和
torch.einsum('ij->i', [a])//行向量求和
torch.einsum('ik,k->i', [a, b])//矩阵向量相乘
torch.einsum('ik,kj->ij', [a, b])//矩阵矩阵相乘
torch.einsum('i,i->', [a, b])//向量内积
torch.einsum('ij,ij->', [a, b])//两个矩阵对应元素相乘然后求和
torch.einsum('ij,ij->ij', [a, b])//哈达玛积(Hadamard product),cij=aij×bij,则称矩阵C=(cij)为A和B的哈达玛积
torch.einsum('i,j->ij', [a, b])//向量外积
torch.einsum('ijk,ikl->ijl', [a, b])//批量矩阵乘法,i为batch
torch.einsum('pqrs,tuqvr->pstuv', [a, b]).shape//tensor contraction
torch.einsum('ik,jkl,il->ij', [a, b, c])//bilinear transformation.
torch.einsum("ii -> i", m)//矩阵的迹
torch.einsum('...qd, ...kd->...qk', A,B) //广播操作,...指代任意维度。
torch.einsum('...ij->...ji', [a])//对一个高维度张量的最后两个维度进行转置操作

其中张量的缩并(tensor contraction)操作是两个多维张量中的分别两个大小相同的维度的内积,具体可以参考链接1中的示例。其中广播操作(broadcast)的实现方式可以参考引文7中的示例说明。

关于示例和相关说明,后面再根据实践会进一步补充更新或进行相关的修正,欢迎读者提出问题意见和建议。

References

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *