Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

Attention

트랜스포머(Transformer) - 1. Positional Encoding 본문

AI

트랜스포머(Transformer) - 1. Positional Encoding

Unet 2023. 12. 8. 00:01

트랜스포머 논문인 'Attention Is All You Need'을 기반으로 세부 사항들을 추가적으로 공부하여 정리하였습니다. 글의 순서는 다음과 같습니다. 

 

  1. Positional Encoding이란
  2. Positional Encoding이 왜 필요한가? 
  3. Positional Encoding 방식
  4. Input 연산 방식 

1. Positional Encoding 이란

 

트랜스포머에서는 가장 먼저 텍스트 데이터를 컴퓨터가 이해할 수 있는 값으로 벡터화하기 위하여 input embedding을 진행한다. embedding은 기존에 학습되어 있는 임베딩 모델을 통해 변환하였으며, 해당 논문에서는 512차원의 벡터로 각 토큰을 표현하였다. 이 값은 결국 비슷한 의미를 갖는 토큰일수록 가깝게 위치하게 되어, 의미적 유사성을 표현할 수 있다.

 

이와 같이 모델에 값을 입력하기에 앞서, input 값에 대해 임베딩하여 512차원의 벡터로 변환하는 embedding layer를 지나고 나면, 추가로 위치정보를 표현한 positioinal encoding 값을 더해주게 된다. 트랜스포머 이전의 seq2seq 모델에서는 positional encoding이 따로 필요 없었는데, 트랜스포머에서 갑자기 등장한 이유는 무엇일까?

 

2. Positional Encoding이 왜 필요한가? 

트랜스포머는 seq2seq 모델의 구조인 인코더-디코더를 따르면서도, RNN을 사용하지 않고 어텐션만으로 구현한 모델이다. 기존의 seq2seq 모델의 경우 다음과 같이 RNN 또는 LSTM을 이용하여 단어를 순차적으로 처리한다. 이처럼 RNN의 특성으로 인해 단어의 위치 정보 (positional information)을 가질 수 있었다. 

seq2seq 모델 작동 과정 (출처 : 딥러닝을 이용한 자연어 처리 입문)

 

하지만 트랜스포머는 RNN을 사용하지 않는 모델로, 단어를 순차적 입력이 아닌 병렬적 입력을 사용하기 때문에 텍스트의 의미를 유지하기 위해선 단어의 위치 정보가 필요하다. 만약, input layer에서 positional encoding 과정 없이 word embedding vector 만을 이용하여 입력한다면 단어의 순서가 바뀌더라도 모델에서는 다르다는 것을 인지하지 못하게 된다. 따라서 positional encoding을 통해 단어의 고유한 위치 정보를 제공해줘야 한다. 

transformer 모델 작동 과정  (출처 : 딥러닝을 이용한 자연어 처리 입문)

 

3. Positional Encoding 방식

각 단어의 위치 정보를 행렬로써 표현하는 방식은 다양하다. 직접 수작업을 통해 positional encoding 값을 지정해주는 방식부터 스스로 학습하는 방식까지 여러 방법이 존재하며, 주어진 상황에 따라 적합한 방법을 택하여 사용할 수 있다. 우선 트랜스포머 논문에서 사용한 positional encoding 방식에 대해서 살펴보자. 

 

다양한 방식으로 positional encoding 할 수 있지만, 기본적으로 충족해야 할 조건이 있다. 

  1. input 시퀀스 길이에 상관없이 동일한 위치의 토큰은 항상 동일한 값을 가지며 식별자 역할을 한다.
  2. 벡터의 값이 너무 크거나 작으면 안된다.

조건 1의 경우, 모든 첫번째, 두번째, ..., n번째 단어에 대한 각 positional encoding 값이 항상 동일해야 한다는 것을 의미한다. 조건 2에서는 인코딩 값이 적정한 범위 안에 있어야 한다고 말한다. 이는 positional encoding과 word embedding 을 더하기 때문에 positional encoding 값이 너무 클 경우, 단어 의미 유사성의 영향을 간과하게 되며, 반대로 그 값이 너무 작을 경우에는 위치 유사성의 영향을 간과하게 된다. 따라서 의미적 유사성과 위치 유사성 간의 적정한 균형을 유지할 수 있도록 값을 지정해야 한다.

 

위의 조건을 기반으로 다음의 encoding 방식들을 하나씩 살펴보자.

3.1 Non-periodic function

가장 간단한 방법은 토큰의 인덱스 값을 이용하는 것이다. 첫번째 토큰은 1, 두번째 토큰은 2 ... 와 같은 방식으로 일정하게 증가하는 정수값을 배정할 수 있다. 간단한 예시를 들어보자. 'Queen and King' 이라는 input이 들어왔을 때, 'Queen'이 첫번째, 'and'가 두번째, 'King'이 세번째에 위치한다. 따라서 각 단어에 대한 positional encoding 벡터는 다음과 같다. (여기서 벡터의 차원 즉, d_model 값은 간단한 표현을 위하여 4차원으로 가정하였다.)

 

