Los codificadores automáticos no pueden aprender funciones significativas

24

Tengo 50,000 imágenes como estas dos:

ejemplo de datos ejemplo de datos2

Representan gráficos de datos. Quería extraer características de estas imágenes, así que utilicé el código del codificador automático proporcionado por Theano (deeplearning.net).

El problema es que estos autoencoders no parecen aprender ninguna característica. He intentado RBM y es lo mismo.

El conjunto de datos MNIST proporciona buenas características, pero mis datos no parecen producir ninguno. Adjunto ejemplos a continuación:

Filtros creados en MNIST:

filtro mnist

Filtros creados por la capacitación en mis datos:

filtros de mis datos

He usado muchas permutaciones diferentes de tamaños de capas ocultas y épocas de entrenamiento, pero los resultados son siempre los mismos.

¿Por qué no funciona? ¿Por qué los codificadores automáticos no pueden extraer características de estas imágenes?

EDITAR:

Para cualquiera que tenga un problema similar. La solución fue realmente simple y la causa realmente tonta. Simplemente olvidé reescalar los valores de píxeles de la codificación RGB para flotar en el rango 0-1.

Los valores de reescalado resolvieron el problema.

b93dh44
fuente

Respuestas:

15

La depuración de redes neuronales generalmente implica ajustar hiperparámetros, visualizar los filtros aprendidos y trazar métricas importantes. ¿Podría compartir qué hiperparámetros ha estado usando?

  • ¿Cuál es su tamaño de lote?
  • ¿Cuál es tu tasa de aprendizaje?
  • ¿Qué tipo de autoencoder estás usando?
  • ¿Has intentado usar un autoencoder denoising? (¿Qué valores de corrupción has intentado?)
  • ¿Cuántas capas ocultas y de qué tamaño?
  • ¿Cuáles son las dimensiones de sus imágenes de entrada?

Analizar los registros de entrenamiento también es útil. Trace un gráfico de su pérdida de reconstrucción (eje Y) en función de la época (eje X). ¿Su pérdida de reconstrucción es convergente o divergente?

Aquí hay un ejemplo de un autoencoder para la clasificación de género humano que era divergente, se detuvo después de 1500 épocas, tenía hiperparámetros sintonizados (en este caso, una reducción en la tasa de aprendizaje) y se reinició con los mismos pesos que fueron divergentes y finalmente convergieron.

Aquí hay uno que converge: (queremos esto)

Vanilla "sin restricciones" puede encontrarse con un problema en el que simplemente aprenden el mapeo de identidad. Esa es una de las razones por las cuales la comunidad ha creado los sabores Denoising, Sparse y Contractive.

¿Podría publicar un pequeño subconjunto de sus datos aquí? Estaría más que dispuesto a mostrarle los resultados de uno de mis codificadores automáticos.

En una nota al margen: es posible que desee preguntarse por qué está utilizando imágenes de gráficos en primer lugar cuando esos gráficos podrían representarse fácilmente como un vector de datos. Es decir,

[0, 13, 15, 11, 2, 9, 6, 5]

Si puede reformular el problema como se indica arriba, esencialmente está haciendo más fácil la vida de su codificador automático. No necesita primero aprender a ver imágenes antes de intentar aprender la distribución generadora.

Respuesta de seguimiento (dada la información).

Aquí están los filtros de una unidad oculta de 1000 unidades, Denoising Autoencoder de una sola capa. Tenga en cuenta que algunos de los filtros son aparentemente aleatorios. Eso es porque dejé de entrenar tan temprano y la red no tuvo tiempo de aprender esos filtros.

Aquí están los hiperparámetros con los que lo entrené:

batch_size = 4
epochs = 100
pretrain_learning_rate = 0.01
finetune_learning_rate = 0.01
corruption_level = 0.2

Paré el pre-entrenamiento después de la 58ª época porque los filtros eran lo suficientemente buenos como para publicar aquí. Si yo fuera usted, entrenaría un Autoencoder de Denoising Apilado de 3 capas completo con una arquitectura 1000x1000x1000 para comenzar.

