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?
fonte
Respostas:
Primeiro, obrigado pelas edições da sua pergunta original, pois agora sabemos que você está aplicando a mesma transformação a todos os seus dados.
P: Por que o
perceptrons
desempenho é muito melhor do quegeneralized linear models
em alguns problemas? R: Por serem modelos inerentemente não lineares, com muita flexibilidade. A desvantagem é que os botões adicionais requerem mais dados para serem ajustados corretamente.Quadro geral:
Menos dados podem causar
high-bias
.High-bias
pode ser superado por mais dados. Você reduziu seus dados de um conjunto de dados do recurso 4800 para um conjunto de 38 recursos, portanto, espere ver um aumento no viés.Neural networks
requerem mais dados do que modelos sem camadas ocultas.Linearidade vs. Não Linearidade
Seu
artificial neural network
(perceptron
) é um modelo inerentemente não linear, mas você está decidindo remover recursos do seu conjunto de dados com um modelo linear (PCA
). A presença de uma única camada oculta cria explicitamente termos de segunda ordem nos seus dados e há duas transformações não lineares adicionais (entrada ==> oculta e oculta ==> previsão), que adicionam não linearidade sigmoidal a cada etapa.O fato de os dados de treinamento e os dados de destino serem multiplicados pela mesma matriz para alcançar a dimensionalidade reduzida significa realmente que você
perceptron
precisa aprender a matriz se desejar reconstruir aspectos não lineares dos dados originais. Isso requer mais dados ou você reduz menos a dimensionalidade.Um experimento:
Sugiro tentar um experimento em que você execute a segunda ordem
polynomial feature extraction
no conjunto de dados completo e, em seguida, executePCA
nesse conjunto de dados aprimorado. Veja quantos recursos você termina mantendo 99% da variação do conjunto de dados aprimorado. Se for maior que a dimensionalidade do seu conjunto de dados inicial, fique com o conjunto de dados não aprimorado e não reduzido. Se for entre a dimensionalidade dos dados originais e 38, tente treiná-losperceptron
com esses dados.Uma ideia melhor:
Em vez de usar a variação (linear) para determinar a redução de recurso de sua projeção de PCA, tente treinar e validar cruzadamente seu modelo com diferentes quantidades de redução de dimensionalidade de PCA. Você provavelmente descobrirá que há um ponto ideal para um determinado conjunto de imagens. Por exemplo, um SVM nos dados do dígito MNIST funciona melhor quando os recursos de 784 pixels são reduzidos para 50 recursos linearmente independentes usando o PCA. Embora isso não seja óbvio ao analisar a variação dos componentes principais.
Outras opções:
Existem técnicas de redução de dimensionalidade não lineares, como isomap . Você pode investigar o uso da redução não linear de recursos, uma vez que está claramente perdendo informações com o PCA linear que aplicou.
Você também pode procurar técnicas específicas de imagem
feature extraction
para adicionar alguma não linearidade antes de reduzir a dimensionalidade.Espero que isto ajude!
fonte
d
recursos, mantendo a maior parte da variação (> 99,99% no meu caso), isso significa que os dados estão aproximadamente em um hiperplano ded
dimensões. E quaisquer que sejam os aspectos não lineares, eles são mantidos nosd
recursos. Não? Se sim, por que a rede neural precisaria reconstruir os aspectos não lineares, pois ainda estão presentes?É possível que a maior parte da variação no conjunto de dados exista entre imagens de entrada (ou entre imagens de entrada e saída). Nesse caso, os componentes principais mais informativos servem para separar exemplos de entrada ou para separar a entrada da saída.
Se apenas os PCs menos informativos descreverem a variação das saídas em preto e branco, será mais difícil distinguir entre as saídas do que no espaço de recursos original.
Dito isto, o PCA em imagens raramente é tão útil. Neste exemplo, posso vê-lo atraente, mas provavelmente seria muito mais significativo e compatível com a memória para aprender uma representação diferente da característica de dimensão inferior. Você pode tentar um codificador automático simples, recursos SIFT / SURF ou recursos semelhantes a haar.
fonte
Eu li o seu Post algumas vezes agora. Mas não tenho certeza absoluta se entendi completamente suas experiências. Mas tenho um palpite do que pode estar acontecendo.
Eu acho que o erro está oculto na parte em que você alcança esse espantoso 0,06%. Você não está apenas generalizando para novos dados, mas também prevendo o futuro. Isso não deve funcionar, mas acho que funciona porque a sua rede está terrivelmente equipada. Por assim dizer, sua rede ainda é muito burra. Apenas aprendi que se você mostrar as figuras a, b, ele responderá c. O segundo experimento contém uma reviravolta, se eu entendi corretamente. Presumo que você ainda apresente imagens completas na rede, mas elas são construídas a partir dos coeficientes de suas imagens próprias. Agora, é preciso cuspir coeficientes para construir a resposta a partir das imagens próprias. Mas isso exigiria alguma compreensão do processo, que a rede não adquiriu.
Acho que há várias sugestões para melhorar seu experimento:
O aprendizado de imagens de entrada completas é apenas um problema dimensional extremamente alto que requer uma enorme quantidade de dados de treinamento. Considere calcular os recursos da imagem.
Não tenho certeza se o seu problema de aprendizagem é sólido. Considere separar seus dados de treinamento dos dados de previsão e usar dados mais convencionais, como dígitos manuscritos.
fonte
cross validation
, ou melhor ainda . Então você saberá se o primeiro caso está realmente super ajustado ou não. Você deve sempre validar cruzadamente! Informe-nos o que os resultados mostram. Suspeito que a solução seja mais sutil e esteja mais relacionada à adaptação de uma transformação de PCA diferente a cada imagem, em vez de fazer o PCA em todo o corpus de dados.