Hasta donde sé, las dos fórmulas que proporcionó son más o menos la inicialización estándar. Había hecho una revisión de literatura hace un tiempo, la copié a continuación si estaba interesado.
[1] aborda la pregunta:
Primero, los pesos no deben establecerse en ceros para romper la simetría cuando se reprograma:
Los sesgos generalmente pueden inicializarse a cero, pero los pesos deben inicializarse cuidadosamente para romper la simetría entre las unidades ocultas de la misma capa. Debido a que las diferentes unidades de salida reciben diferentes señales de gradiente, este problema de ruptura de simetría no concierne a los pesos de salida (en las unidades de salida), que por lo tanto también se puede establecer en cero.
Algunas estrategias de inicialización:
- [2] y [3] recomiendan escalar por el inverso de la raíz cuadrada del abanico
- Glorot y Bengio (2010) y los Tutoriales de aprendizaje profundo utilizan una combinación de fan-in y fan-out:
- r = 6fan-in + fan-out---------√
- r = 4 6fan-in + fan-out---------√
- en el caso de los RBM, un gaussiano de media cero con una pequeña desviación estándar de alrededor de 0.1 o 0.01 funciona bien (Hinton, 2010) para inicializar los pesos.
- Inicialización de matriz aleatoria ortogonal, es decir
W = np.random.randn(ndim, ndim); u, s, v = np.linalg.svd(W)
, utilizar u
como matriz de inicialización.
Además, la capacitación previa sin supervisión puede ayudar en algunas situaciones:
Una opción importante es si se debe usar un entrenamiento previo sin supervisión (y qué algoritmo de aprendizaje de características no supervisado se debe usar) para inicializar los parámetros. En la mayoría de los entornos, hemos encontrado pre-entrenamiento no supervisado para ayudar y muy raramente dañar, pero por supuesto eso implica tiempo de entrenamiento adicional e hiperparámetros adicionales.
Algunas bibliotecas ANN también tienen algunas listas interesantes, por ejemplo, Lasagne :
Constant([val]) Initialize weights with constant value.
Normal([std, mean]) Sample initial weights from the Gaussian distribution.
Uniform([range, std, mean]) Sample initial weights from the uniform distribution.
Glorot(initializer[, gain, c01b]) Glorot weight initialization.
GlorotNormal([gain, c01b]) Glorot with weights sampled from the Normal distribution.
GlorotUniform([gain, c01b]) Glorot with weights sampled from the Uniform distribution.
He(initializer[, gain, c01b]) He weight initialization.
HeNormal([gain, c01b]) He initializer with weights sampled from the Normal distribution.
HeUniform([gain, c01b]) He initializer with weights sampled from the Uniform distribution.
Orthogonal([gain]) Intialize weights as Orthogonal matrix.
Sparse([sparsity, std]) Initialize weights as sparse matrix.
[1] Bengio, Yoshua. " Recomendaciones prácticas para la formación basada en gradientes de arquitecturas profundas " . Redes neuronales: trucos del oficio. Springer Berlin Heidelberg, 2012. 437-478.
[2] LeCun, Y., Bottou, L., Orr, GB y Muller, K. (1998a). Backprop eficiente. En redes neuronales, trucos del oficio .
[3] Glorot, Xavier y Yoshua Bengio. " Comprender la dificultad de entrenar redes neuronales de alimentación profunda ". Conferencia internacional sobre inteligencia artificial y estadística. 2010