¿Qué debo hacer cuando mi red neuronal no aprende?


148

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?


1
Aquí hay un caso en el que el NN no pudo progresar. youtu.be/iakFfOmanJU?t=144
Joshua

44
El blog de Ivanov " Razones por las que su red neuronal no funciona ", especialmente las secciones II, III y IV, podría ser útil.
user5228

Respuestas:


187

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.

  1. 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.

  2. 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:

def make_convnet(input_image):
    net = slim.conv2d(input_image, 32, [11, 11], scope="conv1_11x11")
    net = slim.conv2d(input_image, 64, [5, 5], scope="conv2_5x5")
    net = slim.max_pool2d(net, [4, 4], stride=4, scope='pool1')
    net = slim.conv2d(input_image, 64, [5, 5], scope="conv3_5x5")
    net = slim.conv2d(input_image, 128, [3, 3], scope="conv4_3x3")
    net = slim.max_pool2d(net, [2, 2], scope='pool2')
    net = slim.conv2d(input_image, 128, [3, 3], scope="conv5_3x3")
    net = slim.max_pool2d(net, [2, 2], scope='pool3')
    net = slim.conv2d(input_image, 32, [1, 1], scope="conv6_1x1")
    return net

¿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

  • Las variables se crean pero nunca se usan (generalmente debido a errores de copiar y pegar);
  • Las expresiones para las actualizaciones de gradiente son incorrectas;
  • Las actualizaciones de peso no se aplican;
  • Las funciones de pérdida no se miden en la escala correcta (por ejemplo, la pérdida de entropía cruzada se puede expresar en términos de probabilidad o logits)
  • La pérdida no es apropiada para la tarea (por ejemplo, usar la pérdida categórica de entropía cruzada para una tarea de regresión).

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 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 ( ) 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

    Se ha observado que los métodos de gradiente adaptativo, que adoptan información histórica de gradiente para ajustar automáticamente la tasa de aprendizaje, generalizan peor que el descenso de gradiente estocástico (SGD) con impulso en el entrenamiento de redes neuronales profundas. Esto deja un problema abierto sobre cómo cerrar la brecha de generalización de los métodos de gradiente adaptativo. En este trabajo, mostramos que los métodos de gradiente adaptativo como Adam, Amsgrad, a veces están "sobre adaptados". Diseñamos un nuevo algoritmo, llamado Método de estimación de momento parcialmente adaptativo (Padam), que unifica el Adam / Amsgrad con SGD para lograr lo mejor de ambos mundos. Los experimentos en puntos de referencia estándar muestran que Padam puede mantener una tasa de convergencia rápida como Adam / Amsgrad mientras generaliza y SGD en el entrenamiento de redes neuronales profundas.

Normalización

La escala de los datos puede marcar una gran diferencia en el entrenamiento.

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

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).


11
Muchos buenos consejos allí. Es interesante cuántos de sus comentarios son similares a los comentarios que he hecho (o he visto hacer a otros) en relación con la estimación de depuración de parámetros o predicciones para modelos complejos con esquemas de muestreo MCMC. (Por ejemplo, puede parecer que el código funciona cuando no se implementa correctamente.)
Glen_b

11
@Glen_b No creo que las mejores prácticas de codificación reciban suficiente énfasis en la mayoría de los currículos de estadísticas / aprendizaje automático, por eso enfaticé tanto ese punto. He visto varias publicaciones de NN donde OP dejó un comentario como "oh, encontré un error ahora funciona".
Sycorax

77
Enseño un curso de programación para ciencia de datos en python, y en realidad hacemos pruebas de funciones y unidades el primer día, como conceptos principales. Peleando la buena pelea.
Matthew Drury

8
+1 para "Toda la codificación es depuración". Me sorprende cuántos carteles en SO parecen pensar que la codificación es un ejercicio simple que requiere poco esfuerzo; quienes esperan que su código funcione correctamente la primera vez que lo ejecutan; y que parecen ser incapaces de proceder cuando no es así. Lo curioso es que tienen toda la razón: la codificación es fácil, pero la programación es difícil.
Bob Jarvis

