Einsteinov súčet

Operácie tenzorov v Pythone
Einsteinove techniky sčítania
príklady Numpyho a tenzorového toku
Einsteinov súčet cover image

Zápis Einstein Summation je stručný a účinný spôsob reprezentácie tenzorových operácií, ktorý sa často používa vo fyzike a strojovom učení. Umožňuje nám písať zložité výpočty na tenzoroch v kompaktnej forme. Pokryjeme základy Einsteinovej sumácie, ako ju používať v Pythone s Numpy a Tensorflow a poskytneme príklady na ilustráciu jej použitia.

Základy Einsteinovej sumácie

Einsteinova sumačná notácia (Einsum) je založená na myšlienke sčítania cez opakované indexy v tenzorových výrazoch. Je založená na nasledujúcich dvoch pravidlách:

1. Sumácia opakovaných indexov: Ak sa index objaví dvakrát v termíne, je sčítaný

2. Voľné indexy: Indexy, ktoré sa objavia iba raz, sú voľné indexy a predstavujú osi výstupného tenzora

Ukážme si to na príklade vynásobenia dvoch matíc A a B: výsledná matica C je definovaná ako

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

V Pythone poskytujú knižnice Numpy aj Tensorflow funkciu einsum.

Numpy

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]]

Vo vyššie uvedenom príklade je ij,jk->ik reťazec einsum:

„ij“ predstavuje indexy matice A

„jk“ predstavuje indexy matice B

->ik určuje indexy výstupnej matice C

Operácia spočítava index j

Rovnaký kód v Tensorflow by vyzeral

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)

Ďalšie príklady

Vnútorný produkt vektorov

Vnútorný súčin (bodový súčin) dvoch vektorov a a b je definovaný ako

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

Vonkajší produkt vektorov

Vonkajší súčin dvoch vektorov a a b je daný vzťahom:

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]]

Transpozícia matice

Transpozíciu matice A možno získať zámenou jej indexov

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

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

Stopa matrice

Stopa matice A je súčtom jej diagonálnych prvkov:

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


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

print(trace)
# Output: 5.0

Dávkové maticové násobenie

Einsum je obzvlášť užitočný pre dávkové operácie. Predpokladajme, že máme dávku matíc A a B a chceme vynásobiť zodpovedajúce matice v dávke:


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)

Tu b predstavuje rozmer dávky.

Výhody notácie Einsum

1. Stručnost: Zápis Einsum je kompaktný a môže stručne reprezentovať zložité operácie

2. Flexibilita: Dokáže zvládnuť širokú škálu tenzorových operácií bez explicitného pretvárania alebo transponovania polí

3. Efektivita: Mnoho knižníc interne optimalizuje operácie einsum, čo môže viesť k lepšiemu výkonu.


Career Services background pattern

Kariérne služby

Contact Section background image

Ostaňme v kontakte

Code Labs Academy © 2025 Všetky práva vyhradené.