einsum的本质理解

einsum是numpy和pytorch中一个计算快速灵活的矩阵操作函数,看了网上很多文章解释这个操作,都没有阐述到它的本质,那么多种情况总不能都背记下来吧,终于今天看到一个本质解释,记录下来以后备用。原文地址(似乎也不是原创):
https://www.jianshu.com/p/27350d110caf
本质就是下面这个图,einsum操作符就是下面这个嵌套循环的关键参数的简记:
einsum的本质理解_第1张图片
具体解释:
(1)einsum操作符的’ -> ‘左边是输入,右边是输出。输入可以1到N个,用’ , ‘分隔各个输入变量,输出只能一个。每个变量的字母表示对应的维度。字母数量必须和维度数量一致,否则报错。
(2)首先根据输出维度决定最外面的for循环的嵌套,比如上面输出C有两个维度i,j,就是两层循环嵌套。
(3)然后在输出侧消失的维度标记字母则表示发生了相加聚合,因此需要在里层循环。
(4)循环的最底层则是对应输入变量的对应元素的相乘,如上面的A[i,k] * B[k,j]
(5)还需要补充说的就是’ -> ‘省略时表示:输出矩阵时按照所有输入的字母去掉重复字母后按字母表顺序排列。比如’ik,kj’表示的是’ik,kj -> ij’。可见这个操作符真是把字符压缩到了极致,能省则省,其他我认为没有必要为了省这几个字符加大了理解难度。

上述解释可以帮助我们理解任何einsum操作符,但是具体应用时我们更需要掌握构造符合要求的操作符,我认为可按如下步骤构造:
(1)首先把输出变量的维度写到’->'右边,
(2)然后观察输入变量的哪些维度发生了相加聚合,发生相加聚合的轴要用输出没有的字母表示
(3)然后观察哪些输入变量间的维度轴需要同步操作,通常是具有同样物理含义的轴,它们用同一个字母表示,
(4)最后再核验一下。

你可能感兴趣的:(随笔·各种知识点整理,python,numpy,机器学习)