Os codificadores automáticos não podem aprender recursos significativos

24

Eu tenho 50.000 imagens como estas duas:

exemplo de dados data example2

Eles representam gráficos de dados. Como eu queria extrair recursos dessas imagens, usei o código de codificador automático fornecido pela Theano (deeplearning.net).

O problema é que esses auto-codificadores parecem não aprender nenhum recurso. Eu tentei RBM e é o mesmo.

O conjunto de dados MNIST fornece recursos interessantes, mas meus dados não parecem produzir nenhum. Anexo exemplos abaixo:

Filtros criados no MNIST:

filtro mnist

Filtros criados por treinamento nos meus dados:

filtros dos meus dados

Eu usei muitas permutações diferentes de tamanhos de camadas ocultas e épocas de treinamento, mas os resultados são sempre os mesmos.

Por que isso não funciona? Por que os autoencoders não podem extrair recursos dessas imagens?

EDITAR:

Para quem tem um problema semelhante. A solução foi realmente simples e a causa, muito estúpida. Esqueci de redimensionar os valores de pixel da codificação RGB para flutuar no intervalo de 0 a 1.

O redimensionamento dos valores resolveu o problema.

b93dh44
fonte

Respostas:

15

A depuração de redes neurais geralmente envolve o ajuste de hiperparâmetros, visualização dos filtros aprendidos e plotagem de métricas importantes. Você poderia compartilhar quais hiperparâmetros você está usando?

  • Qual é o tamanho do seu lote?
  • Qual é a sua taxa de aprendizado?
  • Que tipo de autoencoder você está usando?
  • Você já tentou usar um Autoencoder Denoising? (Que valores de corrupção você já tentou?)
  • Quantas camadas ocultas e de que tamanho?
  • Quais são as dimensões das suas imagens de entrada?

Analisar os logs de treinamento também é útil. Traçar um gráfico da sua perda de reconstrução (eixo Y) em função da época (eixo X). Sua perda de reconstrução é convergente ou divergente?

Aqui está um exemplo de um auto-codificador para a classificação de gênero humano que foi divergente, foi interrompido após 1500 épocas, tinha hiperparâmetros ajustados (neste caso, uma redução na taxa de aprendizado) e reiniciado com os mesmos pesos divergentes e eventualmente convergentes.

Aqui está um que está convergindo: (queremos isso)

A baunilha "sem restrições" pode encontrar um problema em que eles simplesmente aprendem o mapeamento de identidade. Essa é uma das razões pelas quais a comunidade criou os sabores Denoising, Sparse e Contractive.

Você poderia postar um pequeno subconjunto de seus dados aqui? Eu estaria mais do que disposto a mostrar os resultados de um dos meus auto-codificadores.

Em uma nota lateral: você pode se perguntar por que está usando imagens de gráficos em primeiro lugar, quando esses gráficos podem ser facilmente representados como um vetor de dados. Ou seja,

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

Se você é capaz de reformular o problema como acima, está essencialmente facilitando a vida do seu codificador automático. Primeiro, ele não precisa aprender a ver imagens antes de tentar aprender a distribuição gerada.

Resposta de acompanhamento (dados os dados).

Aqui estão os filtros de uma unidade oculta de 1000 unidades, Autoencoder Denoising de camada única. Observe que alguns dos filtros são aparentemente aleatórios. Isso porque parei de treinar tão cedo e a rede não teve tempo de aprender esses filtros.

Aqui estão os hiperparâmetros com os quais eu o treinei:

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

Parei o pré-treinamento após a 58ª época, porque os filtros eram suficientemente bons para serem postados aqui. Se eu fosse você, treinaria um Autoencoder Stacked Denoising completo de 3 camadas com uma arquitetura 1000x1000x1000 para começar.

Aqui estão os resultados da etapa de ajuste fino:

validation error 24.15 percent
test error 24.15 percent

Portanto, à primeira vista, parece melhor que o acaso, no entanto, quando analisamos a divisão de dados entre os dois rótulos, vemos que ele tem exatamente o mesmo percentual (75,85% rentável e 24,15% não rentável). Isso significa que a rede aprendeu a simplesmente responder "rentável", independentemente do sinal. Provavelmente treinaria isso por mais tempo com uma rede maior para ver o que acontece. Além disso, parece que esses dados são gerados a partir de algum tipo de conjunto de dados financeiros subjacentes. Eu recomendo que você analise as Redes Neurais Recorrentes depois de reformular seu problema nos vetores, conforme descrito acima. RNNs podem ajudar a capturar algumas das dependências temporais encontradas em dados de séries temporais como esta. Espero que isto ajude.

sabalaba
fonte
O tamanho do meu lote é 20. A taxa de aprendizado é definida em 0,1. Eu tentei auto-codificadores contrativos e denoising sem sucesso. Eu uso uma camada oculta. Eu tentei de 50 a 1000 neurônios. Eu redimensiono as imagens para 25x25 - para que sejam ainda menores que o mnist. Para o que vale, eu incluo todos os meus dados neste arquivo: Você poderia me mostrar os resultados dos seus codificadores automáticos e esses dados?
b93dh44
O arquivo: mega.co.nz/…
b93dh44
OK, eu treinei uma rede com esses dados. Veja a edição na resposta.
sabalaba
Isso parece realmente interessante. Você poderia postar seu código? Eu realmente aprecio isso. Acho que posso ter algum erro no meu código que impede o treinamento da rede. Percebi que você tem um ajuste fino? Penso que o meu autoencoder apenas pré-treina sem qualquer ajuste fino. Você poderia me mostrar sua solução, se não se importa?
precisa saber é o seguinte
Não é possível postar meu código porque é da minha empresa, mas posso apontar para este tutorial, que possui um código de exemplo para criar um Autoencoder Denoising: deeplearning.net/tutorial/dA.html . Todos os conselhos sobre parâmetros são válidos para esse código.
sabalaba
3

Como não tenho representante suficiente para comentar, colocarei isso em resposta. Não sei o motivo exato, no entanto:

  1. O padrão na região inferior esquerda é semelhante ao seu segundo exemplo, e o padrão no canto inferior direito parece muito com o seu primeiro exemplo, quando inspecionado de perto. A questão é: quanta variedade há nos dados de origem? Se todas as 50.000 imagens são variações do mesmo padrão, esses 3 mapas de recursos significativos que vemos podem ser suficientes para o autoencoder explicar e reconstruir todos os seus dados.

  2. Segundo, você pode querer observar o erro de reconstrução e as imagens reconstruídas reais. Quão bons resultados são? Se o erro de reconstrução for baixo, você pode ter um super ajuste, talvez devido aos resons descritos abaixo (ou talvez a combinação desses 3 padrões seja apenas o suficiente para descrever todos os dados interessados). Caso contrário, o autoencoder simplesmente não pode aprender a reconstruir seus dados e você precisa de um autoencoder maior ou de um algoritmo de treinamento melhor.

Denis Tarasov
fonte
1. Eu acho que há muita variedade nesses dados. Cada um desses 50.000 gráficos é um pouco diferente. Eu acho que é impossível que o autoencoder possa reconstruí-los todos com base em apenas 3 filtros. 2. Alguma dica para estimar o erro de reconstrução? O código que estou usando fornece o erro, mas é um número muito grande que não me diz muito. Devo comparar o erro de reconstrução com o tamanho da entrada ou o número de camadas ocultas?
b93dh44