Question: est-il possible de former un NN pour distinguer entre les nombres pairs et impairs en utilisant uniquement comme entrée les nombres eux-mêmes?
J'ai le jeu de données suivant:
Number Target
1 0
2 1
3 0
4 1
5 0
6 1
... ...
99 0
100 1
J'ai formé un NN avec deux neurones d'entrée (l'un étant le nombre variable, l'autre étant un neurone de polarisation), neuf neurones dans la couche cachée et un neurone de sortie en utilisant un algorithme génétique très simple: à chaque époque, deux ensembles de poids se battent " l'un contre l'autre; celui avec l'erreur la plus élevée perd et il est remplacé par une version modifiée du gagnant.
Le script résout facilement les problèmes simples comme les opérateurs ET, OU et XOR, mais reste bloqué en essayant de classer les nombres pairs et impairs. À l'heure actuelle, le mieux qu'il a réussi à faire est d'identifier 53 numéros sur 100 et cela a pris plusieurs heures. Que je normalise ou non les entrées ne fait aucune différence.
Si je voulais tricher, je pourrais simplement prétraiter les données et envoyer% 2 au NN en entrée, mais je ne veux pas le faire; NN devrait être en mesure d'approximer toutes les fonctions, y compris l'opérateur modulo (je crois ). Qu'est-ce que je fais mal?
la source
Réponses:
Comme pour toute tâche d'apprentissage automatique, la représentation de votre contribution joue un rôle crucial dans la façon dont vous apprenez et généralisez.
Je pense que le problème avec la représentation est que la fonction (modulo) est hautement non linéaire et pas lisse dans la représentation d'entrée que vous avez choisie pour ce problème.
J'essaierais ce qui suit:
Essayez un meilleur algorithme d'apprentissage (rétropropagation / descente de gradient et ses variantes).
Essayez de représenter les nombres en binaire en utilisant une précision de longueur fixe.
Si votre représentation d'entrée est un nombre b-bit, je m'assurerais que votre ensemble d'entraînement n'est pas biaisé vers les petits ou les grands nombres. Avoir des nombres qui sont uniformément et indépendamment choisis au hasard dans la plage .[ 0 , 2b- 1 ]
Comme vous l'avez fait, utilisez un réseau multicouche (essayez d'abord 2 couches: c'est-à-dire caché + sortie, avant d'utiliser plus de couches).
Utilisez un ensemble de formation + test séparé. N'évaluez pas vos performances sur l'ensemble d'entraînement.
la source
Apprendre à classer les nombres pairs et impairs est un problème difficile. Un motif simple ne cesse de se répéter à l'infini. 2,4,6,8 ..... 1,3,5,7 .....
Les fonctions d'activation non linéaires comme sin (x) et cos (x) se comportent de manière similaire. Par conséquent, si vous changez vos neurones pour implémenter sin et cos au lieu de fonctions d'activation populaires comme tanh ou relu, je suppose que vous pouvez résoudre ce problème assez facilement en utilisant un seul neurone.
Les transformations linéaires précèdent toujours les transformations non linéaires. Par conséquent, un seul neurone finira par apprendre le péché (ax + b) qui, pour la bonne combinaison de a & b, produira alternativement des 0 et des 1 à la fréquence souhaitée que nous voulons, qui dans ce cas est 1.
Je n'ai jamais essayé le péché ou le cos dans mes réseaux neuronaux auparavant. Donc, je m'excuse si cela finit par être une très mauvaise idée.
la source
Je travaille donc avec des réseaux neuronaux en ce moment et j'ai rencontré le même problème que vous. Ce que j'ai fini par faire était de représenter le nombre d'entrée sous forme de tableau avec des valeurs égales à la représentation binaire du nombre. Puisque ce que nous faisons est de classer, j'ai représenté ma sortie sous forme de tableau, pas une seule valeur. ex:
J'espère que cela t'aides!
la source
J'arrive ici où était aux prises avec un problème similaire. J'écris donc ce que j'ai réussi.
Pour autant que je sache, une couche de perceptron est capable de résoudre tous les problèmes, ce qui peut être finalement simplifié pour diviser les objets dans n'importe quelle géométrie en utilisant une ligne droite. Et c'est ce genre de problème. Si vous dessinez le dernier bit de représentation binaire sur papier, vous pouvez également tracer une ligne, et tous les nombres impairs sont d'un côté, et même de l'autre. Pour la même raison, il est impossible de résoudre le problème xor avec un réseau à une seule couche.
D'accord. Ce problème semble très simple, alors prenons l'étape Heaviside comme fonction d'activation. Après avoir joué un peu avec mon numéro, j'ai réalisé que le problème ici est avec le biais. Je google un peu, et ce que j'ai trouvé, c'est que si vous restez avec la représentation géométrique, le biais vous permet de changer le lieu d'activation dans le système de coordonnées.
Problème très éducatif
la source
Il est bien connu que les portes logiques NON, ET, OU peuvent toutes être effectuées avec des réseaux neuronaux très simples (NN), et que vous pouvez construire une calculatrice arithmétique complète avec des portes logiques en utilisant des nombres binaires en entrée. Par conséquent, vous devriez pouvoir créer un NN pour calculer n modulo k, pour tout nombre n et k exprimé en base 2.
Si vous souhaitez calculer n modulo k pour un nombre k fixe (par exemple k = 4), vous pouvez réellement créer un NN extrêmement simple qui fait cela: exprimez le nombre d'entrée n en base k et ignorez tous les chiffres autres que le rang le plus bas chiffre, et vous avez la réponse!
la source
Une idée évitant l'utilisation du "mod 2" explicite dans l'entrée pourrait être de codifier le nombre comme une séquence de pixels, alors le problème revient à reconnaître si le segment peut être divisé en deux segments égaux. Il s'agit d'un problème de vision industrielle qui pourrait être appris par les réseaux conventionnels.
À l'autre extrême, si le nombre est stocké sous forme de flottant, la question se réduit (ou se généralise) pour reconnaître quand un nombre flottant est approximativement un entier.
la source
J'ai créé un tel réseau en ici .
La représentation donnée par @William Gottschalk était la fondation.
Il utilise seulement 1 neurone dans la première couche cachée avec 32 entrées. La couche de sortie n'a que 2 neurones pour un codage à chaud de 0 et 1.
la source
Ma solution
De plus, diviser par d'autres nombres (disons 7), c'est bien aussi:
Explication:
J'obtiens 2 solutions différentes. Ils sont tous les deux bons:
1. le péché comme activation
2. le plancher (ou int) comme activation
Il est impossible de trouver les meilleurs poids en utilisant la descente de gradient, et j'utilise un algorithme génétique (de scikit-opt )
la source