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].
So gehst du vor
Versuch es zuerst allein und öffne dann einen Hinweis nach dem anderen.
Hinweis 1
Die Ableitung hängt vom Aktivierungstyp ab, also behandle jede Funktion für jeden Eingabewert separat.
Hinweis 2
Bei sigmoid und tanh verwende den Aktivierungs-Output oder den Funktionswert direkt statt ihn auf komplizierte Weise neu zu berechnen.
Hinweis 3
Achte auf die Vorzeichen-Grenzen: ReLU nutzt einen strikten Positivtest, während leaky ReLU für nichtpositive Werte eine kleine Steigung behält values.
Erwartete Komplexität
Zeit O(n), zusätzlicher Speicher O(n)
Referenzen
Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.