Einstein Summation notazioa tentsore-eragiketak irudikatzeko modu zehatza eta indartsua da, sarritan fisikan eta ikaskuntza automatikoan erabiltzen dena. Tentsoreen gaineko kalkulu konplexuak forma trinkoan idazteko aukera ematen digu. Einstein-en batuketaren inguruko oinarriak landuko ditugu, Python-en nola erabili Numpy eta Tensorflow-ekin eta adibideak emango ditugu erabilera ilustratzeko.
Einstein-en batuketaren oinarriak
Einstein Summation notazioa (Einsum) tentsore-adierazpenetan indize errepikatuen gainean batuketaren ideian oinarritzen da. Bi arau hauetan oinarritzen da:
1. Indize errepikatuen gaineko batuketa: Indize bat termino batean bi aldiz agertzen bada, baino gehiago batzen da.
2. Indize askeak: Behin bakarrik agertzen diren indizeak indize askeak dira eta irteerako tentsorearen ardatzak adierazten dituzte
Azal dezagun hori A eta B bi matrize biderkatzeko adibidearekin: ondoriozko C matrizea honela definitzen da.
Python-en, Numpy eta Tensorflow liburutegiek einsum funtzioa eskaintzen dute.
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]]
Goiko adibidean, ij,jk->ik
einsum katea da:
ij
A matrizearen indizeak adierazten ditu
jk
B matrizearen indizeak adierazten ditu
->ik
irteerako C matrizearen indizeak zehazten ditu
Eragiketak j indizearen gaineko batuketak egiten ditu
Tensorflow-en kode bera izango litzateke
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)
Adibide gehiago
Bektoreen barne produktua
a eta b bi bektoreren barne produktua (puntu produktua) honela definitzen da
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.einsum('i,i->', a, b)
print(c) # Output: 32
Bektoreen kanpoko produktua
a eta b bi bektoreren kanpoko produktua honako hau da:
C = np.einsum('i,j->ij', a, b)
print(C)
# Output
# [[4 5 6]
# [8 10 12]
# [12 15 18]]
Matrize baten transposizioa
A matrize baten transposizioa bere indizeak trukatuz lor daiteke
A_transpose = np.einsum('ij->ji', A)
print(A_transpose)
# Output
# [[1. 3.]
# [2. 4.]]
Matrize baten arrastoa
A matrize baten arrastoa bere elementu diagonalen batura da:
trace = np.einsum('ii->', A)
print(trace)
# Output: 5.0
Batch Matrix Biderketa
Einsum bereziki erabilgarria da batch eragiketetarako. Demagun A eta B matrize sorta bat dugula eta lotean dagozkion matrizeak biderkatu nahi ditugula:
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)
Hemen, "b" lotearen dimentsioa adierazten du.
Einsum Notazioaren abantailak
1. Laburtasuna: Einsum notazioa trinkoa da, eta eragiketa konplexuak laburki adieraz ditzake
2. Malgutasuna: tentsore-eragiketa ugari kudea ditzake matrizeak esplizituki birmoldatu edo transposatu gabe
3. Eraginkortasuna: Liburutegi askok barnean optimizatzen dituzte einsum eragiketak, eta potentzialki errendimendu hobea lortzen dute.