[Attention Is All You Need] 심화 개념 정리 (과정 중심)
이 문서는 "Transformer가 실제로 어떻게 계산되는지"를 단계별로 설명합니다. 암기보다 연산 흐름을 이해하는 데 초점을 둡니다.
아주 쉽게 한 줄 요약
Transformer는 RNN처럼 한 칸씩 읽지 않고, 문장 전체를 한 번에 보면서 단어끼리 중요한 연결을 계산하는 모델입니다.
당시 상황과 역사적 맥락
2017년 당시 번역/요약 모델의 주류는 RNN/LSTM 기반 seq2seq였습니다. 문제는 두 가지였습니다. 첫째, 순차 처리라 학습이 느렸습니다. 둘째, 긴 문장에서 앞 정보가 뒤로 잘 전달되지 않았습니다. Transformer는 이 병목을 "Attention 중심 구조"로 바꿔 해결했습니다.
시각 자료로 먼저 보기
Transformer 이전: RNN은 어떻게 읽었나?
대표 구조는 RNN(Recurrent Neural Network)입니다. RNN은 문장을 순서대로 처리합니다.
예: I -> love -> machine -> learning
각 시점에서 hidden state를 갱신하며 정보를 전달합니다.
즉 현재 단어 정보(x_t)와 이전 상태(h_(t-1))를 합쳐 새 상태(h_t)를 만듭니다.
RNN의 핵심 한계: long-range dependency
문장이 길어지면 멀리 떨어진 단어 관계가 약해집니다.
예: The animal that was injured in the accident couldn't move because it was tired
여기서 it -> animal 관계를 잡아야 하지만, RNN에서는 중간 경로가 길어 정보가 희미해지기 쉽습니다. 이 문제가 long-range dependency problem입니다.
Transformer는 이 문제를 "모든 단어가 서로를 직접 참조"하게 만들어 완화했습니다.
LSTM은 무엇을 개선했고 왜 충분하지 않았나
LSTM(Long Short-Term Memory)은 게이트 구조로 정보 보존을 개선해 RNN보다 장기 의존성 문제를 완화했습니다.
하지만 계산은 여전히 순차적입니다. 길이 100 토큰 문장은 기본적으로 100단계 순서 계산이 필요합니다. 그래서 GPU 병렬화 효율이 제한됩니다.
Transformer의 전환점: 순차 처리 대신 전역 관계 동시 계산
Attention Is All You Need의 핵심은 "순서대로 읽지 말고, 모든 단어 관계를 한 번에 계산"하는 것입니다.
예문: I love machine learning
I ↔ love,I ↔ machine,I ↔ learninglove ↔ machine,love ↔ learning,machine ↔ learning
이런 전역 관계를 self-attention이 동시에 계산합니다. 그래서 멀리 떨어진 관계(예: it -> animal)도 직접 포착할 수 있습니다.
RNN vs Transformer 계산 관점
- RNN/LSTM:
word1 -> word2 -> word3 ...(순차 의존) - Transformer: 토큰 간 관계를 행렬연산으로 동시 처리 (병렬 친화)
결과적으로 Transformer는 두 문제를 동시에 개선했습니다: 장거리 의존성 + 병렬 계산.
하나의 구조가 여러 분야로 확장된 이유
Transformer 공통 블록(embedding -> self-attention -> feed-forward -> 반복)은 입력만 바꾸면 다양한 도메인에 적용됩니다.
- BERT: encoder 기반, 양방향 문맥 이해
- GPT: decoder 기반, 다음 토큰 생성
- ViT: 이미지 패치를 토큰처럼 처리
- Diffusion Transformer: 생성 모델 백본으로 확장
요약 흐름: 텍스트 -> 토큰 -> 임베딩 -> self-attention -> 문맥표현 -> pooling/헤드 -> 태스크 출력
1단. 문제 정의
기존 seq2seq는 긴 문맥에서 성능이 떨어지고, GPU 병렬화 효율이 낮았습니다.
2단. 기존 한계
- RNN은 토큰을 순서대로 처리하므로 학습 시간이 길어짐
- 장거리 의존성(앞 단어가 뒤 단어에 미치는 영향) 학습이 어려움
- 주의집중(attention)을 보조로 붙여도 순차 병목은 남아있음
3단. 핵심 아이디어
순환을 버리고, Self-Attention만으로 토큰 간 관계를 직접 계산합니다. 즉, "현재 단어가 문장 내 다른 단어를 얼마나 참고해야 하는가"를 수치로 구한 뒤, 이를 여러 시점(head)에서 병렬로 계산합니다.
왜 attention은 dot product(내적)를 쓰는가?
한 줄 핵심: attention은 단어 간 관련도를 계산하는데, 내적이 가장 단순하고 빠른 유사도 계산이기 때문입니다.
예문: The animal didn't cross the street because it was tired
여기서 it이 무엇을 가리키는지 모델은 attention 점수로 판단합니다. 직관적으로 it -> animal에 높은 점수가 나와야 합니다.
벡터 예시:
animal -> [0.2, 0.7, -0.1, ...]it -> [0.1, 0.6, -0.2, ...]street -> [-0.4, 0.1, 0.8, ...]
이제 it 벡터와 각 단어 벡터의 내적(q·k)을 구하면, 관련도가 높은 단어일수록 더 큰 점수가 나옵니다.
즉 attention의 본질은:
1) 내적으로 유사도 계산 -> 2) softmax로 확률화 -> 3) 확률 가중합으로 정보 통합
Transformer가 내적 attention을 쓰는 이유는 세 가지입니다.
- 단순함: 수식이 간단해 구현/해석이 명확
- 효율성: 행렬곱(
QK^T)으로 GPU 병렬화가 매우 잘 됨 - 표현력: 학습된 선형변환(Wq, Wk) 뒤의 내적은 충분히 강력한 유사도 함수
참고로 cosine 유사도나 additive attention도 가능하지만, 대규모 학습에서는 dot-product attention이 계산 효율 측면에서 유리합니다.
내적 -> softmax -> 가중합: attention의 실제 계산 흐름
가장 단순한 유사도 정의는 similarity = q·k입니다.
직관적으로 같은 방향이면 큰 값, 다른 방향이면 작은 값이 됩니다. 그래서 보통 it·animal은 크고 it·street는 더 작게 나옵니다.
예를 들어 it이 다른 토큰과 비교해 다음 score를 얻었다고 합시다.
animal -> 8.2street -> 1.1cross -> 2.0
softmax를 적용하면:
즉 it는 animal 정보를 가장 많이 참고합니다.
마지막으로 value 벡터를 확률 가중합해 출력을 만듭니다.
예: 0.96 × animal 정보 + 0.02 × street 정보 + ...
이렇게 하면 원래의 it 벡터가 문맥을 반영해 갱신됩니다. 이것이 contextual embedding입니다.
중요한 직관: attention은 동적 가중 평균
RNN은 순차적으로 word1 -> word2 -> word3를 읽지만, attention은 모든 단어 ↔ 모든 단어 관계를 동시에 계산합니다.
그래서 문장 전체를 한 번에 보고, 토큰 표현을 계속 변환(transform)합니다. 이 누적 변환이 Transformer라는 이름의 핵심 직관입니다.
예를 들어 초기의 bank 벡터가 애매해도, 여러 attention layer를 거치며 river bank와 financial bank 문맥이 분리된 표현으로 바뀝니다.
왜 Query, Key, Value를 따로 두는가?
많이 쓰는 비유는 도서관 검색입니다.
- Query: 지금 찾고 싶은 것(검색어)
- Key: 항목 식별 표지(책 제목/인덱스)
- Value: 실제 가져올 내용(책 본문)
attention도 동일합니다. 먼저 Query와 Key로 관련도를 계산하고, 그 점수로 Value를 가져옵니다.
예문: The animal didn't cross the street because it was tired
it의 의미를 파악하려면 현재 토큰 it가 Query가 됩니다.
그다음 각 토큰에 대해:
Query(it) · Key(animal)Query(it) · Key(street)Query(it) · Key(cross)
유사도 점수를 softmax로 확률화하면 예를 들어 [0.9, 0.05, 0.05] 같은 가중치가 됩니다.
중요한 점: 가져오는 것은 Key가 아니라 Value입니다.
output = sum_i attention_i · value_i
즉 animal의 value가 크게 반영되어, 최종적으로 it 표현이 "animal 정보를 포함한 벡터"로 업데이트됩니다.
정리하면:
- Q/K 분리는 "어떤 정보를 참고할지"를 계산하기 위함
- V는 "실제로 주입할 정보"를 담기 위함
- 그래서 검색(매칭)과 내용전달을 분리해 더 유연한 문맥 통합이 가능해집니다.
왜 embedding 하나가 아니라 Q/K/V 세 개로 나누나?
핵심은 역할 분리입니다. 한 토큰은 동시에 세 역할을 수행해야 합니다.
- 무엇을 찾는지 (Query)
- 자신이 무엇인지 식별되는지 (Key)
- 어떤 정보를 전달할지 (Value)
그래서 같은 입력 임베딩 X를 서로 다른 선형변환으로 세 번 투영합니다.
Q = XW_Q, K = XW_K, V = XW_V
즉 같은 단어라도 Query/Key/Value 벡터는 서로 다릅니다.
예: bank가 문장 I deposited money in the bank에 있을 때, Query는 money 관련 단서를 찾고, Key/Value는 금융 맥락 정보를 더 강하게 반영하도록 학습될 수 있습니다.
반대로 river bank 문맥에서는 다른 방향의 Q/K/V가 활성화되어 다른 의미가 강조됩니다. 이것이 contextual embedding으로 이어집니다.
이 관점에서 attention은 다음처럼 볼 수 있습니다.
Query = 질문Key = 색인(index)Value = 실제 정보
그래서 Transformer를 differentiable database lookup(미분 가능한 검색 엔진)이라고 설명하기도 합니다.
결국 블록은 반복적으로 세 단계만 수행합니다: 임베딩 생성 -> attention으로 정보 교환 -> feed-forward로 표현 변환. 이 반복으로 문맥이 반영된 최종 토큰 벡터가 만들어집니다.
왜 self-attention만으로 문법과 의미를 학습할 수 있나?
핵심 아이디어: 문장 이해 = 단어 간 관계 계산입니다. self-attention은 바로 이 관계를 직접 계산합니다.
예문: I love machine learning
사람은 love -> I, learning -> machine, machine learning 결합을 자연스럽게 봅니다. self-attention도 각 토큰이 다른 모든 토큰을 보며 같은 종류의 관계를 학습합니다.
예를 들어 love 토큰의 attention이 다음처럼 나왔다고 합시다.
I -> 0.7machine -> 0.1learning -> 0.2
그러면 love의 새 표현은 가중합으로 갱신됩니다: 0.7×I + 0.1×machine + 0.2×learning. 이 과정이 contextualization입니다.
중요한 점은 이걸 한 번이 아니라 여러 layer에서 반복한다는 것입니다. BERT-base는 12층입니다.
- 초기층: 지역적/문법적 패턴 (형용사-명사, 동사-주어)
- 중간층: 구(phrase) 구조와 의존성 (예:
machine -> learning) - 깊은층: 문맥 의미 분화 (예:
bank -> financevsbank -> river)
예문: The animal didn't cross the street because it was tired
초기에는 it 의미가 모호하지만, 여러 층을 거치며 it -> animal 연결이 강화됩니다.
RNN과의 차이도 여기서 나옵니다.
- RNN:
word1 -> word2 -> word3 ...순차 처리 - Self-attention:
모든 단어 ↔ 모든 단어를 동시에 계산
그래서 장거리 의존성과 문장 전역 구조를 더 쉽게 포착할 수 있습니다.
정리하면 self-attention은
- 유사도 계산
- 가중 평균으로 정보 혼합
- layer 반복으로 표현 정제
를 수행하고, 그 결과 문법/의미/문장 수준 정보가 점진적으로 드러납니다.
왜 몇 층만 쌓아도 언어 구조가 나타나는가? (한 단계 더 깊은 답)
완전한 답은 아직 연구 주제이지만, 실무적으로는 다음 조합이 핵심입니다.
- 대규모 데이터: 다양한 문법/의미 패턴 반복 노출
- 자기지도 목표(MLM/next-token): 문맥 예측을 강제
- 표현 용량(multi-head + 깊이): 서로 다른 관계를 분업 학습
- 역전파 최적화: 예측에 유용한 관계를 점진적으로 강화
즉 모델이 문법 규칙을 "명시적으로 입력받는 것"이 아니라, 예측 성능을 높이는 과정에서 문법/의미 구조를 암묵적으로 학습하는 것입니다.
BERT로 연결: bidirectional은 어떻게 만들어지나 (축약)
핵심은 "특수 양방향 레이어"가 아니라 encoder 가시성 + MLM 학습목표 조합입니다.
- 구조: Transformer encoder stack (self-attention + FFN 반복)
- 가시성: encoder self-attention은 causal mask가 없어 좌/우 문맥을 함께 참조
- 학습목표: MLM으로 일부 토큰을 [MASK] 처리해 information leakage를 방지하고 복원 학습
GPT와 대비하면 더 명확합니다.
- GPT:
P(w_t | w_1...w_{t-1})(왼쪽 문맥) - BERT:
P(w_i | left + right context)(양쪽 문맥)
즉 BERT의 bidirectional은 아키텍처 이름이 아니라, attention 가시성과 MLM objective가 만든 학습 성질입니다.
모델 구조/구성요소 역할

