DL

[DL] 아인슈타인 합의 표기법(Einstein Summation Notation)

moonzoo 2024. 4. 17. 13:17

아인슈타인 합의 표기법(Einstein Summation Notation)

정의

아인슈타인 표기법 또는 아인슈타인의 합 규약은 수학의 선형대수학을 물리학에 응용하면서 좌표계에 관한 공식을 다룰 때 유용한 표기 규칙입니다.

이 방법의 핵심은 반복되는 인덱스를 사용하여 합을 나타내고, 이를 통해 더 복잡한 텐서 연산을 단순화하는 것입니다.

 

수식

 

특정 index의 집합에 대한 합(시그마)연산을 간결하게 표시하는 방법.

  • Aik⋅Bkj를 수행하면 output dimension은 [I,J]
  • 이 후 I에 대해 summation

Einstein Notation(우변) 에서는 다음의 경우 sigma기호를 생략

  • 반복적으로 합산되는데 이용되는 index(k)에 관련된 sigma
  • 최종 결과 값 Cj에 명시되지 않은 index(i)에 관련된 sigma

이를 인덱스 표기법을 사용해 내적하면,

C = np.einsum('ik,kj->ij', A, B)

이는 행렬 A의 i번째 행과 k번째 열, 행렬 B의 k번째 행과 j번쨰 열을 곱하여, 결과 행렬인 C의 i번째 행과 j번째 열을 계산하라는 의미입니다. 여기서 k 인덱스는 두 입력 배열에서 모두 반복되므로, 이에 대한 합이 계산됩니다.

 

 

간단한 벡터 연산

내적의 결과값은 스칼라, 외적의 결과값은 벡터.

 

 

 

코드 구현

NumPy, torch, tensorflow 라이브러리에서 einsum 함수를 사용하여 벡터의 내적, 외적, 전치, 행렬곱 등을 표현할 수 있습니다. 이 표기법을 사용하여 다양한 텐서 연산을 정의하고 실행할 수 있습니다.

 

라이브러리

  • numpy : np.einsum
  • torch : torch.einsum
  • tensorflow : tf. einsum

인자로 equation과 operands를 받음

 

eqaution(string)

  • operand의 각 index에 대응하는 소문자로 구성된 식
  • "->"를 기준으로 왼쪽, 오른쪽의 의미가 달라짐
  • 왼쪽에는 operand들의 차원을 나열한 것으로 ","를 기준으로 구분
  • 오른쪽에는 출력값의 차원 인덱스들을 나타냄 (출력값에 표현되지 않은 인덱스들은 oeprand들을 곱한 후 해당 인덱스를 기준으로 더해짐)
  • → 뒤에 아무것도 없으면 모든 곱셈 결과를 합하여 단일 숫자를 반환합니다.

Unary Operation

Transpose

 

Diag, Trace

 

Summation

 

matrix sum to scalar & Column sum

 

Row sum

 

Matrix - Matrix Multiplication

 

Matrix-Vector multiplication & Matrix-Matrix multiplication

 

Batched Matrix multiplication

 

 

 

 

 

 

 

torch.einsum을 사용해 C를 계산할 때 각 차원은 다음과 같이 대응됩니다:

  • i는 두 텐서 모두에 있는 첫 번째 차원
  • jA에 있는 두 번째 차원
  • k는 두 텐서 모두에 있는 마지막 차원 (A에서는 세 번째, B에서는 두 번째)
  • lB에 있는 세 번째 차원
  1. 인덱스 선택: AB에서 동일한 ik 인덱스를 가진 요소들을 선택합니다.
  2. 점곱 계산: 선택된 요소들에 대해 Ak 차원 요소들과 Bk 차원 요소들을 곱한 다음, 이를 모두 더합니다. 이렇게 하여 jl 차원이 고정된 채로, k 차원을 따라서 요소별 곱을 합산하여 스칼라 값을 얻습니다.
  3. 결과 텐서에 저장: 계산된 스칼라 값을 결과 텐서 Cij, 그리고 Bl에 해당하는 위치에 저장합니다.

 

 

 

Bilinear Transformation

 

 

 

 

두개 이상의 텐서를 operands 입력으로 받을 수도 있습니다.

torch.einsum 연산에서 ik,jkl,il->ijAik 차원, Xj, k, l 차원, 그리고 Bil 차원을 이용하여 다음과 같은 계산을 수행합니다.

  1. Aik 차원, Xk 차원, 그리고 Bi 차원에 따라 모든 가능한 조합으로 요소를 선택합니다.
  2. 선택된 AX, B의 요소들을 곱합니다 (A[i,k] * X[j,k,l] * B[i,l]).
  3. kl 차원에 걸쳐 결과를 더합니다 (이는 사실상 Xkl 차원을 축소하는 것을 의미합니다).
  4. 결과적으로, j 차원과 i 차원만 남게 되어 최종 결과 D의 형태가 **(2, 3)**이 됩니다

 

 

 

 

 

 

 

Dot/Outer/Hadmard Product

 

Dot Preoduct (vector) & Outer product (vector)

 

Hadamard Prodct

 

 

실습코드

https://github.com/moonjoo98/ML-DL_Basic_study/blob/main/Deeplearning/einsum_%EC%8B%A4%EC%8A%B5.ipynb

 

ML-DL_Basic_study/Deeplearning/einsum_실습.ipynb at main · moonjoo98/ML-DL_Basic_study

머신러닝, 딥러닝 기초에 대한 실습 코드입니다. Contribute to moonjoo98/ML-DL_Basic_study development by creating an account on GitHub.

github.com

 

'DL' 카테고리의 다른 글

[DL] RNN - Recurrent Neural Networks 이론 정리  (2) 2024.12.10