에듀테크 프로젝트 대시보드
셀프 어텐션 (Self-Attention)
"그는 사과를 먹었다. 그것은 맛있었다." 에서 그것이 가리키는 건 사과다.
문장의 각 단어가 같은 문장 안의 다른 단어들을 얼마나 참고할지 스스로 정하는 것이
셀프 어텐션이다. 단어마다 Query(내가 찾는 것), Key(내가 가진 꼬리표),
Value(내가 건넬 정보) 세 벡터를 만들고,
Query·Keyᵀ 내적으로 궁합을 재서 softmax로 비율을 매긴 뒤
그 비율대로 Value를 가중합한다. GPT·BERT 같은 트랜스포머의 심장이다.
아래에서 토큰을 눌러 그 단어가 어디에 주목하는지 살펴보자.
아래 6개 토큰은 각각 4차원 벡터로 표현돼 있다(주어성·장소성·음식성·서술성).
여기서는 이해를 위해 WQ=WK=WV=I 로 두어
Query·Key 내적 = 두 단어 벡터의 유사도가 되도록 했다. 파란 토큰이 지금 보고 있는
Query. 화살표가 굵을수록, 히트맵 칸이 밝을수록 그 단어에 더 크게 주목한다는 뜻이다.
dₖ가 커지면 내적값도 커져 softmax가 한 값으로 쏠리고 기울기가 죽는다.
그래서 √dₖ(여기선 2)로 나눠 크기를 눌러준다.
입력 임베딩 x 에 학습된 가중치를 곱해
q = xWQ, k = xWK,
v = xWV 세 벡터를 뽑는다. 같은 단어라도 역할이 셋으로 갈린다.
내 q와 모든 k의 내적으로 궁합 점수를 낸다.
score = q·kᵀ / √dₖ 를 softmax 에 넣어 합이 1인 가중치로 바꾼다.
가중치대로 모든 v를 섞는다.
out = Σ αᵢ vᵢ. 이 문맥 벡터가 다음 층으로 넘어간다.
scores 의 오른쪽 위 삼각형을 -∞ 로 채운 뒤 softmax 한다(causal mask).
어텐션을 한 번만 하면 관점이 하나뿐이다. 멀티헤드 어텐션은 Q·K·V를
h개(예: 8·12·96)의 작은 조각으로 쪼개 병렬로 어텐션을 계산한 뒤 이어붙인다.
한 헤드는 문법, 다른 헤드는 대명사 참조… 식으로 서로 다른 관계를 잡는다.
| 비교 | RNN / LSTM | 셀프 어텐션 (Transformer) |
|---|---|---|
| 연산 방식 | 왼→오 순차 처리, 이전 은닉 상태 필요 | 모든 쌍을 한 번에 병렬 계산 (GPU 친화) |
| 먼 단어 연결 | 거리 n 만큼 정보가 전달돼 희미해짐 | 거리와 무관, 직접 연결 (경로 길이 1) |
| 계산량 | O(n·d²) — 길이에 선형 | O(n²·d) — 길이 제곱 (긴 문맥의 병목) |
| 순서 정보 | 구조상 내장 | 없음 → 위치 인코딩을 따로 더해줌 |
Query는 질문, Key는 색인표, Value는 내용물. 도서관에서 검색어(Q)로 책 라벨(K)을 훑어 내용(V)을 꺼내는 것과 같다.
내적 점수를 합이 1인 확률로 바꾼다. "70%는 사과, 20%는 그, 10%는 …" 처럼 부드럽게 여러 곳을 동시에 참고할 수 있다.
차원이 클수록 내적이 커져 softmax가 포화된다. √dₖ로 나눠
기울기가 사라지지 않게 크기를 맞춘다.
순차 의존이 없어 문장 전체를 한 행렬곱으로 처리한다. 트랜스포머가 대규모 학습에 유리한 핵심 이유.