본문 바로가기
컴퓨터

positional encoding이란 무엇인가

by skyjwoo 2020. 2. 20.
728x90
반응형

 

Transformer model을 살펴보면, positional encoding이 적용된다. 

다음 그림은 transformer 모델에 대한 구조도 인데, positional encoding을 찾아볼 수 있다. 

출처는 https://www.tensorflow.org/tutorials/text/transformer 이다.

transformer model 구조도

transformer 모델에 대해 공부하면서, 가장 이해가 안 갔던 부분이 이 positional encoding이었는데, 한 블로그를 통해 이해에 도움을 얻을 수 있었다. 

 

해당 블로그는 다음 링크를 통해 들어갈 수 있으며, 본 포스팅은 해당 블로그의 글에 대한 약간의 번역과 필자의 이해가 담겨있다.

https://kazemnejad.com/blog/transformer_architecture_positional_encoding/

 

Transformer Architecture: The Positional Encoding - Amirhossein Kazemnejad's Blog

Transformer architecture was introduced as a novel pure attention-only sequence-to-sequence architecture by Vaswani et al. Its ability for parallelizable training and its general performance improvement made it a popular option among NLP (and recently CV)

kazemnejad.com

  • transformer 모델 개괄

positional encoding에 대해 이야기 하려면, transformer 모델의 특징에 대해 먼저 알아보아야 한다. transformer 모델은 기존의 자연어 처리에 사용되는 LSTM, RNN 기반의 모델과 달리 '시간적 연속성'을 모델의 핵심부에서 다루지 않는다. transformer 모델의 핵심은 attention 함수인데, 쉽게 말하면 "John is good at playing soccer and he want to be a soccer player." 라는 문장에서 he를 attention 함수를 통과시키면 John에 대한 attention 값이 가장 높게 나오도록 하는 것이다. 여기서 attention 함수가 들어간 layer에서는 구조적으로 시간적 연속성이 없이 입력값을 다루게 된다. 반면,

RNN 류의 모델은 모델의 구조 자체가 시간적 연속성을 보장하게 된다. (cell과 cell들이 병렬적으로 연결된 구조)

 

attention 함수가 이러한 구조를 통해 얻는 이점은 데이터가 통과하는 layer의 수를 줄일 수 있어 연산에서의 이득과, RNN 류 모델의 학습 과정에서 발생하는 기울기 소실/폭발 등에서 자유롭다는 것이다. 

 

transformer 모델에 대해 더 자세히 알고 싶다면 다음 링크를 추천한다.

https://nlpinkorean.github.io/illustrated-transformer/ 

 

The Illustrated Transformer

저번 글에서 다뤘던 attention seq2seq 모델에 이어, attention 을 활용한 또 다른 모델인 Transformer 모델에 대해 얘기해보려 합니다. 2017 NIPS에서 Google이 소개했던 Transformer는 NLP 학계에서 정말 큰 주목을 끌었는데요, 어떻게 보면 기존의 CNN 과 RNN 이 주를 이뤘던 연구들에서 벗어나 아예 새로운 모델을 제안했기 때문이지 않을까 싶습니다. 실제로 적용했을 때 최근 연구에 비해 큰 성능 향상을

nlpinkorean.github.io

 

  • positional encoding

쨌든 설명은 이정도로 하고, positional encoding이 왜 필요한가 하면, 그럼에도 어순은 언어를 이해하는 데 중요한 역할을 하기에 이 정보에 대한 처리가 필요하다. 따라서 이 논문의 저자가 채택한 방식은 attention layer에 들어가기 전에 입력값으로 주어질 단어 vector 안에 positional encoding 정보, 즉, 단어의 위치 정보를 포함시키고자 하는 것이다. 

 

그럼 여기서 고민해 볼 수 있는 게, 어떻게 위치 정보(순서 정보)를 부여할 것인가 인데, 두 가지 방법과 각 한계를 저자는 이렇게 제시하고 있다. 

 

   1) 데이터에 0~1사이의 label을 붙인다. 0이 첫번째 단어, 1이 마지막 단어

      → I love you: I 0 /love 0.5/ you 1

      → Input의 총 크기를 알 수 없다. 따라서 delta 값이 일정한 의미를 갖지 않는다.(delta = 단어의 label 간 차이)

 

   2) time-step마다 선형적으로 숫자를 할당하는 것이다.(총 크기에 따라 가변적, delta일정해짐) 따라서 첫번째 단어 는 1, 두 번째 단어는 2를 갖게 됨

      → I love you: I 1/ love 2/you 3

      → 숫자가 매우 커질 수 있고, 훈련 시 학습할 때보다 큰 값이 입력값으로 들어오게 될 때 문제 발생 모델의 일반화 가 어려워짐-특정한 범위 값을 갖는게 아니기에

 

이에 대해 저자는 이상적인 모델은 다음과 같은 기준을 충족시켜야 한다고 말한다.

 

   1) time-step(문장에서 단어의 위치)마다 하나의 유일한 encoding 값을 출력해 내야 한다. 

 

   2) 서로 다른 길이의 문장에 있어서 두 time-step 간 거리는 일정해야 한다.

 

   3) 모델에 대한 일반화가 가능해야 한다. 더 긴 길이의 문장이 나왔을 때 적용될 수 있어야 한다. , 순서를 나타내는 값 들이 특정 범위 내에 있어야 한다.

 

   4) 하나의 key 값처럼 결정되어야 한다. 매번 다른 값이 나와선 안된다.

 

 

 

Transformer 모델에서 사용된 encoding 기술은 위의 기준들을 모두 충족시킨다.

첫번째로, 하나의 숫자가 아니다. 대신에 d-dimensional vector로 문장 내 특정 위치 정보를 표현한다.  두번째로 이 인코딩은 모델 자체 내에서 사용되지 않았다. 대신에 이 vector는 각 단어에 붙어 문장 내 위치 정보를 표시하게 되었다. , 단어의 순서 정보를 표현하기 위해 input을 늘렸다.

 

 

 

t를 한 input 문장에서의 위치라 하자.  $R^d$에 속하는  $\vec{p_t}$는 이에 상응하는 encoding값이다. 그리고 dencoding dimension(d≡$_2$0, d mod 2=0) 이다. 그러면, ƒ: N→$R^d$  는 출력 벡터인 $\vec{p_t}$ 를 만들어내는 함수이다.

$\vec{p_t}$ 는 다음과 같이 정의된다.

 

 

 

[1]
[1]

함수의 정의에서 유추해볼 수 있듯이, vector dimension에 따라 frequency가 줄어듦(sin/cos의 주기가 길어짐)을 알 수 있다. 따라서 파장에서 2$\pi$에서 10000*2$\pi$까지의 기하 수열(geometric progression)을 보임을 알 수 있다.

 

또한 positional embedding으로 들어가는 $\vec{p_t}$에 대해 각 frequency에 대해 sin, cos 쌍이 들어가 있음을 알 수 있다. (d2로 나누어 지는 수임을 확인하자.)

 

positional encoding이 적용된 vector 모습[1]

 

  • 직관적으로 생각해보기

어떻게 sin, cos조합으로 순서값을 표현할 수 있는 지 의문이 생길 수 있는데, 매우 간단한 예시로 접근이 가능하다. 다음과 같은 이진 bit를 살펴보자.

 

이진 bit로 표현된 수들 0~8

0~8까지를 표현한 건데 각 자릿수에서 bit의 변화가 일정한 규칙성을 보임을 알 수 있다. 가장 작은 bit (LSB)는 1이 증가할 때마다 바뀌고, 두 번째로 작은 bit는 2가 증가할 때마다 바뀐다. 세 번째로 작은 bit는 4가 증가할 때마다 바뀌고 즉, n번째로 작은 bit는 $2^{n-1}$이 증가할 때마다 바뀜을 알 수 있다. 즉, 이러한 bit의 변화 규칙을 통해 숫자들 사이의 관계에 대해 접근할 수 있다. 

 

그렇다면 왜 이진 bit 방식을 사용하지 않은 걸까? 이는 실제 모델에서 단어 embedding이 주로 부동 소숫점 방식으로 표현되기에 이를 표현하기 위해 이진 bit 방식은 공간의 낭비가 심하다. 같은 단위 공간에서 표현할 수 있는 숫자의 범위가 이진 bit가 적기 때문이다. 

 

  • 다른 세부 사항들

이 글의 초반부에 입력 단어들에 이러한 positional embedding이 부착되어 위치 정보를 표현한다고 했는데, 어떻게 이러한 작업이 이뤄질까? 사실, 원글에서는 실제 embedding의 위에 positional embedding을 추가했다. 한 문장[$w_1$,…,$w_n$]의 모든 단어들($w_t$)에 적용된 이 모델에서 사용된 embedding 값은 다음과 같다.

단어 embedding에 positional embedding을 추가하여 새로운 embedding을 생성한다.[1]
positonal embedding 의 차원을 단어 embedding의 차원과 동일하게 맞춰주어야 한다.[1]

 

  • 상대적 positioning

Sinusoidal positional encoding의 또다른 특징은 모델이 별다른 노력 없이 상대적 position을 갖게 된다는 것이다.

[1]

문장에서 위치 t와 t+$\phi$ 사이의 관계는 어떨까. 2 x 2 행렬인 M을 구하면 서로 다른 위치 사이의 관계를 구할 수 있을 것이다. 

 

그런데 여기서 M이 rotation matrix이다. 이러한 선형 변환 행렬이 상대적인 위치 값을 표시하는 데 매우 적합하다. 기준 위치에서 증가하거나 감소함에 따라 대칭적으로 식이 적용되고, 거리가 멀어짐에 따라 그 값이 감소하는 점 역시 적절했다.

 

참고 자료

[1] https://kazemnejad.com/blog/transformer_architecture_positional_encoding/

728x90
반응형

댓글