Tổng kết Einstein

Các phép toán Tensor trong Python
Kỹ thuật tính tổng Einstein
Ví dụ về Numpy và Tensor
Tổng kết Einstein cover image

Ký hiệu Tổng Einstein là một cách ngắn gọn và mạnh mẽ để biểu diễn các phép toán tensor, thường được sử dụng trong vật lý và học máy. Nó cho phép chúng ta viết các phép tính phức tạp trên tensor ở dạng thu gọn. Chúng tôi sẽ trình bày những kiến ​​thức cơ bản về phép tính tổng Einstein, cách sử dụng nó trong Python với Numpy và Tensorflow, đồng thời cung cấp các ví dụ để minh họa việc sử dụng nó.

Khái niệm cơ bản về phép tính tổng Einstein

Ký hiệu Tổng Einstein (Einsum) dựa trên ý tưởng tính tổng các chỉ số lặp lại trong biểu thức tensor. Nó dựa trên hai quy tắc sau:

1. Tính tổng theo các chỉ số lặp lại: Nếu một chỉ mục xuất hiện hai lần trong một thuật ngữ thì nó sẽ được tính tổng theo

2. Chỉ số tự do: Các chỉ số chỉ xuất hiện một lần là chỉ số tự do và biểu thị các trục của tenxơ đầu ra

Hãy minh họa điều này bằng ví dụ nhân hai ma trận A và B: ma trận kết quả C được định nghĩa là

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

Trong Python, cả thư viện Numpy và Tensorflow đều cung cấp hàm 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]]

Trong ví dụ trên, ij,jk->ik là chuỗi einsum:

ij đại diện cho các chỉ số của ma trận A

jk đại diện cho các chỉ số của ma trận B

->ik chỉ định các chỉ số của ma trận đầu ra C

Phép toán tính tổng theo chỉ số j

Mã tương tự trong Tensorflow sẽ trông như thế nào

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)

Ví dụ khác

Tích bên trong của vectơ

Tích bên trong (tích vô hướng) của hai vectơ a và b được định nghĩa là

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

Sản phẩm bên ngoài của vectơ

Tích ngoài của hai vectơ a và b được cho bởi:

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]]

Chuyển vị của ma trận

Chuyển vị của ma trận A có thể thu được bằng cách hoán đổi các chỉ số của nó

A_transpose = np.einsum('ij->ji', A)

print(A_transpose)
# Output
# [[1. 3.]
#  [2. 4.]]

Dấu vết của Ma trận

Vết của ma trận A là tổng các phần tử đường chéo của nó:

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


trace = np.einsum('ii->', A)

print(trace)
# Output: 5.0

Phép nhân ma trận hàng loạt

Einsum đặc biệt hữu ích cho các hoạt động hàng loạt. Giả sử chúng ta có một dãy ma trận A và B, muốn nhân các ma trận tương ứng trong lô đó:


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)

Ở đây, b đại diện cho kích thước lô.

Ưu điểm của ký hiệu Einsum

1. Tính chính xác: Ký hiệu Einsum nhỏ gọn và có thể biểu diễn các phép toán phức tạp một cách ngắn gọn

2. Tính linh hoạt: Nó có thể xử lý nhiều thao tác tensor khác nhau mà không cần định hình lại hoặc hoán vị mảng một cách rõ ràng

3. Hiệu quả: Nhiều thư viện tối ưu hóa hoạt động einsum trong nội bộ, có khả năng mang lại hiệu suất tốt hơn.


Career Services background pattern

Dịch vụ nghề nghiệp

Contact Section background image

Hãy giữ liên lạc

Code Labs Academy © 2025 Đã đăng ký Bản quyền.