Zurück zu den Herausforderungen
Einfach 0 gelöst 0% Erfolgsquote

Xavier- und He-Gewichtsinitialisierung

Berechne den Bereich oder die Standardabweichung, mit der die Gewichte einer Schicht initialisiert werden.

Das lernst du

  • Initialisierungsbereiche für eine Schicht berechnen
  • Zwischen Xavier und He wählen
  • Verstehen, warum die Initialisierung wichtig ist

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:

methodgibt 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

Beispiel 1
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.

Beispiel 2
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.

Von anderen lernen

Community-Lösungen

Noch keine veröffentlichten Lösungen. Löse die Aufgabe und teile als Erster eine Lösung.