Search
Duplicate

AI/ Positional Encoding

Positional Encoding

Positional Encoding은 순서 정보를 고려하지 않는 모델에 고유한 순서 정보를 부여하는 함수이다. 예컨대 attention은 구조 상 입력 단어의 순서를 이해할 수 없는데, 이것은 모델의 성능을 떨어뜨린다. 이를 해결하기 위해 단어 임베딩을 positional embedding과 연결하면 모델이 단어의 순서를 이해할 수 있다.
입력에 순서를 부여하는 가장 쉬운 방법은 각 위치를 정수로 표현하는 것이지만, 본질적으로 신경망은 정수를 다룰 수 없기 때문에, 이진 형식으로 정수를 인코딩하는 것이 positional encoding의 기본 아이디어이다. 예컨대 n=3n=3인 시퀀스 길이를 고려하면 다음과 같은 각 위치에 d=3d=3-차원 비트 벡터의 시퀀스를 얻을 수 있다.
000001010011100101110111000 \\ 001 \\ 010 \\ 011 \\ 100 \\ 101 \\ 110 \\ 111
가장 오른쪽 인덱스가 가장 높은 빈도로 꺼졌다 켜지는 반면 가장 왼쪽 인덱스(가장 큰 비트)는 가장 느리게 꺼졌다 켜지는 것을 볼 수 있다. (물론 기준을 바꿔서 가장 왼쪽 비트가 가장 빠르게 꺼졌다 켜지도록 할 수도 있다) 이것을 position 행렬 PRn×d\bold{P} \in \mathbb{R}^{n \times d}로 표현할 수 있다.
계수가 0이나 1인 기저 함수(2의 제곱에 해당하는)의 집합을 사용할 수 있지만, 다음과 같은 sinusoidal 기저를 사용하면 더 단순한 코드를 얻을 수 있다.
pi,2j=sin(iC2j/d)pi,2j+1=cos(iC2j/d)\begin{aligned} p_{i,2j} &= \sin\left({i \over C^{2j/d}}\right)\\ p_{i,2j+1} &= \cos \left( {i \over C^{2j/d}} \right) \end{aligned}
여기서 C=10,000C=10,000이고 최대 시퀀스 길이에 해당한다. 예컨대 d=4d =4이면 ii-번째 행은 다음과 같다.
pi=[sin(iC0/4),cos(iC0/4),sin(iC2/4),cos(iC2/4)]\bold{p}_i = \left[\sin\left({i\over C^{0/4}}\right), \cos\left({i \over C^{0/4}}\right), \sin\left({i \over C^{2/4}}\right), \cos\left({i\over C^{2/4}}\right) \right]
positional encoding은 시퀀스의 뒤로 갈 수록 값이 커지도록 하는게 아니라, 전체 입력이 unique한 값을 갖도록 한다는데 주의하라.
이 표현의 이점은 2가지이다. 첫 째는 정수에서 벡터로 매핑하는 것을 배우는 것과 달리 임의의 길이의(TCT \le C) 입력에 대해 계산 가능하다는 것이고, 두 번째는 하나의 위치의 표현이 그들의 연관된 거리의 지식이 주어지면 다른 것으로부터 선형으로 예측 가능하다는 것이다. 특히 pt+ϕ=f(pt)\bold{p}_{t + \phi} = f(\bold{p}_t)을 갖는다. 여기서 ff는 선형 변환이다.
(sin(ωk(t+ϕ))cos(ωk(t+ϕ)))=(sin(ωkt)cos(ωkϕ)+cos(ωkt)sin(ωkϕ)cos(ωkt)cos(ωkϕ)sin(ωkt)sin(ωkϕ))=(cos(ωkϕ)sin(ωkϕ)sin(ωkϕ)cos(ωkϕ))(sin(ωkt)cos(ωkt))\begin{aligned} \begin{pmatrix}\sin(\omega_k(t+\phi)) \\ \cos(\omega_k(t+\phi)) \end{pmatrix} &= \begin{pmatrix} \sin(\omega_k t)\cos(\omega_k\phi) + \cos(\omega_kt)\sin(\omega_k\phi) \\ \cos(\omega_kt)\cos(\omega_k\phi) - \sin(\omega_k t)\sin(\omega_k\phi) \end{pmatrix} \\ &= \begin{pmatrix} \cos(\omega_k\phi ) & \sin(\omega_k\phi) \\ -\sin(\omega_k\phi) & \cos(\omega_k\phi) \end{pmatrix}\begin{pmatrix} \sin(\omega_kt) \\ \cos(\omega_kt) \end{pmatrix}\end{aligned}
따라서 ϕ\phi가 작으면 pt+ϕpt\bold{p}_{t+\phi} \approx \bold{p}_t이 된다. 이것은 유용한 형식의 inductive bias를 제공한다.
positional embedding P\bold{P}를 한 번 계산하면 다음을 사용하여 원래 단어 임베딩 X\bold{X}과 결합해야 한다.
POS(Embed(X))=X+P\text{POS}(\text{Embed}(\bold{X})) = \bold{X} + \bold{P}

참고