กลับไปยังโจทย์
ง่าย 0 ข้อที่แก้แล้ว อัตราผ่าน 0%

อนุพันธ์ของฟังก์ชันกระตุ้น

คำนวณอนุพันธ์ของ sigmoid, ReLU, Leaky ReLU หรือ tanh ที่แต่ละค่า ซึ่งเป็นความชันที่ backpropagation ต้องใช้

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

  • คำนวณความชันของฟังก์ชันกระตุ้นที่นิยมใช้
  • นำเอาต์พุตของ sigmoid มาใช้คำนวณอนุพันธ์
  • เตรียมส่วนประกอบที่ backpropagation ต้องใช้

โจทย์

Backpropagation คูณ gradient ด้วย อนุพันธ์ ของฟังก์ชันกระตุ้นแต่ละตัว จง implement activation_derivative(name, values) และคืนค่าอนุพันธ์ที่แต่ละค่า:

nameอนุพันธ์
"sigmoid"s × (1 - s) โดยที่ s = 1 / (1 + e^(-x))
"relu"1 ถ้า x > 0 มิฉะนั้น 0
"leaky_relu"1 ถ้า x > 0 มิฉะนั้น 0.01
"tanh"1 - tanh(x)²

อินพุต

name: หนึ่งใน "sigmoid", "relu", "leaky_relu" หรือ "tanh"

values: อินพุต x ของฟังก์ชันกระตุ้น

เอาต์พุต

คืนค่าอนุพันธ์ที่แต่ละค่า ตามลำดับเดิม

เงื่อนไข

1 ≤ ความยาว ≤ 1,000

-50 ≤ แต่ละค่า ≤ 50

ตัวอย่าง

ตัวอย่างที่ 1
อินพุต:
name = "sigmoid"
values = [0.0, 2.0]

ผลลัพธ์ที่คาดหวัง:
expected = [0.25, 0.104994]
อินพุต:
std::string name = "sigmoid";
std::vector<double> values = {0.0, 2.0};

ผลลัพธ์ที่คาดหวัง:
std::vector<double> expected = {0.25, 0.104994};
อินพุต:
string name = "sigmoid";
double[] values = new double[] {0.0, 2.0};

ผลลัพธ์ที่คาดหวัง:
double[] expected = new double[] {0.25, 0.104994};

คำอธิบาย

ที่ 0 ค่า s = 0.5 และความชันคือ 0.5 × 0.5 = 0.25 ซึ่งเป็นจุดที่ชันที่สุดของ sigmoid ที่ 2 ค่า s ≈ 0.880797 และความชันประมาณ 0.104994

ตัวอย่างที่ 2
อินพุต:
name = "relu"
values = [-3.0, 0.0, 4.5]

ผลลัพธ์ที่คาดหวัง:
expected = [0.0, 0.0, 1.0]
อินพุต:
std::string name = "relu";
std::vector<double> values = {-3.0, 0.0, 4.5};

ผลลัพธ์ที่คาดหวัง:
std::vector<double> expected = {0.0, 0.0, 1.0};
อินพุต:
string name = "relu";
double[] values = new double[] {-3.0, 0.0, 4.5};

ผลลัพธ์ที่คาดหวัง:
double[] expected = new double[] {0.0, 0.0, 1.0};

คำอธิบาย

ReLU แบนราบเมื่อ x ≤ 0 (ความชัน 0) และมีความชัน 1 เมื่อ x > 0 ดังนั้นผลลัพธ์คือ [0, 0, 1]

แนวทางการแก้

ลองทำเองก่อน แล้วค่อยเปิดคำใบ้ทีละข้อ

คำใบ้ 1

อนุพันธ์ขึ้นกับชนิด activation ดังนั้นต้องแยกจัดการแต่ละฟังก์ชันสำหรับทุก input value

คำใบ้ 2

สำหรับ sigmoid และ tanh ให้ใช้ค่าที่ได้จาก activation เดิมหรือค่าฟังก์ชันมาตรฐานของมันแทนการคำนวณใหม่ทั้งหมด

คำใบ้ 3

ระวังจุดแบ่งเครื่องหมาย: ReLU ใช้เงื่อนไขมากกว่า 0 แบบ strict ส่วน leaky ReLU จะคง slope เล็กๆ สำหรับค่าที่ไม่เป็นบวก

ความซับซ้อนที่คาดหวัง

เวลา O(n), หน่วยความจำเพิ่ม O(n)

แหล่งอ้างอิง

โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน

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

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

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