
El código del software de aprendizaje automático es a menudo complejo y bastante confuso. Detectar y eliminar errores es una tarea que requiere muchos recursos. Incluso
las redes neuronales más simples
conectadas directamente requieren un enfoque serio de la arquitectura de red, la inicialización de los pesos y la optimización de la red. Un pequeño error puede conducir a problemas desagradables.
Este artículo trata sobre el algoritmo de depuración de sus redes neuronales.
Skillbox recomienda: Un desarrollador de Python de curso práctico desde cero .
Le recordamos: para todos los lectores de "Habr": un descuento de 10.000 rublos al registrarse en cualquier curso de Skillbox con el código de promoción "Habr".
El algoritmo consta de cinco etapas:
- inicio simple;
- confirmación de pérdidas;
- verificación de resultados intermedios y compuestos;
- diagnóstico de parámetros;
- control de trabajo.
Si algo le parece más interesante que el resto, puede ir directamente a estas secciones.
Inicio fácil
Una red neuronal con arquitectura compleja, regularización y un planificador de velocidad de aprendizaje es más difícil de lanzar que una red normal. Aquí somos un poco complicados, ya que el elemento en sí tiene una relación indirecta con la depuración, pero esta sigue siendo una recomendación importante.
Un comienzo simple es crear un modelo simplificado y entrenarlo en un conjunto de datos (punto).
Primero creamos un modelo simplificadoPara comenzar rápidamente, cree una red pequeña con una sola capa oculta y verifique que todo funcione correctamente. Luego, complicamos gradualmente el modelo, verificamos cada aspecto nuevo de su estructura (capa adicional, parámetro, etc.) y seguimos adelante.
Entrenamos el modelo en un solo conjunto de datos (punto)Como una prueba rápida del estado de su proyecto, puede usar uno o dos puntos de datos para la capacitación para confirmar si el sistema funciona correctamente. La red neuronal debe mostrar una precisión del 100% del entrenamiento y la verificación. Si este no es el caso, entonces el modelo es demasiado pequeño o ya tiene un error.
Incluso si todo está bien, prepare el modelo para el paso de una o más eras antes de continuar.
Estimación de pérdidas
La estimación de pérdidas es la forma principal de refinar el rendimiento del modelo. Debe asegurarse de que la pérdida corresponde a la tarea, y las funciones de pérdida se evalúan en la escala correcta. Si usa más de un tipo de pérdida, asegúrese de que todas sean del mismo orden y estén correctamente ajustadas.
Es importante estar atento a las pérdidas iniciales. Verifique qué tan cerca está el resultado real al esperado si el modelo comenzó con una suposición aleatoria. El
trabajo de Andrei Karpati sugiere lo siguiente : “Asegúrese de obtener el resultado esperado cuando comience a trabajar con una pequeña cantidad de parámetros. Es mejor verificar de inmediato la pérdida de datos (con el grado de regularización establecido en cero). Por ejemplo, para CIFAR-10 con el clasificador Softmax, esperamos que la pérdida inicial sea 2.302, porque la probabilidad difusa esperada es 0.1 para cada clase (ya que hay 10 clases), y la pérdida de Softmax es la probabilidad logarítmica negativa de la clase correcta como - ln (0.1) = 2.302 ".
Para un ejemplo binario, simplemente se realiza un cálculo similar para cada una de las clases. Aquí, por ejemplo, están los datos: 20% 0's y 80% 1's. La pérdida inicial esperada será de hasta –0.2ln (0.5) –0.8ln (0.5) = 0.693147. Si el resultado es mayor que 1, esto puede indicar que los pesos de la red neuronal no están correctamente balanceados o que los datos no están normalizados.
Comprobación de resultados intermedios y conexiones
Para depurar una red neuronal, es necesario comprender la dinámica de los procesos dentro de la red y el papel de las capas intermedias individuales, ya que están conectadas. Aquí hay algunos errores comunes que puede encontrar:
- Expresiones incorrectas para actualizaciones de gradiente
- las actualizaciones de peso no se aplican;
- gradientes que desaparecen o explotan.
Si los valores de gradiente son cero, esto significa que la velocidad de aprendizaje en el optimizador es demasiado lenta o que encontró una expresión incorrecta para actualizar el gradiente.
Además, es necesario controlar los valores de las funciones de activación, los pesos y las actualizaciones de cada una de las capas. Por ejemplo, el valor de las actualizaciones de parámetros (pesos y compensaciones)
debe ser 1-e3 .
Existe un fenómeno llamado "ReLU moribundo" o
"Problema de gradiente que desaparece" cuando las neuronas ReLU generarán cero después de estudiar el gran valor de sesgo negativo para sus pesos. Estas neuronas nunca se activan nuevamente en ningún lugar de datos.
Puede usar la prueba de gradiente para detectar estos errores al aproximar el gradiente utilizando un enfoque numérico. Si está cerca de los gradientes calculados, la propagación hacia atrás se implementó correctamente. Para crear una verificación de gradiente, consulte estos excelentes recursos de CS231
aquí y
aquí , así como el tutorial de Andrew Nga sobre este tema.
Fayzan Sheikh señala tres métodos principales para visualizar una red neuronal:
- Preliminar: métodos simples que nos muestran la estructura general del modelo entrenado. Incluyen la salida de formas o filtros de capas individuales de la red neuronal y parámetros en cada capa.
- Basado en la activación. En ellos, desciframos la activación de neuronas individuales o grupos de neuronas para comprender sus funciones.
- Basado en gradiente. Estos métodos tienden a manipular los gradientes que se forman del pasaje de un lado a otro cuando se entrena el modelo (incluidos los mapas de significancia y los mapas de activación de clase).
Existen varias herramientas útiles para visualizar las activaciones y conexiones de capas individuales, por ejemplo,
ConX y
Tensorboard .

