트랜스포머와 어텐션 - LLM은 어떻게 다음 단어를 예측할까
ChatGPT에게 질문하면 그럴듯한 문장이 술술 나옵니다. 그런데 그 내부를 들여다보면, LLM이 실제로 하는 일은 놀랍도록 단순합니다. "지금까지의 문장 다음에 올 단어를 확률적으로 고르는 것", 그게 전부입니다. 이 단순한 예측을 무섭게 잘하게 만든 구조가 트랜스포머(Transformer) 이고, 그 심장이 어텐션(Attention) 입니다.
이 글에서는 수식을 최대한 걷어내고, LLM이 다음 단어를 예측하는 원리를 직관 중심으로 정리합니다.
1. LLM의 본질은 "다음 토큰 예측"
거창해 보이지만 LLM이 학습하는 목표는 하나입니다.
"앞의 단어들이 주어졌을 때, 다음에 올 단어의 확률을 맞혀라."
예를 들어 "나는 아침에 커피를 ___" 라는 입력이 들어오면, 모델은 어휘 전체에 대해 확률 분포를 계산합니다.
마셨다 0.62 내렸다 0.11 샀다 0.09 먹었다 0.07 ...
그중 하나를 골라 이어 붙이고, 그 결과를 다시 입력에 넣어 또 다음 단어를 예측합니다. 이 과정을 반복하면 문장이, 문단이, 글이 됩니다. 이것을 자기회귀(auto-regressive) 생성 이라고 합니다.
핵심은 이겁니다. 모델은 "정답"을 아는 게 아니라, 방대한 텍스트에서 학습한 통계적 패턴으로 가장 그럴듯한 다음 단어를 고를 뿐입니다. 할루시네이션이 왜 생기는지도 여기서 짐작할 수 있습니다. 모델은 "사실"이 아니라 "그럴듯함"을 최적화하기 때문입니다.
2. 다음 단어를 잘 고르려면 문맥을 이해해야 한다
다음 단어를 잘 예측하려면, 앞에 나온 단어들 중 무엇이 중요한지 알아야 합니다.
"은행에서 돈을 찾은 뒤, 강 ___ 에 앉아 쉬었다."
여기서 빈칸을 채우려면 "강"이라는 단어에 집중해야 "둔치/변" 같은 답이 나옵니다. 만약 "은행"에 꽂히면 엉뚱한 답이 나오겠죠. 즉 어떤 단어를 예측할 때, 앞의 어떤 단어들을 얼마나 참고할지 정하는 능력이 필요합니다.
바로 이 "어디에 주목할지"를 계산하는 메커니즘이 셀프 어텐션(Self-Attention) 입니다.
3. 셀프 어텐션 직관 - Query / Key / Value
어텐션을 이해하는 가장 좋은 비유는 검색입니다. 각 단어(토큰)는 세 개의 역할을 동시에 만듭니다.
| 이름 | 비유 | 역할 |
|---|---|---|
| Query (질의) | 내가 찾고 싶은 것 | "나는 지금 어떤 정보가 필요한가?" |
| Key (열쇠) | 각 단어의 색인 태그 | "나는 이런 정보를 갖고 있어" |
| Value (값) | 실제 내용 | "가져갈 실제 정보" |
동작을 사람 말로 풀면 이렇습니다.
- 지금 처리 중인 단어가 Query를 던진다. ("나는 이런 게 궁금해")
- 문장 안 모든 단어의 Key와 비교해 얼마나 관련 있는지 점수를 매긴다.
- 관련 높은 단어의 Value를 많이, 낮은 단어의 Value는 적게 섞어서 가져온다.
즉 "관련도로 가중 평균한 정보 요약" 이 어텐션의 결과물입니다. 앞의 "강" 예시라면, 빈칸 단어의 Query가 "강"의 Key와 높은 점수를 내고, "강"의 Value를 많이 반영하게 됩니다.
아주 단순화하면 이런 흐름입니다.
# q, k, v: 각 토큰의 Query/Key/Value 벡터 scores = q @ k.T # 1. 모든 단어와의 관련도 점수 weights = softmax(scores) # 2. 합이 1인 가중치로 변환 output = weights @ v # 3. 가중 평균으로 정보 요약
softmax는 점수들을 "합이 1인 확률"로 바꾸는 함수라고만 알면 충분합니다. 점수가 높은 단어일수록 최종 요약에 더 크게 기여합니다.
여기서 "셀프(self)"인 이유는, Query·Key·Value가 모두 같은 문장 자기 자신에서 나오기 때문입니다. 문장이 스스로를 훑어보며 단어 간 관계를 파악하는 것이죠.
4. 멀티헤드 어텐션 - 여러 관점으로 동시에 보기
문장 안의 관계는 한 종류가 아닙니다. 어떤 관계는 문법적("이 동사의 주어는 누구?"), 어떤 관계는 의미적("이 대명사가 가리키는 대상은?")입니다.
멀티헤드 어텐션(Multi-Head Attention) 은 어텐션을 한 번만 하지 않고, 여러 개(헤드)를 병렬로 돌립니다. 각 헤드는 서로 다른 관점을 학습합니다.
- 헤드 1: 주어–동사 관계에 주목
- 헤드 2: 대명사가 가리키는 명사에 주목
- 헤드 3: 바로 옆 단어(인접성)에 주목
- ...
여러 사람이 같은 문장을 각자 다른 관점에서 읽고, 그 해석을 합쳐 종합하는 것과 같습니다. 이렇게 하면 훨씬 풍부한 문맥 표현이 만들어집니다.
5. 위치 정보는 어떻게 넣을까
어텐션에는 치명적인 맹점이 하나 있습니다. 단어들을 동시에(집합처럼) 보기 때문에, 순서 정보가 없습니다. "개가 사람을 물었다"와 "사람이 개를 물었다"를 구분 못 하면 큰일이죠.
그래서 트랜스포머는 각 토큰 임베딩에 위치 정보(Positional Encoding) 를 더해줍니다. "이 단어는 몇 번째 위치다"라는 신호를 벡터에 섞어 넣는 것입니다.
입력 벡터 = 단어 임베딩 + 위치 임베딩
초기 트랜스포머는 사인/코사인 함수로 위치를 표현했고, 요즘 LLM은 RoPE(회전 위치 임베딩) 같은 기법으로 긴 문맥에서도 위치 관계를 잘 유지하도록 발전했습니다. 자세한 수식보다, "어텐션은 순서를 모르니 위치를 따로 알려줘야 한다" 는 사실만 기억하면 됩니다.
6. 왜 트랜스포머가 RNN을 이겼나 - 병렬성
트랜스포머 이전의 주력은 RNN/LSTM 이었습니다. RNN은 단어를 하나씩 순서대로 읽으며 상태를 넘겨받는 구조입니다.
RNN: 단어1 → 상태 → 단어2 → 상태 → 단어3 → ... (순차적, 앞이 끝나야 뒤 처리)
여기서 두 가지 문제가 생깁니다.
- 병렬화가 안 된다. 단어를 순서대로 처리해야 하니, GPU의 대규모 병렬 연산을 살리기 어렵습니다. 학습이 느립니다.
- 먼 거리 관계를 놓친다. 문장이 길어지면 앞 단어의 정보가 뒤로 갈수록 희미해집니다(장기 의존성 문제).
트랜스포머는 어텐션 덕분에 이 둘을 한 번에 해결했습니다.
- 병렬 처리: 모든 단어의 어텐션을 한 번에 행렬 곱으로 계산합니다. 순서를 기다릴 필요가 없어 GPU에서 학습이 훨씬 빠릅니다. 이 확장성 덕분에 모델을 거대하게 키울 수 있었고, 그게 오늘날 LLM의 밑거름이 됐습니다.
- 먼 거리도 직접 연결: 어텐션은 문장의 첫 단어와 마지막 단어를 거리에 상관없이 한 스텝에 연결합니다. 100단어 떨어져 있어도 관련만 높으면 바로 주목합니다.
| 항목 | RNN/LSTM | 트랜스포머 |
|---|---|---|
| 처리 방식 | 순차적 | 병렬 |
| 먼 거리 의존성 | 약함 | 강함(직접 연결) |
| 학습 속도 | 느림 | 빠름(GPU 친화적) |
| 확장성 | 제한적 | 매우 좋음 |
2017년 논문 제목이 그대로 핵심입니다. "Attention Is All You Need" — 순차 처리 없이 어텐션만으로 충분하다는 선언이었죠.
7. 전체 그림 한 번에
지금까지의 조각을 이어 붙이면 LLM이 다음 단어를 뱉는 과정은 이렇습니다.
1. 입력 문장을 토큰으로 쪼갠다 2. 각 토큰을 임베딩 벡터로 + 위치 정보 추가 3. 멀티헤드 셀프 어텐션으로 문맥 요약 (여러 층 반복) 4. 마지막 위치에서 다음 토큰의 확률 분포 계산 5. 확률에 따라 토큰 하나 선택 → 문장에 이어 붙임 6. 2~5를 반복
3번의 "여러 층 반복"이 중요합니다. 트랜스포머는 어텐션 블록을 수십 겹 쌓습니다. 아래층은 문법 같은 저수준 패턴을, 위층은 의미·논리 같은 고수준 패턴을 잡는 식으로 점점 추상적인 이해를 쌓아 올립니다.
마무리
LLM은 마법이 아니라 "다음 토큰을 확률로 예측하는 기계" 이고, 그 예측을 놀랍도록 잘하게 만든 것이 어텐션 입니다.
세 가지만 남기면 됩니다.
- 본질은 다음 단어 예측이다. 그래서 사실이 아니라 "그럴듯함"을 최적화한다.
- 어텐션은 Query로 묻고, Key로 매칭하고, Value를 가중 평균해 문맥을 요약하는 검색 같은 연산이다.
- 트랜스포머가 RNN을 이긴 결정적 이유는 병렬성과 먼 거리 직접 연결이었고, 이 확장성이 거대 LLM 시대를 열었다.
이 구조를 이해하면, 토크나이저·임베딩·컨텍스트 길이·프롬프트가 왜 성능에 영향을 주는지도 자연스럽게 연결됩니다.