41

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')vs Dense(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 cv2y PIL. 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.txtarchivo que describa todos sus paquetes como en la configuración de su sistema de entrenamiento, hasta los keras==2.1.5nú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.


77
(+1) Verificar la pérdida inicial es una gran sugerencia. Lamento haberlo dejado fuera de mi respuesta.
Sycorax

77
Asegurarse de que su modelo pueda sobreajustar es una excelente idea. Estoy tan acostumbrado a pensar en el sobreajuste como una debilidad que nunca pensé explícitamente (hasta que lo mencionaste) que la capacidad de sobreajustar es en realidad una fortaleza.
John Coleman

15

¡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).


55
xk

11

En esencia, el flujo de trabajo básico para entrenar un modelo NN / DNN es más o menos siempre el mismo:

  1. definir la arquitectura NN (cuántas capas, qué tipo de capas, las conexiones entre capas, las funciones de activación, etc.)

  2. 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).

  3. 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).

  4. dividir datos en entrenamiento / validación / conjunto de pruebas, o en múltiples pliegues si se usa validación cruzada.

  5. 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.

  6. Verifique la precisión en el conjunto de prueba y haga algunos diagramas / tablas de diagnóstico.

  7. 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.

  • pruebe diferentes optimizadores: SGD entrena más lento, pero conduce a un error de generalización más bajo, mientras que Adam entrena más rápido, pero la pérdida de prueba se detiene a un valor más alto
  • intente disminuir el tamaño del lote
  • aumentar la tasa de aprendizaje inicialmente, y luego decaerla, o usar una tasa de aprendizaje cíclica
  • agregar capas
  • agregar unidades ocultas
  • elimine la regularización gradualmente (tal vez cambie la norma del lote por algunas capas). La pérdida de entrenamiento ahora debería disminuir, pero la pérdida de la prueba puede aumentar.
  • visualizar la distribución de pesos y sesgos para cada capa. Nunca tuve que llegar aquí, pero si usa BatchNorm, esperaría distribuciones normales aproximadamente estándar. Vea si la norma de los pesos aumenta anormalmente con las épocas.
  • Si recibe algún error en el tiempo de entrenamiento, busque ese error en Google . Perdí una mañana mientras intentaba arreglar una arquitectura que funcionara perfectamente, solo para descubrir que la versión de Keras que había instalado tenía soporte para múltiples GPU con errores y tuve que actualizarla. A veces tenía que hacer lo contrario (rebajar la versión de un paquete).
  • actualice su CV y ​​comience a buscar un trabajo diferente :-)

+1, pero ¿"Bloody Jupyter Notebook"? ¿Quieres comentar sobre eso? :)
ameba

2
He aquí por qué odio los cuadernos Jupyter . TL; DR: estado oculto, la diferencia es una molestia, problemas de seguridad y alienta las malas prácticas de programación, como no usar pruebas de unidad / regresión / integración. Entrenar NNs ya es bastante difícil, sin que la gente se olvide de los fundamentos de la programación.
DeltaIV

2
Posiblemente estoy siendo demasiado negativo, pero, francamente, he tenido suficiente con la gente que clona los Cuadernos Jupyter de GitHub, pensando que sería cuestión de minutos adaptar el código a su caso de uso y luego acudir a mí quejándose de que nada funciona. ¡Por el amor de Dios, obtenga un IDE real como PyCharm o VisualStudio Code y cree un código bien estructurado, en lugar de cocinar un Notebook! Especialmente si planea enviar el modelo a producción, facilitará mucho las cosas.
DeltaIV

2
Jajaja 'Jupyter notebook' y 'unit testing' están anti-correlacionados.
Sycorax

2
(+1) Esta es una buena reseña. Las sugerencias para las pruebas de aleatorización son formas realmente geniales de llegar a las redes con errores.
Sycorax

6

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.

ϵ

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.