Einsteinin summausmerkintä on ytimekäs ja tehokas tapa esittää tensorioperaatioita, jota käytetään usein fysiikassa ja koneoppimisessa. Sen avulla voimme kirjoittaa monimutkaisia laskutoimituksia tensoreille kompaktissa muodossa. Käsittelemme Einsteinin summauksen perusteet, kuinka sitä käytetään Pythonissa Numpyn ja Tensorflown kanssa, ja annamme esimerkkejä sen käytön havainnollistamiseksi.
Einsteinin summauksen perusteet
Einsteinin summausmerkintä (Einsum) perustuu ajatukseen toistuvien indeksien summaamisesta tensorilausekkeissa. Se perustuu seuraaviin kahteen sääntöön:
1. Toistuvien indeksien summaus: Jos indeksi esiintyy kahdesti termissä, se summataan
2. Vapaat indeksit: Vain kerran esiintyvät indeksit ovat vapaita indeksejä ja edustavat lähtötensorin akseleita
Havainnollistetaan tätä esimerkillä kahden matriisin A ja B kertomisesta: tuloksena oleva matriisi C määritellään
Pythonissa sekä Numpy- että Tensorflow-kirjastot tarjoavat einsum-funktion.
Nuhjuinen
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]]
Yllä olevassa esimerkissä ij,jk->ik on einsum-merkkijono:
"ij" edustaa matriisin A indeksejä
"jk" edustaa matriisin B indeksejä
->ik
määrittää lähtömatriisin C indeksit
Operaatio summaa indeksin j
Sama koodi näyttäisi Tensorflowssa
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)
Lisää esimerkkejä
Vektorien sisätuote
Kahden vektorin a ja b sisätulo (pistetulo) määritellään seuraavasti
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.einsum('i,i->', a, b)
print(c) # Output: 32
Vektorien ulkotuote
Kahden vektorin a ja b ulkotulo saadaan seuraavasti:
C = np.einsum('i,j->ij', a, b)
print(C)
# Output
# [[4 5 6]
# [8 10 12]
# [12 15 18]]
Matriisin transponointi
Matriisin A transponointi saadaan vaihtamalla sen indeksejä
A_transpose = np.einsum('ij->ji', A)
print(A_transpose)
# Output
# [[1. 3.]
# [2. 4.]]
Matriisin jälki
Matriisin A jälki on sen diagonaalielementtien summa:
trace = np.einsum('ii->', A)
print(trace)
# Output: 5.0
Erämatriisikertominen
Einsum on erityisen hyödyllinen eräoperaatioissa. Oletetaan, että meillä on erä matriiseja A ja B, ja haluamme kertoa erän vastaavat matriisit:
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)
Tässä "b" edustaa erän mittaa.
Einsum-merkinnän edut
1. Lyhytisyys: Einsum-merkintä on kompakti ja voi esittää monimutkaisia operaatioita ytimekkäästi
2. Joustavuus: Se pystyy käsittelemään monenlaisia tensoritoimintoja ilman, että taulukoita nimenomaisesti muotoillaan uudelleen tai transponoidaan
3. Tehokkuus: Monet kirjastot optimoivat einsum-toiminnot sisäisesti, mikä saattaa parantaa suorituskykyä.