"Attention을 안다"고 말하는 사람들이 많습니다. Transformer 논문도 읽었고, 코드도 돌려봤고, 심지어 직접 구현까지 해봤다고 합니다.
하지만 막상 물어보면 대답이 막힙니다.
$Q, K, V$가 왜 세 개로 나뉘는지, $K$를 전치하는 이유가 뭔지, Attention Score만으로는 왜 안 되는지. 정확히 설명할 수 있는 사람은 드뭅니다.
이 글은 어텐션 메커니즘의 설계 철학을 다룹니다. 수식과 코드는 최소한으로, 원리 자체에 집중합니다.
왜 이런 설계가 필요했는가
Attention을 이해하려면 역사적 맥락을 알아야 합니다.
RNN의 한계
Transformer 이전, 시퀀스 처리는 RNN과 LSTM의 영역이었습니다. 하지만 치명적인 문제가 있었습니다.
재귀(recurrence) 구조입니다. $h_t$를 계산하려면 $h_{t-1}$이 필요하고, $h_{t-1}$을 계산하려면 $h_{t-2}$가 필요합니다. 순차적으로 계산할 수밖에 없는 구조죠.
이는 두 가지 문제를 일으켰습니다:
- GPU 병렬화 불가능 → 학습 느림
- 먼 거리의 토큰 관계 학습 어려움 → gradient vanishing
이에 대한 Attention의 해답
Attention은 재귀를 제거했습니다. 모든 토큰 쌍의 관계를 한 번에 계산합니다.
$QK^T$ 연산 하나로 $(\text{seq\_len} \times \text{seq\_len})$ 개의 관계를 동시에 구합니다. 완벽한 병렬화가 가능해진 거죠.
거리도 무의미해졌습니다. 첫 토큰과 마지막 토큰도 직접 연결됩니다. Long-range dependency 문제가 해결됩니다.
대신 순차성 정보는 사라졌습니다. 토큰의 위치 정보를 별도로 주입해야 하는데, 이 부분은 다음 글에서 다룰 Positional Encoding이 담당합니다.
Q, K, V의 역할 분담
어텐션을 이해하는 첫 단계는 Query, Key, Value의 역할을 구분하는 것입니다.
내적으로 유사도를 측정한다
$QK^T$ 연산은 토큰 간 유사도를 계산합니다. 여기서 전치($T$)가 붙는 이유를 정확히 알아야 합니다.
행렬 곱셈 규칙을 떠올려보겠습니다. $(A, B, C) \times (A, C, D) = (A, B, D)$
$QK^T$ 계산:
$$ \begin{aligned} &[\text{batch}, \text{seq\_len}, d_{model}] \times [\text{batch}, d_{model}, \text{seq\_len}] \\ &= [\text{batch}, \text{seq\_len}, \text{seq\_len}] \end{aligned} $$
가운데 차원인 $d_{model}$끼리 곱해집니다. 행렬 곱셈 법칙상 가운데 차원이 소거되면서 내적이 일어나는 구조죠.
각 토큰 쌍마다 $d_{model}$ 차원의 벡터끼리 내적합니다. 임베딩 정보를 비교하는 방식입니다. $K$를 전치하지 않으면 차원이 맞지 않아 계산 자체가 불가능합니다.
Attention Score의 한계
이렇게 계산된 결과만으로 충분할까요?
계산 결과는 $(\text{batch}, \text{seq\_len}, \text{seq\_len})$ 크기의 Attention Score입니다. Softmax를 거치면 각 토큰이 다른 토큰들에 얼마나 집중할지 확률 분포로 나타납니다.
참고: 흔히 어텐션의 연산 비용을 $O(n^2)$ 혹은 $O(\text{seq\_len}^2)$이라고 부르는데, 바로 이 과정에서 만들어지는 행렬의 크기가 시퀀스 길이의 제곱으로 늘어나기 때문입니다.
그런데 여기까지만으로는 부족합니다. Attention Score는 "누가 중요한지"만 알려줄 뿐입니다.
V가 담당하는 것
$(\text{seq\_len}, \text{seq\_len})$ 형태의 스코어에는 관련성만 있습니다. 각 토큰이 원래 어떤 의미였는지는 사라졌습니다.
$V$는 입력($X$)이 가중치 행렬 $W^V$와 곱해져($V = X W^V$) 생성됩니다.
즉, $W^V$를 통해 학습 가능한 변환을 거친 정보를 담고 있습니다. 단순히 원본을 보관하는 게 아니라, 현재 문맥에서 이 토큰이 전달할 정보로 재구성된 것입니다.
Attention Score와 $V$를 가중합하면 중요도가 부여된 토큰들의 정보를 얻게 됩니다.
Scaled Dot-Product: 학습을 가능하게 만드는 장치
그런데 여기서 한 가지 빠뜨린 게 있습니다. 실제 어텐션 수식을 보면 이렇게 생겼습니다:
$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$
분모에 $\sqrt{d_k}$가 있습니다. 이게 뭘까요?
$QK^T$를 계산하면 $d_{model}$ 차원의 벡터끼리 내적합니다. 문제는 $d_{model}$이 커질수록 내적 값도 기하급수적으로 커진다는 점입니다.
값이 너무 크면 어떻게 될까요? Softmax를 통과했을 때 확률이 한쪽으로만 쏠립니다. $0.99, 0.01, 0.00...$ 이런 식으로요.
이렇게 되면 기울기가 거의 0에 수렴해버립니다. 학습이 멈춰버리는 거죠.
$\sqrt{d_k}$로 나눠주는 이유가 바로 이겁니다. 이 값을 스케일링 팩터(Scaling Factor)라고 부릅니다. 내적 값의 스케일을 조정해서 Softmax가 적절한 분포를 유지하도록 만듭니다. 이 작은 나눗셈 하나가 Transformer를 깊게 쌓을 수 있게 만든 핵심입니다.
학습으로 획득하는 언어 패턴
그런데 자기 자신과 어텐션해서 중요도를 매긴다고 했는데, 실제 쿼리할 때는 이게 어떻게 적용되는 걸까요?
처음 학습을 시작할 때 $Q, K, V$를 만드는 투영 레이어의 가중치는 랜덤입니다. 어디에 집중해야 할지 모릅니다.
이때, 바로 Cross Entropy Loss를 통한 역전파가 상황을 바꿉니다.
틀린 예측을 할 때마다 기울기가 역전파되면서 "어떤 토큰에 집중했어야 했는가"를 배웁니다. 중요한 건, 특정 문장을 외우는 게 아니라는 점입니다.
$Q, K, V$ projection weights는 일반적인 언어 패턴을 학습합니다:
- 주어-동사 관계에 집중하기
- 대명사는 이전 명사 참조하기
- 수식어와 피수식어 연결하기
- 그 외 등등..
새로운 문장이 들어와도 작동하는 이유입니다. 학습된 가중치로 $Q, K, V$를 만들면 의미있는 attention이 가능합니다. 메커니즘은 "나 자신과의 유사도"로 동일하지만, 학습된 패턴이 새로운 입력을 처리합니다.
마치며
어텐션의 설계는 명확한 철학을 담고 있습니다. $Q$와 $K$로 유사도를 측정하고, $V$로 원본 정보를 보존하며, 학습을 통해 언어의 일반 패턴을 익힙니다.
이 구조를 이해하면 어텐션이 왜 강력한지 보입니다. 동시에 왜 대체하기 어려운지도 알 수 있습니다.
$(\text{sen\_len}, \text{seq\_len})$의 메모리 문제, Long context 처리의 한계. 이런 제약들도 결국 이 설계에서 비롯됩니다.
어텐션 하면 빠질 수 없는 Positional Encoding을 다음 글에서 다룹니다. 그럼 다음 글에서 뵙도록 하겠습니다.
해당 게시글은 Claude Sonnet 4.5와 Gemini 3 Pro를 이용해 작업하였음을 알립니다.이 글은 기존 벨로그에서 작성한 글을 보완하여 재발행한 것입니다.(SEO 최적화를 위해 삭제하였습니다.)
'트랜스포머 시리즈' 카테고리의 다른 글
| [딥러닝] 트랜스포머 Multi-Head Attention: 여러 개의 눈으로 세상을 보는 법 (0) | 2026.01.12 |
|---|---|
| [딥러닝] 트랜스포머의 나침반: Positional Encoding (0) | 2026.01.12 |