โจทย์ทั้งหมด
ง่าย 0 ข้อที่แก้แล้ว อัตราผ่าน 0%

ฟังก์ชันค่าสูญเสียแบบ categorical cross-entropy

วัดค่าสูญเสียของตัวจำแนกหลายคลาสจากความน่าจะเป็นที่ทำนายและคลาสที่ถูกต้อง

สิ่งที่คุณจะได้เรียนรู้

  • ประเมินความน่าจะเป็นที่ทำนายเทียบกับคลาสจริง
  • หาค่าเฉลี่ย loss ของทุกตัวอย่าง
  • เลี่ยง log(0) ด้วยการจำกัดค่า

โจทย์

ตัวจำแนกหลายคลาสให้ความน่าจะเป็นหนึ่งค่าต่อคลาส (เช่น จาก softmax) Categorical cross-entropy จะลงโทษเมื่อโมเดลให้ความน่าจะเป็นต่ำกับคลาสที่ถูกต้อง:

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 กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน

เรียนรู้จากคนอื่น

แนวทางจากชุมชน

ยังไม่มีวิธีทำที่เผยแพร่ ลองแก้โจทย์นี้เพื่อแชร์วิธีแรก