โจทย์
ฟังก์ชัน softmax เปลี่ยนลิสต์ของคะแนน (logit) ให้เป็นความน่าจะเป็น โมเดลภาษาใช้ฟังก์ชันนี้เลือกคำถัดไป:
softmax(x)_i = e^(x_i) / (e^(x_1) + e^(x_2) + … + e^(x_n))
คะแนนที่มีค่ามากทำให้ e^x ล้น ดังนั้นให้ลบคะแนนที่มากที่สุดออกจากทุกคะแนนก่อน ผลลัพธ์ทางคณิตศาสตร์ยังเหมือนเดิม
จงเขียน softmax(logits)
อินพุต
logits: ลิสต์ของคะแนน
เอาต์พุต
คืนค่าลิสต์ความน่าจะเป็นตามลำดับเดิม ทุกค่าอยู่ระหว่าง 0 ถึง 1 และรวมกันได้ 1
เงื่อนไข
1 ≤ ความยาว ≤ 1,000
-1,000 ≤ แต่ละคะแนน ≤ 1,000
ตัวอย่าง
อินพุต:
logits = [1.0, 2.0, 3.0]
ผลลัพธ์ที่คาดหวัง:
expected = [0.090031, 0.244728, 0.665241]
อินพุต:
std::vector<double> logits = {1.0, 2.0, 3.0};
ผลลัพธ์ที่คาดหวัง:
std::vector<double> expected = {0.090031, 0.244728, 0.665241};
อินพุต:
double[] logits = new double[] {1.0, 2.0, 3.0};
ผลลัพธ์ที่คาดหวัง:
double[] expected = new double[] {0.090031, 0.244728, 0.665241};
คำอธิบาย
e¹ ≈ 2.718, e² ≈ 7.389 และ e³ ≈ 20.086 รวมกันได้ 30.193 ดังนั้นความน่าจะเป็นประมาณ [0.090031, 0.244728, 0.665241]
อินพุต:
logits = [1000.0, 1000.0]
ผลลัพธ์ที่คาดหวัง:
expected = [0.5, 0.5]
อินพุต:
std::vector<double> logits = {1000.0, 1000.0};
ผลลัพธ์ที่คาดหวัง:
std::vector<double> expected = {0.5, 0.5};
อินพุต:
double[] logits = new double[] {1000.0, 1000.0};
ผลลัพธ์ที่คาดหวัง:
double[] expected = new double[] {0.5, 0.5};
คำอธิบาย
การคำนวณ e^1000 โดยตรงจะล้น เมื่อลบค่าที่มากที่สุดออกจะได้ [0, 0] และ e⁰ / (e⁰ + e⁰) = 0.5 สำหรับทั้งสองค่า
แหล่งอ้างอิง
โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน