Notasi Penjumlahan Einstein adalah cara ringkas dan ampuh untuk merepresentasikan operasi tensor, yang sering digunakan dalam fisika dan pembelajaran mesin. Hal ini memungkinkan kita untuk menulis perhitungan kompleks pada tensor dalam bentuk yang ringkas. Kami akan membahas dasar-dasar penjumlahan Einstein, cara menggunakannya dalam Python dengan Numpy dan Tensorflow, dan memberikan contoh untuk mengilustrasikan penggunaannya.
Dasar-dasar Penjumlahan Einstein
Notasi Penjumlahan Einstein (Einsum) didasarkan pada gagasan menjumlahkan indeks berulang dalam ekspresi tensor. Hal ini didasarkan pada dua aturan berikut:
1. Penjumlahan atas indeks yang berulang: Jika sebuah indeks muncul dua kali dalam satu suku, maka indeks tersebut akan dijumlahkan
2. Indeks bebas: Indeks yang muncul hanya sekali adalah indeks bebas dan mewakili sumbu tensor keluaran
Mari kita ilustrasikan hal ini dengan contoh mengalikan dua matriks A dan B: matriks C yang dihasilkan didefinisikan sebagai
Di Python, pustaka Numpy dan Tensorflow menyediakan fungsi einsum.
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]]
Pada contoh di atas, ij,jk->ik
adalah string einsum:
ij
mewakili indeks matriks A
jk
mewakili indeks matriks B
->ik
menentukan indeks matriks keluaran C
Operasi ini merangkum indeks j
Kode yang sama di Tensorflow akan terlihat seperti ini
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)
Lebih Banyak Contoh
Hasil kali dalam vektor
Hasil kali dalam (perkalian titik) dari dua vektor a dan b didefinisikan sebagai
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.einsum('i,i->', a, b)
print(c) # Output: 32
Produk Luar Vektor
Hasil kali luar dua vektor a dan b diberikan oleh:
C = np.einsum('i,j->ij', a, b)
print(C)
# Output
# [[4 5 6]
# [8 10 12]
# [12 15 18]]
Transpos Matriks
Transpos matriks A dapat diperoleh dengan menukar indeksnya
A_transpose = np.einsum('ij->ji', A)
print(A_transpose)
# Output
# [[1. 3.]
# [2. 4.]]
Jejak Matriks
Jejak matriks A adalah jumlah elemen diagonalnya:
trace = np.einsum('ii->', A)
print(trace)
# Output: 5.0
Perkalian Matriks Batch
Einsum sangat berguna untuk operasi batch. Misalkan kita mempunyai sekumpulan matriks A dan B, dan kita ingin mengalikan matriks-matriks yang bersesuaian dalam kumpulan tersebut:
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)
Di sini, b
mewakili dimensi batch.
Keuntungan Notasi Einsum
1. Ringkasnya: Notasi Einsum ringkas, dan dapat merepresentasikan operasi kompleks secara ringkas
2. Fleksibilitas: Dapat menangani berbagai macam operasi tensor tanpa secara eksplisit membentuk ulang atau mentransposisi array
3. Efisiensi: Banyak perpustakaan mengoptimalkan operasi einsum secara internal, sehingga berpotensi menghasilkan kinerja yang lebih baik.