einsum的不同情况

404 阅读1分钟

爱因斯坦求和约定(Einstein summation convention),简称EinSum,是一种表示多重索引运算的简洁记号。它不仅可以表示外积,还可以表示点积、矩阵乘积、张量收缩等各种张量操作。

爱因斯坦求和约定

爱因斯坦求和约定的规则是,如果一个索引在一个表达式中出现两次,则暗示对该索引求和。比如: -aibia_i b_i 表示两个向量aa bb 的点积,即 iaibi\sum_i a_i b_i 。 -AijBjkA_{ij} B_{jk} 表示矩阵乘法,即 jAijBjk\sum_j A_{ij} B_{jk}

外积与爱因斯坦求和约定

外积(outer product)是爱因斯坦求和约定的一种特殊情况。外积计算的是两个向量的所有元素之间的乘积,没有求和操作。例如: -cij=aibjc_{ij} = a_i b_j 表示向量aa bb 的外积。

在使用 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)

这是因为 iaibi=14+25+36=32\sum_i a_i b_i = 1*4 + 2*5 + 3*6 = 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]])

这是因为 kAikBkj\sum_k A_{ik} B_{kj} 计算了矩阵乘法。