Seq2Seq에서 Transformer까지: 문맥 누적에서 직접 참조로 · 4편

Self-Attention과 Transformer - 순차 연결을 끊고 직접 참조하다

RNN이 이전 상태 통해 문맥을 누적 전달했다면, Transformer는 필요한 토큰을 직접 찾아본다. Self-Attention이 어떻게 순차 구조를 없애고, Attention Seq2Seq와 어떻게 연결되는지 살펴본다.

지난 편 복습

3편에서 Attention Seq2Seq의 남은 문제를 두 가지로 정리했다.

  1. 출력 쪽 장거리 의존성: Decoder의 $S_k$는 여전히 $S_{k-1}$에 의존한
  2. 병렬화 불가: $h_k$와 $S_k$는 모두 이전 상태가 있어야만 계산할 수 있다

두 문제의 공통 원인은 하나다. RNN 기반 구조는 문맥을 순서대로 누적 전달한다.

Attention Seq2Seq에서 Self-Attention으로

2편에서 한 가지를 짚어두었다. Attention Seq2Seq에서 $K$와 $V$는 모두 $h_i$로 같은 변수다.

개념 Attention Seq2Seq
$Q$ Decoder 상태 $S_k$
$K$ Encoder 상태 $h_i$
$V$ Encoder 상태 $h_i$

$K = V = h_i$는 이미 성립했다. Self-Attention은 여기서 한 걸음 더 나아간다. $Q$도 같은 시퀀스에서 가져온다.

개념 Self-Attention
$Q$ 토큰 $x_i$로부터
$K$ 토큰 $x_j$로부터
$V$ 토큰 $x_j$로부터

“다른 시퀀스를 참조하는 Attention”에서 “자기 자신을 참조하는 Attention”으로의 전환이다.

Self-Attention의 동작

각 토큰 $x_i$는 학습된 가중치 행렬을 통해 $q_i, k_i, v_i$로 변환된다.

\[q_i = W_Q x_i, \quad k_i = W_K x_i, \quad v_i = W_V x_i\]

이후 계산 구조는 2편의 Attention과 동일하다. 토큰 $i$가 다른 모든 토큰 $j$에 대해 관련도를 계산하고,

\[w_{ij} = \text{softmax}\!\left(\frac{\langle q_i, k_j \rangle}{\sqrt{d_k}}\right)\]

그 가중치로 $v_j$를 합산해 새로운 표현을 만든다.

\[h_i^{\text{new}} = \sum_j w_{ij} \cdot v_j\]

$\sqrt{d_k}$로 나누는 스케일링은 차원이 커질수록 내적값이 커져 softmax가 지나치게 sharp해지는 것을 막기 위함이다.

순차 구조가 사라진다

RNN에서 $h_4$가 $h_1$의 정보를 얻으려면 $h_2, h_3$를 순서대로 거쳐야 했다.

Self-Attention에서는 $h_4^{\text{new}}$를 계산할 때 $x_1$을 직접 참조한다. 중간 상태가 필요 없다. 모든 토큰 쌍의 관련도가 한 번에 계산된다.

이 구조는 3편에서 정리한 두 문제를 동시에 해결한다.

  • 장거리 의존성: 어떤 토큰도 다른 토큰을 한 단계에 직접 참조한다
  • 병렬화: 각 토큰의 $q_i, k_i, v_i$ 계산과 attention 연산은 순서 의존성이 없다

Transformer의 구조

Transformer는 Self-Attention을 Encoder와 Decoder 양쪽에 적용한다.

Encoder: 입력 토큰들끼리 Self-Attention을 수행한다. 각 토큰은 입력 시퀀스의 모든 토큰을 직접 참조해 자신의 표현을 업데이트한다.

Decoder: 두 종류의 Attention을 사용한다.

  • Masked Self-Attention: 이전 출력 토큰들끼리 Self-Attention을 수행한다. 단, 미래 토큰을 참조하지 못하도록 마스킹한다. 생성 시점 $k$에서는 $y_1 \sim y_{k-1}$만 참조 가능하다.
  • Cross-Attention: 2편의 Attention과 동일한 구조다. $Q$는 Decoder 상태, $K$와 $V$는 Encoder 출력에서 가져온다.

Positional Encoding

RNN은 토큰을 순서대로 읽기 때문에 위치 정보가 구조 안에 내재되어 있다. Self-Attention은 모든 토큰을 동시에 보기 때문에 위치 정보가 없다. “I love cats”와 “cats love I”를 구분하지 못한다.

이를 해결하기 위해 각 토큰의 embedding에 위치 정보를 더한다.

\[\tilde{x}_i = x_i + \text{PE}(i)\]

원 논문에서는 sin/cos 함수를 사용한 고정 Positional Encoding을 제안했고, 이후 학습 가능한 방식도 많이 사용된다.

전체 시리즈 결론

Seq2Seq에서 Transformer로의 흐름을 정리하면 이렇다.

구조 핵심 특징 남은 문제
Vanilla Seq2Seq 마지막 Encoder 상태에 의존 Encoder 정보 병목
Attention Seq2Seq Encoder 상태 전체를 직접 참조 Decoder 순차성, 병렬화 불가
Transformer Encoder/Decoder 모두 직접 참조

각 단계의 변화는 단순히 더 복잡한 모델로 넘어간 것이 아니다. 정보 전달 방식의 구조적 전환이었다.

RNN이 문맥을 순서대로 누적 전달했다면, Transformer는 필요한 문맥을 직접 찾아본다.