
88번 Embedding Lookup 의 forward: .
역전파는 반대로 — 출력 gradient shape (N, D) 를 임베딩 테이블 gradient shape (V, D) 로 흩뿌려서 누적:
인덱스 가 여러 번 등장하면 모두 더함. 이건 단순 인덱싱 dE[idx] = dY 로는 안 됨 (NumPy의 fancy indexing assignment 는 중복 key를 덮어씀) — np.add.at (unbuffered) 써야 함.
dE = np.zeros((V, D))
np.add.at(dE, idx, dY) # 안전한 scatter-add
잘못된 예시:
dE = np.zeros((V, D))
dE[idx] = dY # 중복 시 마지막 값만 살아남음!
dE[idx] += dY # dE[idx] 자체가 임시 복사본 → 중복 누적 안됨
torch.Tensor.scatter_add_, torch.Tensor.index_add_ 의 핵심.함수 embedding_backward(dY, idx, vocab_size) 를 완성하세요.
dY shape (N, D), idx shape (N,) 정수 in [0, V), vocab_size V.dE shape (V, D).np.add.at(dE, idx, dY).| # | 이름 | 검증 |
|---|---|---|
| 1 | shape (V, D) | |
| 2 | 사용 안된 인덱스 = 0 | |
| 3 | 단일 등장: dE[v] = dY[i] | |
| 4 | 중복 등장: 누적 합 | dE[v] = sum(dY) over 중복 |
| 5 | 손계산 | toy 예제 |
코드를 작성하고 Run 을 눌러보세요.