O objetivo:
Eu sou novo em aprendizado de máquina e experimento com redes neurais. Eu gostaria de construir uma rede que tenha como entrada uma série de 5 imagens e preveja a próxima imagem. Meu conjunto de dados é completamente artificial, apenas para minha experimentação. Como ilustração, aqui estão alguns exemplos de entrada e saída esperada:
As imagens dos pontos de dados e dos destinos são da mesma fonte: a imagem de destino de um ponto de dados aparece em outros pontos de dados e vice-versa.
O que eu fiz:
Por enquanto, eu construí um perceptron com uma camada oculta e a camada de saída fornece os pixels da previsão. As duas camadas são densas e feitas de neurônios sigmóides e eu usei o erro quadrado médio como objetivo. Como as imagens são bastante simples e não variam muito, isso funciona bem: com 200 a 300 exemplos e 50 unidades ocultas, recebo um bom valor de erro (0,06) e boas previsões nos dados de teste. A rede é treinada com descida gradiente (com escala de taxa de aprendizado). Aqui estão os tipos de curvas de aprendizado que recebo e a evolução do erro com o número de épocas:
O que estou tentando fazer:
Tudo isso é bom, mas agora eu gostaria de reduzir a dimensionalidade do conjunto de dados para que ele fosse dimensionado para imagens maiores e mais exemplos. Então eu apliquei o PCA. No entanto, não o apliquei na lista de pontos de dados, mas na lista de imagens , por dois motivos:
- No conjunto de dados como um todo, a matriz de conveniência seria 24000x24000, o que não cabe na memória do meu laptop;
- Ao fazer nas imagens, também posso comprimir os alvos, pois eles são feitos das mesmas imagens.
Como as imagens parecem todas semelhantes, consegui reduzir o tamanho de 4800 (40x40x3) para 36, perdendo apenas 1e-6 da variação.
O que não funciona:
Quando eu alimento meu conjunto de dados reduzido e seus alvos reduzidos à rede, a descida do gradiente converge muito rapidamente para um erro alto (cerca de 50!). Você pode ver os gráficos equivalentes aos acima:
Eu não imaginava que uma curva de aprendizado pudesse começar com um valor alto e depois descer e voltar ... E quais são as causas comuns da descida do gradiente parando tão rápido? Poderia estar vinculado à inicialização do parâmetro (eu uso o GlorotUniform, o padrão da biblioteca lasanha).
Percebi então que, se eu alimentar os dados reduzidos, mas os destinos originais (não compactados), recuperarei o desempenho inicial. Parece que aplicar o PCA nas imagens de destino não era uma boa ideia. Por que é que? Afinal, eu apenas multipliquei os insumos e os objetivos pela mesma matriz, para que os insumos e os objetivos do treinamento ainda estejam vinculados de uma maneira que a rede neural possa descobrir, não? o que estou perdendo?
Mesmo que eu apresente uma camada extra de 4800 unidades para que haja o mesmo número total de neurônios sigmóides, obtenho os mesmos resultados. Para resumir, tentei:
- 24000 pixels => 50 sigmóides => 4800 sigmóides (= 4800 pixels)
- 180 "pixels" => 50 sigmóides => 36 sigmóides (= 36 "pixels")
- 180 "pixels" => 50 sigmóides => 4800 sigmóides (= 4800 pixels)
- 180 "pixels" => 50 sigmóides => 4800 sigmóides => 36 sigmóides (= 36 "pixels")
- 180 "pixels" => 50 sigmóides => 4800 sigmóides => 36 lineares (= 36 "pixels")
(1) e (3) funcionam bem; mas não (2), (4) e (5), e eu não entendo o porquê. Em particular, como (3) funciona, (5) deve ser capaz de encontrar os mesmos parâmetros que (3) e os vetores eigen na última camada linear. Isso não é possível para uma rede neural?