12
votes

Un réseau neuronal peut-il trouver la I-ème permutation d'une liste de taille fixe?

Brièvement

Un réseau neuronal émule une décomposition factorielle (ou une autre méthode) pour fournir une permutation de liste étant donné l'index unique des permutations? P>

Application H2>

J'ai une liste de 10 choses et ce qu'elles sont sans importance. Ce que je tiens à ce que mes 10 choses puissent être placées en 3628800 (ou 10!) Commandes uniques, car alors je peux exprimer n'importe quel ordre de liste de mes 10 choses à l'aide d'une integer non signée et de décomposition factorielle: p>

function ithPermutationOfNElements (n, i)
{
   var j, k = 0;
   var fact = [];
   var perm = [];

   // compute factorial numbers
   fact[k] = 1;
   while (++k < n)
      fact[k] = fact[k - 1] * k;

   // compute factorial code
   for (k = 0; k < n; ++k)
   {
      perm[k] = Math.floor(i / fact[n - 1 - k]);
      i = i % fact[n - 1 - k];
   }

   // readjust values to obtain the permutation
   // start from the end and check if preceding values are lower
   for (k = n - 1; k > 0; --k)
      for (j = k - 1; j >= 0; --j)
         if (perm[j] <= perm[k])
            perm[k]++;

   return perm;
}
console.log(ithPermutationOfNElements(4, 23)); // [ 3, 2, 1, 0 ]

6 commentaires

Très bonne et claire question.


Étant donné que la bonne réponse est oui et que la réponse raisonnable n'est pas une excellente question de suivi serait la suivante: combien de couches serait-elle un NN à accomplir cela et quel est le meilleur moyen de le former.


@Peter Micheal Lacey-Bordeaux résolvant ce problème à l'aide de NN est complètement différent de l'utilisation normale de NN. Le moyen «algorithme» de le faire serait avec de nombreux neurones qui agissent comme des portes logiques. Vous avez donc maintenant la porte NAND NAND / Flipflips, etc., agissant en tant qu'addateurs / multiplicateurs / loquets, etc., jusqu'à ce que vous ayez essentiellement construit une machine de Turing à un niveau élevé. Il ne ressemblera en aucun cas à une NN normale comme ils sont utilisés par la majorité du monde de l'AI. En outre, vous avez déjà une machine de Turning parfaitement bonne en face de vous.


@andrelucas si vous pouvez incorporer et développer sur cela dans votre réponse, je le choisirai comme gagnant


@andrelucas Oui, je sais que beaucoup de gens sont enseignés à propos de NNS de manière à ce que cela ne soit pas évident. J'aimerais bien voir des preuves formelles de la manière dont l'inefficace NNS peut être, en fait, je pense que la résolution de NNS résoudre des problèmes comme celles-ci pourrait modifier une bonne liaison inférieure à la performance et peut-être même conduire à de meilleurs algorithmes d'apprentissage pour eux.


@Peter, vous ne trouverez pas de telles preuves formelles. Tout simplement parce que, si vous considérez que le simple NN et la porte, j'ai montré ci-dessous comme un NN réel, de NN, puis par cette définition, un matériel et une porte réelles sont également un NN. Ainsi, maintenant, tout ce qui est fabriqué à partir d'une combinaison de portes logiques matérielles normales est un NN (y compris un ordinateur normal). La performance / l'efficacité de la décomposition factorielle mise en œuvre dans la logique procédurale sera donc identique à une implémentation NN - si vous utilisez la définition la plus lâche possible du terme. Mais personne dans le monde de l'AI ne ferait pointer une quincaillerie et une porte et dire: «Oui, c'est un NN '.


4 Réponses :


5
votes

a Neuron peut fonctionner En tant que porte logique , et donc un réseau neuronal peut effectuer tout calcul d'ordinateur. Cependant, dans ce sens, il émule simplement des portes logiques inefficalement, en utilisant du code de haut niveau, ce n'est donc pas une bonne solution à ce problème.

En général, les réseaux de neurones sont bons avec des données «réelles» ou «naturelles». Ils fonctionnent également généralement avec des flotteurs et non des entiers. Donc, s'il y a un modèle à apprendre, un NN pourrait l'apprendre, mais la réponse de sortie que vous obtiendrez sera par exemple 0,783267. Vous pourriez ensuite dénormaliser cela à 89743, mais il est peu probable que cela soit parfaitement correct. Pour votre condition, un entier hors de la bonne réponse est complètement faux. P>

par contraste, pour une reconnaissance de visage NN renvoyant 0,787 ou 0,786 pour une image particulière, les deux pourraient être considérées correctes. P>

Votre problème convient mieux à une solution traditionnelle de code de procédure, avec une seule réponse correcte pour chaque entrée. En règle générale, dans AI, vous recherchez la bonne réponse, dans une plage ou une distribution de probabilité donnée. P>

