Einstein Toplama gösterimi, tensör işlemlerini temsil etmenin kısa ve güçlü bir yoludur ve sıklıkla fizikte ve makine öğreniminde kullanılır. Tensörler üzerine karmaşık hesaplamaları kompakt bir biçimde yazmamızı sağlar. Einstein toplamının temellerini, bunun Python'da Numpy ve Tensorflow ile nasıl kullanılacağını ele alacağız ve kullanımını göstermek için örnekler sunacağız.
Einstein Toplamasının Temelleri
Einstein Toplama notasyonu (Einsum), tensör ifadelerinde tekrarlanan indeksler üzerinden toplama fikrine dayanmaktadır. Aşağıdaki iki kurala dayanmaktadır:
1. Tekrarlanan endeksler üzerinden toplama: Bir endeks bir dönemde iki kez görünüyorsa toplanır
2. Serbest indeksler: Yalnızca bir kez görünen indeksler serbest indekslerdir ve çıkış tensörünün eksenlerini temsil eder
Bunu iki A ve B matrisinin çarpılması örneğiyle açıklayalım: Ortaya çıkan C matrisi şu şekilde tanımlanır:
Python'da hem Numpy hem de Tensorflow kitaplıkları bir einsum işlevi sağlar.
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]]
Yukarıdaki örnekte ij,jk->ik
einsum dizesidir:
'ij' A matrisinin indekslerini temsil eder
'jk' B matrisinin indekslerini temsil eder
->ik
çıktı matrisi C'nin indekslerini belirtir
İşlem j indeksi üzerinden toplanır
Tensorflow'taki aynı kod şöyle görünecektir:
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)
Daha Fazla Örnek
Vektörlerin İç Çarpımı
İki vektör a ve b'nin iç çarpımı (nokta çarpımı) şu şekilde tanımlanır:
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.einsum('i,i->', a, b)
print(c) # Output: 32
Vektörlerin Dış Çarpımı
İki vektör a ve b'nin dış çarpımı şu şekilde verilir:
C = np.einsum('i,j->ij', a, b)
print(C)
# Output
# [[4 5 6]
# [8 10 12]
# [12 15 18]]
Bir Matrisin Transpozu
Bir A matrisinin transpozu indeksleri değiştirilerek elde edilebilir
A_transpose = np.einsum('ij->ji', A)
print(A_transpose)
# Output
# [[1. 3.]
# [2. 4.]]
Bir Matrisin İzi
Bir A matrisinin izi köşegen elemanlarının toplamıdır:
trace = np.einsum('ii->', A)
print(trace)
# Output: 5.0
Toplu Matris Çarpımı
Einsum özellikle toplu işlemler için kullanışlıdır. A ve B matrislerinden oluşan bir grubumuz olduğunu ve gruptaki karşılık gelen matrisleri çarpmak istediğimizi varsayalım:
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)
Burada 'b' parti boyutunu temsil ediyor.
Einsum Gösteriminin Avantajları
1. Kısalık: Einsum notasyonu kompakttır ve karmaşık işlemleri kısa ve öz bir şekilde temsil edebilir
2. Esneklik: Dizileri açıkça yeniden şekillendirmeden veya yer değiştirmeden çok çeşitli tensör işlemlerini gerçekleştirebilir
3. Verimlilik: Pek çok kitaplık, einsum işlemlerini dahili olarak optimize ederek potansiyel olarak daha iyi performans sağlar.