주제: 3-2 Self-Attention (Transformer 핵심 연산)
문제 설정
기존 RNN이나 CNN 기반 NLP 모델은 긴 문장에서 단어 간 관계를 효과적으로 학습하기 어렵습니다.
- RNN -> 순차 계산
- CNN -> 제한된 receptive field
Transformer는 이를 해결하기 위해 Self-Attention 메커니즘을 사용합니다.
핵심 식:
Attention(Q,K,V) = softmax(QKT / √dk) V
Q, K, V가 처음엔 복잡해 보이지만, 역할을 나누면 이해가 쉬워진다. Query는 지금 내가 찾고 싶은 정보, Key는 내가 가진 정보의 주소표, Value는 실제로 가져갈 내용이라고 보면 된다. attention은 결국 이 셋을 이용해 "누구를 얼마나 참고할지"를 계산하는 절차다.
그래서 self-attention을 이해하면 Transformer가 왜 멀리 떨어진 단어 관계를 직접 연결할 수 있는지 자연스럽게 보인다. RNN처럼 순서대로 넘기지 않고, 한 단계에서 전체 문장을 동시에 참조하기 때문이다.
직관 비유
- 문장의 각 단어가 다른 모든 단어를 바라봄
- 중요한 단어에는 더 큰 attention weight 부여
- 그 정보를 모아 새로운 표현 생성
시각 자료로 먼저 보기
1. 입력 토큰 표현
문장은 토큰 embedding으로 표현됩니다.
X ∈ Rn × d
기호 의미
- n : 토큰 수 (sequence length)
- d : embedding dimension
왜 필요한가
텍스트를 수치 벡터로 변환하여 모델이 처리할 수 있게 합니다.
이 단계는 단순한 인코딩이 아니라 attention 계산의 출발점이다. 토큰이 공통 벡터 공간 위에 놓여 있어야 query, key, value로 선형 변환할 수 있고, 그다음에 관련도 계산도 가능해진다.
2. Query / Key / Value 생성
Self-attention은 입력 벡터에서 세 가지 벡터를 생성합니다.
Q = XWQ
K = XWK
V = XWV
기호 의미
- Q : query 벡터
- K : key 벡터
- V : value 벡터
- W_Q, W_K, W_V : 학습 파라미터
직관 설명
- Query -> 무엇을 찾는지
- Key -> 어떤 정보를 가지고 있는지
- Value -> 실제 전달할 정보
주의점
Q,K,V는 같은 입력에서 다른 선형 변환으로 생성됩니다.
3. Attention Score 계산
각 토큰 간 유사도를 계산합니다.
S = QKT
기호 의미
- S ∈ Rn × n : attention score matrix
직관 설명
모든 토큰이 서로 얼마나 관련 있는지 계산합니다.
주의점
score 값이 너무 커질 수 있습니다.
4. Scaling
score를 다음 값으로 나눕니다.
S' = QKT / √dk
기호 의미
- d_k : key 벡터 차원
왜 필요한가
차원이 커질수록 dot product 값이 커지므로 softmax saturation을 방지합니다.
주의점
scaling이 없으면 gradient가 매우 작아질 수 있습니다.
5. Softmax
attention weight를 계산합니다.
기호 의미
- A : attention weight matrix
직관 설명
각 토큰이 다른 토큰에 얼마나 집중할지 결정합니다.
주의점
각 행의 합은 1이 됩니다.
6. Value 결합
최종 출력:
기호 의미
- O : attention output
직관 설명
중요한 단어의 value 정보를 weighted sum으로 결합합니다.
7. 전체 Self-Attention 식
모든 과정을 합치면 다음과 같습니다.
Attention(Q,K,V) = softmax(QKT/√dk)V
왜 중요한가
Transformer의 핵심 연산입니다.
8. 계산 복잡도
Self-attention의 계산 복잡도:
기호 의미
- n : token length
왜 중요한가
토큰 수가 증가하면 계산량이 급격히 증가합니다.
코드-수식 연결
| 수식 | PyTorch 코드 | 설명 |
|---|---|---|
| Q = XW_Q | Q = x @ Wq |
query 생성 |
| K = XW_K | K = x @ Wk |
key 생성 |
| V = XW_V | V = x @ Wv |
value 생성 |
| softmax(QKᵀ/√d) | attn = softmax(Q @ K.T / sqrt(d)) |
attention weight |
| AV | output = attn @ V |
attention output |
자주 하는 오해 5개
- Attention은 단순히 가중합이라고 생각한다
- Query, Key, Value가 서로 다른 입력이라고 생각한다
- Self-attention은 순차 계산이라고 생각한다
- Attention score는 확률이라고 생각한다
- Scaling term √d_k가 중요하지 않다고 생각한다
체크리스트 (스스로 설명 가능해야 하는 질문)
- Self-attention의 핵심 아이디어는 무엇인가?
- Query, Key, Value는 어떻게 생성되는가?
- 왜 QKᵀ 연산을 사용하는가?
- √d_k로 나누는 이유는 무엇인가?
- Self-attention의 계산 복잡도는 왜 O(n²)인가?