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

Hàm mất mát: MSE, MAE và cross-entropy

Đo mức sai của dự đoán bằng sai số bình phương trung bình, sai số tuyệt đối trung bình hoặc binary cross-entropy.

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

  • Đo sai số dự đoán theo ba cách
  • Giới hạn xác suất để tránh log(0)
  • Chọn hàm mất mát cho hồi quy hay phân loại

Đề bài

Xem bản gốc (English)

Hàm mất mát biến các sai sót của mô hình thành một con số cần làm nhỏ nhất. Hãy cài đặt compute_loss(kind, predictions, targets) cho ba hàm mất mát phổ biến, với n là số dự đoán:

  • "mse" (sai số bình phương trung bình): trung bình của (p - t)²
  • "mae" (sai số tuyệt đối trung bình): trung bình của |p - t|
  • "binary_cross_entropy": -trung bình của [t × ln(p) + (1 - t) × ln(1 - p)]. Trước tiên hãy giới hạn mỗi dự đoán p trong khoảng [0.0000001, 0.9999999] để không bao giờ tính ln(0).

Đầu vào

kind: "mse", "mae" hoặc "binary_cross_entropy".

predictions: Các dự đoán của mô hình.

targets: Các giá trị đúng (cùng độ dài). Với cross-entropy, chúng là 0 hoặc 1 và dự đoán nằm trong khoảng 0 đến 1.

Đầu ra

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

Ràng buộc

1 ≤ độ dài ≤ 1.000

-1.000 ≤ mỗi giá trị ≤ 1.000 (với cross-entropy: 0 ≤ p ≤ 1 và t ∈ {0, 1})

Ví dụ

Ví dụ 1
Đầu vào:
kind = "mse"
targets = [3.0, -0.5, 2.0]
predictions = [2.5, 0.0, 2.0]

Kết quả mong đợi:
expected = 0.166667
Đầu vào:
std::string kind = "mse";
std::vector<double> targets = {3.0, -0.5, 2.0};
std::vector<double> predictions = {2.5, 0.0, 2.0};

Kết quả mong đợi:
double expected = 0.166667;
Đầu vào:
string kind = "mse";
double[] targets = new double[] {3.0, -0.5, 2.0};
double[] predictions = new double[] {2.5, 0.0, 2.0};

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

Giải thích

Bình phương sai số: 0.5² = 0.25, 0.5² = 0.25 và 0² = 0. Trung bình là 0.5 / 3 ≈ 0.166667.

Ví dụ 2
Đầu vào:
kind = "binary_cross_entropy"
targets = [1.0, 0.0]
predictions = [0.9, 0.2]

Kết quả mong đợi:
expected = 0.164252
Đầu vào:
std::string kind = "binary_cross_entropy";
std::vector<double> targets = {1.0, 0.0};
std::vector<double> predictions = {0.9, 0.2};

Kết quả mong đợi:
double expected = 0.164252;
Đầu vào:
string kind = "binary_cross_entropy";
double[] targets = new double[] {1.0, 0.0};
double[] predictions = new double[] {0.9, 0.2};

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

Giải thích

-(ln(0.9) + ln(1 - 0.2)) / 2 = -(-0.105361 - 0.223144) / 2 ≈ 0.164252. Dự đoán đúng và tự tin cho giá trị mất mát nhỏ.

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.