이 글은 「LLM 기초 15부작」의 4편(P4) 입니다.
앞 편: P2 — Transformer가 한 일, P3 — 딥러닝이 그냥 큰 계산인 이유
다음 편: P5 — AI Agent가 무엇인가
0. 들어가기 전에
P2에서 “책 한 페이지를 펼쳐놓고 형광펜 긋기” 라는 비유로 attention 의 감각만 잡았었죠. P3에서는 딥러닝이 그냥 아주 큰 계산 덩어리라는 얘기를 했고요. 이번 편은 그 둘을 이어서, 진짜로 그 유명한 논문을 한 번 펼쳐보는 것 입니다.
논문 제목은 “Attention Is All You Need”. 2017년에 Google Brain 팀이 낸 8페이지짜리 짧은 논문이에요. 이게 지금 우리가 쓰는 ChatGPT, Claude, Gemini 안에서 돌아가는 거의 모든 구조의 뿌리입니다. Codex 가 코드를 짜주는 그 계산, Claude 가 긴 문서를 요약해 주는 그 구조, 전부 이 논문 한 장에서 갈라져 나온 거예요.
그래서 저는 이 논문을 “한 번쯤은 끝까지 읽어봤다” 는 감각이 있으면 실무에서 프롬프트를 짜거나 도구를 고를 때 흔들림이 확 줄어든다고 생각합니다. 그 감각을 같이 만들어보려고 해요.
수식은 딱 하나 만 제대로 볼 겁니다. 비유는 P2에서 쓰던 도서관·형광펜을 계속 깊게 파고요. 논문의 모든 페이지를 따라가진 않습니다. 읽고 나서 원문을 열었을 때 그림 한 장이 읽히는 수준 까지 끌고 가는 게 이 글의 목표예요.
미리 말씀드릴 게 하나 있어요. 이 글은 “머신러닝 전공자용 해설” 이 아니라 “Claude·Codex 를 일 도구로 쓰는 실무자용 입문” 입니다. 저도 처음에 논문을 열어봤을 때 수식 몇 줄 보다가 덮었던 사람이라, 그때 제가 가장 듣고 싶었던 설명을 지금 쓰고 있어요. 그러니까 수식이 많이 나올까 걱정 안 하셔도 됩니다. 나오는 수식 한 줄은 대신 제대로 풀어드릴게요.
1. “Attention Is All You Need” 라는 논문 이름이 왜 이상하게 들리는가
처음 이 제목 보시면 좀 이상하지 않나요. 저는 2019년쯤에 처음 봤을 때 “Attention 이 All You Need 라니, 뭐 이런 제목을 다는 거지” 싶었어요. 마치 자기계발서 같잖아요. “사랑이 전부다” 같은 문장이랑 비슷한 느낌이고.
그런데 이 제목은 당시 학계에 대한 도발 에 가깝습니다. 2017년 이전의 언어 모델은 거의 전부 RNN (Recurrent Neural Network) 이나 LSTM 이라는 구조를 썼어요. 단어를 왼쪽부터 오른쪽으로 한 개씩 순서대로 읽어가면서, 앞에서 본 걸 기억하려고 애쓰는 구조였죠. CNN (Convolutional Neural Network) 을 언어에 갖다 붙이려는 시도도 있었고요.
이런 구조는 문제가 있었습니다. 첫째, 순서대로 처리해야 하니까 병렬화가 안 됩니다. GPU 에 다 몰아넣어도 “2번째 단어는 1번째가 끝나야 처리되는” 한계 때문에 속도가 안 나요. 둘째, 문장이 길어질수록 앞부분 기억이 희미해집니다. LSTM 으로 어느 정도 해결했지만 완전하진 않았고요.
논문 저자들은 이 두 문제를 동시에 깨버리려고 했어요. 그래서 RNN 을 완전히 빼버리고, CNN 도 빼버리고, 오직 attention 메커니즘 하나로만 모델을 짰습니다. “Attention 만 있으면 된다, 나머진 다 필요 없다” 는 주장을 제목으로 박아버린 거예요.
이게 먹혔습니다. 번역 성능이 올라갔고, 학습 속도가 말도 안 되게 빨라졌고, 몇 년 뒤 BERT·GPT 시리즈로 이어지면서 NLP 판이 완전히 바뀌었습니다. 지금 LLM 세대가 전부 이 논문 위에 지어진 이유예요.
즉 제목은 자기계발서 흉내가 아니라 “이것 하나로 다른 거 다 대체한다” 라는 선언이었던 겁니다. 그런 맥락을 알고 보면 제목이 덜 낯설게 느껴지실 거예요.
참고로 논문 제목을 지은 사람이 누구인지는 저자들 사이에서도 약간 농담처럼 전해져요. Llion Jones 라는 저자가 Beatles 의 “All You Need Is Love” 에서 따왔다는 얘기가 인터뷰에 나옵니다. 학술 논문 제목에 팝송을 끌어다 쓰는 건 흔한 일은 아니에요. 그만큼 자신 있었다는 뜻이기도 하고, 결과적으로 제목 덕분에 논문이 더 많이 입에 오르내린 것도 사실이에요. 기술 자체의 힘이 제일 컸지만, 마케팅의 힘도 은근히 있었던 셈입니다.
2. Attention 한 문장 요약
자, 그럼 attention 이 대체 뭘 하는 거냐. 저는 이걸 이 한 문장으로 정리합니다.
지금 보고 있는 단어가, 같은 문장 안의 다른 단어들 중에서 누구를 얼마나 참고해야 하는지 점수로 매기는 것.
예를 들어 “그 고양이는 배가 고파서 밥그릇 앞에서 울었다” 라는 문장에서, 모델이 지금 “울었다” 라는 단어를 처리하고 있다고 해봅시다. 이 단어를 이해하려면 누가 가장 중요할까요.
- “고양이” → 엄청 중요합니다. 누가 울었는지 알려주니까요.
- “배가 고파서” → 중요합니다. 왜 울었는지 설명하니까요.
- “밥그릇” → 보조적으로 중요합니다. 상황을 그려주니까요.
- “그” “앞에서” → 거의 안 중요합니다. 문법 요소니까요.
사람이라면 이걸 자연스럽게 하죠. “울었다” 를 보면서 머릿속에서 “고양이” 로 손이 가요. attention 은 이 작업을 숫자로 구현 한 겁니다. “울었다” 를 처리할 때 각 단어에 0~1 사이 점수를 매겨서, 그 점수 비율대로 다른 단어 정보를 섞어 오는 거죠.
그게 전부예요. 이 아이디어 하나를 잘 설계한 것이 논문의 핵심입니다.
한 가지 더 짚고 갈게요. Attention 은 “한 단어” 에서 끝나지 않습니다. 문장 안의 모든 단어가 동시에 이 작업을 합니다. “그” 를 처리할 때도 “그” 의 눈으로 다른 단어들에 점수를 매기고, “고양이” 를 처리할 때는 “고양이” 의 눈으로 또 점수를 매기고요. 모든 단어가 모든 단어에 대해 “너는 나한테 얼마나 중요해?” 를 동시에 묻는 거예요. 그래서 한 층만 통과해도 문장 전체의 관계망이 한 번에 갱신됩니다. RNN 처럼 순서대로 기다릴 필요가 없다는 말이 이걸 의미해요.
3. Query / Key / Value — 도서관 비유로 완전히 잡기
| 성분 | 도서관 비유 | attention에서의 의미 |
|---|---|---|
| Query (Q) | “나 이런 책 찾아요” | 현재 단어가 어떤 정보를 원하는지 |
| Key (K) | 책 표지의 라벨 | 다른 단어들이 어떤 정보를 가졌는지의 라벨 |
| Value (V) | 책 안의 실제 내용 | 다른 단어들의 실제 표현값 (섞어서 가져옴) |
여기서부터 유명한 Q·K·V 세 글자가 등장합니다. 처음 보는 분들은 “왜 갑자기 세 글자가 나오지, 뭐 하나만 있으면 되는 거 아닌가” 싶을 수 있어요. 저도 그랬습니다.
P2 에서 썼던 도서관 비유를 이어서 더 깊이 파볼게요.
도서관 장면
당신이 도서관에 들어갔습니다. “고양이가 왜 우는지 알고 싶다” 는 질문을 품고 있어요. 책은 수천 권이 있고요. 그런데 이 도서관은 좀 특이해요. 모든 책 내용을 읽을 필요 없이, 책 등에 붙어있는 태그 만 보고 어느 책을 펼칠지 고를 수 있게 되어 있어요. 이제 어떻게 할지 봅시다.
- 당신의 질문 →
Q (Query)입니다. “고양이 울음에 대해 알고 싶다.” - 책 등에 붙은 태그 →
K (Key)입니다. 각 책에 “동물행동학”, “고양이 돌보기”, “요리책”, “수학책” 같은 태그가 붙어 있어요. - 책의 실제 내용 →
V (Value)입니다. 책을 펼쳤을 때 안에 적혀 있는 글.
자, 이제 당신이 할 일은 이겁니다. Q 와 K 를 비교 해서, 질문에 맞는 책을 고릅니다. 그리고 선택된 책들의 V (내용) 를 읽고 정보를 합칩니다.
Attention 이 딱 이 구조예요.
- 지금 처리 중인 단어 (예: “울었다”) 가 도서관에 들어간 당신입니다. 이 단어의 Query 벡터
Q가 나옵니다. - 같은 문장의 다른 단어들 (예: “고양이”, “배가”, “고파서”…) 각각은 책입니다. 각 단어마다 Key 벡터
K와 Value 벡터V가 있어요. - 모델은
Q와 각 단어의K를 비교해서 유사도 점수 를 냅니다. “고양이” 의 K 와 Q 가 비슷하면 점수가 높고, “그” 의 K 와 Q 는 점수가 낮고요. - 그 점수대로 각 단어의
V를 섞어서 “울었다” 의 새로운 표현을 만듭니다.
유사도를 어떻게 숫자로?
벡터 두 개의 “비슷한 정도” 를 측정하는 가장 간단한 방법이 내적 (dot product) 입니다. 두 벡터를 곱해서 더하는 거예요.
- 두 벡터가 같은 방향이면 내적이 큼 → 점수 높음
- 두 벡터가 직각이면 내적이 0 → 점수 없음
- 두 벡터가 반대 방향이면 내적이 음수 → 점수 낮음
Q 와 K 가 “같은 쪽을 가리키고 있다” 는 건 “이 Query 가 묻고 있는 개념이, 이 Key 가 대표하는 개념과 겹친다” 라는 뜻이에요. 그래서 내적이 유사도로 자연스럽게 쓰이는 거죠.
중요한 건, Q·K·V 는 원래 하나의 단어 임베딩에서 나옵니다. 각 단어는 처음에 벡터 하나로 표현돼요. 거기에 세 개의 서로 다른 가중치 행렬 W_Q, W_K, W_V 를 곱해서 Q·K·V 로 분리합니다. 같은 단어를 “질문하는 쪽”, “태그를 붙이는 쪽”, “내용을 들고 있는 쪽” 세 역할로 분리하는 거예요.
이 세 역할 분리가 왜 중요한지는 조금만 생각해 보시면 됩니다. “울었다” 를 처리할 때 이 단어는 “Q 로서는 원인을 묻는 역할” 이지만, 다른 단어가 “울었다” 를 참고할 때는 “K 와 V 로서 대답하는 역할” 이 되잖아요. 같은 단어가 맥락에 따라 묻는 사람이 되기도, 답하는 책이 되기도 해야 해요. Q·K·V 분리는 그 유연성을 주는 장치입니다.
한 번 더 감각을 다져볼게요. K 와 V 를 왜 따로 두는지 가 처음엔 애매하실 수 있어요. “K 가 비슷하면 그 단어 자체를 가져오면 되잖아, V 를 왜 따로 만들어?” 라는 의문이죠. 도서관 비유를 끝까지 밀어붙이면 이렇습니다. 책 등에 붙은 태그 (K) 는 “이 책이 어떤 주제인지 요약한 키워드” 예요. 반면 책 안의 본문 (V) 은 실제로 당신이 읽고 싶은 글이고요. 태그와 본문은 다른 거잖아요. 태그만 보고 골라서 본문을 읽는 게 검색이에요. Attention 도 똑같아요. “이 단어가 참고될 자격이 있는지 (K)” 랑 “이 단어가 실제로 전달할 정보 (V)” 는 분리하는 게 자연스럽고, 모델이 학습 중에 두 역할을 각자 최적화할 수 있게 해주는 거예요.
실제로 학습이 끝난 모델을 뜯어보면 K 와 V 의 벡터가 명확하게 다른 분포를 이루는 걸 볼 수 있어요. K 는 “검색되기 쉬운 형태”, V 는 “꺼내 쓰기 좋은 형태” 로 각자 수렴한다고 알려져 있습니다.
4. 수식 딱 하나만 — Scaled Dot-Product Attention
여기서 논문의 핵심 수식이 나옵니다. 딱 한 줄이에요.
Attention(Q, K, V) = softmax(Q·K^T / √d_k) · V
처음 보면 약간 배신감 들 수 있어요. “이게 끝이야?” 싶을 정도로 짧거든요. 그런데 이 한 줄 안에 지금까지 얘기한 게 다 들어가 있습니다. 한 글자씩 풀어볼게요.
Q·K^T — 모든 Query 가 모든 Key 에게 묻는다
Q 는 질문들을 행으로 쌓은 행렬이에요. 문장 안의 모든 단어가 각자 Query 를 갖고 있으니까, N x d_k 크기 (N = 단어 수, d_k = Query 차원) 의 행렬이죠.
K^T 는 Key 들을 열로 세운 행렬. d_k x N 크기.
둘을 곱하면 N x N 크기의 행렬이 나옵니다. 이 행렬의 (i, j) 칸에는 i번째 단어의 Q 와 j번째 단어의 K 의 내적 이 들어가요. 즉, “i번째 단어가 j번째 단어에 얼마나 주목해야 하는지” 점수표가 한 번에 나오는 거예요.
도서관 비유로 돌아가면, 모든 독자가 모든 책을 한 번에 훑어서 “이 독자는 이 책이랑 얼마나 관련 있는지” 를 표로 만드는 셈입니다.
/ √d_k — 왜 루트로 나누나
이 부분이 수식에서 제일 “굳이 왜?” 싶은 부분이에요. 그냥 점수만 뽑으면 될 텐데 왜 √d_k 로 나누지?
이유는 벡터 차원이 커지면 내적 값이 너무 커지기 때문 이에요.
감각적으로 설명하면 이래요. 내적은 각 성분끼리 곱해서 더하는 거잖아요. 성분이 1개인 벡터 두 개를 내적하면 숫자 하나가 나와요. 성분이 100개인 벡터 두 개를 내적하면 숫자 100개를 더한 값이 나오죠. 차원이 커질수록 값이 자연스럽게 커집니다.
값이 너무 커지면 뒤에 나오는 softmax 에서 문제가 생겨요. softmax 는 지수함수를 쓰는데, 큰 값이 들어오면 한 곳에 확률이 0.99999 로 쏠려버립니다. 나머지는 거의 0 이 되고요. 그러면 gradient (학습 신호) 가 거의 0 이 돼서 학습이 안 됩니다.
√d_k 로 나눠주면 값의 크기가 차원에 상관없이 비슷한 범위에 머물러요. softmax 가 건강하게 동작합니다. 이 작은 장치 하나가 학습 안정성을 크게 끌어올려서, 논문에서도 일부러 “scaled” 를 이름에 박아 넣었어요.
softmax(...) — 점수를 확률로 바꾼다
이건 다음 섹션에서 따로 다룰게요.
· V — 확률 비율대로 Value 를 섞는다
softmax 를 통과한 값은 0~1 사이의 비율 입니다. 각 단어에 “몇 % 주목할지” 가 정해진 상태예요.
이제 그 비율을 각 단어의 Value 에 곱해서 더합니다. “고양이” 에 0.6, “배” 에 0.3, 나머지에 0.1 이 할당됐다면, 0.6 × V_고양이 + 0.3 × V_배 + 0.1 × V_나머지 가 최종 출력이에요.
이게 “울었다” 의 새로운 표현이 됩니다. 원래는 그냥 “울었다” 라는 단어 하나였는데, 이제는 “고양이가 주어이고 배가 원인인 울음” 이라는 문맥이 녹아든 벡터로 업데이트된 거예요.
이 업데이트가 문장 안 모든 단어에 대해 동시에 일어납니다. 한 번의 행렬 곱셈으로요. RNN 처럼 순서대로 기다릴 필요가 없어요. 이게 병렬화의 비밀입니다.
구체적인 예시로 한 번 만 더 감을 잡아볼게요. “그 고양이는 배가 고파서 울었다” 라는 8-토큰 문장을 생각해보세요. QK^T 를 계산하면 8×8 점수표가 나옵니다. “울었다” 라는 행을 보면, 8개의 칸에 점수가 있어요. softmax 를 통과하면 예를 들어 이런 비율이 될 수 있어요. [그:0.02, 고양이:0.55, 는:0.02, 배가:0.18, 고파서:0.18, 울:0.02, 었:0.02, 다:0.01]. 이 비율대로 8개 토큰의 Value 벡터를 가중 평균하면, “울었다” 의 새 표현이 나옵니다. “고양이가 주어이고 배고픔이 원인인 상태의 울음” 이라는 의미가 한 벡터 안에 압축되는 거예요. 다음 층에서 또 한 번 이 작업이 반복되면서 의미가 점점 풍부해집니다.
수식을 거꾸로 한 번만 더 읊어볼게요. “문장 전체의 Q 와 K 를 한 번에 곱해서 점수표를 만들고 (QK^T), 점수표를 안정화시키고 (/√d_k), 점수를 비율로 바꾸고 (softmax), 그 비율대로 Value 를 섞는다 (·V).” 이 네 단계예요. 한 단어 한 단어 처리하는 게 아니라, 문장 전체를 행렬 하나로 놓고 한 번에 계산합니다. 이 점을 기억하시면 GPU 가 왜 Transformer 와 궁합이 잘 맞는지 자연스럽게 이해가 됩니다. GPU 는 행렬 곱셈을 병렬로 쏟아붓는 데 특화된 하드웨어잖아요. Transformer 가 하는 일은 “큰 행렬 곱 몇 번” 이 거의 전부라서, GPU 를 100% 쓸 수 있어요.
5. Softmax 가 하는 일
softmax 는 attention 에서 두 번째로 중요한 부품이에요. 수식만 보면 이래요.
softmax(x_i) = exp(x_i) / Σ exp(x_j)
이걸 말로 풀면 “점수표를 나눠 먹기 좋게 % 비율로 변환” 하는 겁니다.
점수가 [3, 1, 0, -1] 같이 나왔다고 해봐요. 이건 그냥 크고 작은 숫자들이지 “비율” 이 아니에요. 그대로 쓰기 어렵습니다. softmax 에 넣으면 대략 [0.84, 0.11, 0.04, 0.01] 같은 값이 나와요. 이제 모든 값이 0~1 사이이고, 다 더하면 1 이 됩니다.
왜 이게 중요하냐면 “다른 단어들에 대한 주목 비율” 은 원래 확률의 형태여야 말이 되기 때문이에요. 0.6, 0.3, 0.1 처럼 각 대상에 얼마나 자원을 배분할지 정하는 비율이어야 하고, 다 합치면 100% 가 돼야 하거든요.
그리고 softmax 는 큰 값을 더 크게, 작은 값을 더 작게 만드는 성질이 있어요. 지수함수 때문에 그래요. 원본 점수에서 3과 1의 차이는 2배였는데, softmax 를 통과하면 0.84 와 0.11 로 약 7.6배 차이가 됩니다. 이 “강조 효과” 때문에 모델이 “정말 중요한 단어에 확실히 집중하고 나머지는 거의 무시” 하는 결정을 할 수 있는 거예요.
애매한 점수가 들어가면 softmax 도 애매한 비율을 뱉고, 확실한 점수가 들어가면 확실한 비율을 뱉습니다. 모델이 단어 간 관계를 “강하게 확신할지, 분산해서 볼지” 를 softmax 의 입력 규모를 조절하는 걸로 제어하는 거예요. 아까 √d_k 로 나누는 이유가 여기랑 연결돼요. 규모 조절이 없으면 모델이 항상 너무 확신해버려서 학습이 망가집니다.
여기에 한 가지 더 재미있는 성질이 있어요. softmax 에는 “temperature” 라는 개념이 있는데, 분자의 지수함수 입력을 온도값 T 로 나누는 조작이에요. T 가 작으면 (예: 0.1) softmax 가 뾰족해져서 한 곳에 확률이 확 몰리고, T 가 크면 (예: 5) 납작해져서 확률이 고르게 퍼져요. ChatGPT 에서 “창의성 조절” 할 때 나오는 temperature 파라미터가 정확히 이거예요. 다음 토큰 예측의 마지막 softmax 를 얼마나 뾰족하게 할지를 결정하는 거죠. 낮은 temperature = 보수적·반복적, 높은 temperature = 다양·변덕스러움. 이 개념이 attention 내부의 softmax 랑 정확히 같은 원리 로 작동한다는 걸 아시면, 나중에 API 설정을 만질 때 감이 훨씬 좋아져요.
6. Multi-Head Attention — 여러 편집자가 동시에 형광펜 긋기
여기서 P2 에서 쓴 형광펜 비유를 확장할 거예요.
책 한 페이지가 있다고 해보죠. 한 사람이 형광펜으로 중요한 부분에 밑줄을 긋는다고 치면, 그 사람의 기준 하나로만 그어져요. 어떤 사람은 문법에 주목할 거고, 어떤 사람은 감정 단어에 주목할 거고, 어떤 사람은 고유명사에 주목하겠죠.
편집자 여러 명을 동시에 부르면 어떨까요. 각자 다른 색 형광펜을 들고, 같은 페이지를 동시에 훑습니다. 한 명은 파랑으로 주어-동사 관계를, 한 명은 빨강으로 부정 표현을, 한 명은 초록으로 시간 표현을 긋는 거예요. 다 끝나면 페이지에는 여러 색의 밑줄이 겹쳐서 입체적인 해석이 나옵니다.
이게 Multi-Head Attention 이에요. 논문에서는 head 8개를 썼습니다.
구체적으로 어떻게 나누나
앞서 본 attention 은 Q·K·V 를 각각 한 세트씩 썼잖아요. Multi-head 는 이걸 8세트로 쪼갭니다.
원래 차원이 d_model = 512 였다면, 이걸 64차원씩 8개 로 분할해요. 각 head 는 자기만의 W_Q, W_K, W_V 를 갖고 독립적으로 attention 을 계산합니다. 끝나면 8개의 결과를 이어붙여서 (concatenate) 다시 512 차원 벡터를 만들고, 마지막 가중치 W_O 로 섞어줘요.
각 head 가 “다른 종류의 관계” 를 담당하게 학습이 자연스럽게 유도되는 게 묘한 지점이에요. 명시적으로 “너는 문법, 너는 감정” 이라고 지시한 적 없는데, 학습이 끝나면 각 head 가 실제로 다른 역할을 맡아요. 이걸 시각화한 유명한 그림들이 있습니다 (Jay Alammar 의 “Illustrated Transformer” 블로그에 예쁘게 나와 있어요).
왜 그냥 하나 큰 걸로 안 하나
“64차원 8개 = 512차원이니까 그냥 512차원 head 하나 쓰면 되잖아” 라는 의문이 자연스러워요.
수학적으로는 표현력 자체는 비슷합니다. 하지만 실제로는 쪼개는 게 학습이 더 잘 돼요. 이유를 감각적으로 말하면, 하나의 큰 head 는 “한 가지 관점으로 모든 관계를 설명” 하려고 하게 됩니다. 여러 작은 head 로 쪼개면 각자가 “좁은 관점 하나씩” 을 맡게 되고, 서로 다른 관점이 강제로 분화 돼요.
요리로 비유하면 한 명이 5인분 요리를 혼자 다 하는 것과, 5명이 각자 한 인분씩 맡는 것의 차이 같은 거예요. 후자가 맛의 편차는 있어도 각 접시는 집중도가 높아져요. 조직의 분업이랑 똑같은 원리입니다.
또 하나의 효과가 있어요. 쪼개면 계산 비용이 안 늘어나거든요. 64차원 head 8개의 계산량은 512차원 head 1개와 거의 비슷해요. 같은 예산으로 “한 관점 깊게” 대신 “여러 관점 각각” 을 고를 수 있다는 거죠. 이건 단순히 표현력 문제가 아니라 계산 대비 효용 의 문제예요. 공짜로 얻는 다양성이라고 보시면 됩니다.
이 Multi-head 구조가 없었으면 Transformer 가 실제로 이렇게 잘 동작했을까 싶을 정도로 핵심적인 장치입니다. 이후에 나온 거의 모든 Transformer 변형 (GPT, BERT, T5, Claude 계열) 이 이 multi-head 구조를 그대로 유지하는 이유도 여기 있어요.
7. Positional Encoding — 왜 sin/cos 인가
Transformer 의 큰 구멍이 하나 있어요. Attention 자체는 순서 정보가 없습니다.
RNN 은 단어를 순서대로 읽었으니까 순서가 자동으로 들어왔어요. 그런데 Transformer 는 모든 단어를 한 번에 처리하잖아요. “고양이가 밥을 먹었다” 랑 “밥이 고양이를 먹었다” 가 attention 입장에서는 구분이 안 됩니다. 단어 집합이 같으면 어텐션 점수도 같거든요.
그래서 각 자리마다 고유한 패턴 을 단어 임베딩에 더해줘요. 1번째 자리는 이런 신호, 2번째 자리는 이런 신호, 식으로요. 이걸 Positional Encoding 이라고 합니다.
논문 저자들은 이 신호를 sin 과 cos 로 만들었어요.
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
수식만 보면 굉장히 인위적인데, 이유가 예쁜 게 있습니다.
왜 sin/cos 이 좋은가
첫째, 위치가 달라지면 값이 달라집니다. pos 가 1일 때와 2일 때 sin/cos 값이 다르니까 모델이 “1번과 2번은 다른 자리” 라는 걸 구분할 수 있어요.
둘째 — 이게 핵심인데 — 상대 거리 계산이 자동으로 됩니다. sin/cos 의 수학적 성질 때문에 그래요.
감각적으로 풀어볼게요. 두 자리 pos_1 과 pos_2 가 있다고 해봐요. 이 둘의 PE 벡터를 비교했을 때, 거리가 1 인 관계 (예: 1번-2번) 와 거리가 10 인 관계 (예: 1번-11번) 는 서로 다른 형태의 차이를 보여요. 그리고 거리가 같으면 — 1번-2번이든 5번-6번이든 — 같은 형태의 차이 가 나옵니다.
즉 모델이 “이 두 단어가 몇 칸 떨어져 있는지” 를 두 PE 의 관계만으로 자연스럽게 배울 수 있어요. 단순히 “이 단어는 3번 자리” 라는 절대 위치만이 아니라, “이 단어는 저 단어로부터 3칸 떨어진 곳” 이라는 상대 위치까지 다룰 수 있는 거죠.
셋째, 학습에 없던 위치도 어느 정도 처리됩니다. 훈련 때 100단어짜리 문장만 봤어도 sin/cos 는 100번째 너머 자리도 수학적으로 정의되거든요. 완벽하진 않지만, 학습된 embedding 을 쓰는 것보다는 유연해요.
지금 나오는 최신 모델들은 sin/cos 대신 RoPE (Rotary Position Embedding) 같은 변형을 많이 쓰지만, 기본 아이디어 — “자리마다 고유 패턴을 주고, 그 패턴에 상대 거리 정보가 녹아있게 한다” — 는 이 논문에서 출발한 그대로입니다.
Positional encoding 이 중요한 이유는 실무에서도 드러나요. 예를 들어 Claude 나 GPT 에 긴 문서를 넣었을 때 “중간 부분이 잘 안 잡힌다” 는 현상 (Lost in the Middle 이라고 부릅니다) 이 관찰되는데, 이건 부분적으로 위치 정보가 긴 거리에서 희미해지기 때문이에요. 최신 모델들이 100만 토큰 컨텍스트를 지원하는 흐름 속에서도 위치 인코딩을 어떻게 설계할 것인가 가 계속 연구되는 이유가 여기 있습니다. 이 주제는 나중에 M1 (Retrieval Layer) 편에서도 다시 나와요.
8. Feed-Forward Network — 각 자리에서 혼자 하는 생각 정리
Attention 으로 문장 안 다른 단어들의 정보를 한 바퀴 섞고 나면, 각 단어는 “맥락이 녹아든 벡터” 가 돼요. 그 다음 단계가 Feed-Forward Network (FFN) 입니다.
구조는 단순해요. 두 개 층의 완전연결 신경망 (fully-connected) 에 ReLU 같은 활성화 함수가 사이에 끼어 있어요. 각 단어의 벡터가 이 FFN 을 통과하면서 한 번 더 가공 됩니다.
재밌는 포인트는 이 FFN 이 position-wise 라는 거예요. 이게 뭐냐면 각 자리마다 똑같은 FFN 이 독립적으로 적용된다 는 뜻이에요. 1번째 단어 벡터, 2번째 단어 벡터, 3번째 단어 벡터가 각각 같은 FFN 을 따로따로 통과합니다. 자리들끼리 섞이지 않아요.
자리들 섞는 일은 방금 attention 이 했으니까요. FFN 은 “이제 네 자리에서 받은 정보를 혼자 정리해” 라는 역할입니다.
카페로 비유하면 이래요. 회의에서 아이디어를 교환 (attention) 한 다음, 각자 자기 자리로 돌아가서 혼자 노트 정리 (FFN) 하는 거예요. 교환 단계와 정리 단계가 교대로 반복되는 게 Transformer 블록의 기본 패턴입니다.
Layer Normalization 이 왜 필요한가
각 블록 안에는 Layer Norm 이라는 게 끼어 있어요. 수식은 복잡해 보이지만 역할은 간단합니다. 벡터 안 값들의 평균과 분산을 정규화 하는 거예요.
학습을 오래 돌리면 벡터 값들이 들쑥날쑥 튀기 시작해요. 어떤 차원은 값이 엄청 크고, 어떤 차원은 엄청 작고. 이게 심해지면 gradient 가 폭발하거나 사라져서 학습이 망가집니다. Layer Norm 은 매번 값을 “평균 0, 분산 1 정도의 예쁜 범위” 로 끌어당겨 놓는 안전장치예요.
Deep learning 에 “Normalization” 붙은 기법이 많은 이유도 여기 있습니다. 깊은 네트워크에서 값이 폭주하지 않게 하는 게 학습 안정성의 큰 숙제거든요.
FFN 이 실제로 모델의 “지식 저장소” 역할을 한다는 연구도 있어요. Attention 은 단어들 사이의 관계를 그리는 장치고, FFN 은 “이 단어가 어떤 개념과 연결되는지” 를 가중치에 저장하는 장치라는 해석이에요. 예를 들어 “파리” 라는 단어가 들어오면 특정 FFN 의 뉴런이 “프랑스의 수도” 라는 관련 개념을 활성화시키는 식이죠. Transformer 블록이 “관계 그리기 (attention) → 의미 꺼내 쓰기 (FFN)” 를 교대로 반복하는 구조라고 생각하시면, 왜 이 둘이 한 세트로 반복되는지가 자연스럽게 이해됩니다.
9. Residual Connection — “망가져도 원본은 남긴다”
Transformer 블록에는 Attention 과 FFN 말고 하나 더 숨어 있는 구조가 있어요. Residual Connection 입니다. 식으로 쓰면 이래요.
출력 = x + F(x)
x 는 입력이고, F(x) 는 attention 이나 FFN 같은 변환이에요. 변환 결과만 쓰는 게 아니라, 원본 x 를 그대로 더해줍니다.
왜 이게 중요하냐면 네트워크가 깊어질 때 학습이 안 되는 문제 를 해결해 주거든요. 층이 많아지면 gradient 가 앞쪽까지 거의 도달하지 못해서 앞쪽 층이 학습이 안 됐어요. 이걸 “vanishing gradient” 라고 부릅니다.
Residual 을 넣으면 gradient 가 변환을 건너뛰어서 원본 경로로 바로 전달 돼요. 고속도로 옆에 비상 차선 하나 놓은 거랑 비슷해요. 본선이 막혀도 비상 차선으로 정보가 흐르니까 앞쪽까지 신호가 가요.
또 하나 좋은 점은 각 블록이 “잘못 배워도 최소한 원본은 남긴다” 는 거예요. F(x) 가 이상한 값을 뱉어도 원본 x 가 더해지니까, 최악의 경우에도 입력을 그대로 보존합니다. 모델이 각 블록에서 “필요하면 뭔가 바꾸고, 아니면 그냥 놔둬” 라는 선택을 할 수 있게 되는 거죠.
이 세 부품 — Attention, FFN, Residual+LayerNorm — 이 한 세트로 Transformer 블록을 이룹니다. 논문에서는 이걸 encoder 6층, decoder 6층으로 쌓았어요.
참고로 Residual 은 원래 비전 쪽 ResNet (2015) 에서 먼저 제안된 구조예요. 이미지 분류에서 층을 100층 넘게 쌓으면 학습이 망가지는 문제를 해결한 논문이었고, Transformer 는 이 아이디어를 그대로 가져와서 언어 모델에 적용했어요. 좋은 부품이 다른 분야에서 발견되면 바로 가져와서 쓰는 게 딥러닝의 전통인데, Residual 이 그 대표 사례 중 하나입니다.
10. Transformer 블록 전체 그림 — 이제 논문 그림이 읽힌다
논문의 유명한 Figure 1. 왼쪽에 encoder, 오른쪽에 decoder 가 그려진 그 그림. 처음 보면 화살표가 많아서 어지러운데, 지금까지 얘기한 부품을 갖고 한 번에 해석해 볼게요.
Encoder (왼쪽 6층)
입력 문장이 왼쪽 아래로 들어갑니다.
- Input Embedding + Positional Encoding — 각 단어가 벡터로 변환되고, 자리 패턴이 더해집니다.
- Multi-Head Self-Attention — 각 단어가 같은 문장 안 다른 단어들을 참조해서 업데이트됩니다. “Self” 인 이유는 Q·K·V 가 전부 같은 문장에서 나오기 때문이에요.
- Add & Norm — Residual + Layer Norm.
- Feed Forward — 각 자리에서 혼자 정리.
- Add & Norm — 또 Residual + Layer Norm.
- 여기까지가 1층. 이걸 6번 반복.
6층 위로 올라갈수록 각 단어 벡터는 점점 더 고급 맥락 정보가 녹아든 상태 가 돼요. 1층은 주어-동사 같은 기본 관계, 위쪽 층은 긴 문장의 주제·톤 같은 추상 관계를 잡는 경향이 실험적으로 관찰됩니다.
Decoder (오른쪽 6층)
출력 문장이 오른쪽 아래로 들어갑니다. 번역 모델이니까 “지금까지 생성한 번역문” 이에요.
- Output Embedding + Positional Encoding — encoder 와 똑같이.
- Masked Multi-Head Self-Attention — 여기서 “masked” 가 중요해요. decoder 는 왼쪽부터 하나씩 단어를 만들어 가는데, 아직 안 만든 오른쪽 단어를 미리 볼 수 없잖아요. 그래서 attention 점수표에서 미래 자리를 마스킹 (가려서) 0 으로 만듭니다. “미래 단어를 훔쳐보지 못하게” 하는 장치예요.
- Add & Norm.
- Cross-Attention (Encoder-Decoder Attention) — 여기가 포인트. Q 는 decoder 에서 나오고, K·V 는 encoder 의 최종 출력에서 옵니다. 지금 만들고 있는 번역 단어가 원문 어디를 참조할지 를 결정하는 거예요. 번역 모델의 핵심 연결부입니다.
- Add & Norm.
- Feed Forward + Add & Norm.
- 6번 반복.
- 마지막에 Linear + Softmax 로 다음 단어 확률 분포.
여기까지 보시면 그림이 “아, 그냥 encoder 블록이랑 decoder 블록을 쌓고, decoder 에 cross-attention 만 추가한 거구나” 라고 읽히실 거예요.
지금 쓰시는 GPT 계열 모델은 이 중 decoder 부분만 쓰고 있어요. 인코더는 없어요. Cross-attention 도 없고요. 대신 masked self-attention 을 쌓아서 “지금까지 쓴 문장 → 다음 단어 예측” 만 반복하죠. BERT 같은 모델은 반대로 encoder 부분만 쓰고요. Transformer 는 encoder·decoder 두 축을 다 제시했고, 후속 모델들이 자기 목적에 맞게 한 쪽을 골라서 키운 셈입니다.
Cross-Attention 을 한 문장 더 풀어보면
Cross-attention 이 왜 번역 모델에서 결정적인지만 조금 더 풀어볼게요. 한국어 “고양이가 울었다” 를 영어로 번역한다고 해봅시다. Decoder 가 “The” 를 만들고, 그 다음 “cat” 을 만들 차례예요. “cat” 을 만들 때 decoder 는 원문 “고양이” 라는 단어를 집중해서 봐야 합니다. 이 “원문의 어디를 봐야 하나” 를 결정하는 게 cross-attention 이에요. Q 가 decoder 에서 나오고 (지금 뭘 만들고 있는지), K·V 가 encoder 에서 오는 (원문에 뭐가 있는지) 이유가 여기서 나와요. “만들고 있는 쪽이 질문하고, 원문 쪽이 답한다” 는 구도입니다. RNN 기반 seq2seq 시절에도 attention 메커니즘이 있었지만, Transformer 는 이걸 핵심 부품으로 끌어올렸어요.
11. 왜 이 논문이 그렇게 큰 파장이었나
2017년에 나온 이 짧은 논문이 8년 지나서도 LLM 시대의 기원으로 불리는 이유를 몇 가지로 정리해 볼게요.
1. 병렬화가 됐다. RNN 이 “단어를 순서대로 처리” 하는 동안, Transformer 는 “모든 단어를 한 번에 처리” 해요. GPU 한 장에 다 태워서 학습하면 속도가 크게 빨라집니다. 이 덕분에 데이터와 모델 크기를 대폭 키우는 것이 현실적으로 가능해졌어요.
2. Scaling law 의 문을 열었다. Transformer 는 층을 쌓을수록, 데이터를 늘릴수록 성능이 꾸준히 올라간다 는 성질이 있었어요. 2020년 OpenAI 의 Scaling Laws for Neural Language Models 논문이 이 성질을 정량적으로 보여줬고, 여기서부터 “그냥 더 크게 만들면 더 잘한다” 는 전략이 힘을 얻었습니다. GPT-3 → GPT-4 → Claude → Gemini 의 경로가 전부 이 논리 위에 있어요.
3. 범용성이 엄청났다. 논문은 번역 문제로 시작했지만, 금방 다른 태스크들 (요약, QA, 분류, 코드 생성) 로 확장됐어요. BERT (2018) 가 encoder 만, GPT (2018) 가 decoder 만 써서 각자 다른 강점을 살렸고, 시간이 지나면서 decoder-only 구조가 지금의 ChatGPT·Claude 계열로 수렴했습니다.
4. 비언어 도메인으로도 퍼졌다. Vision Transformer (ViT) 는 이미지에, Perceiver 는 영상·오디오·센서 데이터까지, Transformer 구조가 거의 모든 모달리티에 옮겨 붙었어요. “attention 만 있으면 된다” 는 제목이 언어를 넘어서도 어느 정도 맞는 말이 된 셈입니다.
Codex 나 Claude Code 를 쓰실 때 뒤에서 돌아가는 모델은 전부 이 논문의 decoder 계통이에요. Prompt 를 넣으면 masked self-attention 으로 지금까지 토큰을 읽고, 다음 토큰 하나를 확률로 뽑고, 다시 읽고, 또 뽑고. 이 과정을 반복해서 긴 답변이 생성되는 거예요. 내부 구조를 아는 것과 모르는 것의 차이는 “왜 긴 프롬프트에서 앞부분이 희석되는지”, “왜 같은 질문인데 답이 흔들리는지” 같은 실무 문제를 추적할 때 드러납니다.
5. 해석성의 단서를 줬다. RNN 은 내부에서 무슨 일이 벌어지는지 보기가 어려웠어요. Attention 은 점수표를 직접 꺼내 볼 수 있어요. “이 단어가 저 단어에 0.8 로 주목했다” 가 숫자로 나오니까, 모델이 어떤 관계에 주목했는지 시각화가 가능해졌어요. 완전한 해석성이라고 할 수는 없지만, 모델 안을 조금이라도 들여다볼 수 있는 창문이 생긴 겁니다. Anthropic 의 “circuits” 연구나 mechanistic interpretability 흐름이 Transformer 이후 가속된 이유 중 하나가 이거예요.
실무 감각으로 한 번 더
이 다섯 가지 효과가 합쳐져서 지금의 LLM 생태계가 만들어졌어요. 2026년 기준으로 거의 모든 상용 LLM 이 decoder-only Transformer 를 씁니다. 세부 구조는 조금씩 달라요. Claude 는 MoE (Mixture of Experts) 를 일부 층에서 쓰고 있고, GPT 계열도 비슷한 흐름이고, Gemini 는 multimodal 에 특화된 변형이 들어가 있고요. 그래도 뼈대는 다 이 논문 입니다. 2017년에 제안된 구조가 8년 지나도 현역이라는 건 굉장히 드문 일이에요. 비전의 CNN 이 약 20년 동안 주류였듯이, Transformer 도 상당 기간 주류로 갈 것 같습니다.
실무자로서 이 구조를 이해하면 좋은 점을 하나만 더 말씀드리면, 도구 선택의 기준 이 생긴다는 거예요. “이 모델이 컨텍스트 얼마까지 지원해?” “이 모델의 attention 구조가 긴 문서에 강한 변형인가?” 같은 질문을 던질 수 있게 되거든요. 스펙 시트를 볼 때 숫자만 보는 게 아니라 그 숫자가 어디서 오는지 감이 잡힙니다.
또 하나의 실무 포인트. Attention 이 얼마나 계산 비용이 드는지를 아시면 긴 컨텍스트를 넣을수록 왜 API 비용이 빠르게 올라가는지 가 이해돼요. Attention 의 QK^T 연산은 토큰 수 N 에 대해 O(N²) 복잡도거든요. 토큰이 2배가 되면 attention 계산은 4배가 돼요. 10배 길어지면 100배고요. 100만 토큰 컨텍스트를 다루는 모델이 비싼 이유가 여기 있습니다. 이 O(N²) 병목을 줄이려고 Flash Attention, Sliding Window Attention, Linear Attention 같은 최적화 기법들이 계속 연구되고 있어요. 이런 용어가 기술 뉴스에 나올 때 “아, 저 논문의 저 부분을 최적화하는 얘기구나” 라는 감이 오시면 따라가기가 훨씬 수월해집니다.
12. mathbullet 영상과 이어 읽기 추천
이 글은 “비유 중심, 수식은 딱 하나” 로 끌고 왔어요. 그런데 어느 순간 수식 증명까지 제대로 보고 싶어지는 때가 옵니다. 그럴 때 저는 mathbullet YouTube 채널 해설을 추천드려요.
mathbullet – Attention is All You Need 해설
mathbullet 은 논문 수식을 칠판에 한 줄씩 풀어가면서, 왜 이 형태가 됐는지를 수학적으로 유도해 주는 스타일이에요. 이 블로그가 “도서관 비유로 감각 잡기” 라면, mathbullet 은 “칠판 앞에서 증명 따라가기” 입니다. 두 방향이 합쳐지면 논문이 훨씬 단단하게 머리에 붙어요.
같이 추천드리고 싶은 자료들:
- Jay Alammar — The Illustrated Transformer (블로그). 그림으로 Transformer 전체 구조를 따라가는 글. 이 글에서 도서관 비유랑 바로 이어지는 관점이에요.
- 3Blue1Brown — Deep Learning 시리즈 (YouTube). 딥러닝 기초 감각을 애니메이션으로 잡는 가장 좋은 시리즈.
- Andrej Karpathy — Let’s build GPT (YouTube). Attention 부터 미니 GPT 까지 코드로 직접 짜면서 따라가는 2시간짜리 강의. 이 글로 감각이 잡힌 다음에 보시면 훨씬 잘 따라가져요.
원문 논문 (arXiv:1706.03762) 은 검색하시면 바로 나옵니다. 여기까지 읽으신 상태로 논문 Figure 1 만 한 번 열어보시면, 전보다 훨씬 많은 게 읽힐 거예요.
한 문장 닫음: Attention 은 “지금 보고 있는 단어가 누구를 얼마나 봐야 하는지 점수로 매기는 것” 이고, 그 점수를 softmax 로 비율로 바꾸고, 비율대로 Value 를 섞는다. 이 세 동작을 여러 head 로, 여러 층으로 쌓은 것이 Transformer 다. 지금 우리가 쓰는 모든 LLM 이 이 구조 위에 있다.
다음 읽기
- P5 — AI Agent 가 뭐가 다른가 [준비 중]
- M1 — Retrieval Layer 가 왜 필요한가 [준비 중]
시리즈 처음부터: P1 — LLM 이란 무엇인가 · P2 — Transformer 는 무엇을 했나 · P3 — 딥러닝이 그냥 큰 계산인 이유
자주 묻는 질문 (FAQ)
Q1. Attention 과 Transformer 는 같은 말인가요?
다릅니다. Attention 은 메커니즘 하나 예요. “지금 단어가 다른 단어를 얼마나 볼지 점수로 매긴다” 는 연산이죠. Transformer 는 이 attention 을 여러 개 쌓아서 만든 전체 모델 구조 입니다. Attention 이 부품이고, Transformer 는 완성된 기계라고 생각하시면 편해요. 다른 모델도 attention 을 쓸 수 있지만, Transformer 는 attention 을 주인공 으로 쓴 첫 모델이에요.
Q2. 수식 딱 하나만 봐도 정말 논문 내용이 다 커버되나요?
Attention(Q,K,V) = softmax(QK^T / √d_k) V 이 한 줄은 논문에서 제일 핵심적인 “뭘 계산하는가” 를 담고 있어요. 나머지는 이 연산을 어떻게 쌓을지, 어떻게 병렬화할지, 순서 정보를 어떻게 넣을지 같은 주변 설계입니다. 블로그 기준에서는 이 수식 하나만 감각적으로 이해하시면 논문의 80% 는 읽을 수 있어요. 나머지 20% — 실제 학습 손실 함수, 하이퍼파라미터 선택, BLEU 점수 실험 결과 — 는 실무에서 직접 모델을 훈련하실 때 필요해지는 부분입니다.
Q3. 이 논문을 이해하면 프롬프트 엔지니어링에 직접 도움이 되나요?
도움 됩니다. 예를 들어 “왜 긴 컨텍스트에서 앞부분 정보가 희석되는가” 는 attention 점수가 멀리 떨어진 단어들 사이에 잘 안 모이는 현상이랑 연결돼요. “왜 지시문을 프롬프트 끝부분에 반복해야 효과가 좋은가” 도 attention 이 가까운 토큰에 더 쏠리는 경향에서 설명 가능하고요. 구조를 아시면 프롬프트 전략에 “왜” 가 붙어서 흔들림이 줄어요. 다만 논문 이해가 없어도 실무는 가능하니까, 관심 있으실 때 천천히 쌓아가시면 됩니다.
뉴스레터 구독 안내
매주 월요일, AI·LLM·에이전트 관련 실무 정리를 한 통씩 보내드립니다. 이런 기술 해설을 차분히 쌓아가고 싶으시면 구독해 주세요.
시리즈 안내
– P1: LLM 이란 무엇인가
– P2: Transformer 는 무엇을 했나
– P3: 딥러닝이 그냥 큰 계산인 이유
– P4: Attention Is All You Need 해설 (현재 글)
– P5: AI Agent 가 뭐가 다른가
– M1: Retrieval Layer 가 왜 필요한가
– (이하 15편까지)
📚 전체 지도 보기
도서관 Q·K·V 비유 하나와 수식 하나(scaled dot-product attention)로 원 논문을 끝까지 읽어내는 편.
소스 리스트
- 태일러 지식백과사전 — AI 공부 지도 카테고리 (본 시리즈 20편 전체)
- AI 공부 지도 엔트리맵 — 전체 구조 + 3가지 독법
- “Attention Is All You Need” (Vaswani et al., 2017)
- Anthropic · OpenAI · Google 공식 docs
- mathbullet (YouTube) / Jay Alammar “Illustrated Transformer” / 3Blue1Brown 영상 — 쉬운 설명 레퍼런스
著者: 바이브코딩 태일러 (VibeCoding Tailor) — Lovable公式アンバサダー. AI·バイブコーディング専門メディアshuntailor.net運営.
本シリーズ “AI 공부 지도” 22편은 위키 자료와 공식 논문·공식 문서를 근거로 정리한 체계적 학습 커리큘럼입니다.