
Huber Loss + Gradient [medium]
v1 Huber 은 손실 값만 반환. 실제 학습에서는 gradient 도 필요 — backprop 의 한 블록으로 쓰이려면.
ei=y^i−yi 라 할 때 평균 Huber 손실:
L=N1∑iℓδ(ei),ℓδ(e)={21e2δ(∣e∣−21δ)∣e∣≤δ∣e∣>δ
y^i 에 대한 기울기:
∂y^i∂L=N1{eiδ⋅sign(ei)∣ei∣≤δ∣ei∣>δ
핵심
- 작은 오차 영역: ∂/∂y^=e/N (MSE 의 기울기 / N).
- 큰 오차 영역: ±δ/N (MAE 처럼 상한 걸림) — 이상치에 gradient 가 폭주하지 않음.
- ∣e∣=δ 경계에서 연속 미분 가능.
과제
함수 huber_with_grad(y_pred, y_true, delta) 를 완성하세요.
- 반환:
(loss, grad)
loss: Python float — 평균 Huber 손실.
grad: numpy array, shape = y_pred.shape — ∂L/∂ŷ.
- 힌트:
np.where(|e| <= δ, e, δ * np.sign(e)) / N.
테스트 케이스
| # | 이름 | 검증 |
|---|
| 1 | 반환 2-tuple (loss, grad) | |
| 2 | grad shape = y_pred.shape | |
| 3 | 완벽 예측 → loss=0, grad=0 | |
| 4 | 작은 오차 영역: grad_i = e_i / N | |
| 5 | 큰 오차 영역: grad 가 ±δ/N 로 clip | |
| 6 | delta 크면 grad ≈ (ŷ-y)/N (MSE grad) | |
| 7 | 수치 미분과 일치 | |