Problema
Los pesos iniciales demasiado grandes o pequeños hacen que las redes profundas sean difíciles de entrenar. Dos métodos estándar eligen la escala según el tamaño de la capa, donde fan_in es el número de entradas y fan_out el de salidas:
| method | devuelve |
|---|---|
"xavier_uniform" | límite √(6 / (fan_in + fan_out)), pesos tomados de [-límite, límite] |
"xavier_normal" | desviación estándar √(2 / (fan_in + fan_out)) |
"he_uniform" | límite √(6 / fan_in) |
"he_normal" | desviación estándar √(2 / fan_in) |
Xavier (Glorot) es adecuada para capas sigmoide y tanh; He, para capas ReLU.
Implementa init_bound(method, fan_in, fan_out).
Entrada
method: Uno de "xavier_uniform", "xavier_normal", "he_uniform" o "he_normal".
fan_in, fan_out: El número de entradas y salidas de la capa.
Salida
Devuelve el límite o la desviación estándar como número decimal.
Restricciones
1 ≤ fan_in, fan_out ≤ 100 000
Ejemplos
Entrada:
fan_in = 3
method = "xavier_uniform"
fan_out = 3
Salida esperada:
expected = 1.0
Entrada:
long long fan_in = 3;
std::string method = "xavier_uniform";
long long fan_out = 3;
Salida esperada:
double expected = 1.0;
Entrada:
long fan_in = 3;
string method = "xavier_uniform";
long fan_out = 3;
Salida esperada:
double expected = 1.0;
Explicación
√(6 / (3 + 3)) = √1 = 1, así que los pesos se toman de [-1, 1].
Entrada:
fan_in = 50
method = "he_normal"
fan_out = 10
Salida esperada:
expected = 0.2
Entrada:
long long fan_in = 50;
std::string method = "he_normal";
long long fan_out = 10;
Salida esperada:
double expected = 0.2;
Entrada:
long fan_in = 50;
string method = "he_normal";
long fan_out = 10;
Salida esperada:
double expected = 0.2;
Explicación
He solo usa fan_in: √(2 / 50) = √0.04 = 0.2.
Referencias
Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.