Problème
Des poids de départ trop grands ou trop petits rendent les réseaux profonds difficiles à entraîner. Deux méthodes standard choisissent l'échelle selon la taille de la couche, où fan_in est le nombre d'entrées et fan_out le nombre de sorties :
| method | renvoie |
|---|---|
"xavier_uniform" | limite √(6 / (fan_in + fan_out)), poids tirés dans [-limite, limite] |
"xavier_normal" | écart-type √(2 / (fan_in + fan_out)) |
"he_uniform" | limite √(6 / fan_in) |
"he_normal" | écart-type √(2 / fan_in) |
Xavier (Glorot) convient aux couches sigmoïde et tanh ; He convient aux couches ReLU.
Implémentez init_bound(method, fan_in, fan_out).
Entrée
method : l'une des valeurs "xavier_uniform", "xavier_normal", "he_uniform" ou "he_normal".
fan_in, fan_out : le nombre d'entrées et de sorties de la couche.
Sortie
Renvoyez la limite ou l'écart-type sous forme de nombre décimal.
Contraintes
1 ≤ fan_in, fan_out ≤ 100 000
Exemples
Entrée :
fan_in = 3
method = "xavier_uniform"
fan_out = 3
Sortie attendue :
expected = 1.0
Entrée :
long long fan_in = 3;
std::string method = "xavier_uniform";
long long fan_out = 3;
Sortie attendue :
double expected = 1.0;
Entrée :
long fan_in = 3;
string method = "xavier_uniform";
long fan_out = 3;
Sortie attendue :
double expected = 1.0;
Explication
√(6 / (3 + 3)) = √1 = 1, donc les poids sont tirés dans [-1, 1].
Entrée :
fan_in = 50
method = "he_normal"
fan_out = 10
Sortie attendue :
expected = 0.2
Entrée :
long long fan_in = 50;
std::string method = "he_normal";
long long fan_out = 10;
Sortie attendue :
double expected = 0.2;
Entrée :
long fan_in = 50;
string method = "he_normal";
long fan_out = 10;
Sortie attendue :
double expected = 0.2;
Explication
He n'utilise que fan_in : √(2 / 50) = √0.04 = 0.2.
Références
Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.