concernant les algorithmes de mise en œuvre avec NNS:
Vous pouvez avoir de nombreux neurones d'agir en tant que portes logiques, alors vous avez maintenant la porte NAND NAND / Flipflips, etc., agissant en tant qu'addateurs / multiplicateurs / loquets, etc., jusqu'à ce que vous ayez essentiellement construit une machine de Turing, mais en utilisant explicitement un code de haut niveau. Il ne ressemblera en aucun cas à une NN normale comme ils sont utilisés par la majorité du monde de l'AI. En outre, vous avez déjà une machine de Turning parfaitement bonne en face de vous. P>

Voici le code d'un réseau de neurones et de porte à Matlab. Aucune formation n'est requise. J'ai utilisé configurer code> au lieu de train code>, et définissez simplement les poids manuellement. Donc, rendre les autres types logiques que vous pouvez construire une machine de Turing entière. P>

and = feedforwardnet(1);

truthTable = [0 0 1 1; 0 1 0 1];
and_out = [0 0 0 1];

and = configure(and, truthTable, and_out);

vals = [-2 -2 -1  2 0];

and.IW{1} = vals(1:2); % input1 to hidden, input2 to hidden
and.LW{2,1} = vals(3); % hidden to output
and.b{1} = vals(4);     % bias to hidden
and.b{2} = vals(5);     % bias to output

y = sim(and, truthTable)
round (y)
mse = mean ((y - and_out) .^ 2)


y =
    0.0000    0.0180    0.0180    0.9820
ans =
     0     0     0     1
mse =
   2.4263e-04


11 commentaires

Juste une pensée rapide à ce que la distribution / une plage de probabilité pourrait limiter l'espace problématique à analyser. Par exemple. L'ordinateur 0 recherche à travers [0, 7257], que si un NN pourrait réduire cet espace à quelque chose comme [500, 600] réduisant considérablement le calcul nécessaire pour résoudre le problème. Espérons que le même NN pourrait également réduire l'espace de l'autre ordinateur, rendre efficacement la recherche de toute la recherche plus rapidement. Bien sûr, pour être utile, le NN devrait converger une solution plus rapidement que la solution procédurale directe.


Pas pour ce problème particulier. Nous recherchons la permutation d'une liste fixe. Comment savez-vous si le NN a eu la plage réduite correcte? Vous devez utiliser un algorithme de procédure pour le prouver. Et à ce stade, vous avez déjà résolu le problème initial.


@SlaterTyRanus Soins pour développer ce problème?


@andrelucas Une réponse réelle prendrait une énorme quantité de temps, mais voici quelques points: 1. Les filets neurones n'ont aucune obligation de travailler avec des flotteurs ou des entiers et peuvent faire à la fois de manière interchangeable, en fonction de la fonction d'activation que vous utilisez. 1. Les NN standard ne sont pas statiques. 3. Le nombre de nœuds d'entrée et de sortie est totalement non pertinent, les filets neurones préfèrent effectivement des entrées plus petites pour des raisons de complexité de calcul. 4. Les fonctions et les algorithmes sont équivalents (voir: Turning Turness). 5. Les résultats sont la partie pertinente d'un algorithme.


@andrelucas Limite de caractère m'a arrêté, alors poursuivant ici: 6. L'ensemble du processus de formation d'un réseau neuronal implique un apprentissage supervisé, ce qui signifie que vous devez le montrer la sortie afin de l'entraîner du tout. 7. Il n'y a aucune raison que le Neural Net devrait être un filet neuronal récurrent, que vous devez expliquer ou mentionner. Je conviens que ce n'est pas une bonne solution, mais c'est possible, ce qui concerne la seule chose correcte que vous avez dit.


