AI 에이전트 구축Building AI Agents
Chapter 02 · The Transformer

트랜스포머 — 어텐션이 일으킨 혁명

"필요한 것은 어텐션이 전부다." 2017년 한 논문이 RNN을 개선하는 대신 완전히 제거하자고 제안했다. 현대 AI는 그 결정 위에 서 있다.

아키텍처 Self-Attention Q · K · V Positional Encoding

Section 01어텐션의 탄생

기계 번역은 평가하기 쉽다. 번역이 좋은지 나쁜지 우리는 금방 안다. 그래서 연구자들은 번역을 NLP의 시험대로 삼았고, 그 시험대 위에서 어텐션이 태어났다.

1990년대까지 기계 번역에 쓰인 표준은 seq2seq 모델이었다. 인코더가 입력 시퀀스를 간결한 표현(맥락 벡터)으로 압축하고, 디코더가 그 벡터를 받아 번역을 생성한다. 하지만 RNN 기반 seq2seq에는 근본적 문제가 있었다.

  • 정렬(alignment) — 입력과 출력의 길이가 다르다. "she doesn't like potatoes"는 프랑스어로 더 길어진다.
  • 소실·폭발 그래디언트 — 여러 층을 효과적으로 다룰 수 없다.
  • 병렬화 불가 — 순차 계산이라 학습이 느리고, 몇 단계 후 잊는다.
  • 병목(bottleneck) — 긴 문장 전체를 고정 크기 벡터 하나에 욱여넣어야 한다.

어텐션 메커니즘은 처음에 이 정렬 문제를 풀기 위해 등장했다. 발상은 이렇다 — RNN의 숨겨진 상태를 하나만 전달하는 대신, 시퀀스의 중요한 부분에만 초점을 맞춘 맥락 정보를 매 순간 동적으로 만들어 전달한다.

Attention — 세 단계
eij = score(si−1, hj)
aij = softmax(eij)
ci = Σj aij · hj
score 디코더 상태와 인코더 상태의 정렬 점수(내적·코사인) · softmax 점수를 상대적 중요도로 정규화 · ci 가중 합으로 만든 동적 맥락 벡터.
핵심 — 어텐션이 준 것 어텐션은 정렬을 풀었을 뿐 아니라, 초기 상태로 가는 지름길을 만들어 소실 그래디언트를 줄였고, 인코더-디코더 사이의 병목을 제거했으며, 어떤 단어에 주목하는지 보여주는 해석 가능성까지 주었다.

Section 02자기 어텐션과 Q·K·V

어텐션의 여러 변형 중 하나가 결정적이었다. 자기 어텐션(self-attention)은 다른 것과 비교할 필요 없이 입력 자신으로부터 직접 정보를 추출한다.

직관 — 도서관의 비유 프랑스 혁명에 대한 에세이를 쓰려고 도서관에서 책을 찾는다고 하자(쿼리). 프랑스 역사책()을 찾으려고 모든 책을 펼쳐 읽을 필요는 없다. 책 표지만 보면 된다 — 그것이 다. 자기 어텐션은 문맥 안에서 필요한 표현을 이렇게 검색한다.

구체적으로, 입력 X(토큰 벡터 배열)에 무작위로 초기화된 세 가중치 행렬을 곱해 세 가지를 만든다. 쿼리 Q(어텐션의 현재 초점), 키 K(이전 입력에 대한 안내), 값 V(추출할 정보)다.

Scaled Dot-Product Attention
Attention(Q, K, V) = softmax( Q·KT / √dk ) · V
Q·KT 쿼리와 키의 내적 — 토큰 간 관련성 점수 · √dk 차원의 제곱근으로 정규화 — 내적이 너무 커져 softmax 그래디언트가 작아지는 것을 막는다 · V 점수에 따라 가중 합되는 값.
Motion · 자기 어텐션이 한 토큰을 처리하는 법 STEP 01 / 5
space 재생 · → 다음 · R 리셋

다중 헤드 어텐션

한 교과서에 여러 질문을 던질 수 있듯이, 같은 입력에서 둘 이상의 표현을 추출할 수 있다. 다중 헤드 어텐션(multi-head attention)은 여러 개의 Q·K·V 집합을 병렬로 운용한다. 학습 중 각 헤드는 서로 다른 종류의 관계(문법적 의존, 의미적 연관 등)를 전문적으로 모델링한다. n개 헤드의 출력은 연결되어 최종 선형 층을 거쳐 원래 차원으로 복원된다.

RNN 대 자기 어텐션
특성RNN자기 어텐션
병렬화불가 — 순차 계산가능 — GPU에서 동시 계산
장거리 의존성먼 단어는 여러 단계 대기모든 쌍을 한 번에 직접 비교
계산 비용O(T) 선형O(T²) 이차 — 토큰 수에 민감
순서 인식본질적으로 있음없음 — 위치 인코딩 필요
함정 — 이차 비용 자기 어텐션의 시간·공간 복잡도는 토큰 수 T의 제곱에 비례한다. 4,096 토큰 모델은 512 토큰 모델보다 64배 더 많은 계산을 한다. 이것이 트랜스포머 확장성의 핵심 병목이며, 계산 비용을 줄이려는 수많은 어텐션 변형이 제안된 이유다.

