Dễ 0 đã giải Tỷ lệ chấp nhận 0%

Các hàm kích hoạt

Áp dụng sigmoid, ReLU, Leaky ReLU hoặc tanh cho từng giá trị trong danh sách.

Bạn sẽ học được gì

  • Cài đặt các hàm kích hoạt phổ biến
  • Hiểu vì sao mạng cần tính phi tuyến
  • Tránh tràn số trong hàm sigmoid

Đề bài

Xem bản gốc (English)

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ị:

namecô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ụ

Ví dụ 1
Đầ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.

Ví dụ 2
Đầ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.

Học hỏi từ người khác

Giải pháp cộng đồng

Chưa có giải pháp nào được chia sẻ. Hãy giải thử thách này để đăng giải pháp đầu tiên.