loss 는 네 목표를 정확히 적은 것
loss 는 학습이 minimize 하려고 존재하는 바로 그 숫자야 — '이 예측이 얼마나 틀렸나' 를 optimizer 가 쫓을 수 있는 scalar 하나로 바꿔줘. 잘못 고르면 model 은 충실하게 *엉뚱한 걸* 최적화해, 에러 한 번 안 내고. 그래서 loss 선택은 장식이 아니라 '내가 실제로 푸는 문제가 뭔지' 선언이야.
task 와 label 형식을 같이 보고 매칭해 — loss 매칭이 흔한 첫 버그거든:
| Loss | Task | Label 형식 |
|---|---|---|
CategoricalCrossentropy | multi-class 분류 | one-hot: [0,0,1,0] |
SparseCategoricalCrossentropy | multi-class 분류 | 정수: 2 |
BinaryCrossentropy | binary / multi-label | 0 또는 1 |
MeanSquaredError | regression | 연속값 |
Huber | robust regression | 연속값 (outlier 강함) |
Sparse 냐 아니냐 — 다들 한 번씩 걸려. SparseCategoricalCrossentropy 는 2 같은 정수 label, 그냥 CategoricalCrossentropy 는 [0,0,1,0] 같은 one-hot. 서로 반대 형식 넣으면 잘 돼야 shape 에러, 못 되면 gradient 가 조용히 틀려. regression 은 outlier 있으면 plain MSE 말고 Huber — 0 근처에선 MSE 처럼, 꼬리에선 MAE 처럼 굴어서 튀는 몇 개가 gradient 를 지배 못 해.
from_logits=True — 공짜 안정성
마지막 layer 가 softmax/sigmoid 없이 raw score 를 내면 from_logits=True 써. activation 먹이고 loss 거는 거랑 수학적으로 동일하지만 Keras 가 둘을 합쳐 numerical 하게 안정적인 연산 하나로 만들어 — 중간 probability underflow 가 없어. Code 섹션에 두 형태 있고, Option B 가 기본값으로 삼을 쪽이야.