โจทย์
น้ำหนักเริ่มต้นที่ใหญ่หรือเล็กเกินไปทำให้ฝึกโครงข่ายลึกได้ยาก สองวิธีมาตรฐานเลือกสเกลจากขนาดของเลเยอร์ โดย fan_in คือจำนวนอินพุตและ fan_out คือจำนวนเอาต์พุต:
| method | คืนค่า |
|---|---|
"xavier_uniform" | ขอบเขต √(6 / (fan_in + fan_out)) สุ่มน้ำหนักจาก [-ขอบเขต, ขอบเขต] |
"xavier_normal" | ส่วนเบี่ยงเบนมาตรฐาน √(2 / (fan_in + fan_out)) |
"he_uniform" | ขอบเขต √(6 / fan_in) |
"he_normal" | ส่วนเบี่ยงเบนมาตรฐาน √(2 / fan_in) |
Xavier (Glorot) เหมาะกับเลเยอร์ sigmoid และ tanh ส่วน He เหมาะกับเลเยอร์ ReLU
จงเขียน init_bound(method, fan_in, fan_out)
อินพุต
method: หนึ่งใน "xavier_uniform", "xavier_normal", "he_uniform" หรือ "he_normal"
fan_in, fan_out: จำนวนอินพุตและเอาต์พุตของเลเยอร์
เอาต์พุต
คืนค่าขอบเขตหรือส่วนเบี่ยงเบนมาตรฐานเป็นเลขทศนิยม
เงื่อนไข
1 ≤ fan_in, fan_out ≤ 100,000
ตัวอย่าง
อินพุต:
fan_in = 3
method = "xavier_uniform"
fan_out = 3
ผลลัพธ์ที่คาดหวัง:
expected = 1.0
อินพุต:
long long fan_in = 3;
std::string method = "xavier_uniform";
long long fan_out = 3;
ผลลัพธ์ที่คาดหวัง:
double expected = 1.0;
อินพุต:
long fan_in = 3;
string method = "xavier_uniform";
long fan_out = 3;
ผลลัพธ์ที่คาดหวัง:
double expected = 1.0;
คำอธิบาย
√(6 / (3 + 3)) = √1 = 1 จึงสุ่มน้ำหนักจาก [-1, 1]
อินพุต:
fan_in = 50
method = "he_normal"
fan_out = 10
ผลลัพธ์ที่คาดหวัง:
expected = 0.2
อินพุต:
long long fan_in = 50;
std::string method = "he_normal";
long long fan_out = 10;
ผลลัพธ์ที่คาดหวัง:
double expected = 0.2;
อินพุต:
long fan_in = 50;
string method = "he_normal";
long fan_out = 10;
ผลลัพธ์ที่คาดหวัง:
double expected = 0.2;
คำอธิบาย
He ใช้เฉพาะ fan_in: √(2 / 50) = √0.04 = 0.2
แนวทางการแก้
ลองทำเองก่อน แล้วค่อยเปิดคำใบ้ทีละข้อ
คำใบ้ 1
แต่ละวิธีขึ้นกับขนาดของ layer และว่าต้องการขอบเขตหรือการกระจายแบบไหน
คำใบ้ 2
ใช้ fan_in อย่างเดียวสำหรับ He methods และใช้ fan_in กับ fan_out สำหรับ Xavier methods
คำใบ้ 3
อย่าสับสนสูตร uniform กับ normal เพราะอันหนึ่งให้ limit ส่วนอีกอันให้ standard deviation
ความซับซ้อนที่คาดหวัง
เวลา O(1), หน่วยความจำเพิ่ม O(1)
แหล่งอ้างอิง
โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน