어텐션만 있으면 된다 (트랜스포머)
순환 없이 어텐션만으로 번역 모델을 만든 트랜스포머 — 스케일드 닷-프로덕트 · 멀티헤드 어텐션 · 위치 인코딩의 수식과 의미
먼저 알아야 할 것
초록
지금까지 시퀀스 변환에서 주로 쓰인 모델은 인코더-디코더 구조의 복잡한 순환 신경망이나 합성곱 신경망이었습니다. 가장 성능이 좋은 모델은 여기에 어텐션 메커니즘으로 인코더와 디코더를 잇습니다. 이 논문은 순환과 합성곱을 완전히 버리고 어텐션 메커니즘만으로 이루어진 새롭고 단순한 신경망 구조, 트랜스포머를 제안합니다. 두 기계 번역 과제에서 실험한 결과, 이 모델은 번역 품질이 더 뛰어나면서도 병렬화가 더 잘 되고 학습 시간이 크게 줄었습니다. WMT 2014 영어→독일어 번역에서 28.4 BLEU를 기록해, 앙상블을 포함한 기존 최고 결과보다 2 BLEU 넘게 앞섰습니다. WMT 2014 영어→프랑스어 번역에서는 GPU 8개로 3.5일 학습해 단일 모델 최고 기록인 41.8 BLEU를 세웠는데, 이는 기존 문헌의 최고 모델들이 쓴 학습 비용의 일부에 불과합니다. 또한 학습 데이터가 많을 때와 적을 때 모두 영어 구문 분석에 성공적으로 적용해, 트랜스포머가 다른 과제에도 잘 일반화됨을 보였습니다.
해설
어텐션만 있으면 된다 (트랜스포머)
문장을 한 단어씩 차례로 읽던 번역 모델을 버리고, 모든 단어가 서로를 한 번에 바라보는 '어텐션'만으로 번역 모델을 만든 논문입니다. 더 빨리 학습하면서 더 잘 번역했고, 지금 쓰는 거의 모든 대형 언어 모델(Claude · GPT · Gemini)의 뼈대가 되었습니다.
| 항목 | 내용 |
|---|---|
| 원제 | Attention Is All You Need |
| 저자 | Ashish Vaswani 외 7명 (Google Brain · Google Research · 토론토대) |
| 발표 | 2017 · NeurIPS · arXiv 1706.03762 |
| 트랙 · 수준 | NLP·트랜스포머 · 중급 |
| 먼저 알면 좋은 것 | 행렬 곱 · 소프트맥스, seq2seq, 바다나우 어텐션, 레이어 정규화, 잔차 연결 |
들어가기 전에
이 해설은 아래 내용을 안다고 보고 씁니다. 처음이라면 먼저 읽고 오면 수식과 손계산을 훨씬 쉽게 따라올 수 있습니다.
- 위치 인코딩: 사인파 · 학습형 · RoPE · ALiBi — 이 논문의 사인파 위치 인코딩을 숫자로 먼저 채워 보는 수업
- 트랜스포머 블록 한 층을 손으로: 멀티헤드 · 잔차 · 정규화 · FFN — 이 논문의 블록 한 층을 토큰 2개 예로 끝까지 계산하는 수업
- 어텐션 직관: 쿼리 · 키 · 값을 손으로 계산하기 — 쿼리 · 키 · 값과 softmax(QKᵀ/√d)V를 3토큰 예로 손계산하는 어텐션 기초 수업
- 정렬과 번역을 함께 학습하는 신경망 번역 (어텐션의 시작) — 번역 단어마다 원문 전체를 다시 훑는 어텐션을 신경망 번역에 처음 넣은 논문
- 레이어 정규화 — 한 예제 안의 같은 층 뉴런들로 평균·분산을 구해, 배치 크기와 무관하게 정규화하는 방법
- 잔차 학습으로 깊은 신경망 학습하기 (ResNet) — 층을 건너뛰는 지름길로 '차이만' 배우게 해 152층 망도 쉽게 학습되게 한 논문
한눈에 보기
- 왜 예전 번역 모델(RNN)은 느리고, 멀리 떨어진 단어 관계를 잘 못 배웠는지
- 어텐션 공식 가 실제로 무엇을 계산하는지 — 작은 숫자로 직접 계산해 봅니다
- 왜 로 나누는지, 왜 헤드를 여러 개 쓰는지, 순서 정보는 어떻게 넣는지
- 트랜스포머 한 층이 RNN 한 층보다 왜 빠른지
- 이 구조가 BERT · GPT · 오늘날의 LLM으로 어떻게 이어졌는지
초록 (번역)
지금까지 시퀀스 변환에서 주로 쓰인 모델은 인코더-디코더 구조의 복잡한 순환 신경망이나 합성곱 신경망이었습니다. 가장 성능이 좋은 모델은 여기에 어텐션 메커니즘으로 인코더와 디코더를 잇습니다. 이 논문은 순환과 합성곱을 완전히 버리고 어텐션 메커니즘만으로 이루어진 새롭고 단순한 신경망 구조, 트랜스포머를 제안합니다. 두 기계 번역 과제에서 실험한 결과, 이 모델은 번역 품질이 더 뛰어나면서도 병렬화가 더 잘 되고 학습 시간이 크게 줄었습니다. WMT 2014 영어→독일어 번역에서 28.4 BLEU를 기록해, 앙상블을 포함한 기존 최고 결과보다 2 BLEU 넘게 앞섰습니다. WMT 2014 영어→프랑스어 번역에서는 GPU 8개로 3.5일 학습해 단일 모델 최고 기록인 41.8 BLEU를 세웠는데, 이는 기존 문헌의 최고 모델들이 쓴 학습 비용의 일부에 불과합니다. 또한 학습 데이터가 많을 때와 적을 때 모두 영어 구문 분석에 성공적으로 적용해, 트랜스포머가 다른 과제에도 잘 일반화됨을 보였습니다.
무엇을 풀었나
예전 방식: 한 단어씩 차례로
2017년 이전 번역 모델은 대부분 RNN(순환 신경망)이나 LSTM을 쓴 seq2seq 구조였습니다. "나는 학교에 간다"를 읽을 때 '나는'을 읽고 기억을 만들고, 그 기억을 들고 '학교에'를 읽고, 다시 그 기억을 들고 '간다'를 읽는 식입니다.
비유하면 전화 돌리기 게임입니다. 첫 사람의 말이 마지막 사람에게 가려면 모든 사람을 거쳐야 합니다.
이 방식에는 두 가지 문제가 있었습니다.
- 느립니다. 번째 단어의 기억 를 만들려면 바로 앞 기억 이 먼저 있어야 합니다. 그래서 GPU가 수천 개의 계산을 동시에 할 수 있어도, 단어 순서대로 하나씩 기다려야 합니다.
- 멀리 떨어진 단어 관계를 잘 못 배웁니다. 50번째 단어가 1번째 단어를 참고하려면 정보가 49단계를 거쳐 와야 하고, 그 사이에 흐려집니다. 학습 신호(기울기)도 같은 길을 거꾸로 가야 해서 약해집니다.
이 논문의 질문
어텐션은 이미 쓰이고 있었습니다(바다나우 어텐션, 2014). 다만 RNN에 덧붙이는 장치였습니다. 이 논문은 "RNN을 아예 빼고 어텐션만 남기면 어떨까?"를 물었습니다. 그러면 모든 단어를 동시에 처리할 수 있고, 어느 두 단어든 한 번에 연결됩니다.
전체 흐름
flowchart LR
A[입력 문장 단어들] --> B[단어 임베딩 + 위치 인코딩]
B --> C[인코더 블록 x 6<br/>셀프 어텐션 → 피드포워드]
C --> D[인코더 출력<br/>문장 전체의 의미]
E[지금까지 만든 번역 단어들] --> F[임베딩 + 위치 인코딩]
F --> G[디코더 블록 x 6<br/>가린 셀프 어텐션 → 인코더-디코더 어텐션 → 피드포워드]
D --> G
G --> H[다음 단어 확률]인코더가 원문 문장 전체를 읽어 의미를 만들고, 디코더가 그 의미를 보면서 번역 단어를 하나씩 만듭니다. 학습할 때는 디코더도 모든 위치를 한 번에 계산합니다(뒤쪽 정답은 가려 둡니다).
핵심 아이디어
1. 스케일드 닷-프로덕트 어텐션 — "누구를 얼마나 참고할까"
직관. 도서관에서 책을 찾는 장면을 떠올리면 쉽습니다. 내가 찾는 주제가 질의(Query), 책 등에 붙은 분류표가 키(Key), 책 내용이 값(Value)입니다. 질의와 분류표가 잘 맞는 책일수록 그 내용을 많이 가져옵니다.
단계별로.
- 각 단어 벡터에서 세 가지를 만듭니다: 질의 , 키 , 값 . (학습되는 행렬 를 곱해서 만듭니다.)
- 지금 단어의 와 모든 단어의 를 내적합니다. 내적이 클수록 "관련이 높다"는 뜻입니다.
- 점수를 로 나눕니다(이유는 아래).
- 소프트맥스로 점수를 합이 1인 비율로 바꿉니다.
- 그 비율대로 값 들을 섞습니다. 이것이 그 단어의 새 표현입니다.
문장 전체를 행렬로 쌓으면 위 다섯 단계가 한 줄로 끝납니다.
| 기호 | 뜻 | 크기 |
|---|---|---|
| 질의를 단어 수만큼 쌓은 행렬 | ||
| 키를 쌓은 행렬 | ||
| 값을 쌓은 행렬 | ||
| 번째 단어가 번째 단어를 보는 점수표 | ||
| 질의 · 키 벡터의 차원 수 | 숫자 하나 | |
| 각 행을 합이 1인 비율로 바꾸는 함수 | — |
숫자로 해 보기 (해설용 예시, 논문 수치 아님). 단어 3개, 라고 해 봅시다.
- 키: , ,
- 값: , ,
- 1번 단어의 질의:
- 내적: , ,
- 로 나누기:
- 소프트맥스: , 이므로 합은 → 비율
- 값 섞기:
1번 단어는 자기와 키가 비슷한 1번 · 3번 단어를 많이 참고하고, 2번 단어는 적게 참고했습니다. 결과 벡터 이 "문맥을 반영한 1번 단어"입니다.
왜 로 나누나. 와 의 각 성분이 평균 0, 분산 1인 값이라면, 내적 는 개를 더한 것이라 분산이 가 됩니다. 논문 기본값 면 점수의 표준편차가 8이나 됩니다. 점수 차이가 이렇게 크면 소프트맥스가 거의 한 단어에만 1을 주고 나머지에 0을 줘서, 학습 신호(기울기)가 거의 사라집니다. 로 나누면 표준편차가 다시 1 근처로 돌아옵니다.
왜 이 방식을 골랐나. 논문은 점수를 작은 신경망으로 계산하는 '덧셈 어텐션'도 비교합니다. 내적 방식은 행렬 곱 한 번이면 끝나서 GPU에서 훨씬 빠르고 메모리도 덜 씁니다. 대신 차원이 크면 위의 쏠림 문제가 생기므로 로 나눈 것입니다.
2. 멀티헤드 어텐션 — "여러 관점으로 동시에 보기"
직관. 한 문장을 읽을 때 사람은 여러 관계를 함께 봅니다. "누가 했나(주어-동사)", "무엇을(목적어)", "그것이 가리키는 것(대명사)". 어텐션 한 번은 한 가지 관점에 치우치기 쉬워서, 관점을 여러 개(헤드) 두고 각각 따로 어텐션한 뒤 결과를 합칩니다.
단계별로.
- 를 헤드마다 다른 행렬로 작은 공간에 투영합니다.
- 헤드마다 어텐션을 따로 계산합니다.
- 결과를 이어 붙이고, 행렬 로 원래 크기로 되돌립니다.
| 기호 | 뜻 |
|---|---|
| 헤드 수 (논문 기본 모델은 8) | |
| 번째 헤드가 쓰는 투영 행렬 | |
| 이어 붙인 결과를 되돌리는 행렬 | |
| 모델 전체의 표현 차원 (기본 512) |
숫자로 보면. 기본 모델은 를 헤드 8개로 나눠, 헤드마다 차원을 씁니다. 큰 어텐션 한 번을 작은 어텐션 8번으로 쪼갠 셈이라, 전체 계산량은 비슷하면서 관점은 8개가 됩니다.
3. 인코더 · 디코더 블록 — "어텐션 + 작은 신경망, 그리고 지름길"
직관. 블록 하나는 "주변 단어를 둘러보고(어텐션) → 혼자 생각을 정리하는(피드포워드)" 두 단계입니다. 이 블록을 여러 층 쌓을수록 더 복잡한 관계를 표현합니다.
인코더 블록 (6층).
- 셀프 어텐션: 원문 단어들이 서로를 봅니다.
- 피드포워드: 단어마다 따로 같은 작은 신경망을 통과합니다.
디코더 블록 (6층).
- 가린(masked) 셀프 어텐션: 지금까지 만든 번역 단어들이 서로를 봅니다. 아직 만들지 않은 뒤쪽 단어는 못 보게 점수에 를 더합니다(소프트맥스 후 0이 됨). 시험 볼 때 답안지 뒤쪽을 가리는 것과 같습니다.
- 인코더-디코더 어텐션: 번역 단어(질의)가 원문 단어들(키 · 값)을 봅니다. "이 번역어를 만들려면 원문의 어디를 봐야 하나"입니다.
- 피드포워드.
모든 단계를 감싸는 두 장치.
- 잔차 연결(): 입력을 출력에 그대로 더하는 지름길입니다. 층이 깊어져도 정보와 기울기가 지름길로 잘 흐릅니다.
- 레이어 정규화: 값의 크기를 일정하게 맞춰 학습을 안정시킵니다.
피드포워드 신경망.
차원을 차원으로 넓혔다가(ReLU를 거쳐) 다시 로 줄입니다. 넓은 공간에서 잠깐 생각을 펼쳤다가 정리하는 단계라고 보면 됩니다.
4. 위치 인코딩 — "순서 정보를 숫자로 붙이기"
직관. 어텐션은 단어를 '봉지에 담긴 낱말들'처럼 다뤄서, 순서를 모릅니다. "개가 사람을 문다"와 "사람이 개를 문다"를 구별하지 못합니다. 그래서 단어마다 자리 번호표를 붙입니다. 번호표는 숫자 하나가 아니라, 여러 주기의 사인 · 코사인 물결로 만든 벡터입니다. 시계의 초침 · 분침 · 시침이 각자 다른 속도로 돌아서 그 조합만 보면 시각을 알 수 있는 것과 같습니다.
| 기호 | 뜻 |
|---|---|
| 단어 위치 (0, 1, 2, …) | |
| 차원 번호의 절반 (짝수 차원은 사인, 홀수 차원은 코사인) | |
| 차원마다 다른 물결의 길이. 앞 차원은 빠르게, 뒤 차원은 느리게 변함 |
숫자로 해 보기 (해설용, 로 축소). 위치 이면
- : ,
- : 분모가 이므로 ,
→ 위치 1의 번호표는 이고, 이 벡터를 단어 임베딩에 더합니다.
왜 이 방식을 골랐나. 논문은 위치마다 벡터를 학습하는 방식도 시험했는데 결과가 거의 같았다고 보고합니다. 사인 · 코사인을 고른 이유는, 학습 때보다 긴 문장에도 적용할 수 있을 것이라는 기대 때문이라고 밝힙니다. 또 고정된 거리 만큼 떨어진 위치의 번호표 를 의 선형 변환으로 나타낼 수 있어, 모델이 "몇 칸 떨어졌나"를 배우기 쉽습니다.
5. 왜 빠른가 — 층 하나의 비용 비교
| 층 종류 | 층당 계산량 | 순차로 해야 하는 연산 수 | 가장 먼 두 단어 사이 경로 |
|---|---|---|---|
| 셀프 어텐션 | |||
| 순환(RNN) | |||
| 합성곱 |
(: 문장 길이, : 표현 차원, : 합성곱 커널 크기)
읽는 법.
- 순차 연산 수: RNN은 번 차례로 기다려야 하지만, 셀프 어텐션은 한 번에 모두 계산합니다. GPU를 꽉 채워 쓸 수 있는 이유입니다.
- 경로 길이: 셀프 어텐션은 어느 두 단어든 한 번에 연결합니다. 전화 돌리기 대신 단체 대화방에 모두 들어와 있는 셈입니다.
- 계산량: 셀프 어텐션은 에 비례해, 문장이 길어지면 비싸집니다. 번역 문장은 보통 이 (512)보다 짧아서 이 논문에서는 오히려 더 쌌습니다.
6. 학습 설정 (논문 기준)
- 옵티마이저 Adam(, , )
- 학습률은 처음 4,000단계 동안 직선으로 늘렸다가, 이후 단계 수의 제곱근에 반비례해 줄입니다.
처음부터 큰 학습률을 쓰면 아직 엉성한 모델이 크게 흔들리기 때문에, 천천히 올렸다가 내리는 '워밍업'을 둡니다.
- 정규화: 드롭아웃 0.1, 라벨 스무딩 0.1 (정답에 100% 확신하지 않도록 조금 덜어 두는 기법)
- 학습 시간: 기본 모델은 P100 GPU 8개로 약 12시간, 큰 모델은 3.5일
결과
- WMT 2014 영어→독일어: 큰 모델 28.4 BLEU. 앙상블을 포함한 기존 최고보다 2 BLEU 넘게 높았습니다.
- WMT 2014 영어→프랑스어: 큰 모델 41.8 BLEU(단일 모델 최고), GPU 8개로 3.5일 학습.
- 영어 구문 분석에도 적용해, 번역 밖 과제에서도 잘 작동함을 보였습니다.
BLEU는 기계 번역이 사람 번역과 단어 조각이 얼마나 겹치는지 재는 점수로, 높을수록 좋습니다.
왜 중요한가 · 이후 영향
- 대형 언어 모델의 뼈대: BERT는 인코더만, GPT 계열은 디코더만 가져다 썼습니다. 오늘날 Claude · GPT · Gemini도 이 블록을 바탕으로 합니다.
- 규모를 키울 수 있게 됐습니다: 순차 계산이 사라져 큰 모델을 많은 데이터로 학습할 수 있게 됐고, 이것이 스케일링 법칙 연구로 이어졌습니다.
- 언어 밖으로 퍼졌습니다: 이미지(ViT) · 음성 · 단백질 구조 · 강화학습(결정 트랜스포머)까지 같은 블록을 씁니다.
한계 · 주의할 점
- 긴 문맥이 비쌉니다. 셀프 어텐션은 길이 에 대해 계산 · 메모리가 듭니다. 문서 전체나 긴 대화를 다루려면 플래시어텐션 · 희소 어텐션 · Mamba 같은 후속 연구가 필요해졌습니다.
- 순서 정보는 덧붙인 것입니다. 위치 인코딩 방식은 이후 상대 위치 · 회전 위치(RoPE) 등으로 계속 바뀌었습니다.
- 이 논문은 번역 모델입니다. 지금의 LLM은 디코더만 쓰고, 사전학습 · 지시 학습 · 정렬 단계가 더해진 것입니다. 이 논문만으로 LLM이 완성된 것은 아닙니다.
이어서 읽을 것
용어 정리
| 용어 | 쉬운 뜻 |
|---|---|
| 시퀀스 변환 | 단어 열을 다른 단어 열로 바꾸는 일 (번역 · 요약 등) |
| 인코더 · 디코더 | 입력을 읽어 의미로 바꾸는 쪽 · 그 의미로 출력을 만드는 쪽 |
| 임베딩 | 단어를 숫자 벡터로 바꾼 것 |
| 셀프 어텐션 | 같은 문장 안의 단어들끼리 서로를 참고하는 어텐션 |
| 소프트맥스 | 점수들을 0~1 사이, 합이 1인 비율로 바꾸는 함수 |
| 잔차 연결 | 입력을 출력에 그대로 더하는 지름길 |
| 레이어 정규화 | 한 층의 값 크기를 일정하게 맞추는 처리 |
| BLEU | 기계 번역 품질 점수 (높을수록 좋음) |
스스로 점검
- RNN 번역 모델이 느렸던 가장 큰 이유는? — 를 계산하려면 이 있어야 해서, 단어 순서대로 하나씩 계산해야 했기 때문입니다.
- 로 나누지 않으면 무슨 일이 생기나? — 차원이 클수록 내적 값의 분산이 커져 소프트맥스가 한 단어에 쏠리고, 기울기가 거의 0이 되어 학습이 잘 안 됩니다.
- 위치 인코딩이 없으면? — 어텐션은 단어 순서를 모르기 때문에, 같은 단어로 이루어진 다른 순서의 문장을 구별하지 못합니다.
다음에 볼 것
이 글을 이해했다면 이어서 보면 좋은 항목입니다.
- 인코더 · 디코더 · 인코더-디코더: BERT · GPT · T5와 사전학습 목표 — 이 블록을 어떻게 배치하느냐로 갈라지는 세 계열과 사전학습 목표
- 생성적 사전학습으로 언어 이해 높이기 (GPT-1) — 트랜스포머 디코더를 다음 토큰 예측으로 사전학습하고 과제별로 미세조정한 GPT의 시작
- BERT: 양방향 트랜스포머 사전학습 — 가린 언어 모델로 깊은 양방향 트랜스포머 인코더를 사전학습해 11개 과제를 휩쓴 BERT
- 플래시어텐션: 메모리를 아끼는 정확한 어텐션 — 타일링과 재계산으로 HBM 접근을 줄여 정확한 어텐션을 빠르고 메모리 적게 계산한 플래시어텐션
출처
- 원문: arxiv.org/abs/1706.03762 (2017 · Ashish Vaswani 외)
AI 원리부터 이해하기 · NLP·트랜스포머 모듈
NLP·트랜스포머 모듈 학습
이 글은 NLP·트랜스포머 모듈의 학습 자료입니다. 전체 23개 자료 중 12번째입니다.
출처·원문
원문 보기요약만