[1] aborda la pregunta:
Primero, los pesos no deben establecerse en ceros para romper la simetría cuando se reprograma:
Los sesgos generalmente se pueden inicializar a cero, pero los pesos se deben inicializar con cuidado 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:
- para unidades de tangente hiperbólica: muestrear un Uniforme (-r, r) con (fan-in es el número de entradas de la unidad).r=6fan-in+fan-out−−−−−−−−−√
- para unidades sigmoides: muestre un Uniforme (-r, r) con (fan-in es el número de entradas de la unidad).r=46fan-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)
, utilizarla u
como matriz de inicialización.
Además, la capacitación previa sin supervisión puede ayudar en algunas situaciones:
Una elección importante es si se debe usar un entrenamiento previo no supervisado (y qué algoritmo de aprendizaje de características no supervisado 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