爱因斯坦求和

Einstein Summation
linear algebra
deep learning
tensor
Author
Published

Monday, September 9, 2024

在物理学、机器学习、科学计算等领域,张量的操作是常见而又复杂的。而在张量操作中,有一种优雅的数学简化工具,即爱因斯坦求和约定(Einstein Summation Convention),它极大地减少了公式的复杂性,特别是在高维张量的运算中。

什么是爱因斯坦求和?

爱因斯坦求和约定是由著名物理学家阿尔伯特·爱因斯坦提出的一种简化公式的符号约定。根据这一约定,当一个表达式中有重复的索引变量时,默认对该索引进行求和运算,而不需要显式地写出求和符号。

例如,两个矩阵 (A) 和 (B) 的乘法可以通过爱因斯坦求和简化。通常,矩阵乘法公式为:

\[ C_{ik} = \sum_{j} A_{ij} B_{jk} \]

在爱因斯坦求和的符号下,重复出现的索引 (j) 表示对其求和,因此公式可以写为:

\[ C_{ik} = A_{ij} B_{jk} \]

我们用torch实现这个例子:

import torch
a = torch.arange(6).reshape(2, 3)
b = torch.arange(15).reshape(3, 5)
torch.einsum('ik,kj->ij', [a, b])
tensor([[ 25,  28,  31,  34,  37],
        [ 70,  82,  94, 106, 118]])

column sum

a = torch.arange(6).reshape(2, 3)
torch.einsum('ij->j', [a])
tensor([3, 5, 7])

row sum

torch.einsum('ij->i', [a])
tensor([ 3, 12])

sum

torch.einsum('ij->', [a])
tensor(15)

transpose

torch.einsum('ij->ji', [a])
tensor([[0, 3],
        [1, 4],
        [2, 5]])

batch matrix multiplication

a = torch.randn(3,2,5)
b = torch.randn(3,5,3)
torch.einsum('ijk,ikl->ijl', [a, b])
tensor([[[-1.2472,  2.7077,  0.5733],
         [ 2.4548, -1.9124,  0.7328]],

        [[-2.8607,  0.8644,  1.9380],
         [-0.6378, -0.2192, -0.0412]],

        [[-3.4632, -3.1542, -0.1621],
         [-2.8122,  0.3396,  2.3991]]])

为什么爱因斯坦求和如此重要?

爱因斯坦求和的核心优势在于它可以极大地简化复杂的张量运算,特别是在涉及高维度张量时。这种简洁的符号不仅减少了书写和理解的困难,还可以避免出错,因为我们不再需要反复地书写求和符号。

在物理学中,尤其是在广义相对论和量子力学中,张量的运算无处不在,而爱因斯坦求和约定为这些运算提供了极大的便利。