8 votos

Capa final de la red neuronal responsable del sobreajuste

Estoy utilizando un perceptrón multicapa con 2 capas ocultas para resolver una tarea de clasificación binaria en un conjunto de datos de series temporales ruidosas con un desequilibrio de clases de 80/20. Tengo 30 millones de filas y 500 características en el conjunto de entrenamiento. El conjunto de datos es estructurado, es decir, no son imágenes. Mis características originales estaban muy sesgadas hacia la derecha; hago lo posible por transformarlas en distribuciones más agradables tomando registros o categorizando algunas de ellas. Utilizo una arquitectura de 512->128->128->1, con activaciones relu en cada capa excepto la última. Mi función de pérdida es la entropía cruzada sigmoidea.

El conjunto de validación contiene 10 millones de filas. Al principio, el error de validación disminuye, pero vuelve a aumentar después de un par de épocas. Al analizar los gradientes y pesos de cada capa, veo que el sobreajuste coincide con el pesos sólo en la capa final cada vez más grande. La última capa parece ir a toda marcha mientras que el resto de la red parece hacer muy poco aprendizaje.

Puedo resolver el problema de sobreajuste utilizando la regularización l2, pero esto perjudica el error de validación. Todavía no he encontrado un parámetro de regularización beta que no perjudique el mejor error de validación que he visto. El abandono empeora aún más las cosas.

Es cierto que el problema de clasificación es muy difícil, con una señal probablemente muy débil, pero me parece que los árboles potenciados por el gradiente son capaces de generalizar mucho mejor que un simple, digamos, perceptrón multicapa de 64x64 (la pérdida logarítmica en el conjunto de entrenamiento es la misma para ambas redes y el árbol potenciado por el gradiente).

Hay alguna palabra de sabiduría sobre cómo hacer que esta red se generalice mejor dado que ya lo he intentado:

  • abandono de diversos grados
  • l1/l2/grupo de regularización del lazo
  • añadir ruido a las entradas
  • añadir ruido a los gradientes y pesos
  • la ingeniería de rasgos para eliminar/representar rasgos muy sesgados
  • normalización por lotes
  • utilizando una tasa de aprendizaje más baja en la capa final
  • simplemente utilizando una red más pequeña (esta es la mejor solución que he encontrado)

a algunas o todas las capas. Todos los métodos perjudican tanto el error de validación que el rendimiento no se acerca a lo que hace el modelo de árbol. Ya me habría rendido si no fuera porque el modelo de árbol es capaz de hacerlo mucho mejor fuera de la muestra, pero la pérdida del registro de entrenamiento para ambos es la misma.

0 votos

¿Qué tamaño tiene su conjunto de datos? ¿Cuántas entradas tiene la red? ¿Qué función de activación está utilizando?

0 votos

Tengo 30 millones de filas y 500 características en el conjunto de entrenamiento. El conjunto de validación contiene 10 millones de filas.

6voto

OmaL Puntos 106

Con el tamaño de la muestra $N=30\times10^6$ y 500 características, ya has probado (la mayoría de) los trucos de regularización habituales, por lo que no parece que quede mucho por hacer en este punto.

Sin embargo, puede que el problema esté en el origen. No nos has dicho cuál es tu conjunto de datos, exactamente (¿cuáles son las observaciones? ¿Cuáles son las características?) y qué estás tratando de clasificar. Tampoco describes en detalle tu arquitectura (¿cuántas neuronas tienes? ¿qué funciones de activación utilizas? ¿Qué regla utilizas para convertir el resultado de la capa de salida en una elección de clase?) Procederé bajo las suposiciones de que:

  • tiene 512 unidades en la capa de entrada, 512 unidades en cada una de las capas ocultas y 2 unidades en la capa de salida. correspondiente a $p=525312$ parámetros. En este caso, su conjunto de datos parece lo suficientemente grande como para aprender todos los pesos.
  • está utilizando One-Hot Encoding para realizar la clasificación.

