As redes neurais devem sempre convergir?

16

Introdução

Passo um

Escrevi uma rede neural padrão de backpropegating e, para testá-la, decidi mapear o XOR.

É uma rede 2-2-1 (com função de ativação tanh)

X1  M1
        O1
X2  M2

B1  B2

Para fins de teste, configurei manualmente o neurônio do meio superior (M1) como uma porta AND e o neurônio inferior (M2) como uma porta OR (saída 1 se verdadeira e -1 se falsa).

Agora, também configurei manualmente a conexão M1-O1 como -.5, M2-O1 como 1 e B2 como -.75

Portanto, se M1 = 1 e M2 = 1, a soma é (-0,5 +1 -0,75 = -,25) tanh (0,25) = -0,24

se M1 = -1 e M2 = 1, a soma é ((-0,5) * (- 1) +1 -0,75 = 0,75) tanh (0,75) = 0,63

se M1 = -1 e M2 = -1, a soma é ((-0,5) * (- 1) -1 -0,75 = -1,25) tanh (1,25) = -0,8

Este é um resultado relativamente bom para uma "primeira iteração".

Passo dois

Depois, modifiquei um pouco esses pesos e os treinei usando o algoritmo de propagação de erros (com base na descida do gradiente). Nesse estágio, deixo intactos os pesos entre os neurônios de entrada e os médios e apenas modifico os pesos entre o meio (e o viés) e a saída.

Para o teste, defino os pesos como e .5 .4 .3 (respectivamente para M1, M2 e viés)

Aqui, no entanto, começo a ter problemas.


Minha pergunta

Defino minha taxa de aprendizado como 0,2 e deixo o programa repetir os dados de treinamento (ABA ^ B) para 10000 iterações ou mais.

Na maioria das vezes, os pesos convergem para um bom resultado. No entanto, às vezes, esses pesos convergem para (digamos) 1.5, 5.7 e .9, o que resulta em uma saída +1 (par) para uma entrada de {1, 1} (quando o resultado deve ser -1).

É possível que uma RNA relativamente simples, que tenha uma solução para não convergir, ou que haja algum erro na minha implementação?

Xodarap
fonte

Respostas:

13

(Eu assumo por "propagação de erros" você quer dizer que eu chamo de "erro de volta -propagation.")

Na página 231 da Neural Networks (de Haykin), ele afirma que a propagação de retorno sempre converge, embora a taxa possa ser (em suas palavras) "terrivelmente lenta".

Acho que o que você está perguntando não é se o algoritmo sempre convergirá, mas se sempre convergirá para a resposta ideal. E, infelizmente, não vai. Mesmo em casos simples como o seu, é perfeitamente possível que existam mínimos locais que não sejam mínimos globais.

Lidar com extremos locais é um tópico extremamente importante na otimização, e você pode encontrar uma infinidade de conselhos sobre como lidar com isso. Um dos mais comuns é o que parece que você está fazendo: reinicializações aleatórias (ou seja, basta executar o algoritmo várias vezes, cada uma começando de um local aleatório).

Para descobrir se há um erro no seu código, imprimi o termo do erro e verifique se ele diminui a cada iteração. Nesse caso, provavelmente você está apenas atingindo um mínimo local.

Xodarap
fonte
Todos os pesos aumentam (o peso do neurônio OR aumenta mais rapidamente), o que minimiza o erro quando a entrada é {1,0}, {0,1}, {0,0}, mas maximiza o erro quando {1,1}. Isso é um problema com o aprendizado on-line sobre o aprendizado em lotes?
@ Shmuel: online e em lote vão na direção do gradiente. Se esse gradiente apontar na direção errada, os dois irão na direção errada. A página da Wikipedia sobre Hill Climbing tem algumas maneiras de contornar isso, se você estiver interessado.
Xodarap
6

Se você fixou os pesos entre as unidades de entrada e ocultas e só está modificando os pesos ocultos para os de saída durante o treinamento, não haverá mínimos locais. Com entrada fixa para pesos ocultos, o problema de otimização que você está resolvendo é semelhante à regressão logística, mas com uma função tanh em vez de sigmóide. Independentemente do problema ser convexo, deve haver apenas um mínimo global.

Como os mínimos locais não estão causando seu problema, recomendo aproximar numericamente suas derivadas e compará-las com os valores que você está computando. Se você não tiver certeza de como fazer isso, o tutorial do Standford ULFDL tem uma boa visão geral.

alto
fonte