Đề bài
Trọng số ban đầu quá lớn hoặc quá nhỏ khiến mạng sâu khó huấn luyện. Hai cách chuẩn chọn thang đo dựa trên kích thước lớp, với fan_in là số đầu vào và fan_out là số đầu ra:
| method | trả về |
|---|---|
"xavier_uniform" | giới hạn √(6 / (fan_in + fan_out)), trọng số lấy trong [-giới hạn, giới hạn] |
"xavier_normal" | độ lệch chuẩn √(2 / (fan_in + fan_out)) |
"he_uniform" | giới hạn √(6 / fan_in) |
"he_normal" | độ lệch chuẩn √(2 / fan_in) |
Xavier (Glorot) hợp với lớp sigmoid và tanh; He hợp với lớp ReLU.
Hãy cài đặt init_bound(method, fan_in, fan_out).
Đầu vào
method: Một trong "xavier_uniform", "xavier_normal", "he_uniform" hoặc "he_normal".
fan_in, fan_out: Số đầu vào và số đầu ra của lớp.
Đầu ra
Trả về giới hạn hoặc độ lệch chuẩn dưới dạng số thực.
Ràng buộc
1 ≤ fan_in, fan_out ≤ 100.000
Ví dụ
Đầu vào:
fan_in = 3
method = "xavier_uniform"
fan_out = 3
Kết quả mong đợi:
expected = 1.0
Đầu vào:
long long fan_in = 3;
std::string method = "xavier_uniform";
long long fan_out = 3;
Kết quả mong đợi:
double expected = 1.0;
Đầu vào:
long fan_in = 3;
string method = "xavier_uniform";
long fan_out = 3;
Kết quả mong đợi:
double expected = 1.0;
Giải thích
√(6 / (3 + 3)) = √1 = 1, nên trọng số được lấy trong [-1, 1].
Đầu vào:
fan_in = 50
method = "he_normal"
fan_out = 10
Kết quả mong đợi:
expected = 0.2
Đầu vào:
long long fan_in = 50;
std::string method = "he_normal";
long long fan_out = 10;
Kết quả mong đợi:
double expected = 0.2;
Đầu vào:
long fan_in = 50;
string method = "he_normal";
long fan_out = 10;
Kết quả mong đợi:
double expected = 0.2;
Giải thích
He chỉ dùng fan_in: √(2 / 50) = √0.04 = 0.2.
Tham khảo
Thử thách này đã được điều chỉnh cho CodeUtility. Hãy làm theo đề bài và các ràng buộc ở trên.