← 문제 목록/Embedding Backward (scatter-add)
문제 해설

Embedding Backward (scatter-add)

역전파 · easy

preview

Embedding Backward (scatter-add)

88번 Embedding Lookup 의 forward: outi=Eidxi\text{out}_i = E_{\text{idx}_i}. 역전파는 반대로 — 출력 gradient dYdY shape (N, D) 를 임베딩 테이블 gradient dEdE shape (V, D)흩뿌려서 누적:

dEv,:=i:idxi=vdYi,:dE_{v, :} = \sum_{i : \text{idx}_i = v} dY_{i, :}

인덱스 vv 가 여러 번 등장하면 모두 더함. 이건 단순 인덱싱 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] 자체가 임시 복사본 → 중복 누적 안됨

왜 중요?

  • Transformer 는 같은 토큰 (예: "the") 이 배치·시퀀스에 수없이 등장.
  • 모든 등장에서의 gradient 를 정확히 합산 해야 embedding 학습이 맞음.
  • PyTorch 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).

테스트 케이스

#이름검증
1shape (V, D)
2사용 안된 인덱스 = 0
3단일 등장: dE[v] = dY[i]
4중복 등장: 누적 합dE[v] = sum(dY) over 중복
5손계산toy 예제
코드 작성
Loading...
실행 결과

코드를 작성하고 Run 을 눌러보세요.