https://medium.com/@anishnama20/understanding-cost-functions-in-machine-learning-types-and-applications-cd7d8cc4b47d
CCE 사용 시기
- 다중 클래스 분류: 인스턴스가 여러 가능한 범주 중 하나에만 속하는 문제에 이상적.
- 확률적 출력: 모델 출력이 각 클래스에 대한 확률일 때 유용.
- 출력층의 소프트맥스 활성화: 신경망의 마지막 계층에서 소프트맥스 활성화 함수와 함께 자주 사용됨.
CCE를 사용하지 않는 경우
- 이진 분류: 두 클래스 문제의 경우, 이진 교차 엔트로피가 더 적합함.
- 비확률적 출력: 모델 출력이 확률이 아닌 경우에는 적합하지 않음.
- 회귀 문제: 출력이 연속적인 값이라면 범주형이 아닌 회귀 작업에는 부적절.
장점
- 다중 클래스 문제에서의 성능: 다중 클래스를 효율적으로 처리하며 복잡한 분류 작업에서 좋은 결과를 제공.
- 소프트맥스와의 안정성: 확률을 정규화하기 때문에 소프트맥스 함수와 잘 작동하여 안정적인 훈련을 제공.
- 해석 가능한 손실 값: 모델이 예측한 확률 분포가 실제 분포와 얼마나 잘 일치하는지를 측정하는 해석 가능한 손실 값.
단점
- 불균형 데이터에 민감함: 훈련 데이터가 특정 클래스로 크게 치우친 경우 성능이 저하될 수 있음.
- 수치적 안정성 문제: CCE의 로그 함수는 특히 0에 가까운 확률에서 수치적 불안정을 일으킬 수 있음.
- 비범주형 출력에 부적합: 출력이 이산 범주가 아닌 작업, 예를 들어 회귀에는 부적합.
요약하자면, 범주형 교차 엔트로피는 다중 클래스 분류 작업에 강력하고 널리 사용되는 손실 함수.
특히 소프트맥스 출력 계층과 결합할 때 효과적.
그러나 데이터 불균형, 이진 분류 작업, 비확률적 모델 출력의 경우에는 효과가 감소.
BCE = LogLoss = 1/n sum(-(y_actual * log(y_pred) + (1-y_actual)*log(1-y_pred)))
CCE = -1/n * sum(sum(y_actual*log(y_pred)))
y_actual : truth value
y_pred : predicted probability
BCE
import numpy as np
y_pred = np.array([0.2, 0.8, 0.6, 0.3])
y_actual = np.array([0, 1, 1, 0])
n = len(y_pred)
bce = -1/n * np.sum(y_actual * np.log(y_pred) + (1 - y_actual) * np.log(1 - y_pred))
print('Binary Cross-Entropy:', bce)
CCE
import numpy as np
y_pred = np.array([[0.1, 0.3, 0.6], [0.2, 0.7, 0.1], [0.9, 0.05, 0.05]])
y_actual = np.array([[0, 0, 1], [0, 1, 0], [1, 0, 0]])
n = len(y_pred)
cce = -1/n * np.sum(np.sum(y_actual * np.log(y_pred)))
print('Categorical Cross-Entropy:', cce)