지난 글에서 Transformer의 핵심적인 Building Block인 Attention을 정리해봤습니다. 이어서 Vaswani et al. (2017) 논문을 통해 현재 나오는 수많은 모델의 기반이 되고 있는 Transformer를 차근차근 이해할 수 있도록 정리해보았습니다.
이번 글에서는 Transformer에서 다루지 않은 마지막 요소인 Positional Encoding에 대해 알아보겠습니다.
Positional Encoding
Positional Encoding이란 말 그대로 위치의 Representation을 벡터로 표현한 것을 말합니다. 조금 더 엄밀하게 표현한다면 $A=[a_0, a_1, \cdots, a_n]$가 주어졌을 때 A의 Positional Encoding은 각 원소의 위치와 원소 간의 위치에 대한 정보를 알려주는 함수라고 할 수 있습니다.
Transformer에서는 사용하는 Sinusoid Positional Encoding의 계산 방법은 다음과 같습니다.
$$PE_{(pos, 2i)}=\sin(pos/10000^{2i/d_{model}})$$
$$PE_{(pos, 2i+1)}=\cos(pos/10000^{2i/d_{model}})$$
위 방법을 통해 계산된 Positional Encoding 값을 입력값에 더해주어 모델이 입력값의 순서를 고려할 수 있도록 해주는 것이 Transformer에서 설명하는 전부입니다. 이때 $d_{model}$ 차원 입력값의 Positional Encoding을 그림으로 표현하면 아래와 같습니다. (편의를 위해서 시작 Index를 1로 설정했습니다.)
논문을 읽어보시면 아시겠지만 논문에서는 Positional Encoding을 매우 간략하게 설명하고 있습니다. 주어진 공식을 단순히 사용하여 좋은 결과를 얻는 것도 좋지만, 사용된 원리가 엉뚱하게 다른 문제를 풀 때 도움이 되는 일도 종종 있기에 논문 외 다른 자료들을 살펴보고 정리해보았습니다. (이 글은 Positional Encoding을 검색해보면 나오는 Medium을 포함한 여러 블로그 포스트를 간략하게 정리한 것이기 때문에 보다 상세한 설명을 보고 싶으시다면 아래에 적어둔 Reference를 읽어보시면 되겠습니다 🙂)
Dive into Positional Encoding
Positional Encoding은 임의의 입력값이 들어왔을 때 i번째 위치의 Representation이 동일한 경우(Fixed Positional Encoding)와 다른 경우(Relative Positional Encoding)가 존재합니다. 이 글에서는 Fixed Positional Encoding을 중점적으로 다뤄보겠습니다.
Ideal Criteria for Positional Encoding
특정 Encoding 방법론이 이상적인 Positional Encoding이기 위해서 만족해야 할 조건은 다음과 같습니다.
- 각 위치의 Positional Encoding 값은 결정론적(Deterministic)하게 결정되는 동시에 유일해야 한다.
- 데이터와 관계없이 각 위치의 Positional Encoding 값은 동일해야 한다.
- 데이터의 길이와 상관없이 적용 가능해야 한다.
- 간격이 동일하다면 위치와 관계없이 거리는 동일해야 한다. ($\text{distance}(x,x+h)=\text{distance}(y,y+h)$)
- 데이터와 관계없이 i번째 위치부터 j번째 위치(i < j)까지의 거리는 동일해야 한다.
Methods
Simple Indexing (Count)
Simple Indexing은 말 그대로 각 위치의 인덱스를 Positional Encoding 값으로 사용하는 것입니다.
$$\text{Positional Encoding}(a_i)=i$$
이 방법은 이상적인 Positional Encoding의 조건을 모두 만족하지만, 입력값의 길이가 길어질수록 Encoding 값이 커져 학습 시 문제(Gradient Exploding 등)를 겪을 가능성이 높아지기 때문에 실제 사용에 한계가 있습니다.
Normalize Indexing (Normalize Count)
Normalize Indexing은 값이 커지지 않도록 Simple Indexing의 결과를 문장의 길이로 나누어 0부터 1까지의 값으로 표준화하는 방법입니다.
$$\text{Positional Encoding}(a_i)=\dfrac{i}{T}$$
이 방법은 Simple Indexing에서 발생하는 문제는 해결했지만, 이상적인 Positional Encoding의 두 번째 조건을 만족하지 못합니다. (예: 길이가 20인 데이터에서 8번째 Positional Encoding 값과 길이가 10인 데이터의 4번째 Positional Encoding 값이 동일)
Binary Indexing
Binary Indexing은 Simple Indexing의 결과를 2진수를 이용해 표현하는 방식입니다. 예를 들어 데이터의 길이가 5일 때 Binary Indexing을 이용한 Positional Encoding 값은 다음과 같습니다.
Simple Indexing과 같이 숫자가 커지는 문제도 없고, 2, 3번 조건도 만족하는 것 같지만 4번 조건을 만족하지 못합니다. (예: $\text{distance}(a_1, a_2)=\sqrt{2},\;\text{distance}(a_2, a_3)=1$)
Sinusoidal Encoding
마지막으로 Transformer에서 사용되는 Sinusoidal Encoding에 대해 살펴보겠습니다. Sinusoidal Encoding은 Binary Indexing에서 확인할 수 있는 각 차원의 주기성을 이용합니다. Binary Indexing 예제 그림을 보면 가장 아래에 있는 차원의 주기는 짧고, 차원이 올라갈수록 주기가 길어지는 것을 볼 수 있습니다. 그렇다면 대표적인 주기 함수인 Sine 함수를 이용해서 위치의 Representation을 표현하면 -1과 1 사이의 값을 가지니 학습에도 무리가 없는 동시에 연속된 실수를 이용하기 때문에 Compact 한 Space를 충분히 활용할 수 있을 것 같습니다. 그럼 각 차원을 주기가 $4\pi. 8\pi, 16\pi$인 Sine 함수를 통해 표현했을 때 각 위치를 3차원 공간에 표시해보겠습니다.
괜찮은 아이디어인 것 같았지만 각 차원의 주기가 $2^n\pi$의 형태를 따르기 때문에 3개의 함수로 표현되는 공간이 닫힌계인 것을 위 그림을 통해 확인할 수 있습니다. 즉, 어느 순간 다른 위치가 같은 Encoding 값을 가질 수 있게 되기 때문에 위 형태로는 Positional Encoding을 이용할 수 없습니다.
다시 한번 생각해보면 굳이 주기가 $2^n\pi$꼴이 아니어도 상관없을 것 같습니다. 차원이 증가할수록 주기가 아주 미세하게 증가/감소한다면 닫힌계가 나올 수 없을 테니 i번째 차원의 Encoding을 다음과 같이 계산해보겠습니다.
$$PE_{(pos, i)}=\sin(pos/10000^{i/d_{model}})$$
여기에서 조금만 더 나아가 보겠습니다. 만약 Position i의 Encoding을 선형 변환했을 때 Position j의 Encoding을 알 수 있다면 Attention이 단어들 간의 상호작용을 더 잘 이해할 수 있지 않을까요? 예를 들어 “I am going to eat”이라는 문장을 번역하는 문제라면 Attention은 am going to가 있을 때 am going to의 앞에는 행위자(I)가, 행위자로부터 4번째 뒤에 있는 위치에는 그 행위자가 무엇을 하는지(eat)가 적혀있다는 것을 알 수 있다면 좋겠습니다. 즉, Position의 차이에 의존하는 변환 방법이 있다면 Query, Key, Value를 계산하는 과정에서 이루어지는 선형 변환을 통해 Attention이 조금 더 쉽게 위치에 대한 정보를 얻을 수 있게 될 겁니다.
위에서 말한 성질은 Translation이라 불리며 식으로 표현하면 다음과 같습니다.
$$PE_{pos+\Delta{step}}=PE_{pos}\cdot{T(\Delta{step})}$$
그리고 마침 삼각함수에는 임의의 행렬을 원점을 중심으로 회전시켜주는 선형 변환인 회전변환행렬(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}$$
따라서 Sine 함수와 Cosine 함수로 구성된 Positional Encoding은 Translation이라는 특성을 가지게 될 것입니다. 더불어 Sine 함수를 단독으로 사용하는 것보다 Cosine 함수를 함께 사용한다면 각 Position이 조금 더 명확하게 구별될 수 있을 것입니다. 이러한 과정을 거쳐 최종적으로 나온 결과가 Transformer에서 사용한 Sinusoidal Encoding입니다.
$$PE_{(pos, 2i)}=\sin(pos/10000^{2i/d_{model}})$$
$$PE_{(pos, 2i+1)}=\cos(pos/10000^{2i/d_{model}})$$
마치며
지금까지 Transformer를 이해하기 위해 구성요소들을 하나씩 살펴봤습니다. 사실 워낙 유명하고 현재 가장 많이 사용되는 아이디어/구조이기 때문에 스쳐가듯 이해를 하고 지나갔는데, 글을 쓰며 다시 한번 꼼꼼히 살펴볼 기회를 가질 수 있게 되어서 좋았습니다. 혹시라도 아직 논문을 읽어보지 않으신 분들이 계신다면, 논문이 그리 길지 않고, 참조할 자료도 많으니 꼭 한 번 읽어보셨으면 좋겠습니다! 🙂
잘못된 내용, 오타, 부정확한 문장 등 어떤 피드백이든 환영합니다. 감사합니다.
References
- Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., ... & Polosukhin, I. (2017). Attention is all you need. Advances in neural information processing systems, 30. [Link]
- https://towardsdatascience.com/master-positional-encoding-part-i-63c05d90a0c3
- https://kazemnejad.com/blog/transformer_architecture_positional_encoding/
- https://timodenk.com/blog/linear-relationships-in-the-transformers-positional-encoding/
'Data Science > Maching Learning' 카테고리의 다른 글
ML. Pinball Loss (0) | 2023.09.28 |
---|---|
Vision Transformer(1): Theory (2) | 2022.06.26 |
차근차근 이해하는 Transformer(4): Masked Multi-Head Attention과 Decoder (2) | 2022.05.09 |
차근차근 이해하는 Transformer(3): Multi-Head Attention과 Encoder (0) | 2022.05.06 |
차근차근 이해하는 Transformer(2): Single-Head Attention으로 이해하는 Encoder (2) | 2022.05.05 |