Einstein Summation Convention

爱因斯坦求和约定

爱因斯坦求和约定(Einstein Summation Convention)是一种在数学和物理学中广泛使用的简化符号规则,特别是在张量计算和理论物理中。这个约定使得求和的过程更加简洁和直观,通常用于描述多维空间中的向量、矩阵或张量运算 在数学里,特别是将线性代数套用到物理时,爱因斯坦求和约定(Einstein summation convention)是一种标记的约定,又称为爱因斯坦标记法(Einstein notation),在处理关于坐标的方程式时非常有用。

简介

按照爱因斯坦求和约定,当一个单独项目内有标号变量出现两次,一次是上标,一次是下标时,则必须总和所有这单独项目的可能值。通常而言,标号的标值为1、2、3(代表维度为三的欧几里得空间),或0、1、2、3(代表维度为四的时空或闵可夫斯基时空)。这种约定的好处是可以简化数学公式的书写,使得公式更加简洁。

具体来说:

  • 当一个索引同时出现在上标(如 Ai )和下标(如 Bi )时,表示对这个索引进行求和。例如:

AiBi = ∑iAiBi

这表示对于所有的 i ,计算 AiBi 的乘积并求和。

假设我们有一个向量 A = [A1, A2, …, An] 和另一个向量 B = [B1, B2, …, Bn] ,它们的点积可以表示为:

A ⋅ B = AiBi

按照爱因斯坦求和约定,这里隐含了对 i 从 1 到 n 的求和,即:

$$ A \cdot B = \sum_{i=1}^{n} A^i B_i $$

!!!注意到:

请不要将上标与指数混淆,大多数涉及到方程式都是线性的,不超过变量的一次方。

应用

torch.einsum 是一个非常强大的工具,可以用来进行各种张量运算,如矩阵乘法、转置、内积、外积等,利用简洁的字符串表示法。其优势在于,它不仅能够简洁地表达复杂的操作,还能够通过优化来提升性能,尤其是在多维数组和高维张量的操作中。

语法:

1
torch.einsum(equation, *operands)
  • equation:一个字符串,定义了张量运算的规则。该字符串使用爱因斯坦求和约定,指示了每个输入张量的维度,以及如何进行求和操作。
  • *operands:一个或多个输入张量。

例子

矩阵乘法

对于两个矩阵 A 和 B ,其矩阵乘法可以通过 torch.einsum 表示为:

1
torch.einsum('ik,kj->ij', A, B)

这里 'ik,kj->ij' 表示:

  • 输入部分 (ik,kj)
    • i 和 k 是矩阵 A 的索引,其中 i 对应 A 的行,k 对应 A 的列。
    • k 和 j 是矩阵 B 的索引,其中 k 对应 B 的行,j 对应 B 的列。 在这里,k 作为共享索引出现在了 A 和 B 中,这代表我们会对 A 中的列和 B 中的行进行求和(也就是矩阵乘法中的点积)。
  • 箭头部分 ->ij
    • i 对应矩阵 A 的行索引。
    • j 对应矩阵 B 的列索引。 箭头后的部分指定了输出张量 C 的维度(即结果矩阵的维度),因此这里 ij 表示输出矩阵 C 的维度将是 m × p ,即矩阵 A 的行数和矩阵 B 的列数。

也就是说,对于矩阵 A 中的每个行索引 i 和列索引 k ,以及矩阵 B 中的行索引 k 和列索引 j ,我们计算这些索引相同的元素的乘积,并对 k 进行求和(即矩阵乘法中的点积)。

对于复杂一点的例子,比如高纬度的张量运算,torch.einsum 也能够轻松应对。

批量矩阵乘法

对于批量矩阵乘法,假设 A 和 B 是三维张量,可以使用如下表达式:

1
2
3
4
C[b, i, j] = sum(A[b, i, k] * B[b, k, j] over k)

# torch.einsum 表达式
torch.einsum('bik,bkj->bij', A, B)