Self-Attention과 Transformer - 순차 연결을 끊고 직접 참조하다
RNN이 이전 상태 통해 문맥을 누적 전달했다면, Transformer는 필요한 토큰을 직접 찾아본다. Self-Attention이 어떻게 순차 구조를 없애고, Attention Seq2Seq와 어떻게 연결되는지 살펴본다.
지난 편 복습
3편에서 Attention Seq2Seq의 남은 문제를 두 가지로 정리했다.
- 출력 쪽 장거리 의존성: Decoder의 $S_k$는 여전히 $S_{k-1}$에 의존한
- 병렬화 불가: $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는 필요한 문맥을 직접 찾아본다.