topic★★★★★난이도 · 약 30분
Self-Attention 직접 구현
6단계로 셀프 어텐션을 처음부터 구현하고 행렬 크기 변화를 추적한다.
#셀프 어텐션#NumPy#구현#차원 추적
왜 배우는가
'나는 고양이를 좋아한다' — 3개 토큰이 서로에게 얼마나 주목하는지 직접 계산해본다. 행렬 곱셈이 이렇게 많은데 차원이 안 꼬일까?
6단계로 어텐션을 처음부터 구현합니다
셀�� 어텐션 구현 6단계: Step 0: 입력 임베딩 (3 토큰 × 4 차원) Step 1: 가중치 행렬 W_Q, W_K, W_V 생성 Step 2: Q, K, V 계산 (행렬 곱) Step 3: 어텐션 스코어 = Q × Kᵀ Step 4: 스케일링 (÷ √d_k) Step 5: 소프트맥스 → 확률 가중치 Step 6: 가중 합 = Weights × V
'나는 고양이를 좋아한다'로 셀프 어텐션을 계산합니다
셀프 어텐션 6단계 전체 구현: 입력 → Q,K,V → 스코어 → 스케일 → Softmax → 가중합.
| 구현 6단계 | 설명 |
|---|---|
| Step 0 | 입력 임베딩 — (토큰 수 × 차원) 행렬 준비 |
| Step 1~2 | W_Q, W_K, W_V 생성 → 행렬 곱으로 Q, K, V 계산 |
| Step 3 | 어텐션 스코어 = Q × Kᵀ → (토큰 수 × 토큰 수) |
| Step 4 | ÷ √d_k 스케일링으로 값 안정화 |
| Step 5 | Softmax → 각 행의 합 = 1인 확률 가중치 |
| Step 6 | 가중 합 = Weights × V → 문맥이 섞인 출력 |
| 차원 추적 | 크기 |
|---|---|
| Q, K, V | (토큰 수, d_k) — 입력과 동일한 크기 |
| 스코어 행렬 | (토큰 수, 토큰 수) — 모든 쌍의 유사도 |
| 최종 출력 | (토큰 수, d_k) — 문맥 정보가 반영된 벡터 |
Softmax 적용 후 각 행의 합은 항상 1 — 총 100%의 주의를 배분한다
실기 드릴 5문항
edit실기 드릴 · 단답형
입력이 (3, 4)이고 W_Q가 (4, 4)일 때 Q = X × W_Q의 행렬 크기는?
check_circle실기 드릴 · OX
어텐션 가중치 행렬의 각 행의 합은 항상 1이다 (소프트맥스를 적용했으므로).
edit실기 드릴 · 단답형
3개 토큰, 4차원 임베딩일 때 어텐션 스코어 행렬(Q × Kᵀ)의 크기는?
edit실기 드릴 · 단답형
셀프 어텐션 코드의 빈칸: scores = Q @ K.T / np.sqrt(___)
check_circle실기 드릴 · OX
셀프 어텐션에서 마스킹(masking)은 미래 토큰 정보의 유출을 방지하기 위해 사용한다.