einsum 표현식에 대해 최저 비용의 축소(contraction) 순서를 구하려면 Python의 numpy.einsum_path() 메서드를 사용합니다. 첫 번째 매개변수인 subscripts는 합산에 사용할 아래첨자를 지정하며, 두 번째 매개변수인 operands는 연산에 사용될 배열입니다.
아인슈타인 합 규약(Einstein summation convention)을 활용하면 다차원 선형 대수 배열 연산 대부분을 매우 간결한 형태로 표현할 수 있습니다. 암시적(implicit) 모드에서 einsum은 이러한 값을 자동으로 계산합니다.
반면 명시적(explicit) 모드에서는 특정 아래첨자 레이블에 대한 합산을 비활성화하거나 강제할 수 있어, 고전적인 아인슈타인 합 연산으로 분류되지 않는 다양한 배열 연산도 유연하게 처리할 수 있습니다.
반환되는 경로(path) 정보는 입력 축소식의 어떤 항을 먼저 축소해야 하는지를 알려줍니다. 해당 축소의 결과는 축소 목록의 끝에 추가되며, 모든 중간 축소가 완료될 때까지 이 목록을 반복적으로 처리하면 됩니다.
단계별 진행
먼저 필요한 라이브러리를 임포트합니다.
import numpy as np
텐서를 생성합니다.
p = np.random.rand(2, 2) q = np.random.rand(2, 5) r = np.random.rand(5, 2)
einsum 표현식의 최저 비용 축소 순서를 얻으려면 numpy.einsum_path() 메서드를 호출합니다.
path_info = np.einsum_path('ij,jk,kl->il', p, q, r, optimize='greedy')경로 정보를 출력합니다.
print(path_info[0]) print(path_info[1])
전체 예제 코드
import numpy as np
np.random.seed(123)
# 텐서 생성
p = np.random.rand(2, 2)
q = np.random.rand(2, 5)
r = np.random.rand(5, 2)
# einsum 표현식의 최저 비용 축소 순서를 구하기 위해 numpy.einsum_path() 메서드 사용
path_info = np.einsum_path('ij,jk,kl->il', p, q, r, optimize='greedy')
# 경로 정보 출력
print(path_info[0])
print(path_info[1])실행 결과
['einsum_path', (1, 2), (0, 1)] Complete contraction: ij,jk,kl->il Naive scaling: 4 Optimized scaling: 3 Naive FLOP count: 1.200e+02 Optimized FLOP count: 5.700e+01 Theoretical speedup: 2.105 Largest intermediate: 4.000e+00 elements -------------------------------------------------------------------------- scaling current remaining -------------------------------------------------------------------------- 3 kl,jk->jl ij,jl->il 3 jl,ij->il il->il