ง่าย 0 ข้อที่แก้แล้ว อัตราผ่าน 0%

ฟังก์ชัน softmax

เปลี่ยนคะแนนดิบให้เป็นความน่าจะเป็นที่รวมกันได้ 1 โดยไม่เกิดการล้นของตัวเลขเมื่อค่ามีขนาดใหญ่

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

  • แปลงคะแนนเป็นความน่าจะเป็น
  • ลบค่ามากสุดเพื่อเลี่ยงค่าล้น
  • ทำให้ผลรวมเอาต์พุตเท่ากับ 1

โจทย์

ฟังก์ชัน 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

ตัวอย่าง

ตัวอย่างที่ 1
อินพุต:
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]

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

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

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

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