Llegué a una situación en la que los pesos de mi red neuronal no convergen incluso después de 500 iteraciones. Mi red neuronal contiene 1 capa de entrada, 1 capa oculta y 1 capa de salida. Son alrededor de 230 nodos en la capa de entrada, 9 nodos en la capa oculta y 1 nodo de salida en la capa de salida. Quería saber si hago una condición de parada temprana (por ejemplo, parando mi entrenamiento de la red neuronal después de 100 iteraciones). ¿Qué efecto tendrá esto en el modelo?
¿También quería saber cuál es el estándar de trabajo de la industria si los pesos en la red neuronal no convergen?
machine-learning
neural-networks
Aprendiz
fuente
fuente
Respuestas:
Hay una serie de preguntas para hacer:
¿Qué puedes dar en el camino de las efemérides? ¿Puede decirnos algo sobre la naturaleza de los datos?
Podrías hacer un árbol de redes neuronales potenciado por gradiente.
Usted preguntó qué pasa si se detiene temprano.
Puedes probarlo tu mismo. Ejecute 300x donde comience con pesos inicializados al azar, y luego pare en un número específico de iteraciones, digamos 100. En ese punto calcule su error de conjunto, su error de subconjunto de entrenamiento y su error de conjunto de prueba. Repetir. Después de que tenga 300 valores para indicarle cuál es el error, puede hacerse una idea de su distribución de errores con 100 iteraciones de aprendizaje. Si lo desea, puede probar esa distribución en varios otros valores de aprendizaje. Sugiero 200, 500 y 1000 iteraciones. Esto le dará una idea de cómo cambia su SNR con el tiempo. Una gráfica del recuento de SNR vs iteración puede darle una idea sobre "acantilados" o "lo suficientemente bueno". A veces hay acantilados donde se derrumba el error. A veces el error es aceptable en ese punto.
Se necesitan datos "relativamente simples" o "bastante buena" suerte para que su sistema converja consistentemente en menos de 100 iteraciones. Los dos no son sobre repetibilidad ni son generalizables.
¿Por qué está pensando en términos de pesos convergentes y no en errores por debajo de un umbral particular? ¿Alguna vez has oído hablar de una paradoja de votación? ( enlace ) Cuando tiene interacciones cíclicas en su sistema (como la retroalimentación en las redes neuronales), puede tener paradojas de votación, cambios acoplados. No sé si el peso solo es un indicador suficiente para la convergencia de la red.
Puedes pensar en los pesos como un espacio. Tiene más de 3 dimensiones, pero sigue siendo un espacio. En el "centroide" de ese espacio está su región de "mejor ajuste". Lejos del centroide es un ajuste menos bueno. Puede pensar en la configuración actual de sus pesos como un único punto en ese espacio.
Ahora no sabes dónde está el "bien". Lo que tienes es una "pendiente" local. Puede realizar el descenso de gradiente hacia el local "mejor" dado dónde está su punto ahora. No te dice lo "universal" mejor, pero lo local es mejor que nada.
Entonces comienzas a iterar, caminando cuesta abajo hacia ese valle de mejoría. Usted itera hasta que cree que ha terminado. Quizás el valor de sus pesos sea grande. Tal vez están rebotando por todo el lugar. Tal vez el cálculo está "tomando demasiado tiempo". Quieres que se haga
Entonces, ¿cómo sabes si dónde estás es "suficientemente bueno"?
Aquí hay una prueba rápida que puedes hacer:
Tome 30 subconjuntos aleatorios uniformes de los datos (como un pequeño porcentaje de los datos cada uno) y vuelva a entrenar la red en ellos. Debería ser mucho más rápido. Observe cuánto tiempo les lleva converger y compárelo con el historial de convergencia del gran conjunto. Pruebe el error de la red para todos los datos en estos subconjuntos y vea cómo esa distribución de errores se compara con su gran error. Ahora aumente el tamaño del subconjunto hasta un 5% de sus datos y repita. Mira lo que esto te enseña.
Esta es una variación en la optimización del enjambre de partículas (ver referencia) modelada sobre cómo las abejas toman decisiones basadas en la exploración.
Preguntó qué sucede si los pesos no convergen.
Las redes neuronales son una herramienta. No son la única herramienta. Hay otros. Me gustaría ver el uso de uno de ellos.
Trabajo en términos de criterios de información, así que miro tanto los pesos (recuento de parámetros) como el error. Puedes probar uno de esos.
Hay algunos tipos de preprocesamiento que pueden ser útiles. Centro y escala. Rotar utilizando componentes principales. Si observa los valores propios en sus componentes principales, puede usar las reglas de trazado de skree para estimar la dimensión de sus datos. Reducir la dimensión puede mejorar la convergencia. Si sabe algo sobre la 'física subyacente', puede suavizar o filtrar los datos para eliminar el ruido. A veces, la convergencia se trata de ruido en el sistema.
La idea de la detección comprimida me parece interesante. Puede permitir submuestreo radical de algunos sistemas sin pérdida de generalización. Me gustaría ver algunas estadísticas y distribuciones de sus datos de muestreo de arranque para determinar si y en qué nivel de submuestreo el conjunto de entrenamiento se vuelve representativo. Esto le da una cierta medida de la "salud" de sus datos.
A veces es bueno que no converjan
¿Alguna vez has oído hablar de una paradoja de votación? Podrías pensar en ello como un primo de mayor cuenta en un callejón sin salida de dos vías. Es un bucle. En una paradoja de votación de 2 personas, la primera persona quiere al candidato "A" mientras que la segunda quiere al candidato "B" (o no A o tal). La parte importante es que puedes pensarlo como un bucle.
Los bucles son importantes en las redes neuronales. Retroalimentación. Recursividad Hizo que el perceptrón pudiera resolver problemas similares a XOR. Crea bucles y, a veces, los bucles pueden actuar como la paradoja de la votación, donde seguirán cambiando de peso si tuviera iteraciones infinitas. No están destinados a converger porque no es el peso individual lo que importa, sino la interacción de los pesos en el bucle.
Nota:
Usar solo 500 iteraciones puede ser un problema. He tenido NN's donde 10,000 iteraciones apenas fueron suficientes. El número de iteraciones para ser "suficiente" depende, como ya he indicado, de los datos, la topología NN, las funciones de transferencia de nodos, la función de aprendizaje / entrenamiento e incluso el hardware de la computadora. Debe comprender bien cómo interactúan todos con su recuento de iteraciones antes de decir que ha habido "suficientes" o "demasiadas" iteraciones. También se deben considerar otras consideraciones, como el tiempo, el presupuesto y lo que desea hacer con el NN cuando termine la capacitación.
Chen, RB, Chang, SP, Wang, W. y Wong, WK, (2011, septiembre). Diseños experimentales óptimos a través de métodos de optimización de enjambre de partículas (preimpresión), obtenido el 25 de marzo de 2012, de http://www.math.ntu.edu.tw/~mathlib/preprint/2011-03.pdf
fuente
Para mí es difícil decir cuál podría ser tu problema. Un punto a considerar es la implementación concreta que utiliza. Concretamente, qué algoritmo de optimización. Si su red tarda mucho en converger, y está utilizando alguna forma de descenso de gradiente estocástico (o mini-lote), entonces podría ser el caso de que su red esté en una meseta (una región donde la función de energía / error es muy plana) para que los gradientes sean muy bajos y, por lo tanto, converjan).
Si es así, verifique la magnitud de los gradientes para ver si este es el caso. Hay varias técnicas diferentes para tratar este problema, como agregar un impulso al gradiente.
Para obtener una descripción detallada de las técnicas y los trucos del oficio, eche un vistazo a este documento (debe leer) de Yann LeCun .
fuente
Asegúrese de que sus gradientes no vayan más allá de los límites o también es posible que los gradientes se vuelvan cero. Esto se conoce popularmente como gradientes explosivos y problemas de gradientes que desaparecen.
Una posible solución es usar un optimizador adaptativo como AdaGrad o Adam.
Me enfrenté a un problema similar mientras entrenaba una red neuronal simple cuando comencé con las redes neuronales.
Pocas referencias: https://en.wikipedia.org/wiki/Vanishing_gradient_problem https://www.youtube.com/watch?v=VuamhbEWEWA
fuente
He tenido muchos conjuntos de datos que convergieron lentamente, probablemente porque las entradas estaban altamente correlacionadas.
Escribí mi propio analizador C ++ NN, y con él, puedo variar la tasa de aprendizaje para cada peso. Por cada peso en cada borde hago dos cosas que ayudan un poco.
Primero, multiplico cada tasa de aprendizaje por un número aleatorio distribuido uniformemente de [0,1]. Supongo que eso ayuda con el problema de correlación.
El otro truco es que comparo el gradiente actual con el gradiente anterior en cada borde. Si el gradiente apenas se redujo porcentualmente, entonces multiplico la tasa de aprendizaje para esa ventaja por hasta 5.
No tengo ninguna justificación particular para ninguno de esos trucos, pero parecen funcionar bastante bien.
Espero que esto ayude.
fuente