Đề 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.
Hướng tiếp cận
Hãy tự thử trước, sau đó mở từng gợi ý một.
Gợi ý 1
Mỗi method chỉ phụ thuộc vào kích thước layer và việc bạn cần bound hay độ phân tán.
Gợi ý 2
Dùng fan_in một mình cho He methods, và fan_in cùng fan_out cho Xavier methods.
Gợi ý 3
Đừng nhầm công thức uniform và normal, vì một loại trả về limit còn loại kia trả về standard deviation.
Độ phức tạp mong đợi
thời gian O(1), bộ nhớ phụ O(1)
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.