Python으로 배우는 AI 개념

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 컴파일러에서 실행하세요.

연습 문제

입력값과 경계 조건을 바꾸고 더 큰 데이터에서도 동작을 확인하세요.

  1. 입력이나 가중치를 바꾸고 실행하기 전에 출력을 예상해 보세요.
  2. 중간 값을 출력해 계산의 각 단계를 따라가 보세요.
  3. 아래에 연결된 챌린지를 풀며 아이디어를 직접 구현해 보세요.
Python IDE에서 실행 →

챌린지로 연습하기

이 레슨에서 배운 내용으로 실제 문제를 풀어 보세요. 모든 챌린지는 브라우저에서 실행되며 즉시 테스트와 AI 리뷰를 받을 수 있습니다.

모든 챌린지