Aller au contenu


Photo
- - - - -

Piste pour l'Intelligence Artificielle (IA)


14 réponses à ce sujet

#1 Crazy John

Crazy John

    Nouveau membre

  • Membres
  • 6 messages

Posté 01 janvier 2013 - 10:10

Bonjour à tous,

Mon TPE (en première, on a une espèce d'exposé-expérience à faire) de l'année dernière était sur l'intelligence artificielle. Sauf que j'ai fait un peu de la merde, surtout ce que les jurys voulaient entendre et que mes camarades pouvaient comprendre (Pas qu'ils soient cons, mais juste qu'ils branlaient rien et qu'ils en avaient rien à foutre de la matière) mais j'avais un peu réfléchi au problème de l'intelligence artificielle de mon côté. Et donc je suis venu vous en faire part.

Au fait, tout ce que je dis, c'est basé sur des suppositions etc. J'ai absolument pas un avis d'experts et c'est qu'une ébauche d'idée, une piste, c'est pour ça que je viens le mettre ici pour qu'on l'améliore tous ensemble.


Donc, j'ai réfléchi à la notion d'intelligence avant d'aborder celle d'intelligence artificielle. Et donc, un constat simple, c'est qu'on définit l'intelligence par l'intelligence humaine moyenne. Principe du test du Quotient Intellectuel, 100, c'est la moyenne, 15, c'est l'écart-type. Donc on pourra s'amuser à dire qu'un chien est con, ou qu'un ordinateur qui plante est vachement con, parce qu'on le compare à nous. Bref, l'idée, c'est que pour essayer d'avoir une intelligence artificielle, on a pas 10.000 choix, soit on simule une intelligence humaine, soit on re-crée une intelligence humaine.

Le problème, c'est que la première solution est très limitée, car on ne pourra la simuler que dans un cadre restreint car sinon on est confronté aux limites de cette simulation. Imaginez un agent conversationnel du style skaaz, sylbot, bidiiz ou un shwarpzouille du genre, il peut simuler un humain, mais déjà il apprendra rien, et ensuite, dès qu'on parle genre plus de 5 répliques, on se confronte généralement assez vite à ses limites.

Donc maintenant, je me rabats sur l'autre, qui est de re-créer une intelligence humaine. L'approche qu'on aime bien aujourd'hui, c'est de traiter toutes les facultés que recouvre l'intelligence humaine séparément et genre d'en faire un shlougadamix le jour où on pourra le faire. Le problème, c'est que c'est pas comme ça que ça se passe, au contraire, dans un cerveau, tout est lié, si on veut tout séparer, ça va être la mort, car chacune de ces fonctions élémentaires nécessite énormément de ressources si on veut les reproduire parfaitement et donc le shlougadamix qui en résulterait serait un monstre consommateur. Et un supercalculateur pour faire un cerveau humain qui aura nécessité d'ailleurs beaucoup de jus de cerveau pour sa programmation, c'est pas très rentable.

Bah, ma solution, c'est de recréer l'intelligence humaine de la même manière qu'elle s'est créée. Et je suis évolutionniste, car c'est ce qui mobilise le mieux la réalité. J'ai rien contre les créationnistes, mais si vous pensez que l'homme a été créé tel quel et qu'il n'a pas bougé d'un iota depuis la seconde de sa création, désolé, on pourra pas aller plus loin ensemble. Donc on a un environnement de départ, des lois de la physique, et beaucoup de temps, on arrive à la Terre avec la création de la vie. Ensuite, d'un bidule monocellulaire on arrive à un organisme déjà plus complexe, on passe par l'arbre et le singe pour finalement arriver à nous, merveille de la nature.

Donc mon idée, ce serait de simuler un univers, avec des règles bien à lui (genre un monde en 2D, tous les éléments sont carrés, pas de gravité, bref, on se fera plaisir en fonction de ce qui sera le plus simple et qui pourrait donner le plus de résultat), et on le poserait au moment de la création de la vie (genre, chaque espèce serait une classe, chaque être vivant un objet, les mutations donnent lieu à de propriétés et méthodes, on a l'hérédité etc.), ensuite, on le laisserait tourner un peu jusqu'à voir les objets qui en sortiraient, et voir s'ils seraient transposables dans notre univers, ou si l'on pourrait transposer des problèmes de notre univers dans le leur.

Bref, c'est vachement utopique là, mais c'est que l'idée de base. Si ça vous tente, on peut essayer d'y réfléchir plus posément.


Bonne soirée !

#2 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 01 janvier 2013 - 10:59

Hello !

J'aime beaucoup ta façon de voir les choses.

soit on simule une intelligence humaine, soit on re-crée une intelligence humaine.

Le soucis, c'est qu'actuellement, l'IA n'a pas pour prétention de recréer l'intelligence humaine, mais, comme tu le dis après, d'essayer de résoudre de petits problèmes en s'inspirant du vivant (mais pas dans le but de tout mettre ensemble le moment venu, c'est utopique).
Le but premier, c'est de trouver de nouvelles techniques qui permettent de résoudre certain problèmes spécifique non résolvable jusqu'à présent.

Par exemple, se libérer des contraintes de centralisation grâce aux systèmes distribués, avoir des systèmes plus robustes aux fautes imprévues grâces aux systèmes multi-agents, pouvoir obtenir une solution approximative en peu de temps à un problème de complexité exponentielle grâce aux algo évolutionnistes, résoudre des problèmes de classifications et de reconnaissances grâce aux réseaux de neurone et à l'apprentissage.

D'ailleurs la définition même de l'IA évolue avec le temps !
Il y a 20 ou 30 ans, on considérait qu'un programme sachant rivaliser avec les maitres aux échec était un programme doté d'une intelligence artificielle. Actuellement, un tel programme n'est rien d'autre qu'un bête algorithme du min-max qui calcule tous les coups et qui sélectionne celui avec le plus de probabilité de gagner...


Si je devais donner une définition personnelle :
l'IA permet de résoudre des problèmes qui paraissent intraitable informatiquement actuellement. Dès qu'un problème est résolue, l'algorithme qui a permis cela n'est déjà plus de l'IA. (ironique non ?)


Bah, ma solution, c'est de recréer l'intelligence humaine de la même manière qu'elle s'est créée. Et je suis évolutionniste, car c'est ce qui mobilise le mieux la réalité.

Si tu sais programmer, je te conseillerai de regarder du côté des algorithmes évolutionnistes, et plus particulièrement des algorithmes génétiques. C'est un algorithme "générique" qui s’appuie sur le vivant et sur le concept de sélection naturelle de Darwin.
Tu as un problème et tu essaye de trouver une bonne solution.
Tu prend une population de base, qui correspond à un ensemble de solutions aléatoire.
Tu sélectionnes les meilleures solution, tu les croisent entre-elles et tu leurs applique des mutations aléatoire, puis tu resélectionnes les meilleurs, et ainsi de suite.
Au fur et à mesure des générations, tu verra converger ta population vers un ensemble de solutions optimales ;)

Le second truc qui pourrait t'intéresser, c'est les réseaux de neurones et leurs capacités d'apprentissages, c'est aussi amusant :)


Donc mon idée, ce serait de simuler un univers, avec des règles bien à lui (genre un monde en 2D, tous les éléments sont carrés, pas de gravité, bref, on se fera plaisir en fonction de ce qui sera le plus simple et qui pourrait donner le plus de résultat), et on le poserait au moment de la création de la vie (genre, chaque espèce serait une classe, chaque être vivant un objet, les mutations donnent lieu à de propriétés et méthodes, on a l'hérédité etc.), ensuite, on le laisserait tourner un peu jusqu'à voir les objets qui en sortiraient, et voir s'ils seraient transposables dans notre univers, ou si l'on pourrait transposer des problèmes de notre univers dans le leur.

Genre un truc comme ça ?
(à base d'algo G et de réseaux de neurones ;) )

Mon site internet : http://ferdinandpiette.com/


#3 Crazy John

Crazy John

    Nouveau membre

  • Membres
  • 6 messages

Posté 02 janvier 2013 - 12:10

"Si je devais donner une définition personnelle :
l'IA permet de résoudre des problèmes qui paraissent intraitable informatiquement actuellement. Dès qu'un problème est résolue, l'algorithme qui a permis cela n'est déjà plus de l'IA. (ironique non ?)"
J'aurais dit paradoxal. Mais c'est surtout le fait que ça file pas une définition de l'IA, juste une des implications de ta définition.


Sinon, mec, tu me vends de l'or.
Tu me prouves qu'on a déjà la technologie pour.

Mais sinon, je voudrais aller encore plus loin, genre, création de nouvelles espèces, ajout de "matériel génétique", création de nouvelles structures de programme etc.

Nous, on se limite à créer l'univers.

#4 miq75

miq75

    Membre

  • Membres
  • 41 messages
  • Gender:Male
  • Location:Wissembourg

Posté 06 janvier 2013 - 11:08

C'est même de la programmation génétique, et pas seulement des algos génétiques dont tu parles.

Un algo génétique fait évoluer une population de chromosomes-solutions à un problème. Ces solutions sont fixes en taille et généralement linéaires dans leur application immédiate (Par exemple les valeurs des connexions d'un réseau de neurones, dont le nombre est déterminé. Pour chaque individu, tu attribues ces valeurs une fois à ta grille de neurones et tu en excites les entrées une ou plusieurs fois, selon ton modèle, pour en mesurer les résultats). Permuter 2 gènes, c'est permuter 2 chiffres. ça reste trivial, même si en canaliser les conséquences sur un apprentissage évolutif par un algo gén peut en rendre les conséquences très influentes.

En programmation génétique, c'est un cas particulier : c'est une population de programmes qu'on fait évoluer. Un programme n'est pas délimité par sa taille ni par sa linéarité (même si sa représentation codée est linéaire, ce n'est pas le cas de sa complexité). Il est délimité par un espace d'instructions possibles et la façon dont celles-ci s'imbriquent. Permuter 2 lignes de code, ou 2 lettres dans le nom d'une variable, ça mènera dans la quasi totalité des cas à un plantage syntaxique... Bref, ça reste faisable, mais déterminer un espace d'évolution du programme pertinent est une autre paire de manches. Et je ne te parles pas de l'univers dans lequel ce programme évolue, hein, soyons clairs, mais bien de la matière première que tu vas donner à ton algo gén comme chromosomes.

Tu veut créer de nouveaux individus "intelligents" (trouver de nouvelles "structures de programme" d'intelligence), pourquoi pas, mais tes individus seront-ils intelligents ou appliquerons-t-il seulement un programme, comme un programme joueur d'échec ? Est-ce que l'intelligence ne sera pas dans ton système de programmation génétique au lieu d'être dans les individus ? Est-ce que créer de cette façon des individus réellement intelligents (capables de s'adapter et de s'améliorer par eux même) n'implique pas qu'ils soient eux même capable d'apprendre, donc nécessitant un apprentissage long (lui même sur plusieurs millier d'itérations) à chacune des itération (individu) de ton programme ? comment gérer cette complexité (complexité de l'apprentissage d'un individu × complexité de l'apprentissage évolutif de ton système) ?

#5 miq75

miq75

    Membre

  • Membres
  • 41 messages
  • Gender:Male
  • Location:Wissembourg

Posté 06 janvier 2013 - 11:42

Et sinon, et ça n'a rien à voir :
J'ai entendu hier une émission sur la façon dont les abeilles communiquaient entre elles dans la ruche sur leurs zones de butinage. C'était comme un apprentissage, avec un individu faisant une danse codée traduisant pour les autres la position du cite intéressant, sa richesse, son danger, etc... Bref, un beau système multi-agents. Et comme dans tout système d'apprentissage, y'a une part d'exploration (certaines abeilles) et une part d'exploitation (certaines abeilles collectent). C'est souvent un point problématique dans un système d'apprentissage, comment déterminer la part d'exploration par rapport à celle d'exploitation. Et j'ai trouvé la solution des abeilles très élégante, parce qu'adaptable. Ce sont les butineuese les plus vieilles de la ruche, qui, passées un certain âge, deviennent exploratrices (et donc celles qui ont le mieux survécues aux péripéties de la collecte toute une vie d'abeille durant.

Bref, à noter : dans un système d'apprentissage ou les individus peuvent mourir à des ages différents, pour résoudre le problème de la part d'exploration par rapport à la part d'exploitation, faire exploiter tous les individus dans leur jeunesse, puis faire explorer les individus à partir d'un peu avant qu'ils n'atteignent l'espérance de vie moyenne de la population.

Vu ton projet, il est possible que ça te serve.

#6 Crazy John

Crazy John

    Nouveau membre

  • Membres
  • 6 messages

Posté 07 janvier 2013 - 09:32

L'intelligence se situera dans la strcture de création du programme, je compte toujours utiliser la même (globalement) en changeant seulement l'univers dans lequel évoluent les "sous programmes" et lorsqu'on arrive à une solution jugée suffisante, on l'applique sinon on relance un nnouveau tour de sélection.

De cette manière, le temps de "chargement" se limite à la génération du programme. Mais après, j'ai aucune idée quant à l'intelligence du programme générée lui même. Peut être qu'il sera intelligent, peut être pas. S'il l'est pas et qu'il montre ses limites, on lancera une nouvelle sélection. Mais après je pense que ça dépendra aussi et surtout dans l'univers dans lequel il évolue (cf le joueur d'échec, ici, "apprendre", c'est quoi ?)

En fait, même avec des programmes "simples", je ne les imaginais pas intelligents eux-mêmes, c'est toi qui vient de m'en donner l'idée.

Sinon, je pensais faire un kit de "méthodes élémentaires" et d' "attributs élémentaires" pour chaque univers. Les protéines du code. Ensuite, tu serializes ta classe et tu appliques à la chaine de caractère ton "hasard génétique". Et pour "l'exploration", pour moi, c'était surtout la part de mutants par rapport aux individus sains. J'imaginais un rapport évolant en fonction de l'efficacité du programme. (À chaque génération, on ajoute "1" à un attribut existant pour chaque méthode dans la classe -métodes élémentaires comprises-, et on fait le ratio sommedesattributs divisé par nombredeméthodes pour obtenir l'efficacité. De plus, une méthode ayant un gros attribut a moins de chances d'être modifiée.)

Donc ça traduisait bien ma vision l'intelligence qui est le générateur et non dans le programme.

#7 miq75

miq75

    Membre

  • Membres
  • 41 messages
  • Gender:Male
  • Location:Wissembourg

Posté 07 janvier 2013 - 07:51

Alors tu es bien dans le paradigme de l'intelligence dans le comportement collectif mais pas de l'évolution d'individus intelligents (ce qui n'étais pas clair vu que tu partait de l'intelligence humaine, qui est individuelle).

Le système que tu décrit me fait plus penser à un système de tableau noir qu'à de la programmation génétique. Une liste de règles (ce que tu appelles méthodes élémentaires) posées et appliquées selon un ordre et un poids. L'ordre et le poids pouvant évoluer avec l'apprentissage. Si ton algo n'est qu'une liste de commandes, sans structures de boucles et de tests, ce n'est plus a proprement parler un programme (bien que le système qui gère cela soit lui un algo gen).

Il existe déjà des systèmes qui permettent de fournir (entre autres) tous les composants de la simulation d'agents basée sur de telles règles (par exemple DIMA, du lip6 (en java), j'y ai intégré un système pour gérer les règles durant mon DEA), mais a ma connaissance ils n'intègrent pas encore les algos gen comme sélecteurs de priorités/poids. Cela dit ils te faciliteraient grandement le travail pour tes simulations, tu devrais y jeter un coup d'œil !

#8 Crazy John

Crazy John

    Nouveau membre

  • Membres
  • 6 messages

Posté 08 janvier 2013 - 10:04

Bah le but, c'est qu'il puisse y avoir des conditions et des structures itératives. Les méthodes seront constituées des méthodes élémentaires et de tests sur les attributs élémentaires.

Au fait, pour la formation des méthodes élémentaires, c'était soit on les introduisait nous-mêmes, soit le programme testait toutes les instructions du langage de programmation dans lequel il est conçu (par ordre de priorité) pour trouver des structures fondamentales viables, qui seront elles les méthodes élémentaires.

#9 miq75

miq75

    Membre

  • Membres
  • 41 messages
  • Gender:Male
  • Location:Wissembourg

Posté 09 janvier 2013 - 11:24

Alors je vais te parler un peu de compilation (programmation de compilateurs):
Un programme vu par un compilateur, c'est un arbre d'instructions dont chaque bloc de code (typiquement les fonctions, ce qui est dans les clauses if, then et else, et ce qui est dans les boucles) est un nœud et dont les branches d'un même nœud sont ordonnées. Toi, ça te paraît linéaire, parce que tu le lit dans un fichier texte qui est linéaire, mais pas pour le compilateur ou l'interpréteur. Et je ne parle pas non plus de la complexité de l'exécution d'un programme, qui est encore un problème différent.

Bref, un simple
if A or B then {
   foo
   bar
}

c'est déjà un arbre avec 4 feuilles (A, B, foo, bar) et 3 nœuds (if-then, or, {}). La complexité de cet arbre augmente assez vite (et encore je n'ai pas défini foo et bar, qui sont probablement eux-même des arbres). C'est ce genre de choses que tu devra manipuler si tu veut faire un "programme" génétique. Pas question par exemple de dire "tiens, choisi 20 instructions parmi celles-là". Le 20 est lui même une chose qui devra être testée mais surtout rendue cohérente avec la recherche.

Si je prends un langage au hasard, par exemple python qui possède une notation relativement allégée par rapport à d'autres et que je compte le nombre de "statement", c'est à dire de mots du langage, j'en ai facilement 20. Les opérateurs y'en a facilement 30, et encore je ne parle pas de l'analyse syntaxique des noms de variable et de fonctions. Bref, un pool de 50 composants qui articulent le programme, plus les variables. Soit 50 type de possibilité pour chaque nœud (un 'or', qui possède une arité de 2 peut contenir 2 feuilles aussi bien que 2 nœuds qui peuvent être n'importe quelle expression bien construite du langage, un '.' bien que son arité soit 1 peut faire appel à n'importe quel attribut ou propriété d'un objet...).

Donc pour un nœud, 50 possibilité de valeur du nœud à multiplier par l'arité du type de nœud et encore à multiplier par la complexité des possibles expressions bien construites qui en découlent...

Je ne cherche pas à te décourager, mais à te faire réaliser la complexité de ce à quoi tu t'attelles. Faire une recherche aléatoire mais dirigée dedans est possible, mais c'est très complexe. Tu devra probablement le faire sur un langage que tu aura construit toi-même, ce qui veut dire un langage qui n'est pas forcément complet...

Après, y'a des astuces pour gérer moins d'instructions, comme par exemple de ne placer les opérateurs logiques que dans les clauses if. Mais ne perds pas de vue que tu auras 2 complexités à gérer, celle de l'univers dans lequel tes créatures évoluerons, et celle du langage qui supportera ton programme génétique.

À mon avis, commence par très petit pour le simulateur et pour le langage, puis quand tu auras un truc qui complet qui tournera (un programmateur génétique ET le simulateur qu'il utilise) alors tu pourra chercher à augmenter les capacités du langage, avant d'augmenter celles de l'espace de simulation. Courage !

#10 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 09 janvier 2013 - 02:07

À mon avis, commence par très petit pour le simulateur et pour le langage, puis quand tu auras un truc qui complet qui tournera (un programmateur génétique ET le simulateur qu'il utilise) alors tu pourra chercher à augmenter les capacités du langage, avant d'augmenter celles de l'espace de simulation. Courage !

Il me semble que du côté des langages fonctionnels, tu disposes d'une modularité assez intéressante justement pour travailler en programmation génétique. Je n'ai plus le nom du langage en tête, mais la syntaxe est du genre (opérateur variable variable) et il est facile d'interchanger les différents opérateurs et variables (dans la limite du même type, des nombres dans ce cas).
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#11 miq75

miq75

    Membre

  • Membres
  • 41 messages
  • Gender:Male
  • Location:Wissembourg

Posté 09 janvier 2013 - 06:49

L'ordre de la notation – préfixe (opérateur var var - par ex LISP ou SCHEME), postfixe (var var opérateur - comme FORTH ou RPL) ou infixe (var opérateur var - comme les maths) – ne change pas la complexité structurelle en fait, ton arbre aura toujours le même nombre de nœuds, c'est l'ordre des branches au sein de l'arbre et leur sens de lecture qui change.

Sortir la parenthèse – (func, arg1, arg2) au lieu de func(arg,arg2) – en revanche, ça peut peut-être faciliter la génération plus automatique du code parce que tu généralise ta notation. Du coup un nœud commencera par "(".

Enfin, utiliser un langage fonctionnel, c'est à dire remplacer des variables par des données fixes, ça implique parfois d'avoir au lieu d'une variable plusieurs données, ou une syntaxe accumulant la même donnée (la liste manipulée). Ce qui est intéressant c'est que tu sors effectivement de la linéarité artificielle de l'exécution du code, ta structure est donc un peu plus libre, mais tu risque de devoir plus charger ton arbre de compilation pour un résultat équivalent.
en scheme :
(define (map f lst)
    (cond ((null? lst) lst)
          (else (cons (f (car lst))
                      (map f (cdr lst))))))
en python :
def map(func, liste):
    res = []
    for elt in liste:
        res.append(func(elt))
    return res

ou (plus pythonique mais strictement équivalent)

def map(func, liste):
    return [func(elt) for elt in liste]

en c++ :
template < class InputIterator, class OutputIterator, class UnaryOperator >
  OutputIterator transform ( InputIterator first1, InputIterator last1,
                             OutputIterator result, UnaryOperator op )
{
  while (first1 != last1)
    *result++ = op(*first1++);  // or: *result++=binary_op(*first1++,*first2++);
  return result;
}
En python ou on C, tu passes par une boucle et tu remplace chaque élément par le résultat de la fonction.
En scheme (le fonctionnel), tu doit faire un appel récursif sur chaque elt de la liste séparé de la liste, donc tu : sépare un élément de la liste, calcule le reste de la liste séparée récursivement, et recolle la liste. Ça me parait un tantinet plus complexe comme arbre de compilation, même si ça supprime effectivement le besoin des nœuds de type 'for' ou 'while' en les remplaçant par des récurrences.


Je ne suis pas certain que tu y gagnes au final.

En revanche, ça peut être intéressant de regarder les langages fortement mais non déclarativement typés, comme le Caml. Imagine la surcharge de devoir gérer la cohérence entre le type d'une var lors de sa déclaration et lors de son usage, alors que tu peut utiliser des typages dynamiquement calculés. Bref, c'est à voir et à soigneusement étudier avant de commencer à te plonger dans du code.

Après, je ne connait que le principe des algo gens et n'en ait jamais programmé moi-même, alors je me trompe peut-être du tout au tout, hein, je ne fais que donner mon humble avis sur comment je commencerais. ;)/>

#12 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 10 janvier 2013 - 12:39

(...)
En python ou on C, tu passes par une boucle et tu remplace chaque élément par le résultat de la fonction.
En scheme (le fonctionnel), tu doit faire un appel récursif sur chaque elt de la liste séparé de la liste, donc tu : sépare un élément de la liste, calcule le reste de la liste séparée récursivement, et recolle la liste. Ça me parait un tantinet plus complexe comme arbre de compilation, même si ça supprime effectivement le besoin des nœuds de type 'for' ou 'while' en les remplaçant par des récurrences.


Je ne suis pas certain que tu y gagnes au final.

En revanche, ça peut être intéressant de regarder les langages fortement mais non déclarativement typés, comme le Caml. Imagine la surcharge de devoir gérer la cohérence entre le type d'une var lors de sa déclaration et lors de son usage, alors que tu peut utiliser des typages dynamiquement calculés. Bref, c'est à voir et à soigneusement étudier avant de commencer à te plonger dans du code.

Après, je ne connait que le principe des algo gens et n'en ait jamais programmé moi-même, alors je me trompe peut-être du tout au tout, hein, je ne fais que donner mon humble avis sur comment je commencerais. ;)/>/>/>

C'est bien à LISP ou SCHEME que je pensais. :)
J'ai un peu répondu sur un souvenir de cours, mais je viens de relire l'OP, je vais donc essayer de re-contextualiser ma réponse. En fait, ce type de langage (fonctionnelle) est intéressant pour faire évoluer les programmes : la régularité dans la syntaxe permet d'échanger deux bouts de code sans générer des syntax error. Je m'explique :

Si le génome de deux individus est le suivant (le code est écrit sans respect d'une quelconque vérité du langage, je ne connais principalement que cette propriété de régularité) :
gen_1 : (x (+ 3 5) capteur_mesure)
gen_2 : (ET obstacle_dist avancer_dist)

On peut faire un croisement en coupant le génome au même endroit (par exemple entre operateur et valeurs) et obtenir un code toujours compilable :
gen_1 : (ET (+ 3 5) capteur_mesure)
gen_2 : (x obstacle_dist avancer_dist)

Il n'aura sûrement pas de sens, mais c'est le propre des algos G de produire des individus et de vérifier ensuite leur viabilité.

Or, dans un langage comme le C :
gen_1 : if(a < <img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />/>{ return a; }
gen_2 : a+= b, b*=2;
Couper le génome à la même position n'a déjà pas beaucoup de sens, mais en plus, le génome fils ne compilera probablement pas. Difficile de tester un programme dans une tâche particulière s'il ne compile pas. D'ailleurs, le nombre de programme qui auront la chance de compiler dans ce cas est très faible. D'ou l'intérêt de la programmation fonctionnelle.

J'espère que ma remarque est plus claire. :)/>

Donc, j'ai réfléchi à la notion d'intelligence avant d'aborder celle d'intelligence artificielle. Et donc, un constat simple, c'est qu'on définit l'intelligence par l'intelligence humaine moyenne. Principe du test du Quotient Intellectuel, 100, c'est la moyenne, 15, c'est l'écart-type. Donc on pourra s'amuser à dire qu'un chien est con, ou qu'un ordinateur qui plante est vachement con, parce qu'on le compare à nous. Bref, l'idée, c'est que pour essayer d'avoir une intelligence artificielle, on a pas 10.000 choix, soit on simule une intelligence humaine, soit on re-crée une intelligence humaine.

Tout dépend de ce que tu entends par intelligence. Si tu parles d'un système capable de faire des inférences tel que le nôtre, d'adapter notre comportement en fonction d'un ensemble de stimuli et d'apprendre tout au cours de sa vie, oui, il faut viser un "niveau humain". Cela dit, la plupart des animaux possèdent une intelligence, en fonction d'une part de leurs besoins, et d'autre part associée à leur corps. Et être capable de reproduire ne serait-ce que les capacités cognitives d'un animal comme le chien, voire même d'un oiseau représente déjà un défi.

Donc maintenant, je me rabats sur l'autre, qui est de re-créer une intelligence humaine. L'approche qu'on aime bien aujourd'hui, c'est de traiter toutes les facultés que recouvre l'intelligence humaine séparément et genre d'en faire un shlougadamix le jour où on pourra le faire. Le problème, c'est que c'est pas comme ça que ça se passe, au contraire, dans un cerveau, tout est lié, si on veut tout séparer, ça va être la mort, car chacune de ces fonctions élémentaires nécessite énormément de ressources si on veut les reproduire parfaitement et donc le shlougadamix qui en résulterait serait un monstre consommateur. Et un supercalculateur pour faire un cerveau humain qui aura nécessité d'ailleurs beaucoup de jus de cerveau pour sa programmation, c'est pas très rentable.

En fait, il existe dans le cerveau des zones qui ont été identifiées comme spécifiques à un traitement particulier. Ainsi, les aires visuelles se situent à l'arrière du crâne tandis qu'on suppose que les émotions se trouvent plutôt dans le cortex pré-frontal (donc l'avant et le front) et une partie des mécanismes de prise de décision au centre, dans les ganglions de la base. Effectivement, toutes ces parties sont liées, mais en général, les aires qui traitent la perception projettent vers les aires plus profondes qui s'occupent des fonctions plus abstraites. Comprendre le traitement que fait chaque zone aide à comprendre les structures qui sont présentes. Je pense qu'on peut voir le cerveau comme un assemblage complexe de petites boîtes avec des entrées et des sorties, et une mécanique interne qui fait le filtrage. Les interactions entre ces boîtes construisent des fonctions de plus en plus "haut niveau", et ensuite ... la conscience émerge, d'une manière où d'une autre (là, on y est pas encore malgré des écrits plus ou moins douteux de penseurs divers).

Bah, ma solution, c'est de recréer l'intelligence humaine de la même manière qu'elle s'est créée. Et je suis évolutionniste, car c'est ce qui mobilise le mieux la réalité. J'ai rien contre les créationnistes, mais si vous pensez que l'homme a été créé tel quel et qu'il n'a pas bougé d'un iota depuis la seconde de sa création, désolé, on pourra pas aller plus loin ensemble. Donc on a un environnement de départ, des lois de la physique, et beaucoup de temps, on arrive à la Terre avec la création de la vie. Ensuite, d'un bidule monocellulaire on arrive à un organisme déjà plus complexe, on passe par l'arbre et le singe pour finalement arriver à nous, merveille de la nature.

Donc mon idée, ce serait de simuler un univers, avec des règles bien à lui (genre un monde en 2D, tous les éléments sont carrés, pas de gravité, bref, on se fera plaisir en fonction de ce qui sera le plus simple et qui pourrait donner le plus de résultat), et on le poserait au moment de la création de la vie (genre, chaque espèce serait une classe, chaque être vivant un objet, les mutations donnent lieu à de propriétés et méthodes, on a l'hérédité etc.), ensuite, on le laisserait tourner un peu jusqu'à voir les objets qui en sortiraient, et voir s'ils seraient transposables dans notre univers, ou si l'on pourrait transposer des problèmes de notre univers dans le leur.

Il faut voir que l'Évolution (avec un grand É) s'est faite avec un ensemble très important de pressions de sélection due à l'environnement, avec des mutations aléatoires, bref, beaucoup de paramètres. Dans un monde en 2D carré (par exemple), c'est en fonction de cet environnement que les individus évolueront. Il n'y a que très peu de raisons que tu retrouves des individus transposables vers notre environnement 3D (voire 4D) dont les formes ont une variété importante. De la même manière, importer un problème de chez nous vers chez eux nécessite une transposition qui biaisera probablement les évolutions des individus. Je doute vraiment que tu arrives à une intelligence comparable à celle d'un être humain, voire même d'un animal très simple, d'autant plus que nos capacités cognitives dépendent de notre corps.
Par ailleurs, les algos G sont un paradigme inspiré de l'idée de l'évolution. Je doute qu'ils en soient une modélisation fidèle. C'est plutôt un outil qui permet d'optimiser une solution selon un critère donné à un problème mal défini. Si ta sélection se fait sur des individus capables de parcourir une grande distance, ou de résister à un choc, voire les deux, tu vas obtenir des classes d'individus qui solutionnent le mieux possible ces problèmes. Or, je pense que l'être humain est passé par une succession de contraintes diverses qui l'ont modelé au cours des générations. En quelque sorte, c'est comme si les critères de ton algo G évoluait eux aussi en fonction de l'ensemble des problèmes. Ca me semble difficile à reproduire.

Cela dit, pour finir sur une note plus positive, je pense que ça peut être un bon exercice (et amusant) d'implémenter un algo G pour un problème donné. Tu peux ensuite explorer différents critères selon lesquelles optimiser, sachant que tu peux aussi définir ce qui est susceptible d'évoluer ou pas (forme, moyen de locomotion, "contrôleur" de l'individu, masse, ...). Mais il faut toujours garder en tête que l'algo G va chercher l'optimum en fonction du problème à résoudre. C'est d'ailleurs pour ça que dans les simulations qu'on peut voir sur internet, les individus sont souvent assez loufoques : ils sont optimisés pour un problème donné.

En tout cas, bon courage ! :)/>
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#13 miq75

miq75

    Membre

  • Membres
  • 41 messages
  • Gender:Male
  • Location:Wissembourg

Posté 10 janvier 2013 - 11:17

C'est bien à LISP ou SCHEME que je pensais. :)/>/>/>
J'ai un peu répondu sur un souvenir de cours, mais je viens de relire l'OP, je vais donc essayer de re-contextualiser ma réponse. En fait, ce type de langage (fonctionnelle) est intéressant pour faire évoluer les programmes : la régularité dans la syntaxe permet d'échanger deux bouts de code sans générer des syntax error. Je m'explique :
...


Attention, les deux exemples que tu donne dans les 2 langages n'ont pas du tout la même portée.
Pour ce code en lisp:
gen_1 : (x (+ 3 5) capteur_mesure)
gen_2 : (ET obstacle_dist avancer_dist)
Ce code implique que x soit un fonction dont une des arité est 2 et que ET soit une fonction d'arité variable (en lisp c'est le cas, toute la parenthèse est sommée) et permuter le premier composant plantera si l'arité de la fonction x n'est pas bonne.

on a ce code en c, en utilisant tout le sucre syntaxique que permet c:
gen 1 : x(3 + 5, capteur_mesure)
gen 2 : obstacle_dist & avancer_dist
ou, ce qui est strictement équivalent et tout aussi correct syntaxiquement en c
gen 1 : x(add(3, 5), capteur_mesure)
gen 2 : et(obstacle_dist, avancer_dist)
Ce code implique les mêmes contraintes syntaxiques que le code précédent en lisp, mis à part la position des parenthèses et l'ordre des mots du langage. Et oui, ça le rends plus compliqué à manipuler que celui en Lisp (du moins dans celui de la première versrion), mais en même temps de forcer à permuter dans des morceaux de syntaxe équivalents (par exemple les paramètres de 2 fonctions) peut donner un meilleur contrôle sur ce que tu fait, ça dépends de comment tu gère tes permutations, et même en lisp tu n'a pas intérêt à le faire de manière totalement aléatoire, mais à les diriger pour maintenir la consistance du programme. Donc c'est discutable, ce qui est mieux. Je pense que c'est un choix personnel après.

Ensuite, l'exemple que tu donne de code en C est instranscriptible directement en lisp (la seconde ligne n'existe pas comme brique élémentaire, affecter, puis muter une var est impossible en lisp). Attention, on peut faire en lisp un programme équivalent à celui en C qui utilisera ton extrait en C, mais on passe alors à un paradigme de liste splitée et de la réccurence, comme pour tout ce qui n'est pas trivial comme opération dans ces langages. La puissance syntaxique n'étant pas la même, c'est difficile de comparer la pertinence du sous ensemble du programme traité. En fait, on ne joue pas avec les mêmes briques élémentaires. Après, c'est peut être intéressant aussi de ne pas avoir de variables a manipuler... Là encore, c'est à voir.

Enfin, le problème de c, c'est surtout que ce code ne fonctionnera pas sans avoir construit la déclaration des variables idoine avant, mais c'est un problème que tu n'aurais pas par exemple, en python, tout en gardant tout le reste (plus le garbage collecting, etc...).

#14 sky99

sky99

    Habitué

  • Membres
  • PipPip
  • 271 messages
  • Gender:Male

Posté 12 avril 2013 - 07:07

C'est une discussion très intéréssante que vous avez là. Pour ma part je fais de la recherche sur des réseaux de neurones appliqués, et mon point de vue sur l'émergence d'intelligence artificielle de haut niveau serait qu'on a un problème de niveau, et pas de nature. A priori, les systèmes apprenants, évolutifs, multi-agents, ou les intelligences distribuées sont en principe capables de résoudre toutes sortes de problèmes spécifiques.
Maintenant si on prend des problématiques générales, de compréhension de problémes en général par une intelligence, d'abstraction, de création de formalisme, d'idées, et tous ces concepts liés aux capacités cognitives humaines, on a plus de mal. Disons qu'on peut imiter des capacités cognitives inférieures (contrôle moteur, reconnaissance de modèles, décision rapide,etc), mais qu'on a de plus en plus de mal sur des concepts implicant des processus cognitifs élevés (comprendre soi même des concepts abstraits, non pas par l'observation, l'apprentissage et la répétition, mais par une réfléxion conceptuelle, longue, se basant sur la création d'idées, d'axiomes, etc, en gros dans des espaces de travail "ouverts"), on a plus de mal.


A mon sens, c'est encore une fois une question d'échelle. On fait certes des réseaux de neurones artificiels complexes, mais on est excessivement loin de la complexité d'un réseau de neurones naturel. Je prends mon modèle de travail, le MLP : on a pas de boucles, pas de durée de propagation des influx nerveux, pas toutes sortes de mécanismes physiologiques au niveau des synapses comme dans un vrai cerveau, et encore moins le nombre de neurones d'un cerveau humain.
Il existe certes des réseaux de neurones temporels, incluant la propagation le long des axones, des simulations relatives aux synapses, etc... Mais du coup on a bien plus de mal à leur faire apprendre un problème.

Dans beaucoup d'autres domaines de l'IA, on a des concepts qui pourraient peut être suffire à imiter/dépasser les capacités de la nature, et même générer de l'intelligence de haut niveau, mais on est extrêmement loin de l'échelle mise en place dans la nature. A mon sens, les limitations actuelles viennent du fait qu'on ne parvient pas à créer des structures aussi vastes que celles de la nature. Exemple : les Algos génétiques. On travaille sur des problèmes plus ou moins importants, mais avez vous déjà entendu parler d'un AG traitant des données de la taille du génome d'un animal simple?

Sans compter que dans la nature le génotype ne fait pas tout, et le phénotype peut avoir un impact important sur le niveau que peut atteindre un système vivant...
Et quand bien même on parviendrait au niveau de complexité des êtres vivants, il reste un second problème : les êtres vivants évolués ajoutent une couche supérieure de complexité avec les systèmes sociaux, qui font émerger un niveau d'intelligence d'un autre ordre de grandeur...

Un être humain développerait il son intelligence à ce point s'il naissait d'un oeuf, dans un environnement ou il n'y a pas d'autres humains (en partant de l'hypothèse qu'il survivrait et saurait se débrouiller seul)?
Une intelligence humaine est elle le résultat d'un génotype? Autrement dit mes gènes entraînent ils le développement obligatoire de mon intelligence? Ou alors l'environnement social qui m'entoure est-il la serre qui permet à l'intelligence d'éclore?


Cependant, le mon hypothèse est que le fait qu'on parle d'une différence de niveau signifie qu'on finira bien par rattraper la complexité de la nature. Il faudra probablement des systèmes capables d'apprendre seuls (apprentissage non supervisé), car en tous cas, moi je ne crée pas les bases d'apprentissage pour un réseau de neurones de 100 000 miliards de neurones, et 1 miliard d'entrées ^^

Par contre, il y a une autre piste qui serait envisageable : le design orienté. Plutôt que de répéter les conceptions de la nature, qui sont parfaites pour des systèmes organiques adaptés après des milliards et des milliards d'itérations, peut être pourrait on adapter ces modèles aux contraintes du silicium, aux capacités des machines, et combiner par un design intelligent toutes sortes de techniques pour découper le problème de l'intelligence de haut niveau en plein de petits problèmes plus simples...
En gros, une sorte de "créationisme numérique". Puisqu'on est surs d'exister, pourquoi laisser le hasard faire émerger l'intelligence du silicium, et ne pas y mettre nos à-priori sur certains points?
En gros, ne pas se contenter de recréer les modèles de la nature, mais en inventer de nouveaux, mieux optimisés pour les machines?
Moi je miserais sur un gros "mix" de toutes les techniques disponibles, avec une architecture quasi "fractale" capable de résoudre une infinité de petits problèmes, et en combinant des outils de résolution de problèmes simple, on obtiendrait des outils de résolution de problèmes de plus en plus complexes.

Au bout d'un moment, peut être arriverait on à un système capable de comprendre comment s'optimiser lui même?

Mais dans tous les cas, il me semble qu'on est extrêmement loin du rêve énoncé dans le post initial :)
Plus je fais de l'IA, plus cela me rend humble, car sur des problèmes simples on peut parfois passer 1 an à chercher des solutions, optimiser, pour réussir à faire un truc qu'un stupide escargot arrive à faire ^^

Il y a aussi une approche intéressante à mon sens, c'est l'interconnection de systèmes vivants et de machines. Si on augmente les capacités des humains par ce biais, avec des interfaces neurales directes, ne peut on pas imaginer qu'on puisse également étendre les capacités de la machine en utilisant les forces des calculateurs organiques?

En tous cas, vous pouvez être sur que pendant ma carrière de chercheur, je m'intéresse toujours de près à tout ce qui permet d'interfacer plus efficacement le cerveau humain aux machines... On a déjà pas mal de systèmes capables de lire les ondes cérébrales pour commander des systèmes par "la pensée", et même de multiples prototypes d'interfaces neurales directes, avec des systemes directement en contact avec le système nerveux... Par exemple ce singe qui contrôle un bras robotique par des électrodes dans son cerveau... En revanche, il y a relativement peu de travaux sur la communication dans l'autre sens, hormis quelques systèmes qui envoie des influx sur le nerf optique, ou sur des canaux sensoriels de ce genre...

Mais bon ça viendra ^^

Mon site principal : http://www.nagashur.com/ (format blog, un wiki y est aussi)

Mon profil sur hackaday.io : https://hackaday.io/sky99 (hackerspace en anglais, j'y ai plein de projets)

Mon Github : https://github.com/sarinkhan/


#15 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 825 messages

Posté 14 avril 2013 - 02:54

tout ceci est très intéressant !
je vous conseille de parcourir de temps à autres cet excellent site web sur lequel on peut trouver une foule de liens traitant des avancées dans les domaine de l'IA et de l’interfaçage humain/machine (entre autres).
Je tenterai de vous faire partager ma vision de ce futur quand j'aurai un peu plus de temps car il y a beaucoup à dire. (et il fait un soleil radieux dehors, ce serait dommage de ne pas en profiter. :beach: )



Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users