¿Cómo mejoro la estabilidad de mi red neuronal?

11

Estoy usando el neuralnet en R para construir un NN con 14 entradas y una salida. Construyo / entreno la red varias veces usando los mismos datos de entrenamiento de entrada y la misma arquitectura / configuración de red.

Después de producir cada red, la uso en un conjunto independiente de datos de prueba para calcular algunos valores pronosticados. Estoy descubriendo que hay una gran variación en cada iteración de los datos pronosticados, a pesar de que todas las entradas (tanto los datos de entrenamiento como los de prueba) permanecen iguales cada vez que construyo la red.

Entiendo que habrá diferencias en las ponderaciones producidas dentro del NN cada vez y que no habrá dos redes neuronales que sean idénticas, pero ¿qué puedo tratar de producir redes que sean más consistentes en cada tren, dados los datos idénticos?

tfb
fuente
¿Puede darnos un poco más de detalles sobre el algoritmo de aprendizaje y la arquitectura que usted (o el paquete R) utilizó? ¿Cuántas capas tiene el NN?
Lucas
Hola Lucas, estoy usando el enlace de neuralnet del paquete R que tiene un buen artículo explicativo aquí enlace . Estoy usando una capa oculta de 8 neuronas. El algoritmo de aprendizaje es la retropropagación resistente con retroceso de peso.
tfb

Respuestas:

8

En general, obtendría más estabilidad al aumentar el número de nodos ocultos y al usar una disminución de peso adecuada (también conocida como penalización de cresta).

Específicamente, recomendaría usar el caretpaquete para obtener una mejor comprensión de su precisión (e incluso de la incertidumbre en su precisión). También en caret es lo avNNetque hace que un aprendiz de conjunto de múltiples redes neuronales reduzca el efecto de las semillas iniciales. Personalmente, no he visto una gran mejora con el uso, avNNetpero podría abordar su pregunta original.

También me aseguraría de que todas sus entradas estén debidamente acondicionadas. ¿Los ha ortogonalizado y luego los ha reescalado? Caret también puede hacer este preprocesamiento a través de su pcaNNetfunción.

Por último, puede considerar agregar algunas conexiones de capa de omisión. Sin embargo, debe asegurarse de que no haya valores atípicos / apalancamiento en sus datos para sesgar esas conexiones.

Shea Parkes
fuente
Curiosamente, cambié el entrenamiento de la red a la función 'nnet' (disponible en el paquete del mismo nombre) y los resultados en el conjunto de datos de prueba se han vuelto mucho más estables, tal vez algo relacionado con la diferente forma en que los pesos son inicializado entre los dos paquetes?
tfb
En los nnetpesos iniciales se inicializan todos a un número aleatorio uniforme entre -0.7 y 0.7 si recuerdo correctamente. Y puede controlar la magnitud en un parámetro. Honestamente, tuve mucha suerte con el nnetpaquete y nunca he probado ninguna de las otras opciones. ¡La mejor de las suertes!
Shea Parkes
1

No he trabajado con R, por lo que solo puedo dar consejos más generales.

¿Verificaste si el algoritmo converge? Una posible explicación podría ser que los diferentes conjuntos de parámetros están en algún lugar a la mitad del mismo óptimo.

Si el algoritmo siempre converge pero a un óptimo local diferente, entonces hay muchas heurísticas que podría intentar evitar. Una estrategia simple cuando se utiliza el descenso de gradiente estocástico (SGD) sería utilizar lotes más pequeños y un mayor impulso . Los tamaños de lote más pequeños introducen efectivamente algo de ruido en el entrenamiento que puede ayudar a escapar de algunos óptimos locales. Una estrategia mucho más sofisticada sería inicializar los pesos utilizando autoencoders .

Lucas
fuente
Así como un FYI, siempre y cuando él está usando el nnetde R base, se utiliza el método de optimización BFGS de R optim. Realmente calcula los gradientes para obtener una imagen de la superficie. No hay procesamiento por lotes ni parámetro de momento fijo en su implementación. Habiendo dicho todo eso, puede fallar fácilmente en converger; especialmente con basura adentro.
Shea Parkes
@SheaParkes gracias por los comentarios y respuestas Shea. De hecho, estoy usando el paquete de neuralnet; vea el comentario anterior. Utiliza un algoritmo de retropropagación resistente con retroceso de peso
tfb
Entonces mis disculpas Lucas, me perdí ese dato. Me alegra que lo hayas resuelto tfb.
Shea Parkes