Positional Encoding의 필요성
Transformer 모델은 입력 데이터를 한번에 병렬로 처리합니다. 데이터를 병렬로 처리함으로써 연산 속도가 빠르다는 장점이 있는 반면, 입력 데이터의 순서 정보가 사라지는 단점이 생기게 됩니다. 실제로, 입력 데이터의 순서를 바꿔도 출력 데이터의 순서만 바뀔 뿐 그 값은 동일합니다. 이를 Permutation equivariant 한 특징이라고 합니다. 따라서, 입력 데이터에 순서 정보를 추가해주기 위해 Positional Encoding 이라는 기법을 사용합니다.
Positional Encoding의 필요 조건
- 각 위치값은 시퀀스의 길이나 입력값에 관계없이 동일한 위치값을 가져야 합니다.
- 모든 위치값이 입력값에 비해 너무 크면 안됩니다.
- Positional Encoding 값이 빠르게 증가하면 안됩니다.
- 위치 차이에 의한 Positional Encoding값의 차이를 거리로 이용할 수 있어야 합니다.
- Positional Encoding 값은 위치에 따라 서로 다른 값을 가져야 합니다.
여러가지 간단한 방법으로 Positional Encoding 을 수행할 수 있습니다.
가장 간단한 방법은 위치(index)가 증가할 수록 Positional Encoding의 값 또한 증가하도록 만들어 주는 것 입니다.

하지만, 이와 같은 방법은 Positional Encoding의 필요 조건의 ② 모든 위치값이 입력 값에 비해 너무 크면 안된다는 것과 ③ Positional Encoding 값이 빠르게 증가하면 안된다는 것에 위배됩니다.
그렇다면, 위 방법에서 Positional Encoding의 모든 값을 가장 큰 정수로 나누어 [0,1] 로 정규화 해보면 어떨까요?

이 경우에는 ① 각 위치 값은 시퀀스의 길이나 입력값에 관계없이 동일한 위치값을 가져야 한다는 조건을 위배합니다. 시퀀스의 길이가 3 일 때와 8 일 때 index=1 인 지점의 Positional Encoding 값은 각각 0.5, 0.14로 다른 값을 갖게 됩니다.

또 다른 방법으로는 binary 형태로 Positional Encoding 값을 벡터 형태로 나타내는 방법이 있습니다. 이 방법은 값의 범위가 크지 않고 [0, 1] 사이라서 괜찮은 방법인 것 같습니다.

