Problem
Zu große oder zu kleine Startgewichte machen tiefe Netze schwer trainierbar. Zwei Standardverfahren wählen die Skala anhand der Schichtgröße, wobei fan_in die Anzahl der Eingaben und fan_out die Anzahl der Ausgaben ist:
| method | gibt zurück |
|---|---|
"xavier_uniform" | Grenze √(6 / (fan_in + fan_out)), Gewichte aus [-Grenze, Grenze] |
"xavier_normal" | Standardabweichung √(2 / (fan_in + fan_out)) |
"he_uniform" | Grenze √(6 / fan_in) |
"he_normal" | Standardabweichung √(2 / fan_in) |
Xavier (Glorot) passt zu Sigmoid- und tanh-Schichten, He zu ReLU-Schichten.
Implementiere init_bound(method, fan_in, fan_out).
Eingabe
method: Einer der Werte "xavier_uniform", "xavier_normal", "he_uniform" oder "he_normal".
fan_in, fan_out: Die Anzahl der Eingaben und Ausgaben der Schicht.
Ausgabe
Gib die Grenze oder Standardabweichung als Dezimalzahl zurück.
Einschränkungen
1 ≤ fan_in, fan_out ≤ 100.000
Beispiele
Eingabe:
fan_in = 3
method = "xavier_uniform"
fan_out = 3
Erwartete Ausgabe:
expected = 1.0
Eingabe:
long long fan_in = 3;
std::string method = "xavier_uniform";
long long fan_out = 3;
Erwartete Ausgabe:
double expected = 1.0;
Eingabe:
long fan_in = 3;
string method = "xavier_uniform";
long fan_out = 3;
Erwartete Ausgabe:
double expected = 1.0;
Erläuterung
√(6 / (3 + 3)) = √1 = 1, also werden die Gewichte aus [-1, 1] gezogen.
Eingabe:
fan_in = 50
method = "he_normal"
fan_out = 10
Erwartete Ausgabe:
expected = 0.2
Eingabe:
long long fan_in = 50;
std::string method = "he_normal";
long long fan_out = 10;
Erwartete Ausgabe:
double expected = 0.2;
Eingabe:
long fan_in = 50;
string method = "he_normal";
long fan_out = 10;
Erwartete Ausgabe:
double expected = 0.2;
Erläuterung
He verwendet nur fan_in: √(2 / 50) = √0.04 = 0.2.
So gehst du vor
Versuch es zuerst allein und öffne dann einen Hinweis nach dem anderen.
Hinweis 1
Jede Methode hängt nur von den Layer-Größen ab und davon, ob du eine Grenze oder eine Streuung brauchst.
Hinweis 2
Verwende bei He-Methoden nur fan_in, und bei Xavier-Methoden fan_in plus fan_out.
Hinweis 3
Verwechsele Uniform- und Normal-Formeln nicht, denn die eine liefert ein Limit und die andere eine Standardabweichung.
Erwartete Komplexität
Zeit O(1), zusätzlicher Speicher O(1)
Referenzen
Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.