Einstein Summation notasiyası fizika və maşın öyrənməsində tez-tez istifadə olunan tenzor əməliyyatlarını təmsil etmək üçün qısa və güclü bir üsuldur. O, bizə kompakt formada tensorlar üzərində mürəkkəb hesablamalar yazmağa imkan verir. Biz Eynşteyn cəmlənməsi ilə bağlı əsasları, onu Numpy və Tensorflow ilə Python-da necə istifadə edəcəyimizi əhatə edəcəyik və onun istifadəsini göstərmək üçün nümunələr təqdim edəcəyik.
Eynşteyn yekunlaşdırmasının əsasları
Eynşteynin Toplama notasiyası (Einsum) tenzor ifadələrində təkrarlanan indekslərin cəmlənməsi ideyasına əsaslanır. Aşağıdakı iki qaydaya əsaslanır:
1. Təkrarlanan indekslər üzərində cəmləmə: Əgər indeks bir müddətdə iki dəfə görünürsə, o, üzərində cəmlənir.
2. Sərbəst indekslər: Yalnız bir dəfə görünən indekslər sərbəst indekslərdir və çıxış tensorunun oxlarını təmsil edir
Bunu iki A və B matrisinin vurulması nümunəsi ilə izah edək: nəticədə C matrisi aşağıdakı kimi müəyyən edilir.
Python-da həm Numpy, həm də Tensorflow kitabxanaları einsum funksiyasını təmin edir.
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]]
Yuxarıdakı misalda ij,jk->ik
einsum sətridir:
ij
A matrisinin indekslərini təmsil edir
jk
B matrisinin indekslərini təmsil edir
->ik
çıxış C matrisinin indekslərini təyin edir
Əməliyyat j indeksi üzərində cəmlənir
Tensorflow-da eyni kod belə görünür
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 çox Nümunələr
Vektorların daxili hasilatı
İki a və b vektorunun daxili hasili (nöqtə hasili) kimi müəyyən edilir
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.einsum('i,i->', a, b)
print(c) # Output: 32
Vektorların Xarici Məhsulu
İki a və b vektorunun xarici hasili aşağıdakı kimi verilir:
C = np.einsum('i,j->ij', a, b)
print(C)
# Output
# [[4 5 6]
# [8 10 12]
# [12 15 18]]
Matrisin köçürülməsi
A matrisinin yerini onun indekslərini dəyişdirməklə əldə etmək olar
A_transpose = np.einsum('ij->ji', A)
print(A_transpose)
# Output
# [[1. 3.]
# [2. 4.]]
Matrisin izi
A matrisinin izi onun diaqonal elementlərinin cəmidir:
trace = np.einsum('ii->', A)
print(trace)
# Output: 5.0
Toplu Matrisin Vurması
Einsum toplu əməliyyatlar üçün xüsusilə faydalıdır. Tutaq ki, bizdə A və B matrisləri dəsti var və biz partiyada müvafiq matrisləri çoxaltmaq istəyirik:
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
toplu ölçüsünü təmsil edir.
Einsum notasının üstünlükləri
1. Qısalıq: Einsum notasiyası yığcamdır və mürəkkəb əməliyyatları qısa şəkildə təmsil edə bilər
2. Çeviklik: Massivləri açıq şəkildə dəyişdirmədən və ya köçürmədən müxtəlif tenzor əməliyyatlarını idarə edə bilər.
3. Effektivlik: Bir çox kitabxanalar einsum əməliyyatlarını daxili olaraq optimallaşdırır və potensial olaraq daha yaxşı performansa gətirib çıxarır.