Rede neural divergindo em vez de convergir

9

Eu implementei uma rede neural (usando CUDA) com 2 camadas. (2 neurônios por camada). Estou tentando fazê-lo aprender duas funções polinomiais quadráticas simples usando a retropropagação .

Mas, em vez de convergir, é divergente (a saída está se tornando infinita)

Aqui estão mais alguns detalhes sobre o que eu tentei:

  • Eu havia definido os pesos iniciais como 0, mas, como estava divergente, randomizei os pesos iniciais (Faixa: -0,5 a 0,5)
  • Li que uma rede neural pode divergir se a taxa de aprendizado for muito alta, então reduzi a taxa de aprendizado para 0,000001
  • As duas funções que estou tentando obter são: 3 * i + 7 * j + 9 e j * j + i * i + 24 (estou dando a camada iej como entrada)
  • Eu o havia implementado como uma única camada anteriormente e isso poderia aproximar as funções polinomiais melhor do que está fazendo agora
  • Estou pensando em implementar o impulso nesta rede, mas não tenho certeza se isso ajudaria a aprender
  • Estou usando uma função de ativação linear (como no no)
  • Há oscilação no início, mas a saída começa a divergir no momento em que qualquer um dos pesos se torna maior que 1

Eu verifiquei e verifiquei novamente meu código, mas não parece haver nenhum tipo de problema com ele.

Então, aqui está a minha pergunta: o que está acontecendo de errado aqui?

Qualquer ponteiro será apreciado.

Shayan RC
fonte

Respostas:

8
  1. Com redes neurais, você sempre precisa inicializar aleatoriamente seus pesos para quebrar a simetria.
  2. Se você não usar uma função de ativação não linear nas unidades ocultas, poderá ter ficado com uma única camada. Sua rede agora é apenas uma composição de duas funções lineares, que é obviamente apenas outra função linear.
  3. Essa taxa de aprendizado parece excessivamente pequena. Se estou usando uma taxa de aprendizado fixa, normalmente encontro um valor entre 0,1 e 0,0001 para funcionar bem na maioria dos problemas. Obviamente, isso depende do problema, portanto, leve minha experiência para o que é.
  4. Além de verificar seu código com relação à matemática que você aprendeu, ao fazer a otimização baseada em gradiente, pode ser muito útil calcular analiticamente os gradientes necessários usando diferenças finitas e compará-los com os valores que você está computando em seu código. Veja aqui uma discussão de como você pode fazer isso. Eu peguei muitos erros dessa maneira e ver esses tipos de testes sempre me ajudam a ter muito mais certeza da correção do código.
alto
fonte