아인슈타인 요약

Python의 Tensor 연산
Einstein 합계 기법
Numpy 및 Tensor Flow 예제
아인슈타인 요약 cover image

Einstein Summation 표기법은 텐서 연산을 표현하는 간결하고 강력한 방법으로, 물리학 및 기계 학습에서 자주 사용됩니다. 이를 통해 텐서에 대한 복잡한 계산을 간결한 형식으로 작성할 수 있습니다. Einstein 합계에 대한 기본 사항, Numpy 및 Tensorflow와 함께 Python에서 이를 사용하는 방법을 다루고 사용법을 설명하는 예제를 제공합니다.

아인슈타인 요약의 기본

Einstein Summation 표기법(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. 유연성: 배열을 명시적으로 재구성하거나 전치하지 않고도 다양한 텐서 작업을 처리할 수 있습니다.

삼. 효율성: 많은 라이브러리가 einsum 작업을 내부적으로 최적화하여 잠재적으로 더 나은 성능을 제공합니다.


Career Services background pattern

취업 서비스

Contact Section background image

계속 연락하자

Code Labs Academy © 2025 판권 소유.