ผลรวมของไอน์สไตน์

การทำงานของเทนเซอร์ใน Python
เทคนิคการรวมไอน์สไตน์
ตัวอย่างโฟลว์นัมปีและเทนเซอร์
ผลรวมของไอน์สไตน์ cover image

สัญกรณ์การรวมของไอน์สไตน์เป็นวิธีที่กระชับและทรงพลังในการนำเสนอการทำงานของเทนเซอร์ ซึ่งมักใช้ในวิชาฟิสิกส์และแมชชีนเลิร์นนิง ช่วยให้เราสามารถเขียนการคำนวณที่ซับซ้อนบนเทนเซอร์ในรูปแบบที่กะทัดรัดได้ เราจะครอบคลุมพื้นฐานเกี่ยวกับการสรุปของ Einstein วิธีใช้งานใน Python ด้วย Numpy และ Tensorflow และให้ตัวอย่างเพื่อแสดงการใช้งาน

พื้นฐานของการสรุปไอน์สไตน์

สัญกรณ์การรวมไอน์สไตน์ (Einsum) มีพื้นฐานมาจากแนวคิดในการรวมดัชนีซ้ำในนิพจน์เทนเซอร์ มันขึ้นอยู่กับกฎสองข้อต่อไปนี้:

1. ผลรวมของดัชนีที่ซ้ำกัน: หากดัชนีปรากฏสองครั้งในระยะเวลาหนึ่ง ดัชนีนั้นจะถูกรวมเข้าด้วยกัน

2. ดัชนีอิสระ: ดัชนีที่ปรากฏเพียงครั้งเดียวคือดัชนีอิสระและเป็นตัวแทนแกนของเอาท์พุตเทนเซอร์

เรามาอธิบายสิ่งนี้ด้วยตัวอย่างการคูณเมทริกซ์ A และ B สองตัว: ผลลัพธ์ของเมทริกซ์ C ถูกกำหนดเป็น

Cik=jAijBjkC_{ik} = \sum\limits_{j}^{}A_{ij}B_{jk}

ใน 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 สองตัวถูกกำหนดเป็น

c=iaibic = \sum\limits_{i}^{}a_{i}b_{i}

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 สองตัวหาได้จาก:

Cij=aibjC_{ij} = a_{i}b_{j}

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 คือผลรวมขององค์ประกอบในแนวทแยง:

Tr(A)=iAiiAiiTr(A) = \sum\limits_{i}^{}A_{ii}A_{ii}


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 ภายใน ซึ่งอาจนำไปสู่ประสิทธิภาพที่ดีขึ้น


Career Services background pattern

บริการด้านอาชีพ

Contact Section background image

มาติดต่อกันกันเถอะ

Code Labs Academy © 2025 สงวนลิขสิทธิ์.