Einšteina summēšanas apzīmējums ir kodolīgs un spēcīgs veids, kā attēlot tenzoras darbības, ko bieži izmanto fizikā un mašīnmācībā. Tas ļauj mums rakstīt sarežģītus aprēķinus uz tensoriem kompaktā formā. Mēs apskatīsim Einšteina summēšanas pamatus, kā to izmantot Python ar Numpy un Tensorflow, un sniegsim piemērus, lai ilustrētu tās izmantošanu.
Einšteina summēšanas pamati
Einšteina summēšanas apzīmējums (Einsum) balstās uz ideju par atkārtotu indeksu summēšanu tenzoru izteiksmēs. Tas ir balstīts uz diviem šādiem noteikumiem:
1. Atkārtotu indeksu summēšana: Ja indekss terminā parādās divas reizes, tas tiek summēts
2. Brīvie indeksi: Indeksi, kas parādās tikai vienu reizi, ir brīvi indeksi un attēlo izvades tensora asis
Ilustrēsim to ar divu matricu A un B reizināšanas piemēru: iegūtā matrica C ir definēta kā
Programmā Python gan Numpy, gan Tensorflow bibliotēka nodrošina einsum funkciju.
Neskaidrs
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]]
Iepriekš minētajā piemērā “ij,jk->ik” ir einsum virkne:
"ij" apzīmē matricas A indeksus
"jk" apzīmē matricas B indeksus
->ik
norāda izvades matricas C indeksus
Operācija summējas ar indeksu j
Tas pats kods izskatās Tensorflow
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)
Vairāk piemēru
Vektoru iekšējais produkts
Divu vektoru a un b iekšējo reizinājumu (punktu reizinājumu) definē kā
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.einsum('i,i->', a, b)
print(c) # Output: 32
Vektoru ārējais produkts
Divu vektoru a un b ārējo reizinājumu nosaka:
C = np.einsum('i,j->ij', a, b)
print(C)
# Output
# [[4 5 6]
# [8 10 12]
# [12 15 18]]
Matricas transponēšana
Matricas A transponēšanu var iegūt, mainot tās indeksus
A_transpose = np.einsum('ij->ji', A)
print(A_transpose)
# Output
# [[1. 3.]
# [2. 4.]]
Matricas pēdas
Matricas A trase ir tās diagonālo elementu summa:
trace = np.einsum('ii->', A)
print(trace)
# Output: 5.0
Pakešu matricas reizināšana
Einsum ir īpaši noderīgs partiju operācijām. Pieņemsim, ka mums ir matricu A un B partija, un mēs vēlamies reizināt atbilstošās matricas partijā:
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)
Šeit “b” apzīmē partijas dimensiju.
Einsuma apzīmējuma priekšrocības
1. Īsums: Einsum apzīmējums ir kompakts un var īsi attēlot sarežģītas darbības
2. Elastība: var veikt dažādas tenzora darbības, nepārveidojot vai netransponējot masīvus
3. Efektivitāte: Daudzas bibliotēkas optimizē einsum operācijas iekšēji, iespējams, uzlabojot veiktspēju.