- Embedding + Positional Encoding: 단어 의미 + 위치 정보 결합
- Multi-Head Self-Attention: 단어 간 관계를 여러 관점에서 병렬 계산
- Add & LayerNorm: 학습 안정화(잔차 연결 + 정규화)
- Feed Forward Network: 토큰별 비선형 변환으로 표현력 강화
- Decoder Masked Attention: 미래 토큰을 보지 못하게 마스킹
- Encoder-Decoder Attention: 디코더가 인코더 문맥을 참고
연산 과정 상세 (진짜 중요)
- 입력 토큰을 임베딩 벡터로 변환
- 위치정보 벡터를 더해 순서 정보 주입
- 각 토큰에서 Q/K/V 벡터 생성
- Q와 K의 유사도(내적) 계산
sqrt(d_k)로 스케일링 후 softmax로 가중치화- 가중치를 V에 곱해 각 토큰의 문맥 표현 생성
- 여러 head 결과를 concat 후 선형 변환
- 잔차 연결 + LayerNorm + FFN 반복
- 디코더에서는 미래 토큰 위치를 -inf로 마스킹하여 autoregressive 생성 보장
핵심 수식/기호 설명
Attention(Q,K,V)=softmax((QK^T)/sqrt(d_k))Vhead_i=Attention(QW_i^Q,KW_i^K,VW_i^V)MultiHead=Concat(head_1,...,head_h)W^O
기호: Q=질문 벡터, K=비교 기준, V=전달 정보, d_k=K 차원, h=head 수.
왜 sqrt(d_k)가 필요한가? 차원이 크면 내적값이 커져 softmax가 포화됩니다. 그러면 gradient가 약해져 학습이 불안정해지므로 스케일링이 필요합니다.
왜 하필 sqrt(d) 인가? (직관 + 통계)
attention score는 q·k (내적)입니다. 차원 d가 커질수록 더하는 항이 많아져 score 크기도 커집니다.
- 작은 차원 예: d=2이면 score가 상대적으로 작음
- 큰 차원 예: d=100이면 score가 매우 커짐
문제는 softmax에 큰 값이 들어가면 거의 one-hot처럼 됩니다. 예: [500,300,100] -> [1,0,0]. 그러면 특정 토큰만 보고 나머지를 거의 무시하게 됩니다.
그래서 score / sqrt(d)로 스케일을 줄여 softmax가 과포화되지 않게 만듭니다. 예: 500 / sqrt(100)=50.
통계적 이유: q, k의 각 성분이 평균 0, 분산 1이라면, 내적 q·k의 분산은 대략 d에 비례합니다. 즉 d가 커질수록 분산이 커져 값 스케일이 불안정해집니다. sqrt(d)로 나누면 분산이 대략 1 수준으로 정규화되어 학습이 안정해집니다.
정리: 차원 증가 -> 내적 스케일 증가 -> softmax 포화 위험이라서 sqrt(d)로 나눕니다.
4단. 비용/리스크
- Attention 계산은 길이 n에서 O(n^2): 긴 문맥에서 메모리/속도 부담
- 큰 모델일수록 서빙 비용 증가
- 추론 경로는 보여도 정답 근거가 항상 참인 것은 아님(환각 관리 필요)
5단. 실무 적용
- 중간 길이 문서 이해/생성에는 강력
- 초장문은 RAG, chunking, efficient attention과 함께 설계 권장
- 도입 시 품질뿐 아니라 latency/비용/안전 지표를 함께 모니터링
역사적 의미와 후속 영향
- BERT, GPT, T5 등 현대 LLM 계열의 공통 기반이 됨
- 모델 스케일링 시대를 열어 학습/서빙 아키텍처 전체를 바꿈
- FlashAttention, MoE, RAG 등 후속 연구의 기준점 제공
예상 질문과 답변
Q1. Transformer가 RNN보다 빠른 이유는?
A1. 토큰을 순차 처리하지 않고 병렬 처리하기 때문입니다. GPU 활용률이 올라가고 학습 시간이 줄어듭니다.
Q2. Multi-head가 필요한 이유는?
A2. 한 head는 한 종류의 관계만 보기 쉽습니다. 여러 head를 쓰면 문법/의미/거리 같은 다양한 관계를 동시에 포착할 수 있습니다.
Q3. 디코더 마스킹은 왜 중요한가?
A3. 다음 토큰 생성 시 미래 단어를 미리 보면 치팅이 됩니다. 마스킹은 학습과 추론의 일관성을 보장합니다.
Q4. Transformer의 가장 큰 실무 리스크는?
A4. 긴 입력에서 비용 급증입니다. 구조가 좋아도 서빙 예산을 넘으면 운영이 어렵습니다.
Q5. 실무에서 첫 최적화 포인트는?
A5. 정확도 튜닝 전, 입력 길이 제어와 캐시/배치 전략부터 잡는 것이 효과적입니다.