하지만 이같은 방식은 조건 2를 충족하지 못한다. 왜냐하면 input 시퀀스가 길어질수록 positional encoding 값도 비례하여 커지기 때문에 과도하게 큰 값이 나올 수 있다. 따라서 이 값이 word embedding vector와 더해지게 된다면, positional encoding 값이 압도하게 되므로 단어의 의미 정보를 훼손하게 된다. 그러므로 positional encoding 방식으로는 부적절하다. 그렇다면 일정 범위 안에서 움직이는 주기함수 (periodic function)를 사용하면 어떨까?

3.2 Sine / Cosine function

대표적인 주기 함수로 사인과 코사인 함수를 사용할 수 있다. 이는 -1부터 1 사이의 값을 갖기 때문에 시퀀스 길이가 아무리 길어도 그 값이 발산할 문제가 없다. 그러므로 조건2를 만족한다고 볼 수 있다. 하지만 이 경우에는 조건 1을 만족하지 못한다. 다음의 그래프를 보면 알 수 있듯이 사인/코사인 함수는 다른 position이 동일한 값을 배정받게 되므로 위치 식별자로서의 역할이 퇴색된다. 이는 서로 다른 position에 대한 정보를 완벽하게 제공해주기 어렵다. 

 

만약 아래 그래프처럼 사인/코사인의 주기를 아주 길게 만들거나 sigmoid 함수를 이용한다면 조건 1을 만족시킬 수는 있다. 하지만 이 때의 문제점은 시퀀스의 길이가 길어질수록 position 차이에 따른 인코딩 값의 차이가 미미해진다는 것이다. 이 경우에는 3.1에서와는 반대로 word embedding vector와 더해졌을 때, positional encoding 값의 영향력이 줄게 되므로 위치 정보가 훼손된다. 그러므로 조건1과 2를 만족하면서 position에 따른 encoding 값의 차이가 유의한 방법이 필요하다. 

 

3.3 Sine and Cosine functions of Different Frequencies

모든 조건을 만족시키기 위하여 여러 주기의 사인과 코사인 함수를 동시에 사용할 수 있다. 트랜스포머 논문에서는 이 방식을 다음과 같은 식으로 표현하였다. 

$$PE_{(pos,2i)} = sin(\frac{pos}{10000^{2i/d_{model}}})$$

$$PE_{(pos,2i+1)} = cos(\frac{pos}{10000^{2i/d_{model}}})$$

여기서 pos는 position, i는 vector에서 몇번째 차원인지를 의미하며, d_model은 벡터의 총 차원수로 해당 논문에서는 512로 지정하였다. 위의 식을 기반으로 알 수 있는 사실은 다음과 같다.

  • 짝수 차원(2i)에서는 sine함수를, 홀수 차원(2i+1)에서는 코사인 함수를 사용한다.
  • 차원(i)이 커질수록 주기가 길어지게 된다(변동이 줄어든다).

 

이 사실에 주목하여 그래프와 함께 값의 의미를 예시와 함께 확인해보자. 각 차원별로 사용되는 함수의 주기가 달라지는 것을 볼 수 있다. 먼저 i=4에 해당하는 값을 보면 Queen, and, King 간의 값 차이가 크지 않은 편이다. 그리고 i=1로 갈수록 그 값이 차이가 커진다. 이는 차원(i)가 클수록 주기가 길어지게 된다는 함수의 특성에 의한 것이다. 

 

i=4에서는 주기가 긴 함수를 사용하였기 때문에 각 토큰별 position 값의 차이가 크지 않아 위치 정보가 다소 세밀하지 않다. 하지만 차원(i)가 작아질수록 주기가 짧은 함수를 사용하여 점차 선명한 토큰의 위치 정보를 제공하게 된다. 이를 해석해보면, i=4에서는 대략적인 위치, 즉 순서가 앞쪽인지, 뒤쪽인지 정도를 구분할 수 있으며, 여기에 i=3에 해당하는 정보가 추가되면 앞쪽 중에서도 어느정도 위치인지를 좁혀갈 수 있다. 이처럼 각 차원의 정보를 결합함으로써 그 범위를 점차 좁혀간다면 토큰의 위치를 확인할 수 있게 된다. 

 