Diagnóstico de parámetros
Las redes neuronales tienen muchos parámetros que interactúan entre sí, lo que complica la optimización. En realidad, esta sección es objeto de una investigación activa por parte de especialistas, por lo que las propuestas a continuación deben considerarse solo como un consejo, los puntos de partida a partir de los cuales puede construir.
Tamaño de paquete (
tamaño de lote): si desea que el tamaño del paquete sea lo suficientemente grande como para obtener estimaciones precisas del gradiente de error, pero lo suficientemente pequeño como para que el descenso de gradiente estocástico (SGD) pueda racionalizar su red. El tamaño pequeño de los paquetes conducirá a una convergencia rápida debido al ruido en el proceso de aprendizaje y en el futuro a dificultades de optimización. Esto se describe con más detalle
aquí .
Velocidad de aprendizaje : demasiado lento dará como resultado una convergencia lenta o el riesgo de quedarse atascado en los mínimos locales. Al mismo tiempo, una alta velocidad de aprendizaje provocará una discrepancia en la optimización, ya que corre el riesgo de "saltar" a través de la parte profunda, pero al mismo tiempo estrecha de la función de pérdida. Intente usar la planificación de velocidad para reducirla durante el entrenamiento de la red neuronal. CS231n
tiene una gran sección sobre este tema .
Recorte de degradado: recorte de los gradientes de los parámetros durante la propagación hacia atrás en el valor máximo o la norma límite. Útil para resolver problemas con cualquier gradiente explosivo que pueda encontrar en el tercer párrafo.
Normalización por lotes : se utiliza para normalizar los datos de entrada de cada capa, lo que permite resolver el problema del desplazamiento covariante interno. Si usa Dropout y Batch Norma juntos,
consulte este artículo .
Descenso de gradiente estocástico (SGD) : hay varias variedades de SGD que utilizan el impulso, las velocidades de aprendizaje adaptativas y el método de Nesterov. Al mismo tiempo, ninguno de ellos tiene una clara ventaja tanto en términos de eficiencia del entrenamiento como de generalización (
detalles aquí ).
Regularización : es crucial para construir un modelo generalizado, porque agrega una penalización por la complejidad del modelo o los valores de parámetros extremos. Esta es una forma de reducir la varianza del modelo sin aumentar significativamente su desplazamiento. Más
información aquí .
Para evaluar todo usted mismo, debe deshabilitar la regularización y verificar el gradiente de pérdida de datos usted mismo.
La deserción es otra forma de racionalizar su red para evitar la congestión. Durante el entrenamiento, la pérdida ocurre solo al mantener la actividad de la neurona con una cierta probabilidad p (hiperparámetro) o al establecerla en cero en el caso contrario. Como resultado, la red debe usar un subconjunto diferente de parámetros para cada grupo de entrenamiento, lo que reduce los cambios en ciertos parámetros que se vuelven dominantes.
Importante: si usa tanto la deserción como la normalización de lotes, tenga cuidado con el orden de estas operaciones o incluso con su uso conjunto. Todo esto todavía se discute y complementa activamente. Aquí hay dos discusiones importantes sobre este tema
en Stackoverflow y
Arxiv .
Control de trabajo
Se trata de documentar flujos de trabajo y experimentos. Si no documenta nada, puede olvidar, por ejemplo, qué tipo de velocidad de entrenamiento o peso de clase se utiliza. Gracias al control, puede ver y reproducir fácilmente experimentos anteriores. Esto reduce el número de experimentos duplicados.
Es cierto que la documentación manual puede ser un desafío en el caso de una gran cantidad de trabajo. Aquí, herramientas como Comet.ml lo ayudan a registrar automáticamente conjuntos de datos, cambios de código, historial de experimentos y modelos de producción, incluida la información clave sobre su modelo (hiperparámetros, indicadores de rendimiento del modelo e información ambiental).
Una red neuronal puede ser muy sensible a pequeños cambios, y esto conducirá a una caída en el rendimiento del modelo. El seguimiento y la documentación del trabajo es el primer paso para estandarizar su entorno y modelado.

Espero que esta publicación pueda convertirse en el punto de partida desde el cual comenzarás a depurar tu red neuronal.
Skillbox recomienda: