한양과학기술고등학교

에듀테크 프로젝트 대시보드

셀프 어텐션 (Self-Attention)

셀프 어텐션 (Self-Attention)

"그는 사과를 먹었다. 그것은 맛있었다." 에서 그것이 가리키는 건 사과다. 문장의 각 단어가 같은 문장 안의 다른 단어들을 얼마나 참고할지 스스로 정하는 것이 셀프 어텐션이다. 단어마다 Query(내가 찾는 것), Key(내가 가진 꼬리표), Value(내가 건넬 정보) 세 벡터를 만들고, Query·Keyᵀ 내적으로 궁합을 재서 softmax로 비율을 매긴 뒤 그 비율대로 Value를 가중합한다. GPT·BERT 같은 트랜스포머의 심장이다. 아래에서 토큰을 눌러 그 단어가 어디에 주목하는지 살펴보자.

1. 어떤 단어에 주목할까 — 어텐션 행렬

아래 6개 토큰은 각각 4차원 벡터로 표현돼 있다(주어성·장소성·음식성·서술성). 여기서는 이해를 위해 WQ=WK=WV=I 로 두어 Query·Key 내적 = 두 단어 벡터의 유사도가 되도록 했다. 파란 토큰이 지금 보고 있는 Query. 화살표가 굵을수록, 히트맵 칸이 밝을수록 그 단어에 더 크게 주목한다는 뜻이다.

행 = Query 단어, 열 = 주목 대상(Key). 각 행의 합 = 1 (softmax)
낮추면 한 곳에 뾰족하게 몰리고, 높이면 고르게 퍼진다.
차원 dₖ가 커지면 내적값도 커져 softmax가 한 값으로 쏠리고 기울기가 죽는다. 그래서 √dₖ(여기선 2)로 나눠 크기를 눌러준다.

2. 한 토큰의 출력이 만들어지는 3단계

투영 (Projection)

입력 임베딩 x 에 학습된 가중치를 곱해 q = xWQ, k = xWK, v = xWV 세 벡터를 뽑는다. 같은 단어라도 역할이 셋으로 갈린다.

점수 & 정규화

내 q와 모든 k의 내적으로 궁합 점수를 낸다. score = q·kᵀ / √dₖ 를 softmax 에 넣어 합이 1인 가중치로 바꾼다.

가중합 (Weighted Sum)

가중치대로 모든 v를 섞는다. out = Σ αᵢ vᵢ. 이 문맥 벡터가 다음 층으로 넘어간다.

# 스케일드 닷-프로덕트 어텐션 (한 문장 X: [seq, d]) import numpy as np def softmax(z): e = np.exp(z - z.max(axis=-1, keepdims=True)) return e / e.sum(axis=-1, keepdims=True) def self_attention(X, Wq, Wk, Wv): Q, K, V = X @ Wq, X @ Wk, X @ Wv # 1. 투영 dk = Q.shape[-1] scores = Q @ K.T / np.sqrt(dk) # 2. 점수 / √dk A = softmax(scores) # 행별 softmax → 어텐션 행렬 return A @ V, A # 3. 가중합 + 어텐션 맵 반환
마스킹: GPT처럼 다음 단어를 예측하는 모델은 미래 토큰을 못 보게 scores 의 오른쪽 위 삼각형을 -∞ 로 채운 뒤 softmax 한다(causal mask).

3. 멀티헤드, 그리고 RNN과의 차이

어텐션을 한 번만 하면 관점이 하나뿐이다. 멀티헤드 어텐션은 Q·K·V를 h개(예: 8·12·96)의 작은 조각으로 쪼개 병렬로 어텐션을 계산한 뒤 이어붙인다. 한 헤드는 문법, 다른 헤드는 대명사 참조… 식으로 서로 다른 관계를 잡는다.

비교RNN / LSTM셀프 어텐션 (Transformer)
연산 방식왼→오 순차 처리, 이전 은닉 상태 필요모든 쌍을 한 번에 병렬 계산 (GPU 친화)
먼 단어 연결거리 n 만큼 정보가 전달돼 희미해짐거리와 무관, 직접 연결 (경로 길이 1)
계산량O(n·d²) — 길이에 선형O(n²·d) — 길이 제곱 (긴 문맥의 병목)
순서 정보구조상 내장없음 → 위치 인코딩을 따로 더해줌
길이 제곱 비용 때문에 FlashAttention, 슬라이딩 윈도우 어텐션, 선형 어텐션 등 긴 문맥을 싸게 처리하는 변형이 활발히 연구된다.

4. 핵심 정리

Q · K · V

Query는 질문, Key는 색인표, Value는 내용물. 도서관에서 검색어(Q)로 책 라벨(K)을 훑어 내용(V)을 꺼내는 것과 같다.

softmax 가중치

내적 점수를 합이 1인 확률로 바꾼다. "70%는 사과, 20%는 그, 10%는 …" 처럼 부드럽게 여러 곳을 동시에 참고할 수 있다.

√dₖ 스케일

차원이 클수록 내적이 커져 softmax가 포화된다. √dₖ로 나눠 기울기가 사라지지 않게 크기를 맞춘다.

병렬성

순차 의존이 없어 문장 전체를 한 행렬곱으로 처리한다. 트랜스포머가 대규모 학습에 유리한 핵심 이유.