โจทย์
ฟังก์ชันค่าสูญเสีย เปลี่ยนความผิดพลาดของโมเดลให้เป็นตัวเลขเดียวที่ต้องทำให้น้อยที่สุด จงเขียน compute_loss(kind, predictions, targets) สำหรับฟังก์ชันค่าสูญเสียที่ใช้บ่อยสามแบบ โดย n คือจำนวนการทำนาย:
"mse"(ค่าคลาดเคลื่อนกำลังสองเฉลี่ย): ค่าเฉลี่ยของ (p - t)²"mae"(ค่าคลาดเคลื่อนสัมบูรณ์เฉลี่ย): ค่าเฉลี่ยของ |p - t|"binary_cross_entropy": ค่าลบของค่าเฉลี่ยของ [t × ln(p) + (1 - t) × ln(1 - p)] ก่อนอื่นให้จำกัดการทำนาย p แต่ละค่าให้อยู่ในช่วง [0.0000001, 0.9999999] เพื่อไม่ให้ต้องคำนวณ ln(0)
อินพุต
kind: "mse", "mae" หรือ "binary_cross_entropy"
predictions: ค่าที่โมเดลทำนาย
targets: ค่าที่ถูกต้อง (ความยาวเท่ากัน) สำหรับครอสเอนโทรปี ค่าจะเป็น 0 หรือ 1 และการทำนายอยู่ระหว่าง 0 ถึง 1
เอาต์พุต
คืนค่าความสูญเสียเป็นเลขทศนิยม
เงื่อนไข
1 ≤ ความยาว ≤ 1,000
-1,000 ≤ แต่ละค่า ≤ 1,000 (สำหรับครอสเอนโทรปี 0 ≤ p ≤ 1 และ t ∈ {0, 1})
ตัวอย่าง
อินพุต:
kind = "mse"
targets = [3.0, -0.5, 2.0]
predictions = [2.5, 0.0, 2.0]
ผลลัพธ์ที่คาดหวัง:
expected = 0.166667
อินพุต:
std::string kind = "mse";
std::vector<double> targets = {3.0, -0.5, 2.0};
std::vector<double> predictions = {2.5, 0.0, 2.0};
ผลลัพธ์ที่คาดหวัง:
double expected = 0.166667;
อินพุต:
string kind = "mse";
double[] targets = new double[] {3.0, -0.5, 2.0};
double[] predictions = new double[] {2.5, 0.0, 2.0};
ผลลัพธ์ที่คาดหวัง:
double expected = 0.166667;
คำอธิบาย
ค่าคลาดเคลื่อนกำลังสอง: 0.5² = 0.25, 0.5² = 0.25 และ 0² = 0 ค่าเฉลี่ยคือ 0.5 / 3 ≈ 0.166667
อินพุต:
kind = "binary_cross_entropy"
targets = [1.0, 0.0]
predictions = [0.9, 0.2]
ผลลัพธ์ที่คาดหวัง:
expected = 0.164252
อินพุต:
std::string kind = "binary_cross_entropy";
std::vector<double> targets = {1.0, 0.0};
std::vector<double> predictions = {0.9, 0.2};
ผลลัพธ์ที่คาดหวัง:
double expected = 0.164252;
อินพุต:
string kind = "binary_cross_entropy";
double[] targets = new double[] {1.0, 0.0};
double[] predictions = new double[] {0.9, 0.2};
ผลลัพธ์ที่คาดหวัง:
double expected = 0.164252;
คำอธิบาย
-(ln(0.9) + ln(1 - 0.2)) / 2 = -(-0.105361 - 0.223144) / 2 ≈ 0.164252 การทำนายที่ถูกต้องและมั่นใจจะให้ค่าสูญเสียน้อย
แนวทางการแก้
ลองทำเองก่อน แล้วค่อยเปิดคำใบ้ทีละข้อ
คำใบ้ 1
แต่ละ loss เปรียบเทียบ predictions กับ targets ทีละตัว แล้วค่อยเฉลี่ย error ต่อรายการ
คำใบ้ 2
สำหรับ cross-entropy ให้ clamp predictions ให้อยู่ห่างจาก 0 และ 1 ก่อนนำไป log
คำใบ้ 3
จำไว้ว่าค่า absolute กับการยกกำลังสองไม่เหมือนกัน และ cross-entropy ใช้ target เป็นตัวถ่วงน้ำหนักของแต่ละ log term
ความซับซ้อนที่คาดหวัง
เวลา O(n), หน่วยความจำเพิ่ม O(1)
แหล่งอ้างอิง
โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน