Problème
La rétropropagation multiplie les gradients par la dérivée de chaque fonction d'activation. Implémentez activation_derivative(name, values) et renvoyez la dérivée en chaque valeur :
| name | Dérivée |
|---|---|
"sigmoid" | s × (1 - s), où s = 1 / (1 + e^(-x)) |
"relu" | 1 si x > 0, sinon 0 |
"leaky_relu" | 1 si x > 0, sinon 0.01 |
"tanh" | 1 - tanh(x)² |
Entrée
name : L'une des valeurs "sigmoid", "relu", "leaky_relu" ou "tanh".
values : Les entrées x de l'activation.
Sortie
Renvoyez la dérivée en chaque valeur, dans le même ordre.
Contraintes
1 ≤ longueur ≤ 1 000
-50 ≤ chaque valeur ≤ 50
Exemples
Entrée :
name = "sigmoid"
values = [0.0, 2.0]
Sortie attendue :
expected = [0.25, 0.104994]
Entrée :
std::string name = "sigmoid";
std::vector<double> values = {0.0, 2.0};
Sortie attendue :
std::vector<double> expected = {0.25, 0.104994};
Entrée :
string name = "sigmoid";
double[] values = new double[] {0.0, 2.0};
Sortie attendue :
double[] expected = new double[] {0.25, 0.104994};
Explication
En 0, s = 0.5 et la pente vaut 0.5 × 0.5 = 0.25, le point le plus raide de la sigmoïde. En 2, s ≈ 0.880797 et la pente vaut environ 0.104994.
Entrée :
name = "relu"
values = [-3.0, 0.0, 4.5]
Sortie attendue :
expected = [0.0, 0.0, 1.0]
Entrée :
std::string name = "relu";
std::vector<double> values = {-3.0, 0.0, 4.5};
Sortie attendue :
std::vector<double> expected = {0.0, 0.0, 1.0};
Entrée :
string name = "relu";
double[] values = new double[] {-3.0, 0.0, 4.5};
Sortie attendue :
double[] expected = new double[] {0.0, 0.0, 1.0};
Explication
ReLU est plate pour x ≤ 0 (pente 0) et a une pente de 1 pour x > 0, donc le résultat est [0, 0, 1].
Références
Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.