Les réseaux neuronaux sont donc très intéressants. Il existe une preuve qu'un seul perceptron peut apprendre n'importe quelle fonction linéaire avec suffisamment de temps. Plus impressionnant encore, un réseau neuronal à une seule couche cachée peut apparemment apprendre n'importe quelle fonction, bien que je n'aie pas encore vu de preuve à ce sujet.
XOR est une bonne fonction pour l'enseignement des réseaux neuronaux car, en tant qu'étudiants en CS, les élèves de la classe sont probablement déjà familiarisés avec cette fonction. En outre, elle n'est pas triviale au sens où un seul perceptron peut l'apprendre. Elle n'est pas linéaire. Voir ce graphique que j'ai créé.
Il n'y a pas de ligne qui sépare ces valeurs. Pourtant, elle est suffisamment simple pour que les humains la comprennent et, plus important encore, pour qu'un humain puisse comprendre le réseau neuronal qui la résout. Les réseaux neuronaux sont très "boîte noire", il devient difficile de dire pourquoi ils fonctionnent si vite. Voici un exemple un autre configuration du réseau qui peut résoudre XOR.
Votre exemple d'un réseau plus compliqué qui résout le problème plus rapidement montre la puissance qui résulte de la combinaison de plus de neurones et de plus de couches. Il n'est absolument pas nécessaire d'utiliser 2 ou 3 couches cachées pour résoudre le problème, mais cela permet d'accélérer le processus.
Le fait est qu'il s'agit d'un problème suffisamment simple pour être résolu par un humain et sur un tableau noir en classe, tout en étant légèrement plus difficile qu'une fonction linéaire donnée.
EDIT : Un autre exemple fantastique pour l'enseignement pratique des NN est le jeu de données MNIST de classification de chiffres dessinés à la main. Je trouve qu'il montre très facilement un problème qui est à la fois très simple à comprendre pour les humains, très difficile à écrire un programme de non-apprentissage, et un cas d'utilisation très pratique pour l'apprentissage automatique. Le problème est que la structure du réseau est impossible à dessiner sur un tableau noir et à retracer ce qui se passe d'une manière pratique pour une classe. XOR permet d'y parvenir.
EDIT 2 : Aussi, sans le code, il sera probablement difficile de diagnostiquer pourquoi il ne converge pas. Avez-vous écrit les neurones vous-même ? Qu'en est-il de la fonction d'optimisation, etc ?
EDIT 3 : Si la sortie du dernier nœud de votre fonction est 0,5, essayez d'utiliser une fonction d'écrasement de pas qui transforme toutes les valeurs inférieures à 0,5 en 0, et toutes les valeurs supérieures à 0,5 en 1. Vous n'avez de toute façon qu'une sortie binaire, alors pourquoi s'embêter avec une activation continue sur le dernier nœud ?