Python으로 배우는 어텐션과 셀프 어텐션
어텐션은 각 토큰이 다른 토큰들을 살펴보고 어떤 것이 중요한지 결정하게 합니다. 모든 토큰에는 쿼리(찾는 것), 키(제공하는 것), 밸류(전달하는 정보)가 있습니다.
쉬운 말로 이해하는 개념
어텐션은 각 토큰이 다른 토큰들을 살펴보고 어떤 것이 중요한지 결정하게 합니다. 모든 토큰에는 쿼리(찾는 것), 키(제공하는 것), 밸류(전달하는 정보)가 있습니다.
쿼리, 키, 밸류로 scaled dot-product attention을 직접 계산하고, GPT처럼 causal mask를 더합니다.
핵심 아이디어
- 어텐션 가중치는 Softmax에서 나오므로 각 행의 합은 1입니다.
- √d로 나누면 긴 벡터에서도 점수가 너무 커지지 않습니다.
- causal mask는 생성 중에 토큰이 미래의 토큰을 보지 못하게 막습니다.
- 멀티 헤드 어텐션은 여러 어텐션을 병렬로 실행하고, 위치 인코딩은 단어 순서를 더합니다.
언제 사용하나요?
- 신경망과 AI 라이브러리 내부에서 무슨 일이 일어나는지 이해합니다.
- 해당 챌린지에서 직접 구현하기 전에 아이디어를 익힙니다.
- 머신러닝 강의, 면접, 프로젝트를 준비합니다.
직접 움직여 보기
히트맵의 행을 클릭하면 그 토큰이 어디를 보는지 알 수 있습니다. causal mask를 켜면 미래 토큰이 가려지고, 선명도를 바꾸면 어텐션이 집중됩니다.
예제 코드
main.py
import math
def softmax(row):
exps = [math.exp(v - max(row)) for v in row]
return [e / sum(exps) for e in exps]
# Three tokens, each with a query, key and value vector of size 2.
Q = [[1, 0], [0, 1], [1, 1]]
K = [[1, 0], [0, 1], [1, 1]]
V = [[10, 0], [0, 10], [5, 5]]
d = len(K[0])
def attention(causal=False):
out = []
for i, q in enumerate(Q):
# Score: how well this query matches every key, scaled by sqrt(d).
scores = [sum(a * b for a, b in zip(q, k)) / math.sqrt(d) for k in K]
if causal: # a token may only look at itself and earlier tokens
scores = [s if j <= i else -1e9 for j, s in enumerate(scores)]
weights = softmax(scores)
out.append([round(sum(w * v[c] for w, v in zip(weights, V)), 2) for c in range(2)])
return out
print("attention:", attention())
print("causal attention:", attention(causal=True))
예상 출력
attention: [[6.02, 3.98], [3.98, 6.02], [5.0, 5.0]]
causal attention: [[10.0, 0.0], [3.3, 6.7], [5.0, 5.0]]
작동 원리
각 쿼리에 대해 점수는 모든 키와의 내적을 √d로 나눈 값입니다. Softmax가 점수를 가중치로 바꾸고, 출력은 밸류들의 가중 평균입니다. causal mask를 쓰면 첫 번째 토큰은 자기 자신만 볼 수 있으므로 출력이 자신의 밸류인 [10, 0]과 정확히 같습니다.
값을 변경하고 Python 설치 없이 CodeUtility 온라인 Python 컴파일러에서 실행하세요.
연습 문제
입력값과 경계 조건을 바꾸고 더 큰 데이터에서도 동작을 확인하세요.
- 입력이나 가중치를 바꾸고 실행하기 전에 출력을 예상해 보세요.
- 중간 값을 출력해 계산의 각 단계를 따라가 보세요.
- 아래에 연결된 챌린지를 풀며 아이디어를 직접 구현해 보세요.
챌린지로 연습하기
이 레슨에서 배운 내용으로 실제 문제를 풀어 보세요. 모든 챌린지는 브라우저에서 실행되며 즉시 테스트와 AI 리뷰를 받을 수 있습니다.
- 사인파 위치 인코딩 트랜스포머가 토큰 임베딩에 더하는 사인과 코사인 위치 벡터를 계산합니다. 보통
- 스케일드 닷-프로덕트 어텐션 트랜스포머와 대규모 언어 모델의 핵심인 어텐션 연산을 구현합니다. 어려움
- 인과적(마스크) 셀프 어텐션 GPT 모델이 쓰는 마스크 어텐션을 구현합니다. 각 토큰은 자신과 이전 토큰만 볼 수 있습니다. 보통
- 멀티헤드 셀프 어텐션 입력을 쿼리, 키, 값으로 투영하고 여러 헤드에서 병렬로 어텐션을 실행한 뒤 결합합니다. 어려움