Section 01어텐션의 탄생
기계 번역은 평가하기 쉽다. 번역이 좋은지 나쁜지 우리는 금방 안다. 그래서 연구자들은 번역을 NLP의 시험대로 삼았고, 그 시험대 위에서 어텐션이 태어났다.
1990년대까지 기계 번역에 쓰인 표준은 seq2seq 모델이었다. 인코더가 입력 시퀀스를 간결한 표현(맥락 벡터)으로 압축하고, 디코더가 그 벡터를 받아 번역을 생성한다. 하지만 RNN 기반 seq2seq에는 근본적 문제가 있었다.
- 정렬(alignment) — 입력과 출력의 길이가 다르다. "she doesn't like potatoes"는 프랑스어로 더 길어진다.
- 소실·폭발 그래디언트 — 여러 층을 효과적으로 다룰 수 없다.
- 병렬화 불가 — 순차 계산이라 학습이 느리고, 몇 단계 후 잊는다.
- 병목(bottleneck) — 긴 문장 전체를 고정 크기 벡터 하나에 욱여넣어야 한다.
어텐션 메커니즘은 처음에 이 정렬 문제를 풀기 위해 등장했다. 발상은 이렇다 — RNN의 숨겨진 상태를 하나만 전달하는 대신, 시퀀스의 중요한 부분에만 초점을 맞춘 맥락 정보를 매 순간 동적으로 만들어 전달한다.
aij = softmax(eij)
ci = Σj aij · hj
Section 02자기 어텐션과 Q·K·V
어텐션의 여러 변형 중 하나가 결정적이었다. 자기 어텐션(self-attention)은 다른 것과 비교할 필요 없이 입력 자신으로부터 직접 정보를 추출한다.
구체적으로, 입력 X(토큰 벡터 배열)에 무작위로 초기화된 세 가중치 행렬을 곱해 세 가지를 만든다. 쿼리 Q(어텐션의 현재 초점), 키 K(이전 입력에 대한 안내), 값 V(추출할 정보)다.
다중 헤드 어텐션
한 교과서에 여러 질문을 던질 수 있듯이, 같은 입력에서 둘 이상의 표현을 추출할 수 있다. 다중 헤드 어텐션(multi-head attention)은 여러 개의 Q·K·V 집합을 병렬로 운용한다. 학습 중 각 헤드는 서로 다른 종류의 관계(문법적 의존, 의미적 연관 등)를 전문적으로 모델링한다. n개 헤드의 출력은 연결되어 최종 선형 층을 거쳐 원래 차원으로 복원된다.
| 특성 | RNN | 자기 어텐션 |
|---|---|---|
| 병렬화 | 불가 — 순차 계산 | 가능 — GPU에서 동시 계산 |
| 장거리 의존성 | 먼 단어는 여러 단계 대기 | 모든 쌍을 한 번에 직접 비교 |
| 계산 비용 | O(T) 선형 | O(T²) 이차 — 토큰 수에 민감 |
| 순서 인식 | 본질적으로 있음 | 없음 — 위치 인코딩 필요 |
Section 03트랜스포머 블록
2017년 Google 연구자들은 과감한 결론을 냈다. RNN을 개선하지 말고 완전히 제거하자. "Attention is All You Need."
트랜스포머는 전적으로 다중 헤드 자기 어텐션을 쌓아 올린 층으로 구성된다. 그 과정을 단계별로 보자.
위치 인코딩 — 순서를 되살리다
자기 어텐션은 위치를 인식하지 못한다. 하지만 문장에서 단어 순서는 중요하다. 그래서 트랜스포머는 각 토큰의 위치를 사인·코사인 함수로 인코딩한 벡터를 임베딩에 더한다. 학습 가능한 매개변수가 없어 긴 시퀀스에는 수정이 필요하지만, 모델에 상대 위치를 알려준다.
PE(pos, 2i+1) = cos( pos / 100002i/d )
블록의 네 요소
위치 인코딩을 마치면 일련의 트랜스포머 블록이 이어진다. 각 블록은 네 요소로 이루어진다.
① 다중 헤드 자기 어텐션 — 토큰 간 관계를 학습해 표현을 풍부하게 한다.
② 피드포워드 층(FFN) — 두 선형 변환 사이에 ReLU 하나. 어텐션에 비선형성을 더하고, 위치마다 독립적이라 병렬화하기 쉽다.
③ 잔차 연결(residual) — 입력을 출력에 그대로 더한다. 층 사이에 지름길을 만들어 그래디언트를 낮은 층까지 전달하고, 손실 표면을 매끄럽게 만든다.
④ 층 정규화(layer norm) — 숨겨진 값을 일정 범위로 유지해 학습 안정성을 높인다.
H = LayerNorm( H + FFN(H) )
Section 04학습과 마스킹
원래 트랜스포머는 번역을 위해 인코더와 디코더 두 부분으로 만들어졌다. 하지만 인코더만, 혹은 디코더만 떼어 써도 강력하다는 것이 밝혀졌고, 이것이 오늘날 LLM 계열의 갈래를 만들었다.
마스킹된 언어 모델링
BERT 같은 인코더 전용 모델은 마스킹된 언어 모델링(masked language modeling)으로 학습한다. 입력 토큰의 일부를 [MASK]로 가리고, 모델이 양방향 문맥을 보며 가려진 단어를 맞히게 한다. 양방향으로 보기 때문에 이해(understanding) 작업에 강하다.
GPT 같은 디코더 전용 모델은 자기회귀(autoregressive) 방식이다. 다음 토큰을 예측하며, 미래 토큰을 보지 못하도록 어텐션에 마스크를 씌운다. 생성(generation) 작업에 적합하다.
tokens = [/* 프롬프트 토큰들 */] while not done: logits = transformer(tokens) # 다음 토큰 분포 probs = softmax(logits[-1]) # 마지막 위치만 next = sample(probs, temperature) # 분포에서 샘플링 tokens.append(next) if next == EOS: done = True