모든 챌린지
쉬움 0명 해결 정답률 0%

범주형 교차 엔트로피 손실

예측 확률과 정답 클래스로 다중 클래스 분류기의 손실을 측정합니다.

배우게 될 내용

  • 예측 확률을 실제 클래스와 비교해 평가하기
  • 샘플 전체의 손실 평균 내기
  • 값을 제한해 log(0) 피하기

문제

원문 보기 (영어)

다중 클래스 분류기는 클래스마다 하나의 확률을 출력합니다(예를 들어 소프트맥스로). 범주형 교차 엔트로피는 정답 클래스에 낮은 확률을 줄 때 벌점을 줍니다.

loss = -(ln(p₁) + ln(p₂) + … + ln(pₙ)) / n

여기서 pᵢ는 샘플 i의 정답 클래스에 모델이 준 확률입니다. ln(0)을 피하려면 먼저 0.0000001보다 작은 확률을 0.0000001로 올리세요.

categorical_cross_entropy(probabilities, labels)를 구현하세요.

입력

probabilities: 샘플마다 한 행, 클래스마다 하나의 확률.

labels: 각 샘플의 정답 클래스 인덱스 (0부터 시작).

출력

평균 손실을 실수로 반환하세요.

제약 조건

1 ≤ 샘플 수 ≤ 1,000, 2 ≤ 클래스 수 ≤ 100

0 ≤ 각 확률 ≤ 1

0 ≤ labels[i] < 클래스 수

예시

예시 1
입력:
labels = [0, 1]
probabilities = [
    [0.7, 0.2, 0.1],
    [0.1, 0.8, 0.1]
]

예상 출력:
expected = 0.289909
입력:
std::vector<long long> labels = {0, 1};
std::vector<std::vector<double>> probabilities = {
    {0.7, 0.2, 0.1},
    {0.1, 0.8, 0.1}
};

예상 출력:
double expected = 0.289909;
입력:
long[] labels = new long[] {0, 1};
double[][] probabilities = new double[][] {
    new double[] {0.7, 0.2, 0.1},
    new double[] {0.1, 0.8, 0.1}
};

예상 출력:
double expected = 0.289909;

설명

정답 클래스의 확률은 0.7과 0.8입니다: -(ln(0.7) + ln(0.8)) / 2 = -(-0.356675 - 0.223144) / 2 ≈ 0.289909.

예시 2
입력:
labels = [1]
probabilities = [
    [1.0, 0.0]
]

예상 출력:
expected = 16.118096
입력:
std::vector<long long> labels = {1};
std::vector<std::vector<double>> probabilities = {
    {1.0, 0.0}
};

예상 출력:
double expected = 16.118096;
입력:
long[] labels = new long[] {1};
double[][] probabilities = new double[][] {
    new double[] {1.0, 0.0}
};

예상 출력:
double expected = 16.118096;

설명

정답 클래스의 확률이 0이라 0.0000001로 올라가므로, 손실은 -ln(0.0000001) ≈ 16.118096입니다: 자신 있게 틀린 답은 크게 벌점을 받습니다.

참고 자료

이 문제는 CodeUtility에 맞게 수정되었습니다. 위의 설명과 제한 조건을 따르세요.

다른 사람의 풀이 보기

커뮤니티 솔루션

아직 공개된 풀이가 없습니다. 문제를 풀고 첫 풀이를 공유하세요.