Էյնշտեյնի գումարման նշումը տենզորի գործողությունները ներկայացնելու հակիրճ և հզոր միջոց է, որը հաճախ օգտագործվում է ֆիզիկայում և մեքենայական ուսուցման մեջ: Այն թույլ է տալիս մեզ բարդ հաշվարկներ գրել թենզորների վրա կոմպակտ ձևով: Մենք կանդրադառնանք Էյնշտեյնի գումարման հիմունքներին, ինչպես օգտագործել այն Python-ում Numpy-ի և Tensorflow-ի հետ, և օրինակներ կներկայացնենք դրա օգտագործումը լուսաբանելու համար:
Էյնշտեյնի գումարման հիմունքները
Էյնշտեյնի գումարման նշումը (Einsum) հիմնված է տենզորային արտահայտություններում կրկնվող ինդեքսների գումարման գաղափարի վրա։ Այն հիմնված է հետևյալ երկու կանոնների վրա.
**1. Կրկնվող ինդեքսների գումարումը.
2. Ազատ ինդեքսներ. Ցուցանիշները, որոնք հայտնվում են միայն մեկ անգամ, ազատ ինդեքսներ են և ներկայացնում են ելքային թենզորի առանցքները
Եկեք դա ցույց տանք A և B երկու մատրիցների բազմապատկման օրինակով. ստացված C մատրիցը սահմանվում է որպես.
Python-ում և՛ Numpy, և՛ Tensorflow գրադարաններն ապահովում են einsum ֆունկցիա:
Թմրած
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]]
Վերևի օրինակում «ij,jk->ik»-ը einsum տողն է.
«ij»-ը ներկայացնում է A մատրիցի ինդեքսները
«jk»-ը ներկայացնում է B մատրիցի ինդեքսները
«->ik»-ը սահմանում է C ելքային մատրիցի ինդեքսները
Գործողությունը գումարվում է j ցուցանիշի վրա
Նույն կոդը 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)
Լրացուցիչ օրինակներ
Վեկտորների ներքին արդյունք
Երկու a և b վեկտորների ներքին արտադրյալը (կետային արտադրյալը) սահմանվում է որպես
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.einsum('i,i->', a, b)
print(c) # Output: 32
Վեկտորների արտաքին արտադրանք
Երկու a և b վեկտորների արտաքին արտադրյալը տրվում է հետևյալով.
C = np.einsum('i,j->ij', a, b)
print(C)
# Output
# [[4 5 6]
# [8 10 12]
# [12 15 18]]
Մատրիցայի փոխադրում
A մատրիցի տրանսպոզիցիան կարելի է ստանալ՝ փոխանակելով դրա ինդեքսները
A_transpose = np.einsum('ij->ji', A)
print(A_transpose)
# Output
# [[1. 3.]
# [2. 4.]]
Մատրիցայի հետք
A մատրիցի հետքը նրա անկյունագծային տարրերի գումարն է.
trace = np.einsum('ii->', A)
print(trace)
# Output: 5.0
Խմբաքանակի մատրիցայի բազմապատկում
Einsum-ը հատկապես օգտակար է խմբաքանակային գործառնությունների համար: Ենթադրենք, որ մենք ունենք A և B մատրիցների խմբաքանակ, և մենք ցանկանում ենք բազմապատկել համապատասխան մատրիցները խմբաքանակում.
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)
Այստեղ «b»-ը ներկայացնում է խմբաքանակի չափը:
Einsum Նշման առավելությունները
1. Հակիրճություն. Einsum նշումը կոմպակտ է և կարող է համառոտ ներկայացնել բարդ գործողություններ
2. Ճկունություն. Այն կարող է կառավարել տենզորի գործողությունների լայն տեսականի՝ առանց զանգվածների հստակ ձևափոխման կամ փոխադրման
3. Արդյունավետություն. Շատ գրադարաններ օպտիմիզացնում են einsum գործառնությունները ներսից՝ պոտենցիալ հանգեցնելով ավելի լավ կատարողականության: