[Transformer] Positional Encoding 이론 Deep Dive

Terry·2024년 5월 17일

NLP

목록 보기
2/4

Positional Encoding에 대한 이론적인 내용을 공부하여 요약하였다.

왜 positional encoding이 필요한가?

Positional Encoding은 transformer 모델의 앞단에서 Input Embedding 값에 더해진다. 이런 encoding 값이 필요한 이유는 각 representation의 위치 값을 기억하기 위해서다. Encoder의 값이 Decoder의 값에 병렬로 전달 되는게 transformer가 기존의 sequential한 데이터를 처리하는 모델과 다른 점이다. Transformer는 병렬로 문장 전체를 한꺼번에 전달하는 방법 때문에 연산 속도를 개선할 수 있었다. 병렬 처리 시, 단어의 순서를 기억할 수 있는 방법이 필요했고 이게 Positional Encoding이 필요한 이유다.

왜 positional encoding을 아래와 같은 공식으로 만들었나?

PE(pos,2i)=sin(pos/100002idmodel)PE_(pos,2i) = sin(pos/10000^{\frac{2i}{d_{model}}})
PE(pos,2i+1)=cos(pos/100002idmodel)PE_(pos,2i+1) = cos(pos/10000^{\frac{2i}{d_{model}}})
  • pos: input 안에서의 token의 순서(3이면 3번째)
  • i: 차원(i번째 차원)
  • dmodel: 모델의 전체 차원 수

Positional Encoding을 통해 단어의 위치를 명확하게 파악하려면 아래와 같은 규칙들이 맞아야 한다.

  • 각 위치의 Positional Encoding 값은 결정론적(Deterministic)하게 결정되는 동시에 유일해야 한다.
    ->어떤 representation이 들어오던 positional encoding의 값은 바뀔 수 없다. 문장의 길이도 영향을 줄 수 없다.(어차피 max_seq가 존재하고 문장이 짧으면 pad 값으로 채워진다.)
    -> Positional Encoding 벡터의 값이 동일한 지점이 있다고 하면, 모델은 두 곳의 위치를 같다고 인식하고 단어 간 순서를 파악하지 못하게 된다. 때문에 모든 위치의 인코딩 값은 달라야 한다.
  • 간격이 동일하다면, 위치와 관계없이 거리가 동일해야 한다.
    distance(x,x+h)=distance(y,y+h)distance(x, x+h) = distance(y,y+h)
    -> 모든 positional encoding 값 사이의 간격이 동일하지 않다면 연속된 representation 사이의 순서를 정량적으로 수치화할 수 없다는 뜻인 것 같다.

그럼 이런 규칙을 맞추기 위해 왜 sin, cos 함수를 사용했나?

  1. 0~1 사이의 값으로 표현하기 위함
    positional encoding 값은 input embedding에 더해져야 하는 값이다. 이 값이 너무 커지거나, 너무 작아지면 embedding이 갖는 의미에 대한 정보들이 덜 적용될 것이다. 또한 학습 시에도 vanishing gradient나 그 반대 현상으로 모델의 정확도를 떨어뜨릴 수 있다. 노드의 값에 정규화를 진행하는 것과 동일한 이유로 [-1, ~1]의 range를 갖는 sin, cos 함수를 사용하였다.

  2. 주기 함수를 통한 명확한 위치 구분
    만약 input token의 길이가 길어질 경우(chatgpt처럼 몇백만개의 토큰을 허용할 경우), 주기 함수가 아닌 선형 함수를 사용한다고 하면 벡터 값의 차이가 미미해진다. 하지만 주기 함수의 특성 때문에 input token이 길어지더라도 2개의 연속된 값 사이에 유의미한 차이가 생기게 된다.
    근데 만약 모델의 차원이 1개라면 이런 경우 주기가 돌아오면 두 개 이상의 위치에서 값은 값이 등장할 확률이 높다. 하지만 각 차원마다 주기가 다른(차원 i의 값이 커질수록 값의 변화가 작다) 함수를 사용하기 때문에 n개의 차원인 벡터의 값이 동일할 수 없게 된다. 거기다가 sin, cos 함수를 홀수, 짝수 차원에서 번갈아 써주기 때문에 2개의 연속된 position 사이의 값의 차이를 더 명확히 구분할 수 있게 된다.

왜 Input Embedding에 더해주는 공식을 사용했나?

정말 정말 엄청난 우연으로 input embedding + positional embedding의 값이 2개의 스칼라 값을 동일한 값으로 만들어 줄 수도 있다.(물론 dimension이 커질수록 그럴 확률은 거의 없어지겠지만..그래도 분리하는게 나을 수 밖에 없다) 내가 본 블로그의 설명을 보며 선형대수 개념이 기억났는데 2개의 정보(임베딩 정보, 위치 정보)가 각각의 차원을 가질 때 직교 성질에 의해 독립적인 공간에 있게 된다. Concatenate을 통해 2개의 값을 옆으로 이어붙일 수도 있겠지만 이는 연산 효율의 문제로 합쳐졌을 확률이 높다고 설명한다.

참고 링크
1. positional encoding 수식 관련 설명
positional encoding 함수의 핵심인 Sinusoidal Encoding이 자세히 설명되어 있다.
2. 수식에 대한 예시를 풀어서 설명해준 글
이민경님의 블로그로 수식에 대한 설명을 잘 모르는 사람도 이해할 수 있도록 방법론에 대한 이유를 쉽게 설명했다. Multi-head attention에 대한 설명도 정말 좋았다.

0개의 댓글