
v1 batched outer 는 각 샘플의 outer product. 실제 트랜스포머에서 더 자주 등장하는 것은 attention score:
(B, L_q, d): 쿼리 (각 위치별 벡터)(B, L_k, d): 키(B, L_q, L_k): 모든 query·key 쌍의 scaled inner product.Softmax 적용 전 단계. 이 점수에 소프트맥스를 씌우면 attention weight 가 된다 (다른 문제에서 다룸).
가 클수록 dot product 의 분산이 에 비례해 커짐. Softmax 는 큰 값에서 saturation 됨 → gradient 가 사라짐. 로 나누면 분산이 로 유지 → 안정적 학습 (Vaswani et al. 2017, "Attention is All You Need").
명시적 루프 없이 한 줄:
scores = Q @ K.transpose(0, 2, 1) / np.sqrt(d)
(B, L_q, d) @ (B, d, L_k) = (B, L_q, L_k) — numpy 의 배치 행렬곱 자연 지원.
함수 attention_scores(Q, K) 를 완성하세요.
(B, L_q, L_k).Q @ K.swapaxes(-1, -2) / np.sqrt(d) — swapaxes 또는 transpose.| # | 이름 | 검증 |
|---|---|---|
| 1 | shape (B, L_q, L_k) | |
| 2 | Q=K (self-attention) → 대각이 max | |
| 3 | 가 양수 (self-similarity) | |
| 4 | 수치: 손계산 가능한 toy | |
| 5 | B=1, L_q=1, L_k=1 → 스칼라 (B, 1, 1) | |
| 6 | scale 효과: 커져도 output 분산 안정 | |
| 7 | einsum 'bqd,bkd->bqk' 와 일치 (scale 적용 후) |
코드를 작성하고 Run 을 눌러보세요.