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