트랜스포머·PEFT 2일 과정3장 · Attention과 Encoder7 / 18← 이전목차다음 →MetaContents

3장. Attention과 Encoder

Attention 흐름 다시 보기

요리사가 찌개를 끓인다고 해 봅시다. 먼저 "얼큰한 맛이 필요하다"고 정합니다(Query). 냉장고 재료의 이름표를 훑어 고춧가루와 청양고추를 고릅니다(Key 와 비교). 고른 재료를 비율대로 넣습니다(Value 섞기). 고춧가루를 많이 넣어도 다른 재료가 아예 빠지지는 않습니다. Attention 도 비율이 0.7 인 낱말만 쓰는 것이 아니라 모든 낱말의 V 를 비율대로 섞습니다.

Query 로 찾기, Key 와 견줘 고르기, Value 를 비율대로 섞기의 세 걸음을 이은 흐름도
원 논문 그림: 5번째 층의 Encoder Self-Attention 에서 making 이 멀리 떨어진 more difficult 쪽으로 여러 head 의 색 선을 잇는 시각화

원 논문의 시각화입니다. 위 줄과 아래 줄에 같은 문장이 놓여 있고, 위의 making 에서 아래 낱말들로 선이 이어집니다. 색은 head 마다 다릅니다. 여러 head 가 멀리 떨어진 more difficult 로 선을 이어 "making ... more difficult(더 어렵게 만들다)"라는 구절을 완성합니다. 처음에는 무작위 가중치라 이런 무늬가 없지만, 학습을 거치면 문법이나 뜻으로 이어진 낱말에 가중치가 모입니다.

세 걸음 정리

걸음맡는 벡터하는 일요리로 치면
찾기Query무엇이 필요한지 정한다"얼큰한 맛이 필요하다"
고르기Key, softmax점수를 비율로 바꾼다고춧가루 0.7, 마늘 0.2, 파 0.1
섞기Value비율대로 더한다모든 재료가 비율만큼 들어간다

짧은 예시

노트북의 "바로 확인하기" 문제를 그대로 계산해 봅니다. 참고 비율이 장비 0.7, 작업자 0.2, 점검했다 0.1 이면 문맥 벡터에는 장비의 V 만 들어갈까요?

Python
import numpy as np

# 설명을 위해 정한 V (특징 3개: [사물, 사람, 동작])
V = {
    "장비": np.array([1.0, 0.0, 0.0]),
    "작업자": np.array([0.0, 1.0, 0.0]),
    "점검했다": np.array([0.0, 0.0, 1.0]),
}
weights = {"장비": 0.7, "작업자": 0.2, "점검했다": 0.1}   # 합 1.0

# 비율 × V 를 모두 더한다
context = sum(weights[w] * V[w] for w in V)
print(context)
# 결과: [0.7 0.2 0.1] → 세 낱말의 V 가 모두 들어갔다

이 코드가 뜻하는 것

고춧가루를 70% 넣었다고 마늘과 파가 빠지지 않는 것처럼, 장비의 V 가 가장 크게 들어가고 작업자와 점검했다의 V 도 0.2, 0.1 만큼 들어갑니다. 여기서 재료가 V, 넣는 비율이 weights, 완성된 찌개가 context 입니다.

줄하는 일쉽게 말하면
V = {...}낱말마다 넘겨 줄 내용재료
weights = {...}softmax 를 거친 비율재료 비율
sum(weights[w] * V[w] ...)비율대로 더한다냄비에 넣고 섞기

주의할 점

  • Attention 가중치가 큰 곳이 늘 "모델이 그렇게 판단한 까닭"은 아닙니다. 시각화는 참고용이고, 설명의 증거로 쓸 때는 조심합니다.
  • head 하나의 무늬만 보고 모델 전체를 판단하지 않습니다. 같은 층에도 head 가 여러 개이고, 층마다 무늬가 다릅니다.
← 이전 절3장 · √d_k 로 나누는 까닭다음 절 →3장 · Multi-Head Attention