[논문리뷰] Attention is all you need (Transformer 구조 파헤치기) - 2. Transformer의 Encoder, Decoder

장보윤·2023년 4월 30일
0

논문리뷰

목록 보기
2/7

이전글: [논문리뷰] Attention is all you need (Transformer 구조 파헤치기) - 1. Attention이란?

ChatGPT, GPT-4 그리고 BARD와 같은 LLM들의 근간이 되는 모델은 Attention is all you need 논문에서 소개된 Transformer라고 할 수 있습니다. 지난 글에서 Self-Attention에 대해 설명했다면, 이번에는 self-attention에 기반한 Transformer의 구조를 설명하고자 합니다.

논문 출처 : https://arxiv.org/abs/1706.03762

들어가기 전에

Transformer는 Seq2Seq 구조를 기반으로 합니다. "철수는 오늘 피자를 먹었다"라는 문장을 "Today Cheolsu ate pizza"라는 문장으로 번역하는 과제가 있다고 할 때, Encoder는 "철수는 오늘 피자를 먹었다"를 입력으로 받아 의미를 이해하고, Decoder는 Encoder가 이해한 정보를 바탕으로 차례대로 "Today", "Cheolsu", "ate", "pizza"를 만들어내며, 이 때 Decoder의 입력은 Encoder로부터 받은 문장의 의미 정보와 직전에 만들어낸 단어라고 볼 수 있습니다.

논문에서 보여주는 Transformer의 구조는 위와 같습니다. 큰 블럭을 기준으로 왼쪽이 Encoder, 오른쪽이 Decoder이며, 각각의 구조를 설명하기 전 필요한 개념 두 가지만 짚고 넘어가겠습니다.

01. Position Encoding

기존의 RNN 기반의 seq2seq 구조는 재귀적인 구조를 가지기 때문에 문장 내에서 단어의 순서 정보, 즉 단어의 위치 정보를 얻을 수 있습니다. 특히 자연어 처리를 할 때는 어순에 따라 단어의 의미가 상당히 많이 바뀔 수 있기 때문에 위치 정보를 사용하는 것은 필수적입니다. 하지만 Attention만을 사용하는 Transformer에서는 그것이 불가능하며, Encoder와 Decoder는 단어의 상대적인 위치 정보를 얻기 위해 입력 벡터를 받을 때 Position Encoding을 함께 받습니다.

Position Encoding을 만들기 위한 식은 다양하게 사용할 수 있지만, Attention is all you need 논문에서는 Position Encoding으로 삼각함수를 사용해서 토큰의 위치에 따라 다른 값을 가질 수 있게 합니다. 논문에서 사용한 sine 및 cosine 식은 다음과 같습니다.

PE(pos,2i)=sin(pos100002id)PE(pos, 2i) = \sin(\frac{pos}{10000^{\frac{2i}{d}}})
PE(pos,2i+1)=cos(pos100002i+1d)PE(pos, 2i+1) = \cos(\frac{pos}{10000^{\frac{2i+1}{d}}})

위의 식에서 pospos는 입력 문장에서 토큰의 위치를 의미하며, ii는 임베딩 차원에서의 인덱스값 (0<=i<d/2)(0 <= i < d/2), 그리고 dd는 입력 임베딩 벡터의 차원 수를 의미합니다.

Encoder와 Decoder에서 입력 문장이 들어갈 때는 문장을 토큰화하여 임베딩시키고(Input Embedding과 Output Embedding), 위의 Position Encoding 값도 함께 더해서 사용하게 됩니다. 삼각함수로 구성된 Position Encoding은 토큰의 위치에 따라 값이 달라지기 때문에 입력 벡터의 각 토큰에 위치 정보를 더해줄 수 있게 됩니다.

02. Multi-Head Attention 요약

이전 글에 Multi-Head Attention에 대해서 자세히 설명되어 있기 때문에 간단하게 설명을 하자면, Attention은 문장 내에서 단어별로 중요도를 구하는 부분이라고 볼 수 있습니다. 단어에 WQW_Q, WKW_K, WVW_V 가중치를 각각 곱하여 Query, Key, Value 벡터를 구하고 이를 입력으로 받는데, 현재 단어 Query가 다른 단어들 Key와 어느 정도 관련도가 있는지를 구한 후, 각 단어별 Value를 반영해서 현재 시점에서 각 단어별 가중치를 구합니다. 이 가중치를 여러 개를 구해서 합치기 때문에 Multi-Head Attention이라고 부르게 됩니다.

