logo

사인파 위치 인코딩 📂머신러닝

사인파 위치 인코딩

정의

상수 $C > 0$와 데이터 수열 $\mathbf{X} = \begin{bmatrix} \mathbf{x}_{1} & \cdots & \mathbf{x}_{n} \end{bmatrix}$ $(\mathbf{x}_{\text{pos}} \in \mathbb{R}^{d}$, $d$는 짝수$)$에 대해서, 아래와 같이 정의되는 함수 $\operatorname{pe} : \mathbb{N} \to \mathbb{R}^{d}$ 혹은 매핑 $\mathbf{x}_{\text{pos}} \mapsto \mathbf{x}_{\text{pos}} + \operatorname{pe}(\text{pos})$를 사인파 위치 인코딩sinusoidal positional encoding이라 한다. 성분의 인덱스는 $1$부터 세며, $i$는 $1 \le i \le d/2$의 범위를 움직인다.

$$ \begin{align*} \left[ \operatorname{pe}(\text{pos}) \right]_{2i-1} &:= \sin \left( \text{pos} / C^{2(i-1)/d} \right) \\ \left[ \operatorname{pe}(\text{pos}) \right]_{2i} &:= \cos \left( \text{pos} / C^{2(i-1)/d} \right) \end{align*} $$

설명

트랜스포머위치 인코딩으로 사용되어 유명해졌다. 트랜스포머를 제안한 논문 『🔒(26/08/27)Attention Is All You Need1에서는 $C = 10000$, $d = d_{\text{model}} = 512$로 두었다. $\operatorname{pe}(\text{pos})$를 벡터로 풀어 쓰면 다음과 같다.

$$ \operatorname{pe}(\text{pos}) = \begin{bmatrix} \sin \left( \text{pos} \right) \\ \cos \left( \text{pos} \right) \\ \sin \left( \text{pos} / C^{2/d} \right) \\ \cos \left( \text{pos} / C^{2/d} \right) \\ \vdots \\ \sin \left( \text{pos} / C^{(d-2)/d} \right) \\ \cos \left( \text{pos} / C^{(d-2)/d} \right) \end{bmatrix} $$

홀수번째 성분은 사인, 짝수번째 성분은 코사인으로, 성분의 쌍 $(2i-1, 2i)$마다 파장이 $2\pi C^{2(i-1)/d}$인 사인파가 하나씩 대응된다. 파장은 $2\pi$부터 $2\pi C^{(d-2)/d} \approx 2\pi C$까지 등비수열을 이루므로, 앞쪽 성분일수록 빠르게 진동하고 뒤쪽 성분일수록 느리게 진동한다. 아래 그림은 $C = 10000$, $d = 512$일 때 홀수번째 성분 $\left[ \operatorname{pe}(\text{pos}) \right]_{2i-1} = \sin \left( \text{pos} / 10000^{2(i-1)/512} \right)$를 $i = 1, 10, 50, 100$에 대해서 위치 $\text{pos}$의 함수로 각각 그린 것이다. $i$가 커질수록 파장이 길어지는 것을 볼 수 있다.

다음은 $C = 10000$, $d = 128$일 때 $\operatorname{pe}(1), \dots, \operatorname{pe}(100)$를 열로 늘어놓아 히트맵으로 나타낸 것이다. 인덱스가 작은 아래쪽은 위치가 바뀔 때마다 빠르게 진동하고 위쪽은 천천히 변한다.

트랜스포머에서는 각각의 단어가 문장 내에서 어디에 위치하는지에 대한 정보를 포함시키기 위해서 사용하였다. $\mathbf{x}_{\text{pos}}$가 단어의 의미를 담은 벡터라면 $\operatorname{pe}(\text{pos})$는 그 단어가 몇번째에 등장하는지의 정보를 가진 섭동이나 노이즈 등으로 이해할 수 있으며, 같은 단어라도 등장하는 위치에 따라 서로 다른 벡터로 구별할 수 있도록 만들어준다.

사인파 위치 인코딩의 역할이 위와 같지만은 않다. 가령 자연수 $k$에 대해서 다음의 매핑을 신경망의 제일 앞에 두면 자연스럽게 주기 함수를 구현할 수 있다. 모든 성분이 주기 $2\pi$를 갖는 함수이므로, 이 매핑 뒤에 어떤 신경망 $f : \mathbb{R}^{2k} \to \mathbb{R}$을 합성하더라도 전체는 저절로 주기가 $2\pi$인 함수가 된다. 3차원 장면을 신경망으로 표현하는 NeRF가 이를 사용한 대표적인 사례다2.

$$ x \mapsto \begin{bmatrix} \sin x \\ \cos x \\ \sin 2x \\ \cos 2x \\ \vdots \\ \sin kx \\ \cos kx \end{bmatrix} $$


  1. Ashish Vaswani et al. Attention is all you need. Advances in neural information processing systems 30 (2017). ↩︎

  2. Ben Mildenhall et al. Nerf: Representing scenes as neural radiance fields for view synthesis. Communications of the ACM 65.1 (2021): 99-106. ↩︎