28.22 텐서의 기본 연산 4: 전치(Transpose)와 축 치환(Permutation)
전치와 축 치환은 텐서의 원소 값을 변경하지 않고 축(axis) 사이의 순서를 재배열하는 연산이다. 2차 텐서(행렬)에서의 전치는 행과 열을 바꾸는 익숙한 연산이지만, 고차 텐서에서는 임의의 두 축을 교환하는 일반화된 전치와, 모든 축의 순서를 재정의하는 축 치환(permute)으로 확장된다. 이 연산들은 데이터 복사 없이 스트라이드 메타데이터만 수정함으로써 구현할 수 있으며, 수학적으로는 텐서 공간 상의 자연스러운 선형 동형사상(linear isomorphism)으로 해석된다.
1. 2차 텐서의 전치
행렬 A \in \mathbb{R}^{M \times N}의 전치 A^\top \in \mathbb{R}^{N \times M}은 다음과 같이 정의된다.
(A^\top)_{ij} = A_{ji}
전치 연산은 다음과 같은 기본적 대수적 성질을 만족한다.
(A^\top)^\top = A,\quad (A + B)^\top = A^\top + B^\top,\quad (AB)^\top = B^\top A^\top
실수 내적 공간에서 전치는 수반(adjoint) 연산에 대응되며, \langle Ax, y \rangle = \langle x, A^\top y \rangle의 관계가 성립한다. 전치된 행렬의 메모리 스트라이드는 원본의 스트라이드를 단순히 교환한 형태이다. 원본이 행 우선으로 (N, 1)의 스트라이드를 갖는다면, 전치 행렬은 (1, N)의 스트라이드를 가진다.
2. 고차 텐서의 일반화된 전치
차수가 n인 텐서 T에 대하여, 두 축 p와 q를 교환하는 전치 연산은 다음과 같이 정의된다.
[T^{(p \leftrightarrow q)}]_{i_1 \cdots i_p \cdots i_q \cdots i_n} = T_{i_1 \cdots i_q \cdots i_p \cdots i_n}
즉, 두 축의 지표만 서로 바뀌며 나머지 축의 지표는 그대로 유지된다. 축 p와 축 q의 크기가 각각 d_p, d_q이므로, 전치 후의 형상은 (d_1, \ldots, d_q, \ldots, d_p, \ldots, d_n)이 된다. 스트라이드 역시 동일한 방식으로 p번째와 q번째 원소가 교환된다.
3. 축 치환(Permutation)
축 치환은 전치의 완전한 일반화로, n개의 축 전체에 대한 임의의 치환 \pi \in S_n을 적용하는 연산이다. 치환 \pi에 의한 축 치환의 정의는 다음과 같다.
[\mathrm{perm}_\pi(T)]_{i_1 i_2 \cdots i_n} = T_{i_{\pi^{-1}(1)} i_{\pi^{-1}(2)} \cdots i_{\pi^{-1}(n)}}
새로운 형상과 스트라이드는 각각 원본의 \pi에 의한 재배열이다.
d'_k = d_{\pi^{-1}(k)},\qquad s'_k = s_{\pi^{-1}(k)}
예를 들어 형상 (B, C, H, W)의 4차 텐서에 대하여 치환 (0, 2, 3, 1)을 적용하면, 결과 형상은 (B, H, W, C)가 되며, 이는 합성곱 신경망에서 NCHW 레이아웃을 NHWC 레이아웃으로 변환하는 전형적인 연산이다.
4. 스트라이드 조작에 의한 구현
전치와 축 치환의 가장 중요한 특징은 텐서 데이터의 물리적 재배치 없이 순수하게 메타데이터 조작만으로 구현된다는 점이다. 결과 텐서는 원본 텐서의 뷰(view)이며, 다음과 같이 요약된다.
| 연산 | 입력 형상 | 입력 스트라이드 | 출력 형상 | 출력 스트라이드 | 복사 발생 |
|---|---|---|---|---|---|
| 2차 전치 | (M, N) | (N, 1) | (N, M) | (1, N) | 없음 |
| 축 교환 (p \leftrightarrow q) | (d_1, \ldots, d_n) | (s_1, \ldots, s_n) | d_p \leftrightarrow d_q | s_p \leftrightarrow s_q | 없음 |
| 축 치환 \pi | (d_1, \ldots, d_n) | (s_1, \ldots, s_n) | d_{\pi^{-1}(k)} | s_{\pi^{-1}(k)} | 없음 |
이러한 뷰 연산의 결과는 일반적으로 비연속(non-contiguous) 상태가 되며, 후속 연산에서 연속성이 요구되면 명시적인 contiguous() 호출을 통해 데이터 복사가 수행된다.
5. 대수적 성질과 자동 미분
축 치환은 대칭군 S_n의 작용을 정의하며, 두 치환의 합성은 곱 치환과 동등하다.
\mathrm{perm}_{\pi_2}(\mathrm{perm}_{\pi_1}(T)) = \mathrm{perm}_{\pi_2 \circ \pi_1}(T)
역치환 \pi^{-1}을 적용하면 원본 텐서로 복원된다.
\mathrm{perm}_{\pi^{-1}}(\mathrm{perm}_\pi(T)) = T
자동 미분에서 축 치환의 역전파는 단순히 역치환을 기울기 텐서에 적용하는 것으로 정의된다. 즉, y = \mathrm{perm}_\pi(x)일 때 \partial L / \partial x = \mathrm{perm}_{\pi^{-1}}(\partial L / \partial y)가 성립한다.
6. 딥러닝에서의 역할
전치와 축 치환은 딥러닝 모델 구현에서 빈번히 등장한다. 트랜스포머의 다중 헤드 어텐션에서는 (B, L, H, d_k)와 (B, H, L, d_k) 사이의 변환에 사용되고, 합성곱 신경망에서는 NCHW와 NHWC 레이아웃 사이의 변환에 사용된다. 행렬 곱셈이나 배치 행렬 곱셈의 입력을 적절히 재배치하기 위해서도 사용되며, 아인슈타인 합산 규약을 사용한 연산에서는 지표 순서의 재정의로 자연스럽게 포함된다. 전치와 치환은 수학적으로 단순하지만, 레이아웃 일관성과 성능 최적화 관점에서 모델 구현에 본질적인 영향을 미치는 핵심 연산이다.