
Log-Softmax Backward [medium]
v1 log-softmax 의 forward 는 yi=xi−logsumexp(x). 이제 역전파 공식:
∂xj∂yi=δij−sj,s=softmax(x)
upstream gradient g=∂L/∂y 가 주어지면:
∂xj∂L=∑igi(δij−sj)=gj−sj⋅∑igi
벡터화 구현
axis 로 지정된 축을 기준으로 softmax 를 구한 뒤:
s = softmax(x, axis=axis) # (..., K)
grad_in = g - s * g.sum(axis=axis, keepdims=True)
왜 이게 깔끔한가
- Jacobian 을 명시적으로 만들 필요 없음 — O(K2) 가 아니라 O(K).
- NLL loss 의
g = -e_y (one-hot) 를 대입하면 ∂L/∂x=s−ey (softmax-CE gradient) 로 정확히 환원됨.
불변식
임의의 g 에 대해 ∑j∂L/∂xj=∑gj−∑gi=0. 로짓 전체를 상수만큼 올려도 log-softmax 가 shift-invariant 라는 사실의 쌍대.
과제
함수 log_softmax_backward(x, grad_output, axis=-1) 를 완성하세요.
x, grad_output: 같은 shape.
- 반환:
grad_input, 같은 shape.
테스트 케이스
| # | 이름 | 검증 |
|---|
| 1 | shape 일치 | |
| 2 | 1D 수치 Jacobian 일치 | 유한차분 |
| 3 | 2D (batch) 수치 일치 | |
| 4 | NLL 패턴: g=-e_y → dx=s-e_y | softmax-CE grad |
| 5 | axis 합 = 0 (보존) | |
| 6 | 큰 로짓 안정성 | finite |
| 7 | shift 불변 dx(x+c) = dx(x) | |