← 문제 목록/Log-Softmax Backward (역전파) [medium]
문제 해설

Log-Softmax Backward (역전파) [medium]

신경망 · medium

preview

Log-Softmax Backward [medium]

v1 log-softmax 의 forward 는 yi=xilogsumexp(x)y_i = x_i - \text{logsumexp}(x). 이제 역전파 공식:

yixj=δijsj,s=softmax(x)\frac{\partial y_i}{\partial x_j} = \delta_{ij} - s_j, \quad s = \text{softmax}(x)

upstream gradient g=L/yg = \partial L / \partial y 가 주어지면:

Lxj=igi(δijsj)=gjsjigi\frac{\partial L}{\partial x_j} = \sum_i g_i \left( \delta_{ij} - s_j \right) = g_j - s_j \cdot \sum_i g_i

벡터화 구현

axis 로 지정된 축을 기준으로 softmax 를 구한 뒤:

s = softmax(x, axis=axis)           # (..., K)
grad_in = g - s * g.sum(axis=axis, keepdims=True)

왜 이게 깔끔한가

  • Jacobian 을 명시적으로 만들 필요 없음 — O(K2)O(K^2) 가 아니라 O(K)O(K).
  • NLL loss 의 g = -e_y (one-hot) 를 대입하면 L/x=sey\partial L/\partial x = s - e_y (softmax-CE gradient) 로 정확히 환원됨.

불변식

임의의 g 에 대해 jL/xj=gjgi=0\sum_j \partial L/\partial x_j = \sum g_j - \sum g_i = 0. 로짓 전체를 상수만큼 올려도 log-softmax 가 shift-invariant 라는 사실의 쌍대.

과제

함수 log_softmax_backward(x, grad_output, axis=-1) 를 완성하세요.

  • x, grad_output: 같은 shape.
  • 반환: grad_input, 같은 shape.

테스트 케이스

#이름검증
1shape 일치
21D 수치 Jacobian 일치유한차분
32D (batch) 수치 일치
4NLL 패턴: g=-e_y → dx=s-e_ysoftmax-CE grad
5axis 합 = 0 (보존)
6큰 로짓 안정성finite
7shift 불변 dx(x+c) = dx(x)
코드 작성
Loading...
실행 결과

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