Aquí están los resultados del paso de ajuste:

validation error 24.15 percent
test error 24.15 percent

Entonces, a primera vista, parece mejor que casualidad, sin embargo, cuando miramos el desglose de datos entre las dos etiquetas, vemos que tiene exactamente el mismo porcentaje (75.85% rentable y 24.15% no rentable). Eso significa que la red ha aprendido a responder simplemente "rentable", independientemente de la señal. Probablemente entrenaría esto por más tiempo con una red más grande para ver qué pasa. Además, parece que estos datos se generan a partir de algún tipo de conjunto de datos financieros subyacentes. Le recomendaría que examine las redes neuronales recurrentes después de reformular su problema en los vectores como se describe anteriormente. Los RNN pueden ayudar a capturar algunas de las dependencias temporales que se encuentran en datos de series de tiempo como este. Espero que esto ayude.

sabalaba
fuente
El tamaño de mi lote es 20. La tasa de aprendizaje se establece en 0.1. He intentado autoencoders contractivos y denoising en vano. Yo uso una capa oculta. He intentado de todo, desde 50 hasta 1000 neuronas. Escalo las imágenes a 25x25, por lo que son incluso más pequeñas que mnist. Para lo que vale, adjunto todos mis datos en este archivo: ¿Podría mostrarme los resultados de sus codificadores automáticos y estos datos?
b93dh44
El archivo: mega.co.nz/…
b93dh44
OK, he entrenado una red con esos datos. Vea la edición en la respuesta.
sabalaba 01 de
Eso se ve muy interesante. ¿Podrías enviarme tu código? Realmente lo aprecio. Creo que podría tener algún error en mi código que impide que la red entrene. Me di cuenta de que tienes una etapa de ajuste? Creo que mi autoencoder solo preentrena sin ningún ajuste fino. ¿Podría mostrarme su solución, si no le importa?
b93dh44
No puedo publicar mi código porque es de mi empresa, pero puedo señalarle este tutorial que tiene un código de ejemplo para hacer un Autoencoder de Denoising: deeplearning.net/tutorial/dA.html . Todos los consejos de hiperparámetros se mantendrán para ese código.
sabalaba el
3

No tengo suficiente representante para comentar, así que pondré esto en respuesta. Sin embargo, no sé la razón exacta:

  1. El patrón en la región inferior izquierda se parece a su segundo ejemplo, y el patrón en la esquina inferior derecha se parece mucho a su primer ejemplo, cuando se inspecciona de cerca. La pregunta es, ¿cuánta variedad hay en sus datos de origen? Si las 50 000 imágenes son variaciones del mismo patrón, estos 3 mapas de características significativas que vemos pueden ser suficientes para que el codificador automático explique y reconstruya todos sus datos.

  2. En segundo lugar, es posible que desee ver el error de reconstrucción y las imágenes reconstruidas reales. ¿Qué tan buenos son los resultados? Si el error de reconstrucción es bajo, es posible que tenga un sobreajuste, tal vez debido a las resonas que se describen a continuación (o tal vez la combinación de estos 3 patrones sea suficiente para describir todos los datos interesados). De lo contrario, el codificador automático simplemente no puede aprender cómo reconstruir sus datos y necesita un codificador automático más grande o un mejor algoritmo de entrenamiento.

Denis Tarasov
fuente
1. Creo que hay mucha variedad en estos datos. Cada uno de estos 50,000 gráficos es ligeramente diferente. Creo que es imposible que el codificador automático pueda reconstruirlos a todos en base a solo 3 filtros. 2. ¿Algún consejo para estimar el error de reconstrucción? El código que estoy usando proporciona el error pero es un número realmente grande que no me dice mucho. ¿Debo comparar el error de reconstrucción con el tamaño de la entrada o el número de capas ocultas?
b93dh44