Je pense que @andrelucas aurait pu essayer de dire cela compte tenu des intrants et des sorties - un NN choisirait d'apprendre l'identité (c'est-à-dire une cartographie de 1 à 1) de tous les numéros de formation fournis.


@Slater Tyranus Il n'y a pas de définition mathématique stricte de ce qui est exactement et n'est pas, un NN. Ceci est complètement différent de par exemple, l'hypothèse de Riemann, qui peut être prouvée exactement vraie pour tous les cas possibles ou non. Vous affirmez avec confiance qu'un NN peut fonctionner sur INTS? J'affirme avec confiance qu'une telle configuration, qui est limitée aux fonctions d'activation entier uniquement, n'est pas plus qu'une collection d'additifs et de multiplicateurs (ne peut pas utiliser la division, le trig, le numéro E, etc.) et ne répond pas à la définition d'un NN. Qui est la définition? Exactement - il n'y a pas de définition stricte. ... Cond ...


... Aucun de nous ne peut être prouvé strictement bien ou faux. L'exception est intégrée NN, en utilisant un petit no. des portes logiques utilise de grands INT qui sont des implémentations matérielles essentiellement optimisées de flotteurs. Niveau bas, flotteur / INT n'existe même pas - seulement 0s et 1s. Plus bas, même 1 n'existe pas - seule une tension analogique de 4,98-5.02V. Nous pouvons continuer comme ceci pour tous les 7 de vos points. Même "algorithme" n'a pas de définition mathématique stricte et exacte pour tous les cas possibles. OP, ne sachant rien à propos de NNS, a demandé des conseils généraux - et c'est comme ça que j'ai répondu à la question.


@andrelucas Il existe en fait des définitions mathématiques strictes des filets neurones. Spécifiquement, vous avez une fonction d'activation, une matrice de poids et une matrice de biais. J'affirme avec confiance que les filets neurones travaillent sur INTS parce que la fonction d'activation la plus courante est une fonction étape, et une binarisation a été montrée pour être instrumentale (Hinton 2010). L'ajout et la multiplication sont les seules opérations qu'un filet neural est jamais capable de! L'ensemble du point de complétude de Turing est que vous pouvez construire n'importe quelle fonction (y compris les fonctions de Trig) de ces opérations simples (voir: Cordon)


Je peux prouver mathématiquement que les filets neurones sont capables de choses que vous discutez qu'elles ne sont pas capables de. Votre dernière tangente est absurde et l'algorithme a absolument une définition mathématique stricte. Je ne pense vraiment pas que vous plaignez davantage est utile, mais je souhaite vraiment que vous préoccuperiez de rechercher des filets neurones avant de diffuser ce type de désinformation brute.


Ok, regarde ça comme ça. Donnez-moi un exemple de n'importe quel paradigme informatique , qui comprend au minimum deux numéros (choisissez n'importe quel type de données) et une unité de traitement (additionneur ou tout type) que vous faites pas considère être un nn. Peu importe ce que vous dites, je dirai alors que votre suggestion est également aussi une NN, par votre propre définition . Une définition qui détient que tout paradigme informatique, à partir d'un simple additionneur, à un supercalculateur de crayon, est un NN. Ce n'est pas une définition utile. Comment le différenciez-vous à un algorithme génétique ou à un serveur Web? Par votre définition, tous les deux sont NNS.



4
votes

Un fait peu connu est que les filets neuronaux récurrents Turing sont terminés et peuvent ainsi effectuer tout calcul qu'un ordinateur peut (voir résultat de Siegelmann ).

Cela ne signifie pas non plus (a) que vous pouvez facilement trouver les poids nécessaires par un algorithme d'apprentissage ou (b) qu'un filet d'alimentation en avant, comme vous cherchez probablement, peut le faire.

Néanmoins, cela semble être une tâche que vous ne voulez pas faire avec un filet neural.


0 commentaires

4
votes

En règle générale, les réseaux de neurones sont des approximateurs de fonction universelle, donc en théorie oui.

Plus spécifiquement, remarquez que pour une valeur particulière (fixe) I, le réseau neuronal qui le résouche est trivial (et, en fait, ne nécessite aucun des nœuds cachés ni des fonctions d'activation. C'est un problème linéaire).

comme une force brute, solution naïve, pour le problème général avec I I: un réseau de neurones suffisamment grand pour encoder les 10! Les codages linéaires possibles, avec une couche cachée qui agissent essentiellement de mux en fonction de l'entrée I, résoudrait le problème. Des réseaux plus efficaces existent probablement et il serait intéressant d'essayer une architecture récurrente pour ce problème.

Dans tous les cas, alors qu'une solution existe certainement, la meilleure question est de savoir si c'est un bon moyen de le résoudre. Si un problème se résume à un simple pseudocode simple, j'éviterais une mise en œuvre du réseau de neurones à moins que cela ne soit à des fins académiques.


3 commentaires

Un nn donné tous les 10! Les codages imiteraient les résultats de l'algorithme, pas l'algorithme lui-même. La décomposition factorielle est un algorithme, pas une fonction.


Pour aider à toute confusion, je ne suggère pas que tous les 10! Les résultats possibles sont des entrées dans le filet, mais plutôt que la couche cachée est suffisamment grande pour résoudre de manière indépendante les 10! Résultats simultanément et une couche finale qui pèse simplement fortement les ensembles correspondant à la commande correcte basée sur l'entrée I. Ce serait un réseau massivement géant et ne s'entraînerait jamais correctement, mais il montre qu'un réseau existe pour résoudre le problème.


Consultez ma réponse concernant les portes d'algorithme NN / logiques à Peter Micheal Lacey-Bordeaux's Commentaire ci-dessus.



0
votes

Je pense que peut possible. Entrée vos données et un seul numéro (à partir de 0 ou 1). Faites-le produire un seul numéro représentant le numéro d'élément (le tour). Ajouter ce numéro à votre liste. Ensuite, faites à nouveau, à l'exception augmentation du nombre que vous nourrissez au réseau de neurones par 1 (à savoir le nombre qui représente l'élément dans la liste que vous voulez trouver.)

Un réseau de neurones récursive serait idéal. Mais je ne suis toujours pas certain si la fonction sous-jacente peut être apprise ou approximée efficacement. Je pense que cela pourrait être.


0 commentaires