Transformer의 self-attention은 입력 vector 사이의 관계를 계산하지만, token이 원래 몇 번째 위치에 있었는지는 스스로 알 수 없다. 따라서 token embedding에 위치정보를 별도로 넣어주어야 한다.
Sinusoidal positional encoding은 token의 위치 를 여러 주파수의 sin과 cos로 변환하여 차원 vector 하나로 표현하는 방법이다.
Positional encoding이 필요한 이유
Self-attention에 다음 두 sequence를 입력한다고 하자.
두 문장은 token의 구성은 같지만 순서에 따라 의미가 달라진다. 그러나 위치정보가 없는 self-attention은 입력 순서를 바꾸면 출력도 같은 방식으로 재배열되는 permutation equivariant 연산이다. 어느 token이 첫 번째이고 어느 token이 마지막인지 구분하는 기준이 연산 자체에는 없다.
그래서 위치 의 token embedding 에 같은 차원의 positional vector 를 더한다.
와 의 shape는 모두 다음과 같다.
여기서 는 embedding dimension이며, Transformer 표기에서는 보통 에 해당한다. 이렇게 만든 에는 token의 내용과 위치정보가 함께 들어간다.
Sinusoidal positional encoding의 정의
위치 에 대한 positional vector를 다음과 같이 두자.
각 원소는 다음 식으로 정한다.
기호의 의미는 다음과 같다.
- : sequence 안에서 token의 위치이며 보통 로 센다.
- : positional vector 안의 dimension 또는 channel 번호이다.
- : token embedding과 positional vector의 차원이다.
짝수와 홀수 dimension을 와 로 묶으면 인접한 홀수, 짝수 두개의 채널이 같은 주파수를 공유함을 볼 수 있다.
두 식은 이므로 같은 의미이다. 인접한 두 dimension은 같은 주파수를 공유하고, 하나는 sin, 다른 하나는 cos를 사용한다.
인 경우
Embedding dimension을 으로 두면 는 부터 까지이다. 같은 주파수를 사용하는 dimension을 한 쌍으로 묶으면 다음과 같다.
위치 의 positional vector는 다음과 같이 만들어진다.
예를 들어 이면 모든 sin 항은 , 모든 cos 항은 이므로 다음과 같다.
가 , , 으로 증가하면 각 sin과 cos 쌍은 서로 다른 속도로 값을 바꾸며, 위치마다 다른 vector를 만든다.
여러 주파수를 사용하는 이유
하나의 주파수 를 사용하는 sin과 cos 쌍은 다음과 같이 쓸 수 있다.
이 vector는 단위원 위에서 각도 만큼 회전한 점으로 볼 수 있다. 위치가 증가할 때마다 원 위를 일정한 속도로 이동하는 셈이다.
하지만 sin과 cos는 주기함수이므로 한 주파수만 사용하면 멀리 떨어진 위치에서 같은 값이 반복된다. Sinusoidal positional encoding은 이를 보완하기 위해 dimension마다 서로 다른 주파수를 사용한다.
가 작을 때는 가 커서 위치가 조금만 달라져도 값이 빠르게 변한다. 반대로 가 커질수록 가 작아져 값이 천천히 변한다. 따라서 하나의 positional vector 안에 짧은 거리의 차이에 민감한 dimension과 긴 범위에서 천천히 변하는 dimension이 함께 들어간다.
각 주파수의 wavelength는 다음과 같다.
이를 속도가 서로 다른 여러 개의 시계로 생각할 수 있다. 시계 하나의 상태는 주기적으로 반복되지만, 여러 속도의 시계를 함께 보면 각 위치를 훨씬 풍부한 조합으로 나타낼 수 있다.
상대적 위치를 다루기 좋은 이유
같은 주파수의 두 positional vector를 내적하면 다음과 같다.
삼각함수 항등식을 적용하면 절대 위치 와 가 아니라 두 위치의 차이가 나타난다.
예를 들어 과 은 절대 위치가 다르지만 두 경우 모두 위치 차이가 이다. 따라서 같은 주파수 쌍의 내적값도 같다.
전체 positional encoding은 이런 sin과 cos 쌍을 여러 주파수에 걸쳐 사용한다. 덕분에 각 위치 자체를 표현하면서도 token 사이의 상대적 거리 가 내적과 선형변환을 통해 드러나기 좋은 구조를 가진다.
Sequence 전체의 shape
Token이 개라면 각 위치의 positional vector를 행으로 쌓아 positional encoding matrix를 만든다.
Token embedding matrix도 같은 shape를 가진다.
따라서 두 matrix를 원소별로 더할 수 있다.
Positional encoding을 더해도 Transformer에 들어가는 입력 shape는 바뀌지 않는다. 같은 단어의 embedding이 라고 하더라도 위치에 따라 입력 vector는 달라진다.
따라서 모델은 같은 token이라도 어느 위치에 나타났는지를 구분할 수 있다.
Sinusoidal 방식과 learned positional embedding
고전적인 sinusoidal positional encoding은 학습할 parameter가 없다. 위치 가 주어지면 정해진 식으로 를 바로 계산한다.
반면 learned positional embedding은 최대 길이 에 대한 embedding matrix 자체를 parameter로 둔다.
Sinusoidal 방식은 임의의 위치에 대한 vector를 식으로 생성할 수 있고, learned 방식은 학습 데이터에 맞는 위치 표현을 직접 학습할 수 있다는 차이가 있다. 두 방식 모두 입력에 위치정보를 더하는 구조에서는 최종적으로 를 사용한다.
식에 등장하는 은 수학적으로 반드시 정해지는 상수가 아니라, 넓은 범위의 wavelength를 만들기 위해 선택한 설계값이다.
RoPE와의 연결
Sin과 cos 한 쌍을 2차원 회전으로 보는 관점은 RoPE(Rotary Position Embedding)와도 연결된다. 다만 RoPE는 positional vector를 token embedding에 단순히 더하는 대신, 위치에 따라 query와 key의 channel 쌍을 회전시킨다.
두 방법의 구현은 다르지만, 여러 주파수의 회전으로 위치를 표현하고 상대적 위치 차이가 attention score에 드러나게 한다는 직관은 이어진다.
정리
Sinusoidal positional encoding은 위치 를 여러 속도의 sin과 cos 파동에 넣어 embedding과 같은 차원 vector로 표현한다.
- 빠르게 변하는 dimension은 가까운 위치의 차이에 민감하다.
- 천천히 변하는 dimension은 더 긴 범위의 위치 변화를 나타낸다.
- 같은 주파수의 sin과 cos를 쌍으로 사용하면 위치를 회전 상태로 볼 수 있다.
- 두 위치 vector의 내적에는 가 나타나므로 상대적 위치를 다루기 좋은 구조가 된다.
- 와 의 shape가 모두 이므로 위치정보를 더해도 Transformer 입력 차원은 유지된다.