AI 공부

트랜스포머 논문 리뷰

essay0263 2025. 1. 31. 18:53

트랜스포머 개괄

트랜스포머는 원래 기계 번역을 위해 개발된 모델이다. 개괄적으로 보면 인코더-디코더 구조이고, input- encoder -decoder -output 순서로 진행된다. 인코딩 부분은 여러 개의 인코더를 쌓아 올려 만든 것이고, 논문에서는 6개를 쌓았다. 디코더도 인코더와 동일한 수를 가진다. 인코더들은 모두 똑같은 구조를 가지고 있는데, 서로 weight를 공유하진 않는다. 인코더는 self attention feed forward neural network로 구성되어 있다. 인코더로 들어온 입력은 self attention layer을 지나가면서 입력 내의 다른 단어들과의 관계도를 계산한다. , 인코더를 지나가면 단어들이 문맥을 반영하게 된다. 디코더는 동일한 구조지만 self attention ffnn사이에 encoder decoder attention이라는 새로운 층이 존재한다. 이는 디코더가 입력에서 가장 관련 있는 부분에 집중하게 한다. 그리고 디코더에는 masked self attention이 존재한다. 모델이 출력할 때 미래의 단어를 참고하지 못하도록 하는 기능이다.

Self attention

Self attention은 문장 내에서 각 단어가 다른 단어들과 얼마나 관련 있는지를 학습하여 문맥 정보를 반영한 벡터로 변환하는 과정이다. 이 과정은 6단계를 거쳐서 진행되는데 첫 번째로는에 입력된 벡터들(단어의 embedding)에 학습 가능한 가중치 행렬을 곱해서 Query 벡터, Key 벡터, Value 벡터를 생성한다.

Query(Q): "나는 어느 단어와 관련이 있을까?"

Key(K): "나는 다른 단어들과 얼마나 관련이 있을까?"

Value(V): "내가 다른 단어들에게 전달할 정보는 무엇일까?"

2번째 단계는 벡터들을 이용해 점수를 계산한다. 먼저 Query Key의 내적을 계산한 후, 점수 행렬(각 단어의 연관도를 나타내는 점수)을 만든다.

3번째 단계는 점수 행렬을 key 벡터 차원의 제곱근으로 나누어 정규화한다. 논문에서는key 벡터의 차원이 64이므로 8로 나누어 준다.

4번째 단계는 softmax를 통과시켜 모든 점수를 양수로 만들면서 합을 1로 만들어준다. 이 값(attention weight)은 각 단어가 얼마나 중요한지를 나타낸다.

5번째 단계는 입력의 각 단어들의 value 벡터에 이 점수(attention weight)들을 곱하는 것으로, 관련 있는 단어들을 남기고 관련 없는 단어를 없애는 방식이다.

6번째 단계는 가중합 된벡터들을 모두 합하는 것으로, 이 단계가 self attention layer의 출력이 된다.

Multi head attention

논문에서는 self attention layer multi head attention, 여러 개의 atttention을 병렬적으로 수행해서 각각의 head가 다른 정보를 학습할 수 있도록 한다. Multi head attention을 하게 된다면 먼저 모델이 다양한 위치에 집중할 수 있다. 기존의 self attention은 한 번의 attention 연산만 수행하므로 특정 관계만 학습한다. 하지만 multi head attention은 여러 개의 attention head를 사용하기 때문에 문장에서 다양한 관계를 학습하고, 다른 문장의 정보까지 활용할 수 있다. 그리고 multi head attention은 여러 개의 표현 공간을 가지게 된다는 점 또한 장점이다. 각 head는 독립적으로 학습되므로 서로 다른 의미적 관계를 학습할 수 있다. 즉, 각 head가 다른 표현 공간에서 단어 간의 관계를 학습할 수 있다.

기존의 self attention에서는 하나의 Q, K, V(Query, Key, Value)를 사용했지만 multi head에서는에서는 각각 head마다 Q, K, V를 생성하고 attention을 수행한다.

1. 각 head마다 Q, K, V 생성. 입력 벡터 X에 대해 head 개수만큼 서로 다른 가중치  행렬 WQ, WK, WV를 사용하여 여러 개의 Query, Key, Value를 생성한다.

여러 개의 Q, K, V를 확인할 수 있다.

2. 각 head에서 self attention을 수행한다. 가중치 행렬과 입력 행렬을 곱해준다.

이 과정에서 서로 다른 방식으로 단어 간의 관계를 학습할 수 있다.

3. 각 head의 attention 결과를 병합한다. 

head가 8개라면, 각 head에서 8개의 attention 결과 행렬이 생성된다. feed forward layer는 하나의 행렬만 받을 수 있으므로, 이 8개의 행렬을 하나로 합친다.

4. 최종 가중치 행렬 WO를 곱해 원래 차원으로 치환

위 행렬은 출력 차원이 기존 차원보다 커진다. 그래서 원래 차원으로 변환하기 위해서 최종 가중치행렬 WO를 곱해주어서 최종 출력 벡터를 생성한다.

Positional Encoding

Transformer에서는 self attention을 사용하기 때문에 입력된 단어들의 순서를 고려하지 않는다. 이를 고려해 주기 위해 positional encoding을 이용해서 단어들의 순서를 고려할 수 있다. 논문에서는 Sine함수와 Cosine함수를 이용해서 positional encoding 벡터를 만든다. 예를 들어서 X = WordEmbedding이라고 한다면, 위치 정보를 추가하면 X' = X + PE(position) 이런 방식으로 transformer가 단어들의 순서를 인식할 수 있도록 한다.

Residual Connection & Layer Normalization

Residual connection은 self attention과 Feed forward 후에 적용되는 과정으로 각 서브 레이어를 통과한 후에 원래 입력을 더해주는 과정이다. 이 과정을 거치면 학습이 더 잘되고 정보 손실을 방지할 수 있다.

Layer Normalization은 residual connection후에 (원래 입력 + 연산 결과)를 정규화하는 역할이다. 이는 값이 너무 커지거나 불안정해지는 것을 방지하는 역할이다.

Decoder

Decoder의 구조는 Encoder와 크게 다르지 않다. 하지만 큰 차이점이 2개 존재한다.

1. Masked Self Attention

인코더의 self attention은 전체 입력을 한 번에 볼 수 있다. 하지만 디코더는 출력할 때 단어를 순차적으로 예측해야 하기 때문에 아직 생성되지 않은 단어는 보면 안 된다. 그래서 softmax 연산을 하기 전에 이후에 나오는 단어들을 masking 해서 보지 못하도록 만들어야 한다. 미래 단어의 score를 -inf로 변환하고 softmax로 변환하면 0이 나오기 때문에 미래 단어의 정보가 사라지게 된다. 이 과정을 거치면 디코더가 미래 단어를 참조하지 않게 되어 실제 단어를 한 번씩만 예측하도록 유도할 수 있고, autoregressive 한 방식으로 문장을 생성할 수 있다.

2. Encoder-Decoder Attention

이 과정은 인코더의 출력을 참고해서 디코더가 어떤 입력 단어에 집중할지 결정하는 과정이다. 먼저 Query는 디코더의 이전 레이어에서 가져오고 key와 value는 인코더의 최종 출력에서 가져온다. 즉 인코더에서 만들어진 문맥 정보를 기반으로 디코더가 현재 출력할 단어와 관련된 입력 단어를 찾도록 도와주는 역할을 한다.

 

The Final Linear and Softmax Layer


결국 디코더는 하나의 벡터를 출력한다. 하지만 이 벡터만으로는 단어를 알지 못하므로 이를 Linear layer를 이용해서 변환한다. Linear layer는 디코더의 마지막 출력 벡터를 단어 집합 크기(예 : 10000 )에 맞게 변환한다. 변환된 벡터의 각 값은 각 단어에 대한 점수(logit)이며, 해당 단어가 출력될 가능성을 나타낸다. 그 후, 이 점수를 확률로 해석하기 위해서 softmax함수를 이용해서 가장 확률이 높은 단어를 출력으로 결정한다.

트랜스포머 모델 학습 과정과 디코딩

지금까지는 트랜스포머의 forward pass 과정이었고, 이제 모델이 어떻게 학습하고, 번역을 할 때 어떤 방식으로 단어를 선택하는지 방법에 대해 알아보겠다.

Training Process

먼저 트랜스포머 모델이 학습되기 전이든 후든, forward pass 과정 자체는 동일하다. 입력이 들어오면 embedding - self attention - feed forward - decoder -linear &softmax 과정을 거쳐서 최종 출력을 생성한다. 그러나 처음 모델은 가중치가 랜덤으로 되어있기 때문에 예측한 단어가 정답과 다를 가능성이 크다. 그러므로 학습을 진행하면서 정답과 맞는 방향으로 가중치를 조절해야 한다. 

트랜스포머는 학습 데이터를 바탕으로 output vocabulary를 정의하고, 이를 one hot encoding 방식으로 만든다. 그리고 loss function을 이용해서 예측 값과 정답의 차이를 계산한다. cross entropy loss를 이용해서 모델이 정답을 더 높은 확률로 예측할 수 있게 한다.

그 후, backpropagation 알고리즘을 이용해서 오차를 가중치에 반영한다. 옵티마이저를 이용해서 가중치를 업데이트하고, 반복적으로 진행하면서 모델이 점점 더 정확한 번역을 할 수 있도록 만든다.

Decoding Process

트랜스포머가 학습된 후에는 입력 문장을 받아 번역을 생성하는 과정이 필요하다. 이때 단어를 선택하는 방식에는 greedy decoding과 Beam search가 있다.

Greedy decoding은 말 그대로 각 단계에서 정답일 확률이 가장 높은 단어를 선택하는 방식이다. 이 방식은 빠르고 계산량이 적지만, 최적의 번역을 찾지 못할 가능성이 높다.

Beam search는 각 단게에서 여러 개의 상위 후보 단어를 유지하면서 최적의 문장을 탐색하는 방식이다. beam size는 각 스텝에서 유지할 후보 개수이고 top beams는 최종적으로 고려할 후보 개수이다. 

Beam search를 이용한 방식