Tất cả thử thách
Dễ 0 đã giải Tỷ lệ chấp nhận 0%

Hàm mất mát categorical cross-entropy

Đo mất mát của bộ phân loại nhiều lớp từ xác suất dự đoán và lớp đúng.

Bạn sẽ học được gì

  • Chấm xác suất dự đoán so với lớp đúng
  • Lấy trung bình mất mát trên các mẫu
  • Tránh log(0) bằng cách giới hạn

Đề bài

Xem bản gốc (English)

Bộ phân loại nhiều lớp đưa ra một xác suất cho mỗi lớp (ví dụ từ softmax). Categorical cross-entropy phạt mô hình khi nó gán xác suất thấp cho lớp đúng:

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

với pᵢ là xác suất mô hình gán cho lớp đúng của mẫu i. Để tránh ln(0), trước tiên hãy nâng mọi xác suất nhỏ hơn 0.0000001 lên 0.0000001.

Hãy cài đặt categorical_cross_entropy(probabilities, labels).

Đầu vào

probabilities: Mỗi mẫu một hàng, mỗi lớp một xác suất.

labels: Chỉ số lớp đúng của từng mẫu (bắt đầu từ 0).

Đầu ra

Trả về giá trị mất mát trung bình dưới dạng số thực.

Ràng buộc

1 ≤ số mẫu ≤ 1.000, 2 ≤ số lớp ≤ 100

0 ≤ mỗi xác suất ≤ 1

0 ≤ labels[i] < số lớp

Ví dụ

Ví dụ 1
Đầu vào:
labels = [0, 1]
probabilities = [
    [0.7, 0.2, 0.1],
    [0.1, 0.8, 0.1]
]

Kết quả mong đợi:
expected = 0.289909
Đầu vào:
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}
};

Kết quả mong đợi:
double expected = 0.289909;
Đầu vào:
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}
};

Kết quả mong đợi:
double expected = 0.289909;

Giải thích

Các lớp đúng nhận xác suất 0.7 và 0.8: -(ln(0.7) + ln(0.8)) / 2 = -(-0.356675 - 0.223144) / 2 ≈ 0.289909.

Ví dụ 2
Đầu vào:
labels = [1]
probabilities = [
    [1.0, 0.0]
]

Kết quả mong đợi:
expected = 16.118096
Đầu vào:
std::vector<long long> labels = {1};
std::vector<std::vector<double>> probabilities = {
    {1.0, 0.0}
};

Kết quả mong đợi:
double expected = 16.118096;
Đầu vào:
long[] labels = new long[] {1};
double[][] probabilities = new double[][] {
    new double[] {1.0, 0.0}
};

Kết quả mong đợi:
double expected = 16.118096;

Giải thích

Lớp đúng nhận xác suất 0, được nâng lên 0.0000001, nên mất mát là -ln(0.0000001) ≈ 16.118096: một câu trả lời sai mà tự tin bị phạt rất nặng.

Tham khảo

Thử thách này đã được điều chỉnh cho CodeUtility. Hãy làm theo đề bài và các ràng buộc ở trên.

Học hỏi từ người khác

Giải pháp cộng đồng

Chưa có giải pháp nào được chia sẻ. Hãy giải thử thách này để đăng giải pháp đầu tiên.