28.23 텐서의 기본 연산 5: 재형성(Reshape)과 차원 조작

28.23 텐서의 기본 연산 5: 재형성(Reshape)과 차원 조작

재형성(reshape)은 텐서의 원소 값과 원소 개수를 변경하지 않은 채, 논리적 형상(shape)만을 새로운 차원 구성으로 변환하는 연산이다. 축 치환과 달리 재형성은 원소의 순서를 재배열하지 않고, 단지 다차원 색인 공간을 새롭게 해석한다. 재형성은 평탄화(flatten), 차원 삽입(unsqueeze), 차원 제거(squeeze), 축 분할(split)과 축 합병(merge) 등의 세부 차원 조작 연산을 포괄하며, 딥러닝 모델에서 데이터의 배치, 채널, 공간 차원을 유연하게 다루기 위한 필수 도구이다.

1. 재형성의 형식적 정의

형상 (d_1, d_2, \ldots, d_n)을 가진 텐서 T의 총 원소 수는 N = \prod_{k=1}^{n} d_k이다. 재형성은 새로운 형상 (d'_1, d'_2, \ldots, d'_m)을 도입하되, 원소 수 보존 조건 \prod_{k=1}^{m} d'_k = N을 만족해야 한다. 이때 새로운 색인 (j_1, \ldots, j_m)과 원래 색인 (i_1, \ldots, i_n)은 행 우선 레이아웃을 기준으로 동일한 선형 오프셋(linear offset) \ell을 통해 다음과 같이 매핑된다.

\ell = \sum_{k=1}^{n} i_k \prod_{p=k+1}^{n} d_p = \sum_{k=1}^{m} j_k \prod_{p=k+1}^{m} d'_p

재형성 후의 텐서 원소는 T'_{j_1 \cdots j_m} = T_{i_1 \cdots i_n}로 정의되며, 이 대응은 선형 오프셋 \ell에 의해 유일하게 결정된다.

2. 연속성 요건과 뷰 여부

재형성 연산이 데이터 복사 없이 뷰(view)로 구현될 수 있는 조건은 입력 텐서가 C-연속(또는 F-연속) 상태일 때이다. 연속 텐서의 경우 새로운 형상에 맞는 표준 스트라이드를 단순히 재계산하는 것만으로 재형성이 완료된다.

s'_k = \prod_{p=k+1}^{m} d'_p

반면, 입력이 비연속 상태인 경우 재형성은 일반적으로 데이터를 연속된 메모리 블록으로 복사한 뒤 새 형상과 스트라이드를 부여하는 과정을 수반한다. PyTorch는 이러한 구분을 명확히 하여, 항상 뷰만을 반환하는 view와 필요에 따라 복사까지 수행하는 reshape을 분리 제공한다.

3. 주요 차원 조작 연산

재형성의 특수 사례로 자주 사용되는 세부 연산은 다음과 같다.

연산정의예시
평탄화(flatten)모든 축을 단일 1차원 축으로 합침(B, C, H, W) \to (B \cdot C \cdot H \cdot W,)
부분 평탄화일정 구간의 축만 합병(B, C, H, W) \to (B, C \cdot H \cdot W)
squeeze크기 1인 축 제거(B, 1, C) \to (B, C)
unsqueeze크기 1인 축 삽입(B, C) \to (B, 1, C)
split단일 축을 두 축으로 분할(B, H \cdot W) \to (B, H, W)
merge두 축을 하나로 합병(B, H, W) \to (B, H \cdot W)

축 분할과 축 합병은 항상 상호 역 연산의 관계에 있으며, 재형성의 가장 기본적 빌딩 블록이다. 축 합병은 행 우선 레이아웃을 가정할 때 인접한 축에 대해서만 자연스럽게 뷰로 구현된다.

4. 축 치환과의 관계

재형성과 축 치환은 엄격히 구분되어야 한다. 재형성은 원소의 메모리 순서를 보존한 채 색인 공간만을 재해석하지만, 축 치환은 축의 의미적 순서를 재배열하며 경우에 따라 원소의 메모리 접근 순서를 변경한다. 예를 들어 형상 (2, 3)의 텐서를 (3, 2)로 재형성한 결과는, 동일한 텐서를 전치한 결과와 일반적으로 다르다.

\text{reshape: } T_{ij} \to T'_{kl}\ \text{where}\ \ell = i \cdot 3 + j = k \cdot 2 + l

\text{transpose: } (T^\top)_{kl} = T_{lk}

이러한 차이는 원소가 메모리 상에 배치된 순서가 다르기 때문이며, 잘못된 사용은 수치 오류의 주요 원인이 된다.

5. 자동 미분과 딥러닝에서의 활용

재형성의 역전파는 출력 텐서의 기울기를 원래 입력 형상으로 다시 재형성하는 것으로 정의된다. 즉, y = \mathrm{reshape}(x, \mathbf{d}')일 때 다음이 성립한다.

\frac{\partial L}{\partial x} = \mathrm{reshape}\!\left(\frac{\partial L}{\partial y},\, \mathrm{shape}(x)\right)

재형성은 딥러닝에서 매우 빈번하게 사용된다. 합성곱 계층의 출력을 완전 연결 계층으로 전달하기 위한 평탄화, 다중 헤드 어텐션에서 히든 차원을 (H, d_k)로 분할하는 작업, 그리고 배치 축을 임시로 합병하여 bmm 연산을 간결하게 표현하는 경우가 그 예이다. 예를 들어 히든 크기 dH개의 헤드로 나누는 연산은 다음과 같이 표현된다.

(B, L, d) \xrightarrow{\ \text{reshape}\ } (B, L, H, d_k),\quad d = H \cdot d_k

재형성과 차원 조작은 단순한 수학적 성질에도 불구하고, 실무에서 가장 흔하게 사용되고 또한 가장 많은 오류가 발생하는 연산이다. 형상 불일치와 레이아웃 혼동을 방지하기 위해서는 연산 전후의 형상을 명시적으로 추적하는 습관이 필수적이다.