Cross-Entropy 손실 함수 쉽게 이해하기
머신러닝 코드를 보면 이런 줄이 꼭 나온다.
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
optimizer는 "학습 방법", metrics는 "측정 기준"인 건 알겠는데, loss에 있는 sparse_categorical_crossentropy는 대체 뭘까?
손실 함수가 뭐야?
손실 함수(Loss Function)는 "예측이 정답과 얼마나 다른지" 를 숫자로 계산하는 방법이다.
예측: "이건 2야" (확신 85%)
정답: "2"
손실: 0.16 (낮음 = 잘 맞춤)
예측: "이건 3이야" (확신 80%)
정답: "2"
손실: 3.0 (높음 = 틀림)
학습할 때 이 손실을 낮추는 방향으로 가중치를 조정한다. 그래서 손실 함수가 중요하다.
이름 뜯어보기
sparse_categorical_crossentropy를 분해하면:
| 부분 | 의미 |
|---|---|
| sparse | 정답이 숫자 하나 (예: 5) |
| categorical | 여러 개 중 하나 고르는 문제 (0~9 분류) |
| cross-entropy | 확률 차이 계산 방법 |
Cross-Entropy 계산법
핵심은 간단하다. 정답 위치의 예측 확률만 본다.
손글씨 "2"를 입력했을 때 모델이 이렇게 예측했다고 하자.
예측: [0.01, 0.02, 0.85, 0.02, 0.02, 0.02, 0.02, 0.02, 0.01, 0.01]
# 0 1 2 3 4 5 6 7 8 9
# ↑
# 정답 위치 = 85%
Cross-Entropy는 정답 위치(2번)의 확률만 가져와서 계산한다.
손실 = -log(0.85) = 0.16
만약 모델이 틀렸다면:
예측: [0.01, 0.02, 0.05, 0.80, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02]
# ↑
# 정답 위치 = 5%
손실 = -log(0.05) = 3.0
왜 -log를 쓰는가?
log 함수의 특성 때문이다.
| 정답 확률 | -log(확률) | 의미 |
|---|---|---|
| 100% (1.0) | 0 | 완벽하게 맞춤 |
| 85% (0.85) | 0.16 | 잘 맞춤 |
| 50% (0.5) | 0.69 | 반반 |
| 10% (0.1) | 2.3 | 많이 틀림 |
| 1% (0.01) | 4.6 | 거의 틀림 |
확률이 높으면 손실이 낮고, 확률이 낮으면 손실이 급격히 높아진다. 틀릴수록 강하게 페널티를 주는 구조다.
sparse vs 일반 categorical
정답 형식에 따라 두 가지가 있다.
sparse_categorical_crossentropy
정답이 숫자 하나일 때 사용한다.
train_labels = [5, 0, 4, 1, 9, 2, ...] # 그냥 숫자
MNIST 같은 대부분의 데이터셋이 이 형식이다.
categorical_crossentropy
정답이 원핫 인코딩일 때 사용한다.
# 5 → [0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
# 0 → [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
train_labels = [[0,0,0,0,0,1,0,0,0,0], [1,0,0,0,0,0,0,0,0,0], ...]
계산 결과는 똑같다. 정답 데이터 형식만 다를 뿐이다.
# 정답이 숫자면
loss='sparse_categorical_crossentropy'
# 정답이 원핫 인코딩이면
loss='categorical_crossentropy'
왜 "Cross"-Entropy인가?
원래 Entropy는 정보이론에서 나온 개념으로 "불확실성"을 측정한다. Cross-Entropy는 두 확률 분포 사이의 차이를 측정한다.
정답 분포: [0, 0, 1, 0, 0, 0, 0, 0, 0, 0] ← 2번이 100%
예측 분포: [0.01, 0.02, 0.85, ...] ← 2번이 85%
이 두 분포가 얼마나 다른지를 "cross"해서 계산한다고 해서 Cross-Entropy다. 자세한 수학은 몰라도 "두 분포 차이 = 손실"이라고 이해하면 된다.
다른 손실 함수들
분류 문제에는 Cross-Entropy를 쓰지만, 문제 종류에 따라 다른 손실 함수도 있다.
| 문제 유형 | 손실 함수 | 예시 |
|---|---|---|
| 다중 분류 | categorical_crossentropy | 0~9 숫자 분류 |
| 이진 분류 | binary_crossentropy | 개/고양이 분류 |
| 회귀 | mse (평균제곱오차) | 집값 예측 |
정리
loss='sparse_categorical_crossentropy'
이 한 줄이 하는 일:
- 모델의 예측 확률 중 정답 위치 확률을 가져온다
-log(확률)로 손실을 계산한다- 확률이 낮을수록(틀릴수록) 손실이 커진다
- 이 손실을 줄이는 방향으로 가중치를 조정한다
결국 "정답을 맞출 확률을 높여라" 는 목표를 수학적으로 표현한 것이다.
MNIST 신경망 동작 원리 글과 함께 보면 전체 학습 과정이 더 명확해진다.