Création d'un réseau neuronal pour la fonction xor

8

C'est un fait bien connu qu'un réseau à une couche ne peut pas prédire la fonction xor, car elle n'est pas séparable linéairement. J'ai tenté de créer un réseau à 2 couches, en utilisant la fonction sigmoïde logistique et backprop, pour prédire xor. Mon réseau a 2 neurones (et un biais) sur la couche d'entrée, 2 neurones et 1 biais dans la couche cachée et 1 neurone de sortie. À ma grande surprise, cela ne convergera pas. si j'ajoute une nouvelle couche, j'ai donc un réseau à 3 couches avec entrée (2 + 1), caché1 (2 + 1), caché2 (2 + 1) et sortie, cela fonctionne. De plus, si je garde un réseau à 2 couches, mais que j'augmente la taille de la couche cachée à 4 neurones + 1 biais, il converge également. Y a-t-il une raison pour laquelle un réseau à 2 couches avec 3 neurones cachés ou moins ne pourra pas modéliser la fonction xor?

utilisateur
la source
2
Vous pouvez prédire XOR en utilisant cette structure. En fait, vous n'avez même pas besoin de biais (voir ici ).
krychu
Dois-je initialiser mes poids d'une manière spéciale pour obtenir la convergence? J'essaie un simple réseau neuronal avec des poids entre (-1,1) initialisés au hasard, mais je n'arrive pas à le faire converger (même en utilisant des biais)
utilisateur
En fait, en utilisant le sigmoïde logistique, il converge parfois, mais pas toujours, cela dépend du choix initial de poids aléatoires.
utilisateur
Votre plage semble assez large, essayez (-0,1, 0,1). Sinon, vous risquez que le signal d'entrée vers un neurone puisse être important dès le début, auquel cas l'apprentissage pour ce neurone est lent. Vous pouvez également vouloir réduire le taux d'apprentissage et augmenter le nombre d'itérations.
krychu
Au contraire, des valeurs plus élevées la font converger plus rapidement. J'ai essayé un taux d'apprentissage plus petit et de nombreuses itérations. Je pense que la réponse de Neil Slater ci-dessous résume les problèmes, même si je ne sais toujours pas pourquoi.
utilisateur

Réponses:

7

Oui, il y a une raison. Cela a à voir avec la façon dont vous initialisez vos poids.

Il existe 16 minimums locaux qui ont la plus forte probabilité de converger entre 0,5 et 1.

entrez la description de l'image ici

Voici un article qui analyse le problème xor.

Emil
la source
2
Apparaît que le lien est rompu.
Adam Kingsley
@Emil Donc, si les poids sont très petits, vous dites qu'il ne convergera jamais? J'ai également fixé le lien pour vous.
utilisateur
@user Correct.
Emil
6

Un réseau avec une couche cachée contenant deux neurones devrait être suffisant pour séparer le problème XOR. Le premier neurone agit comme une porte OU et le second comme une porte NON ET. Ajoutez les deux neurones et s'ils franchissent le seuil, c'est positif. Vous pouvez simplement utiliser des neurones de décision linéaires pour cela en ajustant les biais pour les seuils. Les entrées de la porte NOT AND doivent être négatives pour les entrées 0/1. Cette image devrait le rendre plus clair, les valeurs sur les connexions sont les poids, les valeurs dans les neurones sont les biais, les fonctions de décision agissent comme des décisions 0/1 (ou juste la fonction de signe fonctionne dans ce cas aussi).

Réseau neuronal XOR

Photo grâce au "blog Abhranil"

Jan van der Vegt
la source
Merci, alors il n'est pas possible de le faire en utilisant un sigmoïde logistique, car il limite la valeur à (0,1)
utilisateur
Non, il devrait toujours être possible d'apprendre cela avec un sigmoïde logistique, il devrait simplement apprendre les seuils / poids différemment
Jan van der Vegt
Le biais dans la porte NAND doit être un +1.5.
Marc
4

Si vous utilisez une descente de gradient de base (sans autre optimisation, telle que l'élan) et un réseau minimal 2 entrées, 2 neurones cachés, 1 neurone de sortie, il est certainement possible de l'entraîner à apprendre XOR, mais cela peut être assez délicat et peu fiable.

  • Vous devrez peut-être ajuster le taux d'apprentissage. L'erreur la plus courante est de le régler trop haut, afin que le réseau oscille ou diverge au lieu d'apprendre.

  • Il peut falloir un nombre étonnamment élevé d'époques pour former le réseau minimal à l'aide d'une descente de gradient par lots ou en ligne. Peut-être plusieurs milliers d'époques seront nécessaires.

  • Avec un si petit nombre de poids (seulement 6), une initialisation aléatoire peut parfois créer une combinaison qui se coince facilement. Vous devrez donc peut-être essayer, vérifier les résultats, puis redémarrer. Je vous suggère d'utiliser un générateur de nombres aléatoires prédéfini pour l'initialisation et d'ajuster la valeur de départ si les valeurs d'erreur se bloquent et ne s'améliorent pas.

Neil Slater
la source
Oui, c'est ce que j'observe, avec certaines valeurs de départ, cela converge, d'autres pas. De plus, si j'utilise une tangente hyperbolique au lieu de sigmoïde, cela fonctionne assez bien tout le temps, avec sigmoïde, cela dépend de la graine, comme vous l'avez observé. Quelle est la raison pour laquelle cela est si difficile?
utilisateur
Je ne suis pas tout à fait sûr de la raison mathématique, c'est juste de mon expérience d'écriture de suite de tests autour de l'apprentissage de xor. Dans mon cas, l'ajout de l'élan a aidé, mais je pense que tout ajustement loin du réseau le plus simple et / ou de l'optimiseur aide.
Neil Slater