Réseau neuronal divergent au lieu de converger

9

J'ai implémenté un réseau neuronal (utilisant CUDA) avec 2 couches. (2 neurones par couche). J'essaie de lui faire apprendre 2 fonctions polynomiales quadratiques simples en utilisant la rétropropagation .

Mais au lieu de converger, il diverge (la sortie devient l'infini)

Voici quelques détails supplémentaires sur ce que j'ai essayé:

  • J'avais mis les poids initiaux à 0, mais comme il divergeait, j'ai randomisé les poids initiaux (plage: -0,5 à 0,5)
  • J'ai lu qu'un réseau de neurones pouvait diverger si le taux d'apprentissage était trop élevé, j'ai donc réduit le taux d'apprentissage à 0,000001
  • Les deux fonctions que j'essaie d'obtenir pour l'ajouter sont: 3 * i + 7 * j + 9 et j * j + i * i + 24 (je donne en entrée les couches i et j)
  • Je l'avais implémenté en une seule couche auparavant et cela pourrait mieux rapprocher les fonctions polynomiales qu'aujourd'hui
  • Je pense à mettre en place une dynamique dans ce réseau mais je ne suis pas sûr que cela l'aiderait à apprendre
  • J'utilise une fonction d'activation linéaire (comme en aucun)
  • Il y a une oscillation au début mais la sortie commence à diverger au moment où l'un des poids devient supérieur à 1

J'ai vérifié et revérifié mon code, mais il ne semble pas y avoir de problème.

Alors, voici ma question: qu'est-ce qui ne va pas ici?

Tout pointeur sera apprécié.

Shayan RC
la source

Réponses:

8
  1. Avec les réseaux de neurones, vous devez toujours initialiser au hasard vos poids pour briser la symétrie.
  2. Si vous n'utilisez pas de fonction d'activation non linéaire dans les unités cachées, vous pourriez tout aussi bien rester avec une seule couche. Votre réseau n'est plus qu'une composition de deux fonctions linéaires, ce qui n'est bien sûr qu'une autre fonction linéaire.
  3. Ce taux d'apprentissage semble excessivement faible. Si j'utilise un taux d'apprentissage fixe, je trouve normalement une valeur comprise entre 0,1 et 0,0001 pour bien fonctionner pour la plupart des problèmes. Cela dépend évidemment du problème, alors prenez mon expérience pour ce que c'est.
  4. En plus de comparer votre code aux mathématiques que vous avez apprises, lors de l'optimisation basée sur un gradient, il peut être très utile de calculer analytiquement les gradients requis en utilisant des différences finies et de les comparer aux valeurs que vous calculez dans votre code. Voir ici pour une discussion sur la façon dont vous pouvez le faire. J'ai détecté de nombreuses erreurs de cette façon et voir ces types de tests réussir m'aide toujours à me sentir beaucoup plus sûr de l'exactitude du code.
alto
la source