아인슈타인 합의 표기법(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는 두 텐서 모두에 있는 첫 번째 차원
- j는 A에 있는 두 번째 차원
- k는 두 텐서 모두에 있는 마지막 차원 (A에서는 세 번째, B에서는 두 번째)
- l는 B에 있는 세 번째 차원
- 인덱스 선택: A와 B에서 동일한 i와 k 인덱스를 가진 요소들을 선택합니다.
- 점곱 계산: 선택된 요소들에 대해 A의 k 차원 요소들과 B의 k 차원 요소들을 곱한 다음, 이를 모두 더합니다. 이렇게 하여 j와 l 차원이 고정된 채로, k 차원을 따라서 요소별 곱을 합산하여 스칼라 값을 얻습니다.
- 결과 텐서에 저장: 계산된 스칼라 값을 결과 텐서 C의 i와 j, 그리고 B의 l에 해당하는 위치에 저장합니다.
Bilinear Transformation
두개 이상의 텐서를 operands 입력으로 받을 수도 있습니다.
torch.einsum 연산에서 ik,jkl,il->ij는 A의 i와 k 차원, X의 j, k, l 차원, 그리고 B의 i와 l 차원을 이용하여 다음과 같은 계산을 수행합니다.
- A의 i와 k 차원, X의 k 차원, 그리고 B의 i 차원에 따라 모든 가능한 조합으로 요소를 선택합니다.
- 선택된 A와 X, B의 요소들을 곱합니다 (A[i,k] * X[j,k,l] * B[i,l]).
- k와 l 차원에 걸쳐 결과를 더합니다 (이는 사실상 X의 k와 l 차원을 축소하는 것을 의미합니다).
- 결과적으로, j 차원과 i 차원만 남게 되어 최종 결과 D의 형태가 **(2, 3)**이 됩니다
Dot/Outer/Hadmard Product
Dot Preoduct (vector) & Outer product (vector)
Hadamard Prodct
실습코드