Einšteino sumavimo žymėjimas yra glaustas ir galingas būdas pavaizduoti tenzorines operacijas, dažnai naudojamas fizikoje ir mašininiame mokyme. Tai leidžia mums kompaktiška forma parašyti sudėtingus tenzorių skaičiavimus. Apžvelgsime Einšteino sumavimo pagrindus, kaip jį naudoti „Python“ su „Numpy“ ir „Tensorflow“ bei pateiksime jos naudojimą iliustruojančių pavyzdžių.
Einšteino sumavimo pagrindai
Einšteino sumavimo žymėjimas (Einsum) yra pagrįstas pasikartojančių indeksų sumavimo idėja tenzorių išraiškose. Jis pagrįstas šiomis dviem taisyklėmis:
1. Sumavimas per pasikartojančius indeksus: Jei indeksas pateikiamas du kartus per terminą, jis sumuojamas
2. Laisvieji indeksai: Tik vieną kartą rodomi indeksai yra laisvieji indeksai ir reiškia išvesties tenzoriaus ašis
Paaiškinkime tai dviejų matricų A ir B padauginimo pavyzdžiu: gauta matrica C apibrėžiama kaip
„Python“ ir „Numpy“, ir „Tensorflow“ bibliotekos teikia einsum funkciją.
Numigęs
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]]
Anksčiau pateiktame pavyzdyje „ij,jk->ik“ yra einsum eilutė:
„ij“ reiškia A matricos indeksus
„jk“ reiškia B matricos indeksus
„->ik“ nurodo išvesties matricos C indeksus
Operacija sumuojasi su indeksu j
Tas pats kodas atrodytų 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)
Daugiau pavyzdžių
Vidinis vektorių produktas
Dviejų vektorių a ir b vidinė sandauga (taškinė sandauga) apibrėžiama kaip
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.einsum('i,i->', a, b)
print(c) # Output: 32
Išorinis vektorių produktas
Dviejų vektorių a ir b išorinė sandauga apskaičiuojama taip:
C = np.einsum('i,j->ij', a, b)
print(C)
# Output
# [[4 5 6]
# [8 10 12]
# [12 15 18]]
Matricos perkėlimas
Matricos A transponavimą galima gauti sukeitus jos indeksus
A_transpose = np.einsum('ij->ji', A)
print(A_transpose)
# Output
# [[1. 3.]
# [2. 4.]]
Matricos pėdsakai
Matricos A pėdsakas yra jos įstrižainių elementų suma:
trace = np.einsum('ii->', A)
print(trace)
# Output: 5.0
Paketinis matricos dauginimas
Einsum yra ypač naudingas paketinėms operacijoms. Tarkime, kad turime A ir B matricų paketą ir norime padauginti atitinkamas partijos matricas:
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)
Čia „b“ reiškia partijos matmenį.
Einsum žymėjimo pranašumai
1. Glaustumas: Einsum žymėjimas yra kompaktiškas ir gali glaustai pateikti sudėtingas operacijas
2. Lankstumas: gali atlikti įvairias tenzorines operacijas, aiškiai neperformuodamas ar neperkeldamas masyvų
3. Efektyvumas: daugelis bibliotekų optimizuoja einsum operacijas viduje, todėl gali būti geresnis našumas.