Corríjanme si mis suposiciones son erróneas. Ahora:

  1. si tienes datos estructurados (esto significa que no estás haciendo una clasificación de imágenes), tal vez no haya nada que puedas hacer. Por lo general, XGboost supera a las DNN en la clasificación de datos estructurados. Echa un vistazo a las competiciones de Kaggle: verás que para los datos estructurados, normalmente los equipos ganadores utilizan conjuntos de árboles de gradiente extremo, no redes neuronales profundas.
  2. si tienes datos no estructurados, entonces hay algo raro: normalmente las DNNs dominan a XGboost aquí. Si estás haciendo clasificación de imágenes, no uses un MLP. Casi todo el mundo utiliza ahora una CNN. Además, asegúrate de no usar funciones de activación sigmoideas, sino cosas como ReLU.
  3. No has probado la parada anticipada y el descenso de la tasa de aprendizaje. La parada temprana suele "jugar bien" con la mayoría de los otros métodos de regularización y es fácil de implementar, así que es lo primero que probaría, si estuviera en tu lugar. En caso de que no estés familiarizado con la parada temprana, lee esta bonita respuesta: Parada anticipada frente a la validación cruzada
  4. Si nada más ayuda, deberías comprobar si hay errores en tu código. ¿Puede intentar escribir pruebas unitarias? Si estás usando Tensorflow, Theano o MXNet, ¿puedes cambiar a una API de alto nivel como Keras o PyTorch? Es de esperar que el uso de una API de alto nivel, donde es posible una menor personalización, haga que los errores de las pruebas sean mayores. arriba ...no hacia abajo. Sin embargo, a menudo ocurre lo contrario, porque la API de nivel superior permite hacer el mismo trabajo con mucho menos código y, por tanto, con muchas menos oportunidades de cometer errores. Por lo menos, usted puede estar seguro de que su alto error de prueba no se debe a los errores de codificación....

Por último, no he añadido nada sobre cómo tratar el desequilibrio de clases porque pareces bastante informado, así que supongo que has utilizado los métodos habituales para tratar el desequilibrio de clases. En caso de que me equivoque, házmelo saber y añadiré un par de trucos, citando preguntas que traten específicamente del desequilibrio de clases si es necesario.

0 votos

Gracias por sus comentarios. He actualizado el post original con los detalles que me pedisteis. La otra cosa que quiero señalar es que el error de entrenamiento siempre llega a un mínimo en unas 10 épocas. Después, sólo se tambalea. Además, siempre obtengo la misma proporción de positivos correctos, aunque la recuperación puede variar. Esto me parece muy extraño.

2 votos

Hmmm, es realmente extraño. No creo que pueda ayudar más, pero quizá añadir un gráfico de los errores del conjunto de entrenamiento y de prueba podría atraer más respuestas. Dado que estás usando sólo una neurona de salida, estás usando un umbral para realizar la clasificación, ¿verdad? ¿Ajustaste el umbral usando validación cruzada y AUC? Con datos estructurados, podría darse el caso de que XGboost sea mejor... no sería la primera vez que veo esto. Sin embargo, esto no explica por qué el error del conjunto de entrenamiento se estanca: esto parece indicar un error en el código. Por cierto, no se trata de datos de series temporales, ¿verdad?

0 votos

Bueno, sí son series temporales. Cada fila sería bastante similar, ya que son eventos consecutivos. Así que he probado a muestrear cada N filas en su lugar, y esto hace una diferencia insignificante. He puesto el umbral de salida en 0,5, pero también estoy mirando la precisión media, ya que ésta tiene en cuenta todos los umbrales. Ambos empeoran con el tiempo en el conjunto de validación.

0voto

okomuss Puntos 1

Con algunos años de retraso pero: ¿Qué optimizador estás usando? Adam suele hacer un buen trabajo sin mucho esfuerzo de ajuste. Sin embargo, trabajos recientes parecen mostrar que SGD funciona mejor que los métodos adaptativos en muchos casos, así que probablemente también valga la pena explorarlo. Asegúrese de ajustar tanto la tasa de aprendizaje inicial como la programación de la tasa de aprendizaje. Este último punto podría explicar por qué su pérdida de entrenamiento se estanca en algún momento, si baja la tasa de aprendizaje, debería ver que su pérdida sigue disminuyendo. También puede intentar recortar los gradientes para hacer frente al ruido de cola pesado: https://arxiv.org/pdf/1905.11881.pdf

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X