어쩌다데싸
Transformer, 도대체 그게 뭔데 - Transformer 편 (2) 본문
목차
Transformer, 도대체 그게 뭔데 - Transformer 편 (1)에서 이어지는 글입니다.
이전 글에서는 트랜스포머 모델의 등장 배경과 핵심 개념인 Self-Attention, Positional Encoding, Multi-Head Attention에 대해 살펴봤습니다. 이제, 이러한 개념들이 인코더-디코더 구조 안에서 어떻게 연결되어 모델이 동작하는지를 살펴볼 차례입니다.
단순히 구현된 모델을 가져다 쓰는 것이 아닌, 각 구성 요소들이 어떤 역할을 하고 어떻게 상호작용하는 지를 안다면 자신의 환경이나 상황에 맞게 모델을 응용해서 사용할 수 있을 것입니다. 실제로 트랜스포머의 인코더만 사용한 모델, 디코더만 사용한 모델들이 파생되어 강력한 성능을 보이고 있습니다.
구조 | 설명 | 대표 모델 |
인코더만 사용 | 입력을 인코딩해 분류, 특성 추출에 활용 | BERT, RoBERTa |
디코더만 사용 | 다음 문장 생성 등 생성 중심에 활용 | GPT 시리즈 |
인코더-디코더 | 번역 등 입력과 출력을 모두 고려하는 작업 | 기존 Transformer |
이처럼 트랜스포머 구조를 깊이 이해하면, 상황에 따라 인코더만, 디코더만 활용하는 식으로 모델을 변형해 최적화할 수 있습니다.
그럼 이제, 트랜스포머 전체 구조를 다시 간단히 살펴보고, 각 구성 요소의 역할과 동작 원리를 차례로 알아보겠습니다.
트랜스포머의 성능은 단순히 Self-Attention과 병렬 처리에서만 오는 것이 아닙니다. 인코더와 디코더가 협력하며 정보를 처리하는 방식과 내부의 세부 메커니즘이 강력한 성능의 비결입니다. 이번 글에서는 트랜스포머의 각 구성 요소가 어떤 역할을 맡고, 이를 통해 어떻게 모델 전체가 작동하는지 하나씩 구체적으로 살펴보겠습니다.
Encoder
인코더는 컴퓨터가 이해할 수 있도록 입력 문장을 압축해 핵심 정보를 담은 형태(고차원 벡터)로 바꾸는 역할을 합니다. 여기서 '고차원 벡터'란, 문장의 의미를 숫자 형태로 나타낸 것이라고 생각하면 됩니다. 예를 들어, '나는 밥을 먹는다'라는 문장이 있다면, 인코더는 이 문장을 '숫자로 이루어진 벡터'로 바꿔서 컴퓨터가 이해할 수 있도록 만듭니다. 이 글의 임베딩 파트를 참고하시면 이해가 더 쉬울 것 같습니다.
N개의 인코더 계층(논문에서는 6개)으로 구성되어 있으며, 각 계층은 입력 데이터를 점진적으로 추상화된 벡터로 변환합니다. 최종 인코더 계층에서는 입력 데이터를 점점 더 중요한 의미만 담도록 가공해 벡터로 변환합니다. 즉, 입력 단어의 의미를 잘 반영한 벡터를 만드는 것이 인코더의 핵심 과제입니다.
각 인코더 레이어는 3개의 주요 서브 레이어로 구성됩니다:
- Multi-Head Attention
- Add & Norm
- Feed Forward Network
이 3가지 레이어가 순차적으로 실행되며, 입력 데이터를 점진적으로 학습하고 추상화된 벡터로 변환합니다.
Multi-Head Attention
자세한 원리는 지난 글에서 다루었으니, 이번 글에서는 인코더 내에서 Multi-Head Attention이 어떤 역할을 하는지 간단히 복습하고 넘어가겠습니다.
인코더에서 Multi-Head Attention은 입력 문장의 단어들 간의 관계를 학습하는 데 사용됩니다. 문장 속 각 단어가 다른 단어들과 얼마나 관련이 있는지(Attention Value)를 계산하고, 이를 바탕으로 새로운 단어 벡터를 생성합니다. 텍스트를 벡터로 변환해서 설명한다고 했을 때, 유사하거나 관계가 있는 단어들은 벡터 공간 상에서 서로 가까운 위치에 놓이고, 그렇지 않은 단어들은 멀리 떨어지도록 표현됩니다.
즉, 모델이 단어들을 '서로 비슷한 의미면 가깝게', '다른 의미면 멀게' 배치하도록 학습하는 것입니다.
특히, Multi-Head Attention은 단일 Self-Attention이 아닌 여러 개의 Self-Attention Head가 병렬로 작동하기 때문에, 문법적 관계, 의미적 연관성 등 다양한 관점을 학습할 수 있습니다.
이렇게 생성된 Attention Output은 다음 서브 레이어인 Add & Norm으로 전달됩니다.
ADD & Norm
Add & Norm은 잔차 연결(Skip Connection)과 정규화(Normalization)을 결합한 구조로, 트랜스포머 모델의 안정적 학습을 돕는 핵심 메커니즘입니다. 이 레이어는 Multi-Head Attention뿐만 아니라 Feed Forward 레이어 뒤에도 반복적으로 등장합니다. ADD는 정보를 보존해 손실을 막고, Norm은 데이터를 균형 있게 만들어 학습을 돕습니다.
ADD
ADD는 이전 레이어의 정보를 현재 레이어의 출력값에 더해주는 역할을 합니다. 쉽게 말해, 이전 정보가 손실되지 않도록 '다리 역할' 혹은 '원본을 백업해두고 새로운 정보를 덧칠하는 것'과 비슷합니다.
수식으로 표현하면 다음과 같습니다.
$$ \text{Output}_\text{ADD}= \text{Input} + \text{SubLayer}(\text{Input}) $$
즉, 입력(Input)에 현재 레이어의 결과(SubLayer)를 더한 값이 출력됩니다.
Multi-Attention 레이어에서의 ADD는 Attention Result=Input Embedding(이전 레이어에서 입력된 값)+Attention Output(현재 레이어에서 출력된 계산값) 이 됩니다. 딥러닝 모델은 깊어질수록, 입력 정보가 여러 레이어를 거치기 때문에 정보가 손실되고 기울기 소실 문제가 발생할 위험이 있습니다. 잔차 연결은 깊은 입력된 정보를 그대로 다음 레이어에 전달할 수 있게 해 정보 손실 문제와 기울기 소실 문제를 해결할 수 있게 합니다. 또한, 모델이 단순한 패턴까지 모두 학습하는 것이 아닌 복잡한 패턴만 학습하도록 유도할 수 있어 학습 속도가 더 빨라지게 되는 이점이 있습니다.
기울기 소실 문제 : 딥러닝 모델이 깊어질수록 역전파 과정에서 기울기(gradient)가 점점 작아져, 앞쪽(입력층)에 있는 레이어들이 제대로 학습되지 않는 현상. 깊은 물에 돌을 던졌을 때, 바닥까지 갈수록 점점 힘이 없어지는 것과 비슷하다고 생각하면 좋습니다.
Norm
Norm(층 정규화, *Layer Normalization)은 각 층을 정규화해 데이터의 범위를 조정하고, 서로 다른 특성들이 비교 가능하게 만들어주는 과정입니다. 쉽게 말해, '데이터 크기를 균형 있게 맞춰 공정한 비교 기준을 만든다'고 이해하면 됩니다. 예를 들어, 모델에 사용하는 변수 중에 1~10의 값을 가지는 A 변수와 1,000~1,000,000의 값을 가지는 B 변수가 있다고 합시다. 두 변수를 동시에 사용하면 절대적인 값의 크기에 따라 모델에 B변수가 더 크게 영향을 미칠 수 있습니다. 이런 데이터 범위 불균형 문제를 해결하기 위해 정규화가 필요합니다.
층 정규화는 네트워크 학습을 안정화시키고, 기울기 폭발이나 소실 문제를 완화하는 데 도움이 됩니다. 또한, 모델의 학습 속도를 높이고 일반화 성능도 개선합니다.
*트랜스포머에서 사용하는 건 Layer Normalization입니다. Batch Normalization과 헷갈리지 않도록 주의하세요.
Layer Normalization vs. Batch Normalization
- Layer Normalization : 한 데이터(하나의 샘플) 안의 각 특징(Feature)들을 기준으로 정규화. (각 샘플 독립적으로 정규화, NLP에서 주로 사용)
- Batch Normalization : 배치에 있는 여러 샘플들을 기준으로 정규화. (배치 전체에서 정규화, 이미지에서 주로 사용)
ADD & Norm 레이어를 간단하게 정리해보면 각 파트는
- ADD : 이전 레이어의 정보를 보존해 안정성을 확보한다.
- Norm : 데이터 균형을 맞춰 학습을 안정적이고 효율적으로 만든다.
역할을 하며, 두 기능을 통해 이전 레이어에서 받은 정보를 다음 레이어에 안정적이고 효과적으로 전달할 수 있게 됩니다.
Feed Forward Network
트랜스포머의 Feed Forward 레이어는 FFN(Feed Forward Network)이라고 불리며, 딥러닝에서 기본적으로 접하는 피드포워드 신경망(FFNN)으로 구성된 모듈입니다. 굳이 두 용어를 엄격히 구분하지 않아도 괜찮으며, FFNN은 신경망의 개념, FFN은 트랜스포머 내에서 이 신경망 구조를 활용한 레이어라고 이해하면 됩니다.
Self-Attention 레이어에서는 입력 문장의 단어 간 관계를 학습했다면, FFN 레이어는 각 단어 벡터 자체를 더 유용하게 가공하고 의미를 풍부하게 만드는 역할을 합니다. 이를 통해 각 단어 벡터가 고유한 의미를 더 정교하게 표현할 수 있게 됩니다.
- Self-Attention → "단어들 간 관계 학습"
- FFN → "단어 자체의 고유한 의미 학습"
이렇게 FFN은 Self-Attention에서 학습한 관계 정보를 바탕으로 각 단어를 더 유용하게 가공해주는 단계라고 할 수 있습니다. Self-Attention이 "이 단어와 저 단어가 서로 어떤 관련이 있을까?"를 학습한다면, FFN에서는 "이 단어 자체를 더 풍부하게, 더 똑똑하게 표현해보자"라고 다듬는 과정인 것입니다.
Q. 피드포워드 신경망이란?
데이터를 한 방향(입력 → 출력)으로만 처리하는 단순한 형태의 신경망입니다. 즉, 입력값이 들어오면 여러 층(layer)을 차례로 통과하며 계산을 수행하고, 최종 출력값을 생성합니다. 처음 접하는 분들은 "입력에서 출력으로 처리하는 게 당연하지 않나?"라는 의문이 생길 수 있습니다. 딥러닝 모델에서는 출력에서 발생한 오차를 입력 방향으로 거슬러 올라가며 학습하는 오차 역전파(Backpropagation)라는 과정이 필수적입니다. 따라서 피드포워드 신경망은 학습 과정에서 출력 방향과 학습 방향이 구분됩니다.
피드포워드 신경망의 핵심은 비선형 활성화 함수(ReLU, Sigmoid 등)를 사용하는데 있습니다. 단순한 선형 변환만으로는 복잡한 패턴이나 비선형 관계를 학습할 수 없는데, 활성화 함수를 사용하면 신경망이 비선형적인 데이터를 처리하고 더 복잡한 관계를 학습할 수 있게 됩니다. 이를 통해 FFNN은 이미지나 텍스트처럼 복잡한 데이터에서 중요한 패턴을 학습할 수 있습니다. 이는 딥러닝 모델이 다양한 문제에서 높은 성능을 발휘할 수 있는 이유 중 하나입니다.
정리해보면 FFN은 각 단어 벡터를 독립적으로 변환해 의미를 더 잘 표현하는 기계라고 할 수 있습니다. 단어를 더 정교하게 가공하는 '미세 조정 도구'인 것이죠. 즉, Self-Attention을 거쳐 서로 간의 관계를 학습해 만들어진 벡터(문맥 반영된 벡터)를 FFN이 한 번 더 다듬어서 더 유용한 표현 벡터로 만드는 과정입니다.
Encoder 동작 과정 정리
세부 레이어에 대한 내용을 바탕으로 트랜스포머 인코더의 동작 과정을 단계별로 정리해보겠습니다.
입력 문장 → [ 임베딩 ] → [ 포지셔널 인코딩 ] → [ 인코더 계층(1층) ] → [ 인코더 계층(2층) ] → ... → [ 인코더 계층(N층) ] → 최종 벡터 출력 → 디코더로 전달
1. 입력 처리
- 입력 단어 임베딩 : 입력 문장의 각 단어를 고차원 벡터(논문에서는 512차원)로 변환합니다. 이 벡터는 각 단어의 의미와 문맥 정보를 숫자로 표현한 것입니다. 임베딩을 할 때는 사전 학습된 임베딩(Word2Vec, GloVe 등)된 값을 사용할 수 있지만, 트랜스포머에서는 기본적으로 무작위 값으로 초기화한 학습 가능한 임베딩 테이블을 사용합니다. 해당 입력된 단어를 학습을 통해 점진적으로 본래의 의미나 다른 단어와의 관계를 잘 담을 수 있도록 벡터화해가는 것입니다. 처음엔 엉성한 선만 있던 낙서(무작위 벡터)이지만, 학습을 통해 점점 세밀한 그림(학습된 의미를 반영한 벡터)가 되어가는 것이죠.
- 포지셔널 인코딩 : 트랜스포머가 입력 단어의 순서를 알 수 있도록, 각 단어 벡터에 위치 정보를 더해줍니다. 사인과 코사인 함수로 계산된 위치 정보 벡터를 각 단어 벡터에 더해 순서 정보를 학습할 수 있도록 합니다.
2. 인코더 내 세부 레이어 통과
트랜스포머의 인코더는 총 N개(논문에서 6개)의 계층으로 구성되어 있으며, 각 계층은 동일한 구조를 가집니다. 하나의 계층에서 이루어지는 과정은 다음과 같습니다.
- Multi-Head Self-Attention : Self-Attention은 단어 간 관계를 학습하며, 출력값은 입력 단어 벡터에 문맥적 관계를 반영한 새로운 벡터입니다. Query, Key, Value를 사용하여 각 단어가 다른 단어와 얼마나 관련이 있는지(Attention Score)를 계산하고, 이 과정에서 문맥적 관계를 반영한 새로운 벡터를 생성합니다. 1번 입력 처리에서 무작위로 설정된 임베딩 벡터들이 이 과정을 통해 문맥전 관계를 학습한 값으로 변환되는 것입니다. Multi-Head Attention에서는 여러 개의 Self-Attention Head가 병렬로 작동해, 단어 간의 문법적 관계, 의미적 유사성 등 다양한 관점을 학습합니다.
- Add & Norm : Add(잔차연결)를 통해 Mult-Head Attention의 출력값에 입력값을 더하고, Norm(층 정규화)를 통해 데이터를 정규화하여 학습을 안정화합니다.
- Feed Forward Network(FFN) : 각 단어 벡터를 독립적으로 처리하여 고유한 의미를 강화합니다. Fully Connected Layer(완전 연결 신경망) 2개와 활성화 함수(ReLU)로 구성되어 이 과정을 통해 단어 벡터가 더욱 정교하게 변환됩니다.
- Add & Norm : FFN의 출력값에 다시 잔차 연결을 적용한 뒤, 층 정규화를 수행합니다.
3. 인코더 출력 결과
각 인코더 계층을 통과할 때마다 2번 과정을 거치게 되고, 입력 데이터는 점진적으로 추상화된 벡터로 변환됩니다. 인코더의 목적은 입력된 단어를 학습을 통해 의미적, 문맥적 관계를 고려한 임베딩 벡터로 만들어주는 것입니다.
이렇게 만들어진 인코더의 최종 출력 벡터(마지막 계층의 출력)는 이후 디코더에서 사용되어 번역, 문장 생성 등 다양한 작업을 수행하는 기초 자료가 됩니다.
Decoder
앞서 인코더가 입력 문장을 고차원 벡터로 변환했다면, 이제 디코더는 이 벡터를 활용해 새로운 문장을 만들어내는 역할을 합니다. 인코더가 입력 문장의 요약 노트를 만들어줬다면, 디코더는 이 노트를 참고하면서 한 단어씩 문장을 완성해 나가는 과정입니다. 디코더는 인코더의 출력과 이전에 생성된 단어를 입력으로 사용해 새로운 단어를 순차적으로 생성하고, 이를 통해 최종적으로 문장 단위의 결과를 만들어냅니다.
디코더는 아래의 두 정보를 결합하여 현재 시점의 새로운 단어를 생성하게 됩니다.
- 인코더의 출력: 입력 문장의 정보(문맥, 의미 등)를 요약한 벡터.
- 이전 디코더 출력: 이전 시점에 디코더가 생성한 단어들.
디코더의 각 계층은 인코더와 유사하지만, Masked Multi-Head Attention 등 문장 생성 과정에 필요한 추가적인 구성 요소를 포함합니다. 이제 디코더의 입력과 세부 레이어를 살펴본 뒤, 전체 구조를 정리해보겠습니다.
Decoder 입력 처리
디코더는 이전까지 생성한 단어들을 입력으로 사용해 다음 단어를 만들어냅니다. 하지만 디코더 내부에서는 고정된 길이의 자리(시퀀스 길이)가 미리 확보되어 있고, 아직 생성되지 않은 자리에는 PAD라는 빈 공간을 채워둡니다.
예를 들어, 최종적으로 "나는 학교에 갑니다."라는 문장을 만들어내야 한다면, 생성 과정 초기에는 다음과 같은 식입니다.
시점 t | 디코더 입력 |
t=1 | <start> [PAD] [PAD] [PAD] |
t=2 | <start> 나는 [PAD] [PAD] |
t=3 | <start> 나는 학교에 [PAD] |
t=4 | <start> 나는 학교에 갑니다 |
이처럼 생성되지 않은 부분은 PAD로 채우고, 지금까지 생성된 단어들만 의미 있는 입력으로 사용됩니다.
입력 단어 임베딩
디코더에 입력된 단어들은 고차원 벡터(논문 기준 512차원)로 변환됩니다. 이는 각 단어의 의미와 문맥 정보를 수치로 표현하는 과정(벡터화)입니다. 딥러닝에서는 입력 길이가 일정해야 하므로, PAD도 하나의 토큰처럼 취급해서 벡터로 만들어줘야 합니다. 인코더와 마찬가지로, 디코더도 처음에는 무작위로 초기화된 임베딩 테이블에서 각 단어를 벡터로 변환합니다. 이후 디코더 계층을 거치며 단어 벡터는 점점 정교해지고, 문장 생성에 적합한 표현으로 변해갑니다.
이어서 나오지만, Masked Multi-HEAD Attention에서 PAD의 위치는 가려지면서 Attention Score가 무시되거나 0 처리되므로, 임베딩 자체는 하더라도 결과적으로 의미있는 정보로 사용되지는 않습니다.
포지셔널 인코딩
각 단어가 문장 내에서 몇 번째 위치인지 알 수 있도록 포지셔널 인코딩을 더해 위치 정보를 알려줍니다.
Q. 디코더는 단어가 순차적으로 생성되는데 왜 포지셔널 인코딩을 해야 하는가?
디코더는 "지금까지 생성된 단어들 전체 시퀀스"를 항상 한 번에 처리합니다. 즉, 단어 하나씩 추가되는 것처럼 보이지만, 각 시점에서 "지금까지 만들어진 문장 전체"를 입력으로 다시 넣어서 처리하는 방식입니다. 인코더와 마찬가지로 Positional Encoding을 통해 각 단어의 위치를 벡터에 반영해줘야 하죠.
디코더의 입력 처리 과정은 첫 번째 계층에 입력되기 전 딱 한 번만 수행됩니다. 이어서 디코더 내 세부 레이어를 살펴보겠습니다.
이렇게 준비된 입력(임베딩 + 위치 정보)은 디코더 첫 번째 계층으로 전달됩니다. 첫 번째 서브 레이어에서는 Masked Multi-Head Attention이 수행됩니다.
Masked Multi-Head Attention
디코더는 단어를 순차적으로 생성합니다. 즉, 이전에 생성된 단어들을 참조하여 다음 단어를 예측하며 문장을 만들어갑니다. 이때 현재 시점에서 이후 단어를 미리 알면 안 되기 때문에, Masked Multi-Head Attention이 사용됩니다.
Masked Multi-Head Attention은 Self-Attention과 유사하지만, "미래 단어를 가리는 Masking 기능"이 추가된 형태입니다. 현재까지 생성된 단어까지만 참고하고, 이후 단어는 가려서 보지 못하도록 강제합니다. Masking을 하는 이유는, 단어 생성이 시험 문제를 푸는 것과 비슷하기 때문입니다. 앞에 단어를 보고 다음 단어를 맞춰야 하는데, 정답(이후 단어)을 미리 보면 안 되기 때문입니다.
Masked Multi-Head Attention은 인코더와 마찬가지로 여러 개의 Self-Attention이 병렬로 작동해, 다양한 관점에서 단어들 간의 관계를 학습합니다.
Multi-Head Attention
디코더에서는 두 가지 Multi-Head Attention이 사용됩니다. 첫 번째는 앞에서 설명한 Masked Multi-Head Attention이고, 두 번째는 인코더-디코더 Multi-Head Attention입니다.
인코더-디코더 Multi-Head Attention은 인코더가 만든 문장 요약 벡터(입력 문장의 정보)와, 현재까지 디코더가 생성한 단어들을 참고해 더 정확한 단어를 생성하도록 돕습니다. 이 과정은 마치 통역사가 앞서 받은 원문 요약(인코더 출력)을 참고해가며, 지금까지 작성한 번역문(디코더 단어들)을 살펴보며 다음 문장을 자연스럽게 이어가는 것과 비슷합니다. 이 Multi-Head Attention은 입력 문장(인코더)과 출력 문장(디코더)의 연결고리 역할을 합니다.
위의 그림에서처럼 인코더의 최종 출력은 디코더의 각 계층이 독립적으로 전달됩니다. 디코더의 각 계층은 서로 다른 관점에서 단어를 가공해 점점 더 자연스러운 문장을 완성해갑니다. 그래서 매 계층마다 인코더 정보를 참고해, 더 정확한 단어를 생성하는 데 도움을 받습니다.
지금까지 디코더에서 사용되는 두 가지 Multi-Head Attention에 대해 살펴보았습니다.
아래 표는 Masked Multi-Head Attention과 인코더-디코더 Multi-Head Attention의 차이를 한눈에 정리한 것입니다.
이처럼 디코더에서는 이전 단어와의 관계(내부 Self-Attention)와 인코더의 문장 정보 참고(인코더-디코더 Attention)라는 두 가지 어텐션이 결합해 자연스럽고 문맥에 맞는 문장을 만들어냅니다.
Decoder 동작 과정 정리
이제 이러한 세부 레이어들이 결합된 디코더 전체 구조와 동작 과정을 최종적으로 정리해보겠습니다.
입력 단어들(시작 토큰 포함) → [ 임베딩 ] → [ 포지셔널 인코딩 ] → [ 디코더 계층(1층) ] → [ 디코더 계층(2층) ] → ... → [ 디코더 계층(N층) ] → 최종 벡터 출력 → Linear + Softmax → 최종 단어 선택
1. 입력 처리
- Input : 이전까지 생성된 단어들을 입력으로 사용합니다. (ex: "<start>", "나는", "밥을", ... 이런 식으로 점점 늘어나게 됩니다.)
- 입력 단어 임베딩 : 입력 단어를 고차원 벡터(논문 기준 512차원)로 변환합니다.
- 포지셔널 인코딩 : 입력 단어의 순소를 고려하기 위해 위치 정보를 더합니다.
2. 디코더 내 세부 레이어 통과
트랜스포머 디코더는 인코더와 마찬가지로 N개(논문 기준 6개)의 계층으로 구성되어 있으며, 각 계층은 아래 3가지 서브 레이어로 이루어져 있습니다.
- Masked Multi-Head Attention : 이전까지 생성된 단어들끼리 관계를 학습합니다. 이때 현재 시점 이후 단어는 보지 못하도록 Masking 합니다. 여러 개의 Attention Head가 병렬로 다양한 관점에서 단어들 간의 관계를 학습합니다.
- Add & Norm : Masked Multi-Head Attention의 출력과 입력을 더하고 데이터 분포를 균일하게 만들어 학습 안정화를 돕습니다.
- 인코더-디코더 Multi-Head Attention : 디코더가 지금까지 생성한 단어들과 인코더의 최종 출력을 결합해 현재 단어를 예측합니다. 인코더가 만든 문장 정보를 참고해 더 자연스럽고 정확한 단어를 생성하도록 도움을 받습니다.
- Add & Norm : 인코더-디코더 Attention의 출력과 이전 출력을 더하고 데이터 분포를 균일하게 맞춥니다.
- Feed Forward Network (FFN) : 각 단어 벡터를 독립적으로 처리해 의미를 강화합니다.
- Add & Norm : FFN의 출력과 이전 출력을 더하고, 데이터 분포를 균일하게 맞춥니다.
3. 디코더 출력 결과
디코더 최종 벡터(512차원)
↓
Linear 레이어 (10,000차원 점수)
↓
Softmax 함수 (확률로 변환)
↓
확률이 가장 높은 단어 선택
디코더의 각 계층을 통과하고 마지막 계층을 지나면 각 단어 자리마다 고차원 벡터(512차원)가 나옵니다. 이 벡터는 현재 위치의 단어가 어떤 의미인지 모델이 학습한 '숫자 표현'입니다. 하지만 아직 사람이 알아볼 수 있는 단어나 문장은 아니기 때문에, 이 숫자(벡터)를 우리가 아는 '단어'로 바꿔주는 과정이 필요합니다.
트랜스포머 모델은 미리 사용할 수 있는 단어 집합(어휘집)이 정해져 있습니다. 예를 들어, 어휘 집합 크기가 10,000개라고 하면, "나는", "학교", "갑니다", "사과", "바다", ... 이런 단어들이 0번, 1번, ... 9999번까지 번호가 매겨져 있다고 생각할 수 있습니다. 이제, 디코더의 최종 벡터를 이 단어들 중 하나로 바꾸는 과정이 진행됩니다.
- Linear 레이어 : 벡터를 '단어 집합 크기'로 바꾸는 역할을 합니다. 디코더 마지막 출력 벡터(512차원)를 어휘집 크기(ex. 10,000차원)로 변환합니다. 이 변환은 선형 변환(Linear Layer)으로 이루어집니다. 즉, 각 벡터를 10,000차원의 점수(logit)로 바꾸는 과정으로, 이 점수는 각 단어가 맞을 가능성에 대한 점수라고 볼 수 있습니다.
- Softmax 함수 : 점수를 '확률'로 바꿉니다. Softmax 함수는 모든 점수를 확률(0~1 사이)로 변환하고, 전체 확률 합이 1이 되도록 만들어줍니다.
이 과정을 예시로 보이면 다음과 같습니다.
단어 | 점수(logit) | 확률(Softmax 결과) |
나는 | -0.5 | 0.1 |
학교 | 2.1 | 0.6 |
갑니다 | 1.3 | 0.2 |
사과 | -1.7 | 0.05 |
최종적으로 이 확률 중 가장 높은 단어인 학교가 선택되는 것이죠. 이렇게 매 시점마다 디코더는 '최종 벡터 → Linear 점수 → Softmax 확률 → 단어 선택' 과정을 거쳐서 하나씩 단어를 만들어가고 문장을 완성합니다.
Transformer 정리
마지막으로 트랜스포머가 문장을 생성하는 과정을 처음부터 끝까지 다시 한번 정리해보겠습니다.
(1) 인코더-디코더 동작 흐름
단계 | 주요 과정 |
입력 처리 | 입력 문장 → 임베딩 → 포지셔널 인코딩 |
인코더 | Self-Attention → Add & Norm → FFN 반복 |
디코더 입력 처리 | 이전까지 생성한 단어 + PAD → 임베딩 → 포지셔널 인코딩 |
디코더 | Masked Self-Attention → 인코더-디코더 Attention → FFN 반복 |
출력 | 최종 벡터 → Linear → Softmax → 단어 선택 |
1. 인코더는 입력 문장을 임베딩한 후 Self-Attention 등을 거쳐 문장 전체 의미를 담은 고차원 벡터로 변환합니다.
2. 디코더는 이전까지 생성한 단어와 인코더 출력을 참고해, Masked Attention 등을 통해 다음 단어를 하나씩 생성합니다.
3. 최종적으로 각 위치에서 생성된 벡터는 Linear 레이어와 Softmax를 거쳐 단어가 선택됩니다.
이 과정을 반복해 자연스러운 문장이 완성됩니다.
(2) 그래서 트랜스포머가 왜 좋다고?
트랜스포머는 자연어 처리 패러다임을 바꿨습니다. 그 이유를 다시 한번 짚어보면 다음과 같습니다.
- Self-Attention으로 문맥 고려 + 병렬 연산 덕분에 빠르고 정확하다.
- 기존 순차적 모델(RNN)보다 긴 문장에서도 효율적이다.
(3) 실제 트랜스포머 응용 모델 사례
트랜스포머의 유연한 구조는 다양한 강력한 모델들로 발전해, 실무에서도 활발히 사용되고 있습니다. 트랜스포머를 기반으로 한 LLM 모델에 대해 더 자세히 알고 싶으시다면 이 글을 읽어보는 것을 추천드립니다.
모델 | 특징 |
BERT | 인코더만 사용 – 문장 이해 (분류, 문서 검색) |
GPT | 디코더만 사용 – 문장 생성 (글쓰기, 대화) |
T5 | 인코더-디코더 사용 – 문장 이해 + 생성(요약, 번역) |
결론
트랜스포머가 주목받는 이유는 단순히 '좋다'는 평가 때문이 아니라, Self-Attention, 병렬 처리, 유연한 구조 덕분에 자연어 처리에서 어려웠던 문제들을 실질적으로 해결했기 때문입니다. 이제 트랜스포머가 왜 핫한지, 그리고 그 안에서 각 구성 요소들이 어떤 역할을 하는지 명확하게 이해하셨길 바랍니다. 앞으로 모델을 사용할 때도 '그냥 좋다더라'가 아니라, 자신의 환경과 목적에 맞게 트랜스포머 구조를 이해하고 응용하는 경험을 꼭 해보시길 바랍니다. 지금 한 걸음 나아간 만큼, 앞으로 자연어 처리 모델들을 활용하고 연구하는 데 큰 도움이 될 것입니다.
참고 자료
- Vaswani, A., et al. (2017). Attention Is All You Need. 논문 링크
- The Illustrated Transformer
'Data&AI' 카테고리의 다른 글
AI 모델에게 현실세계 알려주기 - Feature와 Embedding (0) | 2025.02.02 |
---|---|
Transformer, 도대체 그게 뭔데 - Transformer 편 (1) (0) | 2025.01.19 |
Transformer, 도대체 그게 뭔데 - Attention편 (33) | 2024.12.07 |