"Attention Is All You Need."
2017년 Google이 발표한 이 논문 한 편이 자연어 처리의 판도를 완전히 바꿔놓았다. GPT, BERT, T5 등 현재 우리가 사용하는 거의 모든 대규모 언어 모델(LLM)의 뿌리에는 Transformer가 있다. RNN과 LSTM이 지배하던 시퀀스 모델링의 세계에서, Transformer는 어떤 문제를 해결했고, 왜 표준이 되었을까?
RNN의 한계, 그리고 새로운 길
Transformer를 이해하려면 먼저 그 이전의 접근 방식을 알아야 한다.
RNN(Recurrent Neural Network) 은 시퀀스 데이터를 다루기 위해 설계된 모델이다. 문장의 단어를 하나씩 순서대로 읽으며, 이전 단어의 정보를 다음 단계로 전달한다. 마치 책을 한 글자씩 읽으며 앞의 내용을 기억하려는 것과 같다.
하지만 이 방식에는 치명적인 문제가 있다.
- 장기 의존성 문제(Long-term Dependency): 문장이 길어지면 앞부분의 정보가 뒷부분까지 전달되지 못한다. "어제 서울에서 출발한 기차가 ... (긴 수식어) ... 도착했다"에서 "기차가"와 "도착했다"의 관계를 파악하기 어렵다.
- 병렬 처리 불가: 단어를 순차적으로 처리하므로, GPU의 병렬 연산 능력을 활용할 수 없어 학습 속도가 느리다.
LSTM과 GRU가 장기 의존성 문제를 일부 완화했지만, 순차 처리라는 근본적 한계는 여전했다. Transformer는 이 두 문제를 한 번에 해결한다. 순환 구조(Recurrence)도, 합성곱(Convolution)도 사용하지 않고, 오직 Attention만으로 시퀀스를 처리한다.
Self-Attention: 모든 단어가 서로를 바라본다
Transformer의 핵심은 Self-Attention(자기 주의) 메커니즘이다.
RNN이 단어를 하나씩 순서대로 읽는 방식이라면, Self-Attention은 문장의 모든 단어가 동시에 다른 모든 단어를 참조하는 방식이다. 마치 회의실에서 한 명씩 돌아가며 발언하는 대신, 모든 참석자가 동시에 서로의 의견을 확인하는 것과 같다.
Self-Attention은 각 단어가 문장 내 다른 단어들과 얼마나 관련 있는지(relevance)를 계산하고, 그 관련성을 반영하여 각 단어의 표현을 업데이트하는 메커니즘이다.
Query, Key, Value
Self-Attention의 작동 원리는 검색 시스템에 비유하면 직관적이다.
- Query(질의): "나와 관련 있는 단어가 뭐지?" -- 현재 단어가 던지는 질문
- Key(키): "나는 이런 정보를 가지고 있어" -- 각 단어가 제공하는 식별 정보
- Value(값): "내가 실제로 전달할 내용은 이거야" -- 각 단어가 담고 있는 실제 정보
각 단어는 입력 임베딩에 학습된 가중치 행렬을 곱하여 Q, K, V 세 가지 벡터를 생성한다. 그런 다음, Query와 Key의 내적(dot product) 을 통해 단어 간 유사도를 계산하고, 이를 Softmax로 정규화하여 가중치를 얻는다. 최종적으로 이 가중치와 Value의 가중합(weighted sum) 이 해당 단어의 새로운 표현이 된다.
예를 들어, "The cat sat on the mat because it was tired"라는 문장에서 "it"이라는 단어의 Query는 "cat"의 Key와 높은 유사도를 보일 것이다. 결과적으로 "it"의 표현에는 "cat"의 정보가 강하게 반영된다.
Multi-Head Attention: 다양한 시선으로 바라보기
Self-Attention 하나만으로도 강력하지만, Transformer는 여기서 한 발 더 나아간다. Multi-Head Attention(다중 헤드 어텐션) 은 Self-Attention을 여러 개 병렬로 수행하는 것이다.
왜 여러 개가 필요할까? 하나의 Attention Head가 하나의 관점이라면, 여러 Head는 다양한 관점에서 단어 간 관계를 포착한다.
- Head 1: 문법적 관계에 주목 (주어-동사)
- Head 2: 의미적 관계에 주목 (대명사-선행사)
- Head 3: 위치적 근접성에 주목 (인접 단어)
각 Head는 서로 다른 Q, K, V 가중치 행렬을 사용하므로, 동일한 입력에서도 서로 다른 관계 패턴을 학습한다. 모든 Head의 출력은 연결(concatenate) 된 후 하나의 선형 변환을 거쳐 최종 출력이 된다.
이렇게 함으로써 모델의 표현력(expressiveness) 이 크게 향상된다. 단일 Attention으로는 놓칠 수 있는 복잡한 관계들을 다중 시점에서 포착할 수 있기 때문이다.
Positional Encoding: 순서 정보 주입하기
Transformer에는 순환 구조가 없다. 모든 단어를 동시에 처리하기 때문에, 모델 자체는 단어의 순서를 전혀 알지 못한다. "고양이가 쥐를 쫓았다"와 "쥐가 고양이를 쫓았다"를 구분할 수 없다는 뜻이다.
이 문제를 해결하기 위해 Positional Encoding(위치 인코딩) 을 사용한다. 각 단어의 임베딩 벡터에 위치 정보를 담은 벡터를 더해주는 방식이다.
원래 논문에서는 사인(sin)과 코사인(cos) 함수를 사용한 고정된 위치 인코딩을 제안했다. 주파수가 다른 삼각함수들을 조합하면, 각 위치마다 고유한 패턴이 생성되면서도 모델이 상대적인 위치 관계를 학습할 수 있다.
핵심은 Positional Encoding이 임베딩과 같은 차원을 가져야 한다는 점이다. 둘을 더하는 연산이기 때문이다. 이를 통해 모델은 "무슨 단어인지"와 "어디에 있는 단어인지"를 동시에 파악한다.
Feed-Forward Network: 비선형 변환
Attention 레이어를 거친 출력은 Feed-Forward Network(FFN) 를 통과한다. 각 위치에 대해 독립적으로 동일한 구조의 네트워크가 적용된다.
구조는 단순하다. 두 개의 선형 변환(Linear Transformation) 사이에 ReLU 활성화 함수를 넣은 것이다.
FFN(x) = max(0, xW1 + b1)W2 + b2
이 과정이 필요한 이유는, Attention이 단어 간 관계를 포착하는 역할이라면, FFN은 각 단어의 표현을 더 풍부한 의미 공간으로 변환하는 역할을 하기 때문이다. Attention만으로는 선형적인 조합에 그치지만, FFN의 비선형 활성화 함수가 모델에 비선형성을 부여하여 복잡한 패턴을 학습할 수 있게 한다.
Residual Connection & Layer Normalization: 학습 안정화
Transformer는 깊은 신경망이다. Encoder와 Decoder 각각이 여러 층으로 쌓이기 때문에, 깊은 네트워크에서 흔히 발생하는 두 가지 문제를 해결해야 한다.
Residual Connection (잔차 연결)
Residual Connection은 각 서브 레이어의 입력을 출력에 직접 더해주는 기법이다.
Output = SubLayer(x) + x
마치 고속도로의 지름길 같다. 정보가 여러 층을 통과하면서 점차 희미해지는 것(기울기 소실, Vanishing Gradient)을 방지하기 위해, 원래 정보를 바로 전달하는 경로를 만들어 준다. 덕분에 수십, 수백 층을 쌓아도 안정적으로 학습할 수 있다.
Layer Normalization (층 정규화)
Layer Normalization은 각 레이어의 출력을 정규화(normalize) 하여 학습을 안정시킨다. 각 샘플의 특성 차원에 걸쳐 평균과 분산을 계산하고, 이를 기반으로 값을 정규화한다.
Residual Connection과 Layer Normalization은 항상 함께 사용되며, 각 서브 레이어의 출력은 다음과 같이 처리된다.
LayerNorm(x + SubLayer(x))
이 두 기법의 조합 덕분에 Transformer는 깊은 구조에서도 안정적이고 빠르게 수렴할 수 있다.
Encoder-Decoder 구조
Transformer의 전체 아키텍처는 Encoder(인코더) 와 Decoder(디코더) 로 구성된다. 이 구조는 기계 번역 같은 시퀀스-투-시퀀스(Seq2Seq) 작업을 위해 설계되었다.
Encoder
Encoder는 입력 시퀀스를 받아 문맥이 반영된 임베딩(contextual embeddings) 으로 변환한다. 각 단어의 표현에 문장 전체의 맥락 정보가 담기도록 하는 것이다.
구조적으로 Encoder는 동일한 레이어를 N번 쌓은 형태이며, 각 레이어는 다음 두 서브 레이어로 구성된다.
- Multi-Head Self-Attention
- Position-wise Feed-Forward Network
각 서브 레이어에는 Residual Connection과 Layer Normalization이 적용된다.
Encoder는 주로 입력을 이해하는 데 특화되어 있어, 자연어 이해(NLU, Natural Language Understanding) 작업에 적합하다.
Decoder
Decoder는 Encoder의 출력과 이전 Decoder 단계의 출력을 기반으로, 다음 단어를 예측하여 출력 시퀀스를 생성한다.
Decoder 레이어는 Encoder보다 하나의 서브 레이어가 더 있다.
- Masked Multi-Head Self-Attention: 현재 위치 이후의 단어를 참조하지 못하도록 마스킹 처리한다. 번역 시 아직 생성하지 않은 미래 단어를 미리 보는 것을 방지한다.
- Multi-Head Cross-Attention: Encoder의 출력을 Key, Value로 사용하고, Decoder의 현재 상태를 Query로 사용하여 입력 시퀀스의 관련 정보를 참조한다.
- Position-wise Feed-Forward Network
Decoder는 자연어 생성(NLG, Natural Language Generation) 작업에 특화되어 있다.
파생 모델들: BERT, GPT, 그리고 그 너머
Transformer의 Encoder와 Decoder는 반드시 함께 사용할 필요가 없다. 어떤 부분을 사용하느냐에 따라 특성이 달라지며, 이것이 현대 LLM들의 분류 기준이 되었다.
| 구조 | 대표 모델 | 특징 | 적합한 작업 |
|---|---|---|---|
| Encoder Only | BERT | 양방향 문맥 이해 | 분류, 개체명 인식, QA |
| Decoder Only | GPT | 자기회귀적 텍스트 생성 | 텍스트 생성, 대화 |
| Encoder-Decoder | BART, T5 | 입력 이해 + 출력 생성 | 번역, 요약 |
- BERT(Bidirectional Encoder Representations from Transformers) 는 Encoder만 사용하여 문맥을 양방향으로 이해한다. 문장의 의미를 파악하는 데 강하다.
- GPT(Generative Pre-trained Transformer) 는 Decoder만 사용하여 왼쪽에서 오른쪽으로 텍스트를 생성한다. ChatGPT의 기반 아키텍처다.
- BART와 T5는 Encoder-Decoder를 모두 활용하여, 입력을 이해하고 변환된 출력을 생성하는 작업에 적합하다.
정리
Transformer는 RNN의 순차 처리와 장기 의존성 문제를 Self-Attention으로 해결하며, 현대 자연어 처리의 기반 아키텍처가 되었다. 핵심 구성 요소를 다시 정리하면 다음과 같다.
- Self-Attention: 모든 단어 간 관계를 동시에 계산하는 핵심 메커니즘
- Multi-Head Attention: 다양한 관점에서 단어 관계를 포착하여 표현력 향상
- Positional Encoding: 순환 구조 없이도 단어 순서 정보를 모델에 주입
- Feed-Forward Network: 비선형 변환으로 풍부한 표현 학습
- Residual Connection & Layer Normalization: 깊은 네트워크의 안정적 학습 보장
- Encoder-Decoder: 입력 이해와 출력 생성을 분리한 유연한 구조
이 구성 요소들의 조합이 BERT, GPT, T5 등 다양한 파생 모델로 이어졌고, 오늘날의 LLM 시대를 열었다.