在Tensorflow、Numpy和PyTorch中都提供了使用einsum的api,einsum是一种能够简洁表示点积、外积、转置、矩阵-向量乘法、矩阵-矩阵乘法等运算的领域特定语言。在Tensorflow等计算框架中使用einsum,操作矩阵运算时可以免于记忆和使用特定的函数,并且使得代码简洁,高效。
如对矩阵和矩阵做矩阵乘,然后对列求和,最终得到向量,即:
使用爱因斯坦求和约定表示为:
在Tensorflow、Numpy和PyTorch中对应的einsum字符串为:ik,kj->j
。在上面的字符串中,隐式地省略了重复的下标k,表示在该维度矩阵乘;另外输出中未指明下标i,表示在该维度累加。
Numpy、PyTorch和Tensorflow中的einsum
einsum在Numpy中的实现为np.einsum,在PyTorch中的实现为torch.einsum,在Tensorflow中的实现为tf.einsum,均使用同样的函数签名einsum(equation,operands),其中,equation传入爱因斯坦求和约定的字符串,而operands则是张量序列。在Numpy、Tensorflow中是变长参数列表,而在PyTorch中是列表。上述例子中,在Tensorflow中可写作:tf.einsum('ik,kj->j',mat1,mat2)
。 其中,mat1、mat2为执行该运算的两个张量。注意:这里的(i,j,k)的命名是任意的,但在一个表达式中要一致。
PyTorch和Tensorflow像Numpy支持einsum的好处之一就是,einsum可以用于深度网络架构的任意计算图,并且可以反向传播。在Numpy和Tensorflow中的调用格式如下:
其中,□是占位符,表示张量维度;arg1,arg3是矩阵,arg2是三阶张量,运算结果是矩阵。注意:einsum处理可变数量的输入。上面例子中,einsum制定了三个参数的操作,但同样可以操作一个参数、两个参数和三个参数及以上的操作。
典型的einsum表达式
内积:又称点积、点乘,对应位置数字相乘,结果是一个标量,有见向量内积和矩阵内积等。
向量a和向量b的内积:
内积几何意义:
外积:又称叉乘、叉积、向量积,行向量矩阵乘列向量,结果是二阶张量。注意到:张量的外积作为张量积的同义词。外积是一种特殊的克罗内克积。
向量a和向量b 的外积:
外积的几何意义:
其中,
由于PyTorch可以实时输出运算结果,以PyTorch使用einsum表达式为例。
矩阵转置 Bji=Aij
求和
列求和(列维度不变,行维度消失)
列求和(列维度不变,行维度消失)
矩阵-向量相乘
矩阵-矩阵乘法
点积
向量
矩阵
外积
batch矩阵乘
张量缩约
batch矩阵相乘是张量缩约的一个特例,比如有两个张量,一个n阶张量,一个m阶张量。取n=4,m=5,假定维度且,将这两个张量在这两个维度上(A张量的第2、3维度,B张量的第3、5维度)相乘,获得新张量,如下所示:
多张量计算
如前所述,einsum可用于超过两个张量的计算,以双线性变换为例: