Problema
A retropropagação multiplica os gradientes pela derivada de cada função de ativação. Implemente activation_derivative(name, values) e retorne a derivada em cada valor:
| name | Derivada |
|---|---|
"sigmoid" | s × (1 - s), onde s = 1 / (1 + e^(-x)) |
"relu" | 1 se x > 0, senão 0 |
"leaky_relu" | 1 se x > 0, senão 0.01 |
"tanh" | 1 - tanh(x)² |
Entrada
name: Um entre "sigmoid", "relu", "leaky_relu" ou "tanh".
values: As entradas x da ativação.
Saída
Retorne a derivada em cada valor, na mesma ordem.
Restrições
1 ≤ comprimento ≤ 1.000
-50 ≤ cada valor ≤ 50
Exemplos
Entrada:
name = "sigmoid"
values = [0.0, 2.0]
Saída esperada:
expected = [0.25, 0.104994]
Entrada:
std::string name = "sigmoid";
std::vector<double> values = {0.0, 2.0};
Saída esperada:
std::vector<double> expected = {0.25, 0.104994};
Entrada:
string name = "sigmoid";
double[] values = new double[] {0.0, 2.0};
Saída esperada:
double[] expected = new double[] {0.25, 0.104994};
Explicação
Em 0, s = 0.5 e a inclinação é 0.5 × 0.5 = 0.25, o ponto mais íngreme da sigmoide. Em 2, s ≈ 0.880797 e a inclinação é cerca de 0.104994.
Entrada:
name = "relu"
values = [-3.0, 0.0, 4.5]
Saída esperada:
expected = [0.0, 0.0, 1.0]
Entrada:
std::string name = "relu";
std::vector<double> values = {-3.0, 0.0, 4.5};
Saída esperada:
std::vector<double> expected = {0.0, 0.0, 1.0};
Entrada:
string name = "relu";
double[] values = new double[] {-3.0, 0.0, 4.5};
Saída esperada:
double[] expected = new double[] {0.0, 0.0, 1.0};
Explicação
A ReLU é plana para x ≤ 0 (inclinação 0) e tem inclinação 1 para x > 0, então o resultado é [0, 0, 1].
Como abordar
Tente sozinho primeiro e depois abra uma dica de cada vez.
Dica 1
A derivada depende do tipo de activation, então trate cada função separadamente para cada valor de entrada.
Dica 2
Para sigmoid e tanh, reutilize a saída da activation ou seu valor da função em vez de recalcular do zero de um jeito complicado.
Dica 3
Observe os limiares de sinal: ReLU usa teste estritamente positivo, enquanto leaky ReLU mantém uma pequena inclinação para valores não positivos.
Complexidade esperada
tempo O(n), espaço extra O(n)
Referências
Este desafio foi adaptado para o CodeUtility. Siga o enunciado e as restrições acima.