Estoy entrenando una red neuronal pero la pérdida de entrenamiento no disminuye. ¿Cómo puedo arreglar esto?
No estoy preguntando sobre el sobreajuste o la regularización. Estoy preguntando cómo resolver el problema donde el rendimiento de mi red no mejora en el conjunto de entrenamiento .
Esta pregunta es intencionalmente general, de modo que otras preguntas sobre cómo entrenar una red neuronal pueden cerrarse como un duplicado de esta, con la actitud de que "si le das un pescado a un hombre, lo alimentas por un día, pero si le enseñas un hombre para pescar, puedes alimentarlo por el resto de su vida ". Vea este hilo Meta para una discusión: ¿Cuál es la mejor manera de responder a las preguntas "mi red neuronal no funciona, por favor solucione"?
Si su red neuronal no se generaliza bien, vea: ¿Qué debo hacer cuando mi red neuronal no se generaliza bien?
fuente
Respuestas:
La prueba de unidad es tu amiga
Hay un dicho entre los escritores que dice: "Toda escritura es reescritura", es decir, la mayor parte de la escritura está revisando. Para los programadores (o al menos científicos de datos), la expresión podría reformularse como "Toda la codificación es depuración".
Cada vez que está escribiendo código, debe verificar que funcione según lo previsto. El mejor método que he encontrado para verificar la corrección es dividir el código en segmentos pequeños y verificar que cada segmento funcione. Esto se puede hacer comparando la salida del segmento con lo que sabe que es la respuesta correcta. Esto se llama prueba unitaria . Escribir buenas pruebas unitarias es una pieza clave para convertirse en un buen estadístico / científico de datos / experto en aprendizaje automático / profesional de redes neuronales. Simplemente no hay sustituto.
¡Debe verificar que su código esté libre de errores antes de poder ajustar el rendimiento de la red! De lo contrario, también podría reorganizar las tumbonas en el RMS Titanic .
Hay dos características de las redes neuronales que hacen que la verificación sea aún más importante que para otros tipos de aprendizaje automático o modelos estadísticos.
Las redes neuronales no son algoritmos "listos para usar" en la forma en que lo son los bosques aleatorios o la regresión logística. Incluso para redes simples de alimentación, la responsabilidad recae principalmente en el usuario para tomar numerosas decisiones sobre cómo se configura, conecta, inicializa y optimiza la red. Esto significa escribir código, y escribir código significa depurar.
Incluso cuando se ejecuta un código de red neuronal sin generar una excepción, ¡la red puede tener errores! Estos errores pueden incluso ser del tipo insidioso para el que se entrenará la red, pero se atascan en una solución subóptima, o la red resultante no tiene la arquitectura deseada. ( Este es un ejemplo de la diferencia entre un error sintáctico y semántico ).
Esta publicación mediana , " Cómo probar el código de aprendizaje automático de la unidad ", de Chase Roberts, analiza las pruebas unitarias para modelos de aprendizaje automático con más detalle. Tomé prestado este ejemplo de código con errores del artículo:
¿Ves el error? Muchas de las diferentes operaciones no se utilizan realmente porque los resultados anteriores se sobrescriben con nuevas variables. El uso de este bloque de código en una red seguirá entrenando y los pesos se actualizarán y la pérdida podría incluso disminuir, pero el código definitivamente no está haciendo lo que se pretendía. (El autor también es inconsistente sobre el uso de comillas simples o dobles, pero eso es puramente estilístico).
Los errores de programación más comunes relacionados con las redes neuronales son
Rastrear antes de caminar; Camina antes de correr
Las redes neuronales anchas y profundas, y las redes neuronales con cableado exótico, son lo más importante en este momento en el aprendizaje automático. Pero estas redes no surgieron plenamente formadas; sus diseñadores construyeron para ellos desde unidades más pequeñas. Primero, construya una red pequeña con una sola capa oculta y verifique que funcione correctamente. A continuación, agregue de forma incremental la complejidad del modelo adicional y verifique que cada uno de ellos también funcione.
Muy pocas neuronas en una capa pueden restringir la representación que la red aprende, causando una falta de adaptación. Demasiadas neuronas pueden causar un sobreajuste porque la red "memorizará" los datos de entrenamiento.
Incluso si se puede demostrar que no es, matemáticamente, sólo un pequeño número de neuronas necesarias para modelar un problema, es a menudo el caso de que tener "un poco más" neuronas hace que sea más fácil para el optimizador para encontrar una configuración de "bueno". (Pero no creo que nadie entienda completamente por qué este es el caso.) Proporciono un ejemplo de esto en el contexto del problema XOR aquí: ¿No son necesarias mis iteraciones para entrenar NN para XOR con MSE <0.001 demasiado alto? .
Elegir el número de capas ocultas permite a la red aprender una abstracción de los datos sin procesar. El aprendizaje profundo está de moda en estos días, y las redes con una gran cantidad de capas han mostrado resultados impresionantes. Pero agregar demasiadas capas ocultas puede hacer que se sobreajuste el riesgo o dificultar la optimización de la red.
Elegir un cableado de red inteligente puede hacer mucho del trabajo por usted. ¿Su fuente de datos es susceptible de arquitecturas de red especializadas? Las redes neuronales convolucionales pueden lograr resultados impresionantes en fuentes de datos "estructurados", imágenes o datos de audio. Las redes neuronales recurrentes pueden funcionar bien en tipos de datos secuenciales, como el lenguaje natural o los datos de series temporales. Las conexiones residuales pueden mejorar las redes de alimentación profunda.
El entrenamiento de redes neuronales es como abrir cerraduras
Para lograr resultados de vanguardia, o incluso simplemente buenos, debe haber configurado todas las piezas para que funcionen bien juntas . Establecer una configuración de red neuronal que realmente aprenda es muy parecido a abrir una cerradura: todas las piezas deben alinearse correctamente. Así como no es suficiente tener un solo vaso en el lugar correcto, tampoco es suficiente tener solo la arquitectura, o solo el optimizador, configurados correctamente.
Ajustar las opciones de configuración no es tan simple como decir que un tipo de opción de configuración (p. Ej., Tasa de aprendizaje) es más o menos importante que otra (p. Ej., Número de unidades), ya que todas estas opciones interactúan con todas las demás opciones, por lo que uno La elección puede funcionar bien en combinación con otra elección realizada en otro lugar .
Esta es una lista no exhaustiva de las opciones de configuración que no son también opciones de regularización u opciones de optimización numérica.
Todos estos temas son áreas activas de investigación.
La inicialización de la red a menudo se pasa por alto como fuente de errores de red neuronal. La inicialización en un intervalo demasiado grande puede establecer pesos iniciales demasiado grandes, lo que significa que las neuronas individuales tienen una influencia descomunal sobre el comportamiento de la red.
La diferencia clave entre una red neuronal y un modelo de regresión es que una red neuronal es una composición de muchas funciones no lineales, llamadas funciones de activación . (Ver: ¿Cuál es la diferencia esencial entre la red neuronal y la regresión lineal )
Los resultados clásicos de la red neuronal se centraron en las funciones de activación sigmoidea (funciones logísticas o ). Un resultado reciente ha encontrado que las unidades ReLU (o similares) tienden a funcionar mejor porque tienen gradientes más pronunciados, por lo que las actualizaciones se pueden aplicar rápidamente. (Ver: ¿Por qué usamos ReLU en redes neuronales y cómo lo usamos? ) Una advertencia sobre ReLUs es el fenómeno de "neurona muerta", que puede obstaculizar el aprendizaje; relus con fugas y variantes similares evitan este problema. Vertanh
Hay varias otras opciones. Ver: lista completa de funciones de activación en redes neuronales con pros / contras
Las conexiones residuales son un desarrollo ordenado que puede facilitar el entrenamiento de redes neuronales. "Aprendizaje residual profundo para el reconocimiento de imágenes" Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun En: CVPR. (2016) Además, cambiar el orden de las operaciones dentro del bloque residual puede mejorar aún más la red resultante. " Mapeos de identidad en redes residuales profundas " por Kaiming He, Xiangyu Zhang, Shaoqing Ren y Jian Sun.
La optimización no convexa es difícil
La función objetivo de una red neuronal es solo convexa cuando no hay unidades ocultas, todas las activaciones son lineales y la matriz de diseño es de rango completo, porque esta configuración es idénticamente un problema de regresión ordinario.
En todos los demás casos, el problema de optimización es no convexo y la optimización no convexa es difícil. Los desafíos de entrenar redes neuronales son bien conocidos (ver: ¿Por qué es difícil entrenar redes neuronales profundas? ). Además, las redes neuronales tienen una gran cantidad de parámetros, lo que nos restringe a métodos exclusivamente de primer orden (ver: ¿Por qué el método de Newton no se usa ampliamente en el aprendizaje automático? ). Esta es un área de investigación muy activa.
Establecer una tasa de aprendizaje demasiado grande hará que la optimización difiera, ya que saltará de un lado del "cañón" al otro. Establecer esto demasiado pequeño evitará que realices un progreso real y posiblemente permita que el ruido inherente en SGD supere tus estimaciones de gradiente.
El recorte de degradado reescala la norma del degradado si está por encima de algún umbral. Solía pensar que este era un parámetro de establecer y olvidar, generalmente en 1.0, pero descubrí que podía hacer un modelo de lenguaje LSTM dramáticamente mejor al configurarlo en 0.25. No sé por qué es eso.
La programación de la tasa de aprendizaje puede disminuir la tasa de aprendizaje en el transcurso de la capacitación. En mi experiencia, tratar de usar la programación es muy similar a la expresión regular : reemplaza un problema ("¿Cómo aprendo a continuar después de cierta época?") Con dos problemas ("¿Cómo aprendo a continuar después de cierta época? ? "y" ¿Cómo elijo un buen horario? "). Otras personas insisten en que la programación es esencial. Te dejaré decidir.
Elegir un buen tamaño de minibatch puede influir indirectamente en el proceso de aprendizaje, ya que un mini lote más grande tenderá a tener una variación menor ( ley de los números grandes ) que un mini lote más pequeño. Desea que el mini lote sea lo suficientemente grande como para ser informativo sobre la dirección del gradiente, pero lo suficientemente pequeño como para que SGD pueda regularizar su red.
Hay una serie de variantes en el descenso de gradiente estocástico que utilizan el impulso, las tasas de aprendizaje adaptativo, las actualizaciones de Nesterov, etc. para mejorar el SGD de vainilla. Diseñar un mejor optimizador es en gran medida un área activa de investigación. Algunos ejemplos:
Cuando salió por primera vez, el optimizador Adam generó mucho interés. Pero algunas investigaciones recientes han encontrado que SGD con impulso puede superar los métodos de gradiente adaptativo para redes neuronales. " El valor marginal de los métodos de gradiente adaptativo en el aprendizaje automático " por Ashia C. Wilson, Rebecca Roelofs, Mitchell Stern, Nathan Srebro, Benjamin Recht
Pero, por otro lado, este artículo muy reciente propone un nuevo optimizador de tasa de aprendizaje adaptativo que supuestamente cierra la brecha entre los métodos de tasa de adaptación y el SGD con impulso. " Cerrar la brecha de generalización de los métodos de gradiente adaptativos en el entrenamiento de redes neuronales profundas " por Jinghui Chen, Quanquan Gu
Normalización
La escala de los datos puede marcar una gran diferencia en el entrenamiento.
Antes de presentar los datos a una red neuronal, la estandarización de los datos para tener 0 media y varianza de la unidad, o estar en un intervalo pequeño como puede mejorar el entrenamiento. Esto equivale a un preacondicionamiento y elimina el efecto que tiene una elección en unidades sobre los pesos de la red. Por ejemplo, longitud en milímetros y longitud en kilómetros representan el mismo concepto, pero están en diferentes escalas. Los detalles exactos de cómo estandarizar los datos dependen de cómo se vean sus datos.[ - 0.5 , 0.5 ]
La normalización de la capa puede mejorar el entrenamiento de la red al mantener una desviación estándar y media en ejecución para las activaciones de las neuronas. No se comprende bien por qué esto ayuda a la capacitación y sigue siendo un área activa de investigación.
Regularización
Elegir y ajustar la regularización de la red es una parte clave de la construcción de un modelo que se generalice bien (es decir, un modelo que no se ajuste demasiado a los datos de entrenamiento). Sin embargo, en el momento en que su red está luchando para disminuir la pérdida de datos de capacitación, cuando la red no está aprendiendo, la regularización puede ocultar cuál es el problema.
Cuando mi red no aprende, apago toda la regularización y verifico que la red no regularizada funciona correctamente. Luego agrego cada pieza de regularización y verifico que cada una de ellas funcione en el camino.
Esta táctica puede determinar dónde se puede establecer mal cierta regularización. Algunos ejemplos son
Dos partes de la regularización están en conflicto. Por ejemplo, se observa ampliamente que la normalización de capa y el abandono son difíciles de usar juntos. Dado que, por sí solo, es muy útil, comprender cómo usar ambos es un área activa de investigación.
Mantenga un libro de registro de experimentos
Cuando configuro una red neuronal, no codifico ninguna configuración de parámetros. En cambio, lo hago en un archivo de configuración (por ejemplo, JSON) que se lee y se utiliza para completar los detalles de configuración de la red en tiempo de ejecución. Mantengo todos estos archivos de configuración. Si hago alguna modificación de parámetros, hago un nuevo archivo de configuración. Finalmente, adjunto como comentarios todas las pérdidas por época para capacitación y validación.
La razón por la que estoy tan obsesionado con retener los resultados antiguos es que esto hace que sea muy fácil regresar y revisar experimentos anteriores. También protege contra la repetición errónea del mismo experimento sin salida. Psicológicamente, también te permite mirar hacia atrás y observar "Bueno, el proyecto podría no estar donde quiero que esté hoy, pero estoy progresando en comparación con donde estaba hace semanas".k
Como ejemplo, quería aprender sobre los modelos de lenguaje LSTM, así que decidí hacer un bot de Twitter que escriba nuevos tweets en respuesta a otros usuarios de Twitter. Trabajé en esto en mi tiempo libre, entre la escuela de posgrado y mi trabajo. Me llevó alrededor de un año, e iteré más de 150 modelos diferentes antes de llegar a un modelo que hizo lo que quería: generar un nuevo texto en inglés que (más o menos) tiene sentido. (Un punto clave, y parte de la razón por la que tomó tantos intentos, es que no fue suficiente simplemente obtener una baja pérdida fuera de la muestra, ya que los primeros modelos de baja pérdida habían logrado memorizar los datos de entrenamiento, por lo tanto, solo estaba reproduciendo bloques de texto relacionados textualmente en respuesta a las indicaciones: se necesitaron algunos ajustes para que el modelo sea más espontáneo y aún tenga poca pérdida).
fuente
Las respuestas publicadas son geniales, y quería agregar algunas "Comprobaciones de cordura" que me han ayudado mucho en el pasado.
1) Entrene su modelo en un único punto de datos. Si esto funciona, entrénelo en dos entradas con diferentes salidas.
Esto verifica algunas cosas. Primero, le muestra rápidamente que su modelo puede aprender al verificar si su modelo puede sobreajustar sus datos. En mi caso, constantemente cometo errores tontos de hacer
Dense(1,activation='softmax')
vsDense(1,activation='sigmoid')
para predicciones binarias, y el primero da resultados basura.Si su modelo no puede sobreajustar algunos puntos de datos, entonces es demasiado pequeño (lo cual es poco probable en la era actual) o algo está mal en su estructura o en el algoritmo de aprendizaje.
2) Presta atención a tu pérdida inicial.
Continuando con el ejemplo binario, si sus datos son 30% 0 y 70% 1, entonces su pérdida inicial esperada alrededor de . Esto se debe a que su modelo debe comenzar cerca de adivinar al azar.L=−0.3ln(0.5)−0.7ln(0.5)≈0.7
Muchas veces verás una pérdida inicial de algo ridículo, como 6.5. Conceptualmente, esto significa que su salida está muy saturada, por ejemplo, hacia 0. Por ejemplo , por lo que si está viendo una pérdida mayor que 1, es probable que su El modelo está muy sesgado. Esto suele suceder cuando los pesos de su red neuronal no están correctamente equilibrados, especialmente cerca del softmax / sigmoide. Entonces esto le diría si su inicialización es mala.−0.3ln(0.99)−0.7ln(0.01)=3.2
Puede estudiar esto más a fondo haciendo que su modelo prediga en unos pocos miles de ejemplos y luego histogramando las salidas. Esto es especialmente útil para verificar que sus datos estén correctamente normalizados. Como ejemplo, si espera que su salida esté muy sesgada hacia 0, podría ser una buena idea transformar sus salidas esperadas (sus datos de entrenamiento) tomando las raíces cuadradas de la salida esperada. Esto evitará problemas de gradiente para sigmoides saturados, en la salida.
3) Generalice las salidas de su modelo para depurar
Como ejemplo, imagine que está utilizando un LSTM para hacer predicciones a partir de datos de series temporales. Tal vez en su ejemplo, solo le importa la última predicción, por lo que su LSTM genera un solo valor y no una secuencia. Cambie el LSTM para devolver predicciones en cada paso (en keras, esto es
return_sequences=True
). Luego, puede ver sus salidas de estado oculto después de cada paso y asegurarse de que sean realmente diferentes. Una aplicación de esto es asegurarse de que cuando está enmascarando sus secuencias (es decir, rellenándolas con datos para que tengan la misma longitud), el LSTM ignora correctamente sus datos enmascarados. Sin generalizar su modelo , nunca encontrará este problema .4) Mira las capas individuales
Tensorboard proporciona una forma útil de visualizar los resultados de su capa . Esto puede ayudar a garantizar que las entradas / salidas estén correctamente normalizadas en cada capa. También puede detectar activaciones con errores. También puede consultar las salidas de capa en keras en un lote de predicciones, y luego buscar capas que tengan activaciones sospechosamente sesgadas (ya sea 0 o todas distintas de cero).
5) Construye un modelo más simple primero
Decidió que el mejor enfoque para resolver su problema es usar una CNN combinada con un detector de cuadro delimitador, que procesa aún más los cultivos de imágenes y luego usa un LSTM para combinar todo. La GPU tarda solo 10 minutos en inicializar su modelo.
En su lugar, haga un lote de datos falsos (misma forma) y divida su modelo en componentes. Luego, haga modelos ficticios en lugar de cada componente (su "CNN" podría ser una sola convolución 2x2 de 20 zancadas, el LSTM con solo 2 unidades ocultas). Esto lo ayudará a asegurarse de que la estructura de su modelo sea correcta y que no haya problemas extraños. Luché por un tiempo con ese modelo, y cuando probé una versión más simple, descubrí que una de las capas no estaba enmascarada correctamente debido a un error de keras. Puede consultar fácilmente (y rápidamente ) las capas internas del modelo y ver si ha configurado su gráfico correctamente.
6) Estandarice sus versiones de preprocesamiento y paquete
Las redes neuronales en particular son extremadamente sensibles a pequeños cambios en sus datos. Como ejemplo, dos paquetes populares de carga de imágenes son
cv2
yPIL
. Solo por abrir un JPEG, ambos paquetes producirán imágenes ligeramente diferentes . Las diferencias suelen ser realmente pequeñas, pero ocasionalmente verá caídas en el rendimiento del modelo debido a este tipo de cosas. También hace que la depuración sea una pesadilla: obtuviste un puntaje de validación durante el entrenamiento, y luego usas un cargador diferente y obtienes una precisión diferente en el mismo conjunto de datos.Entonces, si está descargando el modelo de alguien de github, preste mucha atención a su preprocesamiento. ¿Qué cargadores de imágenes usan? ¿Qué rutinas de preprocesamiento de imágenes utilizan? Al cambiar el tamaño de una imagen, ¿qué interpolación utilizan? ¿Primero cambian el tamaño y luego normalizan la imagen? ¿O al revés? ¿Cuál es el orden de los canales para las imágenes RGB?
La forma más segura de estandarizar paquetes es usar un
requirements.txt
archivo que describa todos sus paquetes como en la configuración de su sistema de entrenamiento, hasta loskeras==2.1.5
números de versión. Entonces, en teoría, usar Docker junto con la misma GPU que en su sistema de entrenamiento debería producir los mismos resultados.fuente
¡No entrenes una red neuronal para empezar!
Todas las respuestas son geniales, pero hay un punto que debe mencionarse: ¿hay algo que aprender de sus datos? (que podría considerarse como algún tipo de prueba).
Si la etiqueta que intenta predecir es independiente de sus características, es probable que la pérdida de entrenamiento tenga dificultades para reducirse.
En su lugar, comience a calibrar una regresión lineal, un bosque aleatorio (o cualquier método que le guste cuyo número de hiperparámetros sea bajo y cuyo comportamiento pueda comprender).
Luego, si logra un rendimiento decente en estos modelos (mejor que adivinar al azar), puede comenzar a ajustar una red neuronal (y la respuesta de @Sycorax resolverá la mayoría de los problemas).
fuente
En esencia, el flujo de trabajo básico para entrenar un modelo NN / DNN es más o menos siempre el mismo:
definir la arquitectura NN (cuántas capas, qué tipo de capas, las conexiones entre capas, las funciones de activación, etc.)
lea datos de alguna fuente (Internet, una base de datos, un conjunto de archivos locales, etc.), eche un vistazo a algunas muestras (para asegurarse de que la importación haya salido bien) y realice la limpieza de datos si es necesario. Este paso no es tan trivial como la gente suele suponer que es. La razón es que, para los DNN, generalmente tratamos con conjuntos de datos gigantes, varios órdenes de magnitud más grandes de lo que estamos acostumbrados, cuando ajustamos modelos estadísticos paramétricos no lineales más estándar (los NN pertenecen a esta familia, en teoría).
normalizar o estandarizar los datos de alguna manera. Dado que los NN son modelos no lineales, la normalización de los datos puede afectar no solo la estabilidad numérica, sino también el tiempo de entrenamiento y las salidas de NN (una función lineal como la normalización no conmuta con una función jerárquica no lineal).
dividir datos en entrenamiento / validación / conjunto de pruebas, o en múltiples pliegues si se usa validación cruzada.
entrenar la red neuronal, al mismo tiempo que controla la pérdida en el conjunto de validación. Aquí puede disfrutar de los placeres desgarradores de la optimización no convexa, donde no sabe si existe alguna solución, si existen varias soluciones, cuál es la mejor solución (s) en términos de error de generalización y qué tan cerca llegó a eso. La comparación entre la pérdida de entrenamiento y la curva de pérdida de validación lo guía, por supuesto, pero no subestime la actitud dura de los NN (y especialmente los DNN): a menudo muestran una pérdida de entrenamiento / validación decreciente (tal vez lentamente) incluso cuando tiene errores abrumadores en su código.
Verifique la precisión en el conjunto de prueba y haga algunos diagramas / tablas de diagnóstico.
Regrese al punto 1 porque los resultados no son buenos. Reiterar ad nauseam .
Por supuesto, los detalles cambiarán según el caso de uso específico, pero con este lienzo en mente, podemos pensar en qué es más probable que salga mal.
Comprobaciones de arquitectura básica
Esto puede ser una fuente de problemas. Por lo general, hago estos controles preliminares:
busque una arquitectura simple que funcione bien en su problema (por ejemplo, MobileNetV2 en el caso de la clasificación de imágenes) y aplique una inicialización adecuada (en este nivel, al azar generalmente lo hará). Si esto se entrena correctamente en sus datos, al menos sabe que no hay problemas evidentes en el conjunto de datos. Si no puede encontrar una arquitectura simple y probada que funcione en su caso, piense en una línea de base simple . Por ejemplo, un clasificador Naive Bayes para clasificación (o incluso simplemente clasificar siempre la clase más común), o un modelo ARIMA para pronósticos de series de tiempo
Construir pruebas unitarias. No hacer esto (y el uso del bloc de notas Jupyter Bloody) son generalmente las causas de los problemas en el código NN que me piden que revise, especialmente cuando se supone que el modelo se implementará en producción. Como la respuesta más votada ya ha cubierto las pruebas unitarias, solo agregaré que existe una biblioteca que admite el desarrollo de pruebas unitarias para NN (desafortunadamente solo en Tensorflow).
Conjunto de entrenamiento
Verifique sus datos de entrada. Vea si invirtió el conjunto de entrenamiento y las etiquetas del conjunto de prueba, por ejemplo (me pasó una vez -___-), o si importó el archivo incorrecto. Eche un vistazo a algunas muestras de entrada y las etiquetas asociadas, y asegúrese de que tengan sentido. Compruebe que los datos normalizados están realmente normalizados (eche un vistazo a su rango). Además, los conjuntos de datos del mundo real están sucios: para la clasificación, podría haber un alto nivel de ruido de etiqueta (muestras que tienen la etiqueta de clase incorrecta) o para pronósticos de series de tiempo multivariadas, algunos de los componentes de series de tiempo pueden tener muchos datos faltantes ( He visto números tan altos como 94% para algunas de las entradas).
El orden en que el conjunto de entrenamiento se alimenta a la red durante el entrenamiento puede tener un efecto. Pruebe una combinación aleatoria del conjunto de entrenamiento ( sin romper la asociación entre entradas y salidas ) y vea si la pérdida de entrenamiento disminuye.
Finalmente, la mejor manera de verificar si tiene problemas con el conjunto de entrenamiento es usar otro conjunto de entrenamiento. Si está haciendo una clasificación de imágenes, en lugar de las imágenes que recopiló, use un conjunto de datos estándar como CIFAR10 o CIFAR100 (o ImageNet, si puede permitirse entrenar en eso). Estos conjuntos de datos están bien probados: si su pérdida de entrenamiento se reduce aquí pero no en su conjunto de datos original, puede tener problemas en el conjunto de datos.
Haz las pruebas de oro
Hay dos pruebas que llamo Golden Tests, que son muy útiles para encontrar problemas en un NN que no entrena:
reduzca el conjunto de entrenamiento a 1 o 2 muestras y entrene en esto. El NN debe sobreajustar inmediatamente el conjunto de entrenamiento, alcanzando una precisión del 100% en el conjunto de entrenamiento muy rápidamente, mientras que la precisión en el conjunto de validación / prueba irá a 0%. Si esto no sucede, hay un error en su código.
la prueba opuesta: mantienes el conjunto de entrenamiento completo, pero barajas las etiquetas. La única forma en que el NN puede aprender ahora es memorizando el conjunto de entrenamiento, lo que significa que la pérdida de entrenamiento disminuirá muy lentamente, mientras que la pérdida de prueba aumentará muy rápidamente. En particular, debe alcanzar la pérdida de probabilidad aleatoria en el conjunto de prueba . Esto significa que si tiene 1000 clases, debe alcanzar una precisión del 0.1%. Si no ve ninguna diferencia entre la pérdida de entrenamiento antes y después de barajar las etiquetas, esto significa que su código tiene errores (recuerde que ya hemos revisado las etiquetas del conjunto de entrenamiento en el paso anterior).
Comprueba que tu métrica de entrenamiento tenga sentido
La precisión (pérdida de 0-1) es una métrica deficiente si tiene un fuerte desequilibrio de clase. Pruebe algo más significativo, como la pérdida de entropía cruzada: no solo desea clasificar correctamente, sino que desea clasificar con alta precisión.
Saca las grandes armas
Si nada ayudó, ahora es el momento de comenzar a jugar con hiperparámetros. Esta es fácilmente la peor parte del entrenamiento NN, pero estos son modelos gigantescos, no identificables, cuyos parámetros se ajustan mediante la resolución de una optimización no convexa, por lo que estas iteraciones a menudo no se pueden evitar.
fuente
Si el modelo no está aprendiendo, existe una posibilidad decente de que su propagación hacia atrás no esté funcionando. Pero hay tantas cosas que pueden salir mal con un modelo de caja negra como Neural Network, hay muchas cosas que debe verificar. Creo que Sycorax y Alex proporcionan respuestas muy buenas e integrales. Solo quiero agregar una técnica que aún no se ha discutido.
fuente