비밀번호

커뮤니티2

  • 구름많음속초23.2구름많음북춘천17.5구름많음철원17.7맑음동두천19.1맑음파주18.3맑음대관령16.2구름많음춘천18.9맑음백령도16.9맑음북강릉22.9구름조금강릉23.6맑음동해20.1맑음서울18.5맑음인천16.7맑음원주17.9맑음울릉도16.4맑음수원18.2맑음영월17.0맑음충주18.6맑음서산17.8맑음울진17.2맑음청주19.0맑음대전19.0맑음추풍령18.1맑음안동17.6맑음상주20.0맑음포항20.0맑음군산19.0맑음대구19.5맑음전주20.0맑음울산19.0맑음창원19.8맑음광주19.3맑음부산17.9맑음통영18.7맑음목포17.5맑음여수17.6맑음흑산도17.5맑음완도21.4맑음고창19.2맑음순천19.1맑음홍성19.3맑음서청주17.5맑음제주19.0맑음고산17.2맑음성산20.4맑음서귀포19.1맑음진주19.6맑음강화17.4구름많음양평16.9맑음이천19.2구름많음인제18.1구름조금홍천18.3맑음태백17.1구름많음정선군19.9맑음제천17.8맑음보은18.4맑음천안19.0맑음보령18.3맑음부여18.8맑음금산18.9맑음세종19.1맑음부안19.6맑음임실18.8맑음정읍20.2맑음남원18.8맑음장수18.8맑음고창군19.9맑음영광군19.6맑음김해시20.2맑음순창군18.9맑음북창원21.1맑음양산시19.4맑음보성군21.6맑음강진군21.3맑음장흥20.9맑음해남20.1맑음고흥19.8맑음의령군19.7맑음함양군21.4맑음광양시19.4맑음진도군19.1맑음봉화18.5맑음영주18.5맑음문경19.1맑음청송군18.8맑음영덕20.9맑음의성19.0맑음구미20.9맑음영천19.2맑음경주시20.3맑음거창19.4맑음합천19.8맑음밀양19.4맑음산청20.3맑음거제19.2맑음남해19.0맑음북부산19.9
  • 2024.05.09(목)

데이터 엔지니어링데이터 엔지니어링

[ML/DL] Transformer - Positional Embedding

최근 인공지능 분야에서 가장 큰 트렌드는 LLM (Large Language Model)로, 우리가 많이 사용하는 Chat GPT, Bard등 다양한 분야에서 활용하는 언어모델이다. 대부분의 LLM의 기원은 Vaswani의 Transformer 아키텍처(2017) (https://arxiv.org/abs/1706.03762) 를 기본으로하며, 해당 연구는 NLP에서 사용되던 RNN계열인 GRU 또는 LSTM보다 우수한 성능을 보여주며 많은 분야에 적용되고 있다. 

 

대부분의 LLM이 Vaswani의 Transformer를 사용하지만, 지속되는 연구를 통해서 조금씩의 차이를 보여주고 있다.

대표적으로는 기본 Transformer 아키텍처에서는 Multi-Head Attention이후의 값을 Normalization을 하는 "Post Normalization" 방식과 Meta에서 공개한 Llama2에서는 Multi-Head Attention 이전에 "RMS norm"을 적용하여  "Pre Normalization"을 사용하는 방법이 있고, Activation 함수는 ReLU를 사용하던 기존에서, "SwiGLU"를 사용 하는 방법 등 다양한 차이점이 있다.

 

이 글은 이러한 차이점 중에서 Positional Encoding / Embedding (PE) 에 대해서 집중적으로 설명을 해보려고 한다.

 

이번글은 

1. 왜 PE가 필요한지

2. Encoding과 Embedding의 차이점

3. Vaswani의 PE에 대한 이해

4. Vaswani의 PE의 장점과 단점

 

추후에는 이 PE의 단점을 보완한 Relative PE와 Llama에 적용된 Rotary PE에 대한 글을 작성할 예정이다.

Screenshot 2024-02-01 at 12.24.00 PM.png

위의 Figure 1은 Vaswani의 Transformer 아키텍처로, inputs은 Token의 Sequence이며, 해당 토큰은 Embedding Table을 통해 Token Embedding을 생성한다. 

이후 Pre-Define된 Positional Encoding과 합연산을 통해 각 토큰의 순서에 대한 정보를 값에 포함시키는 것이다.

 

 

[1] 그렇다면, 왜 Transformer는 PE가 필요했을까?

이에 대해서는 RNN계열의 단점을 봐야한다.


Screenshot 2024-02-01 at 12.28.01 PM.png

위의 그림은 기본적인 RNN 계열의 연산 방법이다. 간략하게 설명하자면, x<1>이 들어가서 a<0>과 함께 연산이 되어(파란색 블럭) 이에 대한 결과는 y<1>과 오른쪽의 파란색 블럭의 인풋 a<1>로 사용된다.

x<2>는 x<1>이 연산된 결과와 함께 연산되어 y<2>, a<2>로 나타난다. 이러한 방식을 모든 x 까지 하게 되어 나온 y은 앞에 연산된 a<1>부터 들어간 값이 함께 연산이 되었기에 x들에 대한 정보를 가지고 있다고 생각할수 있다. 

 

그러나 RNN계열의 연산 방식은 모든 x의 순서 (Sequence)를 거치면서 연산속도에 대한 단점과, Input의 Sequence가 길다면 앞의 정보를 잃어버리는 경우가 발생한다. 이를 보완하기 위해 GRU, LSTM등 다양한 RNN계열의 네트워크가 있지만 비슷한 문제점이 발견되어 왔다.

 

간단하게 생각하면 이러한 문제점을 보완하기 위해 연구된 결과가 Transformer 아키텍처이다.

문제는 이 Transformer의 내부 구조는 Sequence에 대한 정보를 전달하는 연산과정이 없다. 모든 레이어의 컴포넌트는 Fully Connected 구조로  Input에 대한 수치와 layer가 가지고 있는 가중치(W)의 행렬곱으로 연산이 되는 구조이기에 Sequence에 대한 정보를 주입해 주는 과정이 필요했다.

 

예를 들자면, 

"트렌스포머는 최고의 아키텍처이다"와 "마이클 베이의 트렌스포머는 최고다" 에서

순서를 상관하지 않는다면, "트렌스포머"라는 단어는 동일한 임베딩 값을 가질것이다.

임베딩 값은 모델의 학습이 진행되며 값이 변하지만, 고유한 인덱스는 변하지 않는 테이블이라 생각하면 쉽다.

 

Screenshot 2024-02-01 at 2.26.34 PM.png

위의 예시는 10개의 단어에 대한 5개의 임베딩 값이다


 

만약 위의 두 문장을 넣는다면, "트렌스포머"라는 단어가 3번 인덱스에 해당한다면, [0.9, 1.37, -0.16, -0.2, 0.7]이라는 벡터가 "트렌스포머"라는 단어의 값이다. (인덱스의 시작은 0부터)

 

다른 예시를 들자면,  "트렌스포머 아키텍처와 트렌스포머 영화는 다르다" 라는 문장에서 "트렌스포머"라는 단어는 다른 의미를 가진 단어가 되어야 한다.

 

이를 위한 방법이 Positional Embedding이다.

 

그런데, Vaswani의 아키텍처에는 "Positional Encoding"이라고 명시되어 있는 부분이 있다. 

 

[2] "Positional Encoding"과 "Positional Embedding"은 무슨 차이가 있을까?

Encoding과 Embedding은 모델의 학습과정에서 값이 변하는지에 대한 유무에 따라 달라진다.

Encoding이란 학습이 진행됨에 따라 변하지 않는 값이고, Embedding은 모델의 학습에 따라 Gradient Descent (경사하강법)을 통해 값이 변하는 Parameter이다.

 

[3] Vaswani의 트렌스포머 아키텍처에서 Positional Encoding이라 명시한 이유는,

Input의 길이에 대한 각 포지션(순서)에 대해서 값을 지정한다.

 

Screenshot 2024-02-01 at 3.11.17 PM.png

 

pos는 문장에서 단어의 위치이며, i는 임베딩 디멘션이다.

 

Input에 대한 예시를 들어보면

"트렌스포머는  vaswani가 연구한 아키텍처이다"를 단어별로 토큰화 하게 되면,

"트렌스포머는  vaswani가 연구한 아키텍처이다" -> [트렌스포머는, vaswani가, 연구한, 아키텍처이다]로 4개의 문단어를 가진다. 각 단어에 고유한 번호를 부여하면, [트렌스포머는, vaswani가, 연구한, 아키텍처이다] -> [0, 1, 2, 3]으로 간단하게 볼수 있다. 이러한 변환을 토큰화 (Tokenize)라고 하며, 이 토큰의 값이 임베딩 테이블에서의 값을 가져오기 위한 고유 번호로 볼수 있다.

 

이렇게 변환된 토큰을 임베딩테이블을 거치면, 

Screenshot 2024-02-01 at 3.16.29 PM.png

4x5 행렬이 나타나며, 이 값이 Token Embedding 값이다.

 

Vaswani의 PE는 삼각함수를 사용하여 포지션을 "Encoding"하였다.

위의 식을 따르면, Position 0번인 단어에 대해서 짝수 차원에는 sin의 값을, 홀수 차원에는 cos의 값을 주게된다.

 

아래 그림처름 "i love cat" 이라는 문장에서, I에 해당 하는 값은,

첫번째  sin graph에서 0번째,

두번째 cos graph에서 0번째, 

3번째 sin graph에서 0번째를 가져와서 만들게 된다.

 IMG_0038.JPG

 

이렇게 나온 PE는 히트맵으로표현하면 아래와 같다.

Screenshot 2024-02-01 at 3.27.32 PM.png

 

조금 더 긴 문장과, 임베딩의 차원을 늘리면 아래와 같다.

Screenshot 2024-02-01 at 3.28.49 PM.png

 

이렇게 생성된 값은 앞에 구해진 Token 임베딩과 더해져서 트렌스포머 아키텍처의 초기 Input값으로 사용된다.

파이토치의 구현 코드는 다음과 같이 사용할수 있다.

 

Screenshot 2024-02-01 at 4.08.36 PM.png

 

 

[4] 이런 PE를 Sinusoidal Positional Encoding 또는 Absolute Positional Embedding등 다양하지만, 보편적으로 보는 Positional Embedding / Encoding은 위와 같은 Vaswani의 Sinusoidal Positional Encoding을 의미한다.

 

이 PE는 구현이 쉽고 가장 베이직한 방법이기에 많이 사용되지만, 각 단어의 위치를 Independent하게 보기때문에 단어간의 관계를 고려하지 않는다.

 

각 단어의 거리와 관계를 고려하여 트렌스포머를 활용한 연구는 "Relative Positional Embedding"(Shaw et al. https://arxiv.org/abs/1803.02155) 으로

다음글에 리뷰를 진행해보겠다. 

 

전체댓글0

검색결과는 총 12건 입니다.    글쓰기
1