Section 03트랜스포머 블록

2017년 Google 연구자들은 과감한 결론을 냈다. RNN을 개선하지 말고 완전히 제거하자. "Attention is All You Need."

트랜스포머는 전적으로 다중 헤드 자기 어텐션을 쌓아 올린 층으로 구성된다. 그 과정을 단계별로 보자.

위치 인코딩 — 순서를 되살리다

자기 어텐션은 위치를 인식하지 못한다. 하지만 문장에서 단어 순서는 중요하다. 그래서 트랜스포머는 각 토큰의 위치를 사인·코사인 함수로 인코딩한 벡터를 임베딩에 더한다. 학습 가능한 매개변수가 없어 긴 시퀀스에는 수정이 필요하지만, 모델에 상대 위치를 알려준다.

Positional Encoding
PE(pos, 2i)  = sin( pos / 100002i/d )
PE(pos, 2i+1) = cos( pos / 100002i/d )
pos 시퀀스 내 토큰 위치 · i 임베딩 차원 인덱스 · d 임베딩 차원. 짝·홀 차원에 사인·코사인을 교대로 쓴다.

블록의 네 요소

위치 인코딩을 마치면 일련의 트랜스포머 블록이 이어진다. 각 블록은 네 요소로 이루어진다.

Concept 트랜스포머 블록의 해부

① 다중 헤드 자기 어텐션 — 토큰 간 관계를 학습해 표현을 풍부하게 한다.

② 피드포워드 층(FFN) — 두 선형 변환 사이에 ReLU 하나. 어텐션에 비선형성을 더하고, 위치마다 독립적이라 병렬화하기 쉽다.

③ 잔차 연결(residual) — 입력을 출력에 그대로 더한다. 층 사이에 지름길을 만들어 그래디언트를 낮은 층까지 전달하고, 손실 표면을 매끄럽게 만든다.

④ 층 정규화(layer norm) — 숨겨진 값을 일정 범위로 유지해 학습 안정성을 높인다.

Transformer Block — 흐름
H = LayerNorm( X + MultiHeadAttention(X) )
H = LayerNorm( H + FFN(H) )
X 입력 행렬 (n × d, n=토큰 수, d=차원) · 블록을 통과해도 차원이 보존되어 96개까지 직렬로 쌓을 수 있다.
Motion · 자기회귀 토큰 생성 STEP 01 / 6
space 재생 · → 다음 · R 리셋
직관 — 점점 깊어지는 표현 아이디어는 단순하다. 모델은 층을 거치며 점점 복잡한 언어 표현을 배운다. 초기 임베딩에서 시작해, 자기 어텐션이 점점 더 넓은 문맥을 통합하면 표현이 풍부해진다. 일반적으로 더 깊은 층일수록 더 특화된 표현을 학습한다.

Section 04학습과 마스킹

원래 트랜스포머는 번역을 위해 인코더와 디코더 두 부분으로 만들어졌다. 하지만 인코더만, 혹은 디코더만 떼어 써도 강력하다는 것이 밝혀졌고, 이것이 오늘날 LLM 계열의 갈래를 만들었다.

마스킹된 언어 모델링

BERT 같은 인코더 전용 모델은 마스킹된 언어 모델링(masked language modeling)으로 학습한다. 입력 토큰의 일부를 [MASK]로 가리고, 모델이 양방향 문맥을 보며 가려진 단어를 맞히게 한다. 양방향으로 보기 때문에 이해(understanding) 작업에 강하다.

GPT 같은 디코더 전용 모델은 자기회귀(autoregressive) 방식이다. 다음 토큰을 예측하며, 미래 토큰을 보지 못하도록 어텐션에 마스크를 씌운다. 생성(generation) 작업에 적합하다.

Autoregressive Language Modeling
p(x1, x2, …, xn) = Πi p(xi | x<i)
x<i 현재 토큰 이전의 모든 토큰 · 전체 시퀀스 확률은 각 토큰의 조건부 확률을 곱한 것 — 이것이 RAG·에이전트에서 다시 등장하는 핵심 식이다.
자기회귀 생성 — 의사 코드
tokens = [/* 프롬프트 토큰들 */]
while not done:
    logits = transformer(tokens)        # 다음 토큰 분포
    probs  = softmax(logits[-1])        # 마지막 위치만
    next   = sample(probs, temperature)  # 분포에서 샘플링
    tokens.append(next)
    if next == EOS: done = True
함정 — 온도의 양면 샘플링 온도(temperature)를 높이면 다양성이 늘지만, 확률이 낮은 토큰을 뽑게 되어 할루시네이션 위험이 커진다. 3장과 5장에서 다시 다룰 LLM의 핵심 트레이드오프다.
핵심 트랜스포머는 RNN의 순차성·소실 그래디언트·병목을 한꺼번에 해결했다. 자기 어텐션은 병렬화 가능하고 모든 토큰 쌍을 직접 잇는다. 96개까지 쌓인 블록은 점점 정교한 언어 표현을 배운다. 이 아키텍처를 대규모로 학습한 것이 바로 다음 장의 LLM이다.