Обратное распространение ошибки умножает градиенты на производную каждой функции активации. Реализуйте activation_derivative(name, values) и верните производную в каждой точке:
| name | Производная |
|---|---|
"sigmoid" | s × (1 - s), где s = 1 / (1 + e^(-x)) |
"relu" | 1, если x > 0, иначе 0 |
"leaky_relu" | 1, если x > 0, иначе 0.01 |
"tanh" | 1 - tanh(x)² |
Входные данные
name: Одно из "sigmoid", "relu", "leaky_relu" или "tanh".
values: Входы x функции активации.
Выходные данные
Верните производную в каждой точке в том же порядке.
Ограничения
1 ≤ длина ≤ 1 000
-50 ≤ каждое значение ≤ 50
Примеры
Ввод:
name = "sigmoid"
values = [0.0, 2.0]
Ожидаемый вывод:
expected = [0.25, 0.104994]
Ввод:
std::string name = "sigmoid";
std::vector<double> values = {0.0, 2.0};
Ожидаемый вывод:
std::vector<double> expected = {0.25, 0.104994};
Ввод:
string name = "sigmoid";
double[] values = new double[] {0.0, 2.0};
Ожидаемый вывод:
double[] expected = new double[] {0.25, 0.104994};
Пояснение
В точке 0 s = 0.5, и наклон равен 0.5 × 0.5 = 0.25 — самая крутая точка сигмоиды. В точке 2 s ≈ 0.880797, и наклон примерно 0.104994.
Ввод:
name = "relu"
values = [-3.0, 0.0, 4.5]
Ожидаемый вывод:
expected = [0.0, 0.0, 1.0]
Ввод:
std::string name = "relu";
std::vector<double> values = {-3.0, 0.0, 4.5};
Ожидаемый вывод:
std::vector<double> expected = {0.0, 0.0, 1.0};
Ввод:
string name = "relu";
double[] values = new double[] {-3.0, 0.0, 4.5};
Ожидаемый вывод:
double[] expected = new double[] {0.0, 0.0, 1.0};
Пояснение
ReLU плоская при x ≤ 0 (наклон 0) и имеет наклон 1 при x > 0, поэтому результат [0, 0, 1].
Как подступиться
Сначала попробуйте сами, затем открывайте подсказки по одной.
Подсказка 1
Производная зависит от типа activation, поэтому обрабатывайте каждую функцию отдельно для каждого значения входа.
Подсказка 2
Для sigmoid и tanh используйте уже найденный результат activation или его стандартное значение, вместо того чтобы пересчитывать всё с нуля сложным способом.
Подсказка 3
Следите за знаковыми порогами: ReLU использует строгое условие положительности, а leaky ReLU оставляет маленький наклон для не положительных значений.
Ожидаемая сложность
O(n) по времени, O(n) по дополнительной памяти
Ссылки
Это задание адаптировано для CodeUtility. Следуйте условию и ограничениям выше.