← 문제 목록/NLL Loss (Negative Log-Likelihood)
문제 해설

NLL Loss (Negative Log-Likelihood)

손실 함수 · easy

preview

NLL Loss (Negative Log-Likelihood)

91번 log-softmax-v1 의 자연스러운 다음 단계. 분류 문제에서 정답 클래스의 확률에 음의 로그 를 취한 것이 손실:

L=1Ni=1Nlogpi,yiL = -\frac{1}{N} \sum_{i=1}^{N} \log p_{i, y_i}

  • pp: softmax-v1 확률 (N, C).
  • yy: 정수 레이블 (N,).
  • 선택하는 인덱스: p[i, y_i].

log-softmax-v1 와 결합

수치 안정을 위해 log(softmax-v1) 를 직접 쓰지 않고 logits → log_softmax-v1 → gather 한 번에:

L=1Nilogsoftmax-v1(xi)yiL = -\frac{1}{N} \sum_i \text{logsoftmax-v1}(x_i)_{y_i}

이게 PyTorch F.cross_entropy-v1 의 실제 내부 구현.

직관

  • 정답 클래스 확률이 1 → log 1 = 0 → loss 0.
  • 정답 확률 0.5 → log 0.5 ≈ -0.69 → loss 0.69.
  • 정답 확률 0 → log 0 = -∞ → loss ∞ (이래서 logits 에서 직접 계산).

과제

함수 nll_loss(logits, y) 를 완성하세요.

  • logits shape (N, C), y shape (N,) 정수 [0, C).
  • 반환: Python float (배치 평균).
  • 힌트:
    1. m = logits.max(axis=1, keepdims=True) 안정화.
    2. lse = m.squeeze() + np.log(np.exp(logits - m).sum(axis=1)).
    3. log_p_y = logits[np.arange(N), y] - lse.
    4. return -log_p_y.mean().

테스트 케이스

#이름검증
1완벽 예측 → ~0정답 logit ≫ 나머지
2균등 logits → log(C)
3Python float 반환
4큰 logit 에서 finite (log-sum-exp trick)
5손계산 일치
코드 작성
Loading...
실행 결과

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