하지만, 이 방법은 Positional Encoding 값들이 discrete하다는 문제가 있습니다. 위 그림과 같이 0~3 값을 (0,0), (1,0), (0,1), (1,1)로 표현할 수있습니다. 이 값들은 의미적으론 연속적이지만, 실제 그 값들이 연속적이지는 않습니다.
우리는 Positional Encoding의 필요 조건을 만족시키면서 [-1, 1] 범위로 정규화 되어(할 수)있고, $d_{model}$ embedding space 위에 존재하는 curve 를 찾기를 원합니다. 또한, 그 값이 '천천히' 증가하며 연속 함수 이기를 원합니다.
이러한 조건을 만족시키는 함수가 바로 삼각함수 입니다.
조금 더 자연스러운 설명이 필요하다면 아래 글의(Guess #4)를 참고해 보세요.
Master Positional Encoding: Part I | by Jonathan Kernes | Towards Data Science
Positional Encoding(Sin, Cos)
삼각함수는 Positional Encoding의 필요조건들에 대해 만족합니다. $\sin$ 함수를 예시로 들어보겠습니다. $\sin$ 함수는 입력 시퀀스의 길이와 상관 없는 임베딩 값을 갖습니다. [-1, 1] 범위 내에서만 진동하며, 그 값의 주기는 $\sin(Nx)$ 에서 $N$을 통하여 조절할 수 있습니다. 따라서 입력 시퀀스가 매우 길 때, $N$의 크기를 줄여 입력값에 따른 고유값을 갖도록 조절해줍니다. Transformer의 저자는 N 값을 1/10000 와 같이 작은 값을 사용하였습니다.
따라서 아래와 같은 Positional Encoding 수식을 적용할 수 있습니다. $pos$는 데이터의 위치를 의미하고 $i$는 $d$의 인덱스를 나타냅니다.
$$PE_{(pos, 2i)} = \sin(pos/10000^{2i/d_{model}})$$
$$PE_{(pos, 2i+1)} = \cos(pos/10000^{2i/d_{model}})$$
Transformer의 저자는 이러한 $\sin$과 $\cos$ 함수를 번갈아 사용한 이유를 다음과 같이 설명합니다.
(Attention is All you Need 3.5 section) We chose this function because we hypothesized it would allow the model to easily learn to attend by relative positions, since for any fixed offset $k$, $PE{pos+k}$ can be represented as a linear function of $PE_{pos}$
위와 같은 함수를 선택하면, $PE(pos+k)$는 $PE(pos)$의 선형 함수로 표현할 수 있습니다. 따라서 모델이 Position 간의 상대적 위치를 쉽게 학습할 수 있을 것이라 말하고 있습니다.
$$PE(x+\nabla x) = PE(x) \cdot T(\nabla x)$$
삼각 함수에서는 rotation matrix 성질을 이용해 이를 쉽게 계산할 수 있습니다.
$$\begin{bmatrix}cos(\theta + \phi) \\ sin(\theta + \phi) \end{bmatrix} = \begin{bmatrix}cos(\phi) & -sin(\phi) \\ sin(\phi)& cos(\phi) \end{bmatrix} \begin{bmatrix}cos(\theta) \\ sin(\theta) \end{bmatrix}$$
Derivation
$$PE(x+\nabla x) = PE(x) \cdot T(\nabla x)$$ 를 만족시키는 $T(x)$ 행렬을 구해보겠습니다.
$$\begin{bmatrix}u_1 & v_1 \\ u_2 & v_2 \end{bmatrix} \cdot \begin{bmatrix}sin(t) \\ cos(t) \end{bmatrix} = \begin{bmatrix}sin(t+\phi) \\ cos(t+\phi) \end{bmatrix}$$
를 만족시키는 $2 \times 2$ 크기의 행렬 $M$이 있다고 가정해보겠습니다. 우리는 행렬 $M$의 원소 $u_1, v_1, u_2, v_2$를 구하고 싶습니다.
우리는 삼각함수 공식을 통해 우변을 다음과 같이 전개할 수 있습니다.
$$\begin{bmatrix}u_1 & v_1 \\ u_2 & v_2 \end{bmatrix} \cdot \begin{bmatrix}sin(t) \\ cos(t) \end{bmatrix} = \begin{bmatrix} sin(t)cos(\phi) + cos(t)sin(\phi) \\ cos(t)cos(\phi) - sin(t)sin(\phi) \end{bmatrix}$$
따라서 좌변을 전개해 다음과 같은 두 식을 얻습니다.
$$u_1sin(t) + v_1cos(t) = cos(\phi)sin(t) + sin(\phi)cos(t)$$
$$u_2sin(t)+v_2cos(t) = -sin(\phi)sin(t) + cos(\phi)cos(t)$$
이로써 우리는 $u_1, v_1, u_2, v_2$ 를 구할 수 있습니다.
$$u_1 = cos(\phi) v_1 = sin(\phi)$$
$$u_2 = -sin(\phi) v_2 = cos(\phi)$$
따라서, 최종적으로 $M$ 은 다음과 같습니다.
$$M = \begin{bmatrix}cos(\phi) & sin(\phi) \\ -sin(\phi) & cos(\phi) \end{bmatrix}$$
translation을 반영하기 위하여 Positional Encoding은 sin과 cos을 한 쌍으로 사용합니다. 따라서 다음과 같이 $v^{(i)}$를 구성합니다.
$$v^{(i)} = [sin{w_0x_i} \ \ \ cos{w_0x_i} \ \ \ \dots \ \ \ sin{w_{n-1}x_i} \ \ \ cos_{w_{n-1}x_i}]$$
위 식에서 $\nabla x$ 만큼 변화량을 행렬 $T(\nabla x)$를 이용하여 선형 변환을 통해 나타내면 다음과 같습니다.
$$PE(x+\nabla x) = PE(x) \cdot T(\nabla x)$$
$$ = \begin{bmatrix} \sin(\omega_0 x_0) & \cos(\omega_0 x_0) & \cdots & \sin(\omega_{n-1} x_0) & \cos(\omega_{n-1} x_0) \\ \sin(\omega_0 x_1) & \cos(\omega_0 x_1) & \cdots & \sin(\omega_{n-1} x_1) & \cos(\omega_{n-1} x_1) \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ \sin(\omega_0 x_{\text{seq_len}-1}) & \cos(\omega_0 x_{\text{seq_len}-1}) & \cdots & \sin(\omega_{n-1} x_{\text{seq_len}-1}) & \cos(\omega_{n-1} x_{\text{seq_len}-1}) \end{bmatrix} $$
$$ \cdot \begin{bmatrix} \begin{bmatrix} \cos(\omega_0 \Delta x) & -\sin(\omega_0 \Delta x) \\ \sin(\omega_0 \Delta x) & \cos(\omega_0 \Delta x) \end{bmatrix} & \cdots & 0 \\ \vdots & \ddots & \vdots \\ 0 & \cdots & \begin{bmatrix} \cos(\omega_{n-1} \Delta x) & -\sin(\omega_{n-1} \Delta x) \\ \sin(\omega_{n-1} \Delta x) & \cos(\omega_{n-1} \Delta x) \end{bmatrix} \end{bmatrix}$$
회전 변환에 대한 행렬 연산이 전체 Positional Encoding Matrix에 적용되므로 $\nabla$ 만큼의 차이를 선형적으로 나타낼 수 있음을 확인하였습니다.
따라서 앞서 제시한 조건을 모두 만족하므로 다음과 같이 Positional Encoding Matrix를 구성하는 것은 적합합니다.
다시 처음으로 돌아가보겠습니다. Positional Encoding의 기본 형태는 다음과 같습니다.
$$PE_{(pos, 2i)} = \sin(pos/10000^{2i/d_{model}})$$
$$PE_{(pos, 2i+1)} = \cos(pos/10000^{2i/d_{model}})$$
$pos$는 데이터의 위치, $i$는 차원의 인덱스를 나타냅니다. 즉, 짝수번째 차원은 $sin$을 사용하고 홀수번째 차원은 $cos$를 사용합니다. 아래 예시를 보겠습니다.

$d=4, n=100$ 일 때의 Positional Encoding 값의 예시입니다.
(P10=sin(1/1)=0.84 입니다.)
입력 데이터는 embedding vector로 변환됩니다. The, dog, ran, fast는 각각 (4, ) 크기의 vector로 변환되며, 총 (4, 4) 크기의 Positional Embedding Matrix가 생성됩니다. 이 값은 입력 데이터인 embedding vector와 합(Sum)하게 됩니다.

Positional Encoding Matrix를 생성하여 가로 축이 $d_{model}$, 세로 축이 $seq_len$로 시각화하면 다음과 같습니다.
$d_{model}$ 이 작을 수록 Positional Encoding 값이 Position 변화에 민감하게 바뀌는 것을 알 수 있습니다. 이는 $d_{model}$이 작을 수록 $sin$ 함수와 $cos$ 함수의 주기가 작아지기 때문입니다.
Reference
- Transformer Architecture: The Positional Encoding - Amirhossein Kazemnejad's Blog
- Positional Encoding and Layer Normalisation | by Sambhav Mehta | Medium
- Master Positional Encoding: Part I | by Jonathan Kernes | Towards Data Science
- Transformer와 Nerf에서의 Positional Encoding의 의미와 사용 목적 - gaussian37
- Linear Relationships in the Transformer’s Positional Encoding - Timo Denk's Blog
- Vaswani, Ashish, et al. "Attention is all you need." arXiv preprint arXiv:1706.0372 (2017).
'딥러닝' 카테고리의 다른 글
| 모두의 딥러닝 시즌 1 (0) | 2024.12.22 |
|---|---|
| Batch/Layer/Group Normalization (0) | 2024.11.25 |
| RNN: Backpropagation (0) | 2024.11.18 |