아마 Attention 설명만 들으면 직관적으로 다가오지 않을 수 있습니다. 그래서 Encoder, Decoder 각각에서 Multi-Head Attention이 어떤 의도를 가지고 사용되는지를 설명하겠습니다.

Encoder

Encoder는 크게 Attention Layer와 Feed Forward Layer로 구성된 블럭을 N개씩 가지고 있습니다. 입력으로 입력 문장의 Input Embedding과 Position Encoding을 합친 값을 받은 Encoder는 입력 문장의 의미를 해석하기 위해 Attention을 이용하게 됩니다.

01. Encoder의 Self-Attention

Encoder에서 사용하는 Attention은 Self-Attention입니다. 그 말은 Attention의 Query, Key, Value를 생성하기 위해 똑같은 입력 벡터를 사용한다는 것입니다. 앞서 Query가 현재 단어이며, 다른 단어 Key와 Value를 이용해서 현재 시점에서 어떤 단어가 중요도가 높을지를 계산하다고 했습니다. Query, Key, Value로 같은 단어를 사용한다는 것은 입력 시퀀스의 각 위치마다 다른 위치들과의 상대적인 중요도를 계산하는 과정이라고 볼 수 있습니다.

Encoder의 Self-Attention은 다음과 같은 세 단계의 과정을 거쳐 구해집니다.

  1. 입력 시퀀스의 모든 토큰에 대해 Query, Key, Value를 생성합니다. 이때, Query, Key, Value 각각은 다른 가중치 행렬 WQW_Q, WKW_K, WVW_V을 사용하여 계산됩니다.

  2. 각 위치의 Query와 모든 위치의 Key의 내적값 계산하고, softmax 함수를 적용하여 각 위치별 Attention Score를 계산합니다. 이 Attention Score는 입력 시퀀스의 모든 위치에 대해 계산되며, 각 위치마다 다른 위치들과의 상대적인 중요도를 나타냅니다.

  3. Attention Score를 Value에 곱하여, 각 위치별로 Weighted Value를 계산합니다. 이 Weighted Value들을 모두 더한 결과가 해당 위치의 최종 Output이 됩니다.

