Đề bài
Sau khi nơ-ron cộng các đầu vào đã nhân trọng số, hàm kích hoạt quyết định đầu ra của nó. Nếu không có hàm kích hoạt, mạng nơ-ron chỉ học được các đường thẳng.
Hãy cài đặt activate(name, values) và áp dụng hàm có tên tương ứng cho từng giá trị:
| name | công thức |
|---|---|
"sigmoid" | 1 / (1 + e^(-x)) |
"relu" | max(0, x) |
"leaky_relu" | x nếu x > 0, ngược lại 0.01 × x |
"tanh" | (e^x - e^(-x)) / (e^x + e^(-x)) |
Đầu vào
name: Một trong "sigmoid", "relu", "leaky_relu" hoặc "tanh".
values: Một danh sách số.
Đầu ra
Trả về danh sách đã áp dụng hàm kích hoạt cho từng giá trị, giữ nguyên thứ tự.
Ràng buộc
1 ≤ độ dài của values ≤ 1.000
-50 ≤ mỗi giá trị ≤ 50
Ví dụ
Đầu vào:
name = "sigmoid"
values = [0.0, 2.0, -2.0]
Kết quả mong đợi:
expected = [0.5, 0.880797, 0.119203]
Đầu vào:
std::string name = "sigmoid";
std::vector<double> values = {0.0, 2.0, -2.0};
Kết quả mong đợi:
std::vector<double> expected = {0.5, 0.880797, 0.119203};
Đầu vào:
string name = "sigmoid";
double[] values = new double[] {0.0, 2.0, -2.0};
Kết quả mong đợi:
double[] expected = new double[] {0.5, 0.880797, 0.119203};
Giải thích
sigmoid(0) = 1 / (1 + 1) = 0.5, sigmoid(2) ≈ 0.880797 và sigmoid(-2) ≈ 0.119203. Sigmoid ép mọi số vào khoảng từ 0 đến 1.
Đầu vào:
name = "relu"
values = [-1.5, 0.0, 3.0]
Kết quả mong đợi:
expected = [0.0, 0.0, 3.0]
Đầu vào:
std::string name = "relu";
std::vector<double> values = {-1.5, 0.0, 3.0};
Kết quả mong đợi:
std::vector<double> expected = {0.0, 0.0, 3.0};
Đầu vào:
string name = "relu";
double[] values = new double[] {-1.5, 0.0, 3.0};
Kết quả mong đợi:
double[] expected = new double[] {0.0, 0.0, 3.0};
Giải thích
ReLU giữ nguyên giá trị dương và biến giá trị âm thành 0: [0, 0, 3].
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 activation áp dụng độc lập cho từng số, nên hãy xử lý từng giá trị một.
Gợi ý 2
Dùng công thức đúng với tên đã cho và tạo một danh sách mới từ kết quả.
Gợi ý 3
Cẩn thận với số âm, nhất là ReLU và phần dốc leaky ở phía không dương.
Độ phức tạp mong đợi
thời gian O(n), bộ nhớ phụ O(n)
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.