정리를 해보자면, 이는 차원별로 주기를 다르게 함으로써 각 position에 대해 거의 유니크한 값을 생성하는 방법이다. 모든 주기에 대한 공배수에서는 동일한 값을 갖게 될 수 있으나, 크게 신경쓰지 않아도 되는 수준이다. 따라서 트랜스포머에서는 이같은 방식을 통해 계산된 positional encoding 값을 word embedding 값에 더함으로써 단어의 의미 정보와 위치 정보를 담고 있는 input 데이터를 생성한다. 하지만 여기서 추가적인 의문이 들 수 있다. 왜 두 값을 온전히 보전하기 위해 연결(concatenate)방식을 선택하지 않고 더한(add)걸까?

 

4. Input 연산 방식

일반적으로 positional encoding과 word embedding 간의 연산 방식으로는 두가지가 있다. 두 값을 더하거나(add), 연결(concatenate)하는 것이다. 우선 다음 그림을 통해 두 방법의 작동 방식을 살펴보자.  

 

4.1 Add

word embedding과 positional encoding 값을 더하는 방법이다. 이것이 갖는 의미를 그래프를 보며 해석해보자. 'Queen' ,'King'을 예시로 들었을 때, 처음의 word embedding 벡터를 통해 찍힌 점을 보면 서로 가까운 것을 확인할 수 있다. 이는 두 단어의 의미가 비슷하다는 것을 의미한다. 여기에 positional encoding이 더해지면서 두 점이 이동하게 되는데, Queen은 첫번째 토큰들이 주로 모여 있는 공간 쪽으로 이동하며, King은 세번째 토큰들이 모여있는 공간 쪽으로 이동하였다. 이를 통해 add 방식은 단어의 의미 정보와 위치 정보를 모두 혼합하여 표현된 형태임을 생각할 수 있다.

4.2 Concatenate

word embedding과 positional encoding을 옆으로 연결하는 방법이다. 이는 word를 나타내는 차원과 position을 나타내는 차원이 독립적으로 존재한다는 것을 의미한다. 그래프에서 확인할 수 있듯이, word와 position은 서로 orthogonal하게 축을 갖게 된다. 따라서 add 방식과는 다르게 word와 position의 정보가 섞이지 않고 모든 정보를 표현할 수 있게 된다. 

두 방법의 장단점을 정리해보면 다음과 같다. 서로의 장단점의 확실하기 때문에 상황에 따라 선호되는 방법이 달라진다.

  • Add
    • 장점 : 비교적 연산이 간단하여 자원이 많이 필요하지 않다.  
    • 단점 : position과 word의 값을 더해버림으로써 두 정보가 섞여버리는 위험성이 존재한다.
  • Concatenate
    • 장점 : position과 word 정보가 섞이지 않고 orthogonal하게 표현 가능하다.
    • 단점 : 차원이 커져 메모리, 파라미터, 런타임 등의 문제가 발생한다.

 

이처럼 정보의 온전성과 자원 사이의 trade-off 관계가 생기는데, add 방식의 경우 positional encoding 함수의  튜닝을 통해 단점을 어느정도 해소할 수 있다. 하지만 일일이 튜닝을 해주는 것은 힘든 일이다. positional encoding 값을 모델이 스스로 학습해서 구할 수는 없을까? 

 

4.3 Learned Positional Encoding

트랜스포머에서는 sine과 cosine을 이용한 positional encoding 방식을 선택하였으나, 어떤 방식이 효과적인지 제대로 연구되지 않는 task에서는 positional encoding을 직접 지정하는 것이 어려운 일이다. 이러한 경우, positional encoding을 수작업으로 지정하지 않고 기계학습시키는 방법을 사용할 수 있다. 이를 통해 모델의 다른 파라미터들과 동일한 절차 (SGD, 역전파)를 이용하여 input에 더해지는 어떠한 벡터를 학습시킬 수 있다. 

 

하지만 이렇게 학습을 시키는 방식이라고 하더라도, 직접 값을 지정하는 방식보다 항상 뛰어난 것은 아니다. 이것이 트랜스포머에서 학습된 postional embedding을 사용하지 않은 이유이다. sinusoidal 버전과 학습시킨 버전을 비교한 결과, 거의 동일한 성능을 보였다. 트랜스포머 논문에서는 모델이 훈련 중에 발생하는 시퀀스 길이보다 더 긴 길이도 추정할 수 있어서  sinusoidal 버전을 선택했다고 한다.

 

 

참고자료

[1] Vaswani, Ashish, et al. "Attention is all you need" NIPS (2017)

[2] 유원준 외. "딥러닝을 이용한 자연어 처리 입문", 위키독스

[3] Blossomindy's Research Blog, "트랜스포머(Transformer) 파헤치기", 블로그

[4] AI Coffee Break with Letitia, "Positional embeddings in transformers EXPLAINED", 유튜브

[5] AI Coffee Break with Letitia, "Adding vs. concatenating positional embeddings", 유튜브