สัญกรณ์การรวมของไอน์สไตน์เป็นวิธีที่กระชับและทรงพลังในการนำเสนอการทำงานของเทนเซอร์ ซึ่งมักใช้ในวิชาฟิสิกส์และแมชชีนเลิร์นนิง ช่วยให้เราสามารถเขียนการคำนวณที่ซับซ้อนบนเทนเซอร์ในรูปแบบที่กะทัดรัดได้ เราจะครอบคลุมพื้นฐานเกี่ยวกับการสรุปของ Einstein วิธีใช้งานใน 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 ภายใน ซึ่งอาจนำไปสู่ประสิทธิภาพที่ดีขึ้น