딥러닝 기초 (3) - 손실과 출력층: softmax와 교차 엔트로피
학습의 목표를 정하는 손실 함수와, 과제에 맞춘 출력층 설계를 정리합니다. 회귀의 MSE, 다중분류의 softmax와 교차 엔트로피, 이진분류의 sigmoid와 BCE가 왜 그렇게 짝지어지는지를 값으로 확인한 딥러닝 기초 (3)편입니다.
딥러닝 기초 시리즈의 3편입니다. 전체 목차는 0편에 있습니다. 1편의 순전파가 예측을 냈다면, 이 편은 그 예측이 얼마나 틀렸는지를 재는 손실과, 과제에 맞춘 출력층을 다룹니다.
학습의 목표를 하나의 수로
가중치를 바꾸려면 먼저 “지금 얼마나 틀렸는지”를 숫자 하나로 요약해야 합니다. 이것이 손실(loss)입니다. 손실은 가중치의 함수이고, 학습의 목표는 한 문장으로 정리됩니다 — 손실을 가장 작게 만드는 가중치를 찾는다.
무엇을 예측하느냐에 따라 출력층의 형태와 손실이 함께 정해집니다. 크게 회귀와 분류로 나뉩니다.
회귀: 출력 그대로, MSE
연속값(집값, 수요량)을 예측하는 회귀에서는, 출력층에 활성화를 씌우지 않고 값을 그대로 냅니다. 손실은 예측과 정답의 차이를 제곱해 평균 낸 평균제곱오차(MSE)입니다.
1
loss = np.mean((y_pred - y_true) ** 2)
제곱이라 큰 오차에 더 큰 벌점을 주고, 미분이 깔끔해 최적화에 잘 맞습니다.
다중 분류: softmax와 교차 엔트로피
여러 범주 중 하나를 고르는 분류에서는, 출력층이 각 범주의 점수(logit)를 내고 이를 확률로 바꿔야 합니다. 이때 쓰는 것이 softmax입니다. 점수를 지수화해 전체 합이 1이 되도록 정규화합니다.
1
2
3
4
5
def softmax(z):
e = np.exp(z - z.max()) # z.max()를 빼는 것은 수치 안정을 위해
return e / e.sum()
softmax(np.array([2.0, 1.0, 0.1])) # [0.659, 0.242, 0.099], 합 1.0
가장 큰 점수(2.0)가 가장 큰 확률(0.659)이 되고, 세 확률의 합은 1입니다. 이렇게 나온 확률에 대한 손실이 교차 엔트로피(cross-entropy)입니다. 정답 범주에 모델이 준 확률 p에 대해 -log(p)로 벌점을 매깁니다.
1
2
3
p = softmax(np.array([2.0, 1.0, 0.1])) # [0.659, 0.242, 0.099]
-np.log(p[0]) # 0.417 — 정답이 0번(확률 0.659): 맞춘 쪽 → 낮은 손실
-np.log(p[2]) # 2.317 — 정답이 2번(확률 0.099): 틀린 쪽 → 큰 손실
정답에 높은 확률을 줬으면 손실이 작고, 낮은 확률을 줬으면 손실이 급격히 커집니다. -log는 확률이 0에 가까울수록 무한대로 발산해, “확신에 찬 오답”을 강하게 벌합니다. softmax가 확률을 만들고 교차 엔트로피가 그 확률을 평가하는, 자연스러운 짝입니다.
이진 분류: sigmoid와 BCE
두 범주(참/거짓) 문제는 2편의 시그모이드로 출력을 0~1 확률로 만들고, 그에 맞는 이진 교차 엔트로피(BCE)를 손실로 씁니다. 다중 분류의 특수한 경우로 보면 됩니다.
정리
| 과제 | 출력층 | 손실 |
|---|---|---|
| 회귀 | 활성화 없음 (값 그대로) | MSE (평균제곱오차) |
| 이진 분류 | sigmoid | BCE (이진 교차 엔트로피) |
| 다중 분류 | softmax | 교차 엔트로피 |
| 개념 | 한 줄 요약 |
|---|---|
| 손실 | 얼마나 틀렸는지를 하나의 수로. 학습은 이걸 최소화 |
| softmax | 점수를 합이 1인 확률로 변환 |
| 교차 엔트로피 | 정답 확률에 -log 벌점. 확신에 찬 오답을 강하게 벌 |
이제 예측(순전파)과 손실이 갖춰졌습니다. 남은 것은 이 손실을 줄이는 방향을 어떻게 구하느냐입니다. 다음 편, 역전파입니다.