Problema
Pesi iniziali troppo grandi o troppo piccoli rendono difficile addestrare le reti profonde. Due metodi standard scelgono la scala in base alla dimensione dello strato, dove fan_in è il numero di input e fan_out il numero di output:
| method | restituisce |
|---|---|
"xavier_uniform" | limite √(6 / (fan_in + fan_out)), pesi estratti da [-limite, limite] |
"xavier_normal" | deviazione standard √(2 / (fan_in + fan_out)) |
"he_uniform" | limite √(6 / fan_in) |
"he_normal" | deviazione standard √(2 / fan_in) |
Xavier (Glorot) è adatto agli strati sigmoide e tanh; He agli strati ReLU.
Implementa init_bound(method, fan_in, fan_out).
Input
method: Uno tra "xavier_uniform", "xavier_normal", "he_uniform" o "he_normal".
fan_in, fan_out: Il numero di input e di output dello strato.
Output
Restituisci il limite o la deviazione standard come numero decimale.
Vincoli
1 ≤ fan_in, fan_out ≤ 100.000
Esempi
Input:
fan_in = 3
method = "xavier_uniform"
fan_out = 3
Output atteso:
expected = 1.0
Input:
long long fan_in = 3;
std::string method = "xavier_uniform";
long long fan_out = 3;
Output atteso:
double expected = 1.0;
Input:
long fan_in = 3;
string method = "xavier_uniform";
long fan_out = 3;
Output atteso:
double expected = 1.0;
Spiegazione
√(6 / (3 + 3)) = √1 = 1, quindi i pesi vengono estratti da [-1, 1].
Input:
fan_in = 50
method = "he_normal"
fan_out = 10
Output atteso:
expected = 0.2
Input:
long long fan_in = 50;
std::string method = "he_normal";
long long fan_out = 10;
Output atteso:
double expected = 0.2;
Input:
long fan_in = 50;
string method = "he_normal";
long fan_out = 10;
Output atteso:
double expected = 0.2;
Spiegazione
He usa solo fan_in: √(2 / 50) = √0.04 = 0.2.
Come affrontarlo
Prova prima da solo, poi apri un suggerimento alla volta.
Suggerimento 1
Ogni metodo dipende solo dalle dimensioni del layer e dal fatto che serva un bound o una dispersione.
Suggerimento 2
Usa solo fan_in per i metodi He, e fan_in più fan_out per i metodi Xavier.
Suggerimento 3
Non confondere le formule uniformi e normali, perché una restituisce un limite e l'altra una deviazione standard.
Complessità attesa
tempo O(1), spazio aggiuntivo O(1)
Riferimenti
Questa sfida è adattata per CodeUtility. Segui la traccia e i vincoli sopra.