Problem
Backpropagation multipliziert Gradienten mit der Ableitung jeder Aktivierungsfunktion. Implementiere activation_derivative(name, values) und gib die Ableitung an jedem Wert zurück:
| name | Ableitung |
|---|---|
"sigmoid" | s × (1 - s), wobei s = 1 / (1 + e^(-x)) |
"relu" | 1, wenn x > 0, sonst 0 |
"leaky_relu" | 1, wenn x > 0, sonst 0.01 |
"tanh" | 1 - tanh(x)² |
Eingabe
name: Einer der Werte "sigmoid", "relu", "leaky_relu" oder "tanh".
values: Die Eingaben x der Aktivierung.
Ausgabe
Gib die Ableitung an jedem Wert in derselben Reihenfolge zurück.
Einschränkungen
1 ≤ Länge ≤ 1.000
-50 ≤ jeder Wert ≤ 50
Beispiele
Eingabe:
name = "sigmoid"
values = [0.0, 2.0]
Erwartete Ausgabe:
expected = [0.25, 0.104994]
Eingabe:
std::string name = "sigmoid";
std::vector<double> values = {0.0, 2.0};
Erwartete Ausgabe:
std::vector<double> expected = {0.25, 0.104994};
Eingabe:
string name = "sigmoid";
double[] values = new double[] {0.0, 2.0};
Erwartete Ausgabe:
double[] expected = new double[] {0.25, 0.104994};
Erläuterung
Bei 0 ist s = 0.5 und die Steigung 0.5 × 0.5 = 0.25, die steilste Stelle der Sigmoidfunktion. Bei 2 ist s ≈ 0.880797 und die Steigung etwa 0.104994.
Eingabe:
name = "relu"
values = [-3.0, 0.0, 4.5]
Erwartete Ausgabe:
expected = [0.0, 0.0, 1.0]
Eingabe:
std::string name = "relu";
std::vector<double> values = {-3.0, 0.0, 4.5};
Erwartete Ausgabe:
std::vector<double> expected = {0.0, 0.0, 1.0};
Eingabe:
string name = "relu";
double[] values = new double[] {-3.0, 0.0, 4.5};
Erwartete Ausgabe:
double[] expected = new double[] {0.0, 0.0, 1.0};
Erläuterung
ReLU ist für x ≤ 0 flach (Steigung 0) und hat für x > 0 die Steigung 1, also ist das Ergebnis [0, 0, 1].
Referenzen
Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.