Encoder는 다수의 Self-Attention Layer로 구성됩니다. 이때, 각 Self-Attention Layer에서는 입력 시퀀스의 각 위치마다 다른 위치들과의 상대적인 중요도를 계산하는 과정이 반복되며, 이를 통해 입력 시퀀스의 정보가 점차적으로 추상화되어 가는 과정이 진행됩니다. (하단 그림 출처 : https://wikidocs.net/31379)

02. Encoder의 Feed-Forward Network

입력 벡터로부터 계산된 Attention 값은 Fully Connected Layer로 구성된 Feed-Forward Network로 들어갑니다. FFN은 ReLU 활성화 함수를 가진 두 개의 linear transform layer로 구성됩니다.

FFN(x)=max(0,xW1+b1)W2+b2\mathrm{FFN}(x)=\max \left(0, x W_{1}+b_{1}\right) W_{2}+b_{2}

즉, Encoder는 Attention Layer와 FFN 두 개의 레이어로 구성된 블럭을 여러 레이어로 쌓은 구조라고 볼 수 있습니다. FFN을 사용할 때 위치에 따른 가중치 벡터의 차이는 없으나, 레이어마다 서로 다른 가중치 벡터를 사용합니다. 부가적인 Residual Network와 Layer Normalization을 추가하면 Encoder의 구조를 완전히 설명할 수 있습니다.

Decoder

Decoder는 Encoder로부터 받은 입력 문장의 정보와 Decoder가 직전 time-step에서 생성한 출력 정보를 바탕으로 현재 time-step에서의 단어를 출력하는 역할을 합니다. Encoder와 마찬가지로 Attention과 Feed-Forward Network로 구성된 블럭을 여러 개 가지고 있는데, Encoder와 하나 다른 점이라면 Attention Layer를 한 블럭마다 두 개를 가지고 있습니다.

01. Decoder의 Self-Attention

Decoder의 첫 번째 Attention 레이어는 Self-Attention Layer입니다. Decoder는 이전 time-step까지 생성한 문장 정보를 바탕으로 self-attention을 수행하며, 이를 바탕으로 현재 time-step애서 생성해야 할 단어 정보를 수집합니다.

Decoder의 Self-Attention은 현재까지 출력된 문장을 입력 벡터로 사용해서 앞서 Encoder에서 설명한 방법과 동일하게 Attention을 계산합니다. 차이점이 있다면 Decoder에서는 Masked Multi-head Attention을 사용합니다. Masked Multi-head Attention은 현재 위치 이전의 위치에 대해서만 Attention을 수행하도록 Mask를 적용하여, 현재 위치에서 미래의 정보를 사용하지 않도록 합니다. 이렇게 함으로써, 현재 time-step에서 생성된 단어들이 다음 time-step에서 예측하는 단어에 영향을 주지 않도록 합니다.

02. Encoder-Decoder Attention

Decoder의 두 번째 Attention 레이어는 Encoder-Decoder Attention layer입니다. 앞서 Self-Attention Layer에서 Decoder의 출력값을 이용해서 정보를 얻었다면, Encoder-Decoder Attention에서는 Encoder의 정보를 함께 활용해서 단어별 가중치를 계산합니다.

Encoder-Decoder Attention layer에서도 Query, Key, Value를 이용해서 Attention을 계산합니다. 다만, Self-Attention에서 Query, Key, Value를 생성하기 위해 셋 다 동일한 입력 벡터를 사용했다면, Encoder-Decoder Attention에서는 Query로 Decoder의 정보를, Key와 Value로 Encoder의 정보를 활용합니다. Query는 이전 Self-Attention Layer에서 예측한 단어 벡터가 되고, Key와 Value는 Encoder의 출력 벡터들이 됩니다. 즉, Decoder의 Query 벡터와 모든 Encoder의 Key 벡터 간의 유사도를 계산하고, 이를 Key 벡터들의 중요도로 사용하여 Value 벡터들을 Weighted Sum하여 Encoder-Decoder Attention의 출력 벡터를 얻게 됩니다. 이 출력 벡터는 다음 단어를 예측하는 데 사용됩니다.

이렇게 함으로써 Decoder는 이전 단어와 Encoder의 출력 벡터들 사이의 유사도를 고려하여 다음 단어를 예측할 수 있게 됩니다.

03. Decoder의 Feed-Forward Network

Encoder와 마찬가지로 Decoder도 두 개의 Attention Layer를 통해 얻은 출력값을 FFN으로 가져옵니다. 즉 Decoder는 Self-Attention Layer, Encoder-Decoder Layer, FFN 세 개의 레이어로 구성된 블럭 레이어를 여러 개 쌓은 구조라고 볼 수 있습니다. Decoder는 Attention과 FFN 층을 여러 개 거치면서 현재까지의 출력값과 Encoder가 해석한 입력 문장의 정보를 바탕으로 다음에 출력해야 할 토큰 정보를 구합니다.

여러 개의 블럭을 거친 이후 Decoder의 출력값은 Linear Layer를 통과하고, Softmax를 통해서 현재 time-step에 올 확률이 가장 높은 토큰을 예측합니다. 이렇게 예측된 토큰 정보는 다음 time-step에서 Decoder의 입력값으로 함께 들어갑니다.

Transformer 구조를 전체적으로 설명했습니다. RNN 구조를 전혀 사용하지 않은 Transformer 구조는 처음 등장했을 당시 기존의 모델들을 뛰어넘는 성능을 보여주었고, Transformer 구조를 바탕으로 GPT-1을 시작으로 다양한 LLM 구조들이 만들어졌습니다. 그만큼 Transformer는 최근에 나온 모델은 아니지만 현재의 자연어 처리에서 빠질 수 없는 뼈대가 되는 모델이라고 볼 수 있겠습니다.

profile
머신러닝 엔지니어, 취미사진가

0개의 댓글