O resumo de Einstein

Operações de tensor em Python
técnicas de soma de Einstein
exemplos de numpy e fluxo de tensor
O resumo de Einstein cover image

A notação de soma de Einstein é uma forma concisa e poderosa de representar operações tensoriais, frequentemente usada em física e aprendizado de máquina. Ele nos permite escrever cálculos complexos em tensores de forma compacta. Abordaremos o básico do somatório de Einstein, como usá-lo em Python com Numpy e Tensorflow e forneceremos exemplos para ilustrar seu uso.

Noções básicas do somatório de Einstein

A notação de soma de Einstein (Einsum) é baseada na ideia de somar índices repetidos em expressões tensoriais. Baseia-se nas duas regras a seguir:

1. Soma de índices repetidos: Se um índice aparecer duas vezes em um termo, ele será somado

2. Índices livres: Índices que aparecem apenas uma vez são índices livres e representam os eixos do tensor de saída

Vamos ilustrar isso com o exemplo da multiplicação de duas matrizes A e B: a matriz resultante C é definida como

Cik=jAijBjkC_{ik} = \sum\limits_{j}^{}A_{ij}B_{jk}

Em Python, as bibliotecas Numpy e Tensorflow fornecem uma função einsum.

Entorpecido

import numpy as np

# Define two matrices A and B
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

# Perform matrix multiplication using einsum
C = np.einsum('ij,jk->ik', A, B)

print(C)
# [[19 22]
#  [43 50]]

No exemplo acima, ij,jk->ik é a string einsum:

ij representa os índices da matriz A

jk representa os índices da matriz B

->ik especifica os índices da matriz de saída C

A operação soma o índice j

O mesmo código no Tensorflow seria parecido

import tensorflow as tf

# Define two matrices A and B
A = tf.constant([[1, 2], [3, 4]], dtype=tf.float32)
B = tf.constant([[5, 6], [7, 8]], dtype=tf.float32)

# Perform matrix multiplication using einsum
C = tf.einsum('ij,jk->ik', A, B)

print(C)
# tf.Tensor(
# [[19. 22.]
#  [43. 50.]], shape=(2, 2), dtype=float32)

Mais exemplos

Produto interno de vetores

O produto interno (produto escalar) de dois vetores aeb é definido como

c=iaibic = \sum\limits_{i}^{}a_{i}b_{i}

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

c = np.einsum('i,i->', a, b)

print(c)  # Output: 32

Produto externo de vetores

O produto externo de dois vetores aeb é dado por:

Cij=aibjC_{ij} = a_{i}b_{j}

C = np.einsum('i,j->ij', a, b)

print(C)
# Output
# [[4 5 6]
#  [8 10 12]
#  [12 15 18]]

Transposição de uma Matriz

A transposta de uma matriz A pode ser obtida trocando seus índices

A_transpose = np.einsum('ij->ji', A)

print(A_transpose)
# Output
# [[1. 3.]
#  [2. 4.]]

Traço de uma Matriz

O traço de uma matriz A é a soma de seus elementos diagonais:

Tr(A)=iAiiAiiTr(A) = \sum\limits_{i}^{}A_{ii}A_{ii}


trace = np.einsum('ii->', A)

print(trace)
# Output: 5.0

Multiplicação de matrizes em lote

Einsum é particularmente útil para operações em lote. Suponha que temos um lote de matrizes A e B e queremos multiplicar as matrizes correspondentes no lote:


A = np.random.rand(3, 2, 2)
B = np.random.rand(3, 2, 2)

# Perform batch matrix multiplication
C = np.einsum('bij,bjk->bik', A, B)

print(C)

Aqui, b representa a dimensão do lote.

Vantagens da notação Einsum

1. Concisão: A notação Einsum é compacta e pode representar operações complexas de forma sucinta

2. Flexibilidade: Ele pode lidar com uma ampla variedade de operações de tensor sem remodelar ou transpor explicitamente matrizes

3. Eficiência: Muitas bibliotecas otimizam as operações de einsum internamente, levando potencialmente a um melhor desempenho.


Career Services background pattern

Serviços de carreira

Contact Section background image

Vamos manter-nos em contacto

Code Labs Academy © 2025 Todos os direitos reservados.