爱因斯坦求和约定(Einstein summation convention),简称EinSum,是一种表示多重索引运算的简洁记号。它不仅可以表示外积,还可以表示点积、矩阵乘积、张量收缩等各种张量操作。
爱因斯坦求和约定
爱因斯坦求和约定的规则是,如果一个索引在一个表达式中出现两次,则暗示对该索引求和。比如: - 表示两个向量 和 的点积,即 。 - 表示矩阵乘法,即 。
外积与爱因斯坦求和约定
外积(outer product)是爱因斯坦求和约定的一种特殊情况。外积计算的是两个向量的所有元素之间的乘积,没有求和操作。例如: - 表示向量 和 的外积。
在使用 torch.einsum 进行外积计算时,我们不会涉及求和操作。例如:
import torch
# 定义两个向量
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6, 7])
# 使用einsum计算外积
C = torch.einsum("i,j->ij", a, b)
print(C)
输出将是:
tensor([[ 4, 5, 6, 7],
[ 8, 10, 12, 14],
[12, 15, 18, 21]])
这个操作只是简单地计算了两个向量之间的所有元素的乘积,并没有任何求和操作。
让我们看看其他一些使用爱因斯坦求和约定的操作:
点积(Dot Product):
import torch
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
dot_product = torch.einsum("i,i->", a, b)
print(dot_product)
输出将是:
tensor(32)
这是因为 。
矩阵乘法(Matrix Multiplication):
import torch
A = torch.tensor([[1, 2], [3, 4]])
B = torch.tensor([[5, 6], [7, 8]])
matrix_product = torch.einsum("ik,kj->ij", A, B)
print(matrix_product)
输出将是:
tensor([[19, 22],
[43, 50]])
这是因为 计算了矩阵乘法。