Volver a los desafíos
Fácil 0 resueltos 0% de aceptación

Inicialización de pesos Xavier y He

Calcula el rango o la desviación estándar usados para inicializar los pesos de una capa.

Lo que aprenderás

  • Calcular los rangos de inicialización de una capa
  • Elegir entre Xavier y He
  • Entender por qué importa la inicialización

Problema

Ver original (inglés)

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:

methoddevuelve
"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

Ejemplo 1
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].

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

Cómo abordarlo

Inténtalo primero por tu cuenta y luego abre las pistas una a una.

Pista 1

Cada método solo depende del tamaño de las capas y de si necesitas un límite o una dispersión.

Pista 2

Usa solo fan_in para los métodos de He, y fan_in más fan_out para los métodos de Xavier.

Pista 3

No confundas las fórmulas uniformes y normales, porque una devuelve un límite y la otra una desviación estándar.

Complejidad esperada

tiempo O(1), espacio extra O(1)

Referencias

Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.

Aprende de otros

Soluciones de la comunidad

Aún no hay soluciones publicadas. Resuelve este reto para compartir la primera.