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?
Respuestas:
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
caret
paquete para obtener una mejor comprensión de su precisión (e incluso de la incertidumbre en su precisión). También en caret es loavNNet
que 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,avNNet
pero 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
pcaNNet
funció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.
fuente
nnet
pesos 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 elnnet
paquete y nunca he probado ninguna de las otras opciones. ¡La mejor de las suertes!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 .
fuente
nnet
de R base, se utiliza el método de optimización BFGS de Roptim
. 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.