Problema
La retropropagazione moltiplica i gradienti per la derivata di ogni funzione di attivazione. Implementa activation_derivative(name, values) e restituisci la derivata in ogni valore:
| name | Derivata |
|---|---|
"sigmoid" | s × (1 - s), dove s = 1 / (1 + e^(-x)) |
"relu" | 1 se x > 0, altrimenti 0 |
"leaky_relu" | 1 se x > 0, altrimenti 0.01 |
"tanh" | 1 - tanh(x)² |
Input
name: Uno tra "sigmoid", "relu", "leaky_relu" o "tanh".
values: Gli input x dell'attivazione.
Output
Restituisci la derivata in ogni valore, nello stesso ordine.
Vincoli
1 ≤ lunghezza ≤ 1.000
-50 ≤ ogni valore ≤ 50
Esempi
Input:
name = "sigmoid"
values = [0.0, 2.0]
Output atteso:
expected = [0.25, 0.104994]
Input:
std::string name = "sigmoid";
std::vector<double> values = {0.0, 2.0};
Output atteso:
std::vector<double> expected = {0.25, 0.104994};
Input:
string name = "sigmoid";
double[] values = new double[] {0.0, 2.0};
Output atteso:
double[] expected = new double[] {0.25, 0.104994};
Spiegazione
In 0, s = 0.5 e la pendenza è 0.5 × 0.5 = 0.25, il punto più ripido della sigmoide. In 2, s ≈ 0.880797 e la pendenza è circa 0.104994.
Input:
name = "relu"
values = [-3.0, 0.0, 4.5]
Output atteso:
expected = [0.0, 0.0, 1.0]
Input:
std::string name = "relu";
std::vector<double> values = {-3.0, 0.0, 4.5};
Output atteso:
std::vector<double> expected = {0.0, 0.0, 1.0};
Input:
string name = "relu";
double[] values = new double[] {-3.0, 0.0, 4.5};
Output atteso:
double[] expected = new double[] {0.0, 0.0, 1.0};
Spiegazione
ReLU è piatta per x ≤ 0 (pendenza 0) e ha pendenza 1 per x > 0, quindi il risultato è [0, 0, 1].
Come affrontarlo
Prova prima da solo, poi apri un suggerimento alla volta.
Suggerimento 1
La derivata dipende dal tipo di attivazione, quindi tratta ogni funzione separatamente per ogni valore di input.
Suggerimento 2
Per sigmoid e tanh, riusa l'output dell'attivazione o il suo valore standard invece di ricalcolarlo da zero in modo complicato.
Suggerimento 3
Occhio ai test sul segno: ReLU usa un confronto stretto con zero, mentre leaky ReLU mantiene una piccola pendenza per i valori non positivi.
Complessità attesa
tempo O(n), spazio aggiuntivo O(n)
Riferimenti
Questa sfida è adattata per CodeUtility. Segui la traccia e i vincoli sopra.