Explication du fonctionnement de Neural Bird
Posté le 14/06/2018 22:39
Dans
Neural Bird, Je cherche à faire évoluer une intelligence artificielle pour jouer à Flappy Bird. Je découperai donc cette explication en 3 parties :
1.Jouer à Flappy Bird
2.Intelligence Artificielle
3.Evoluer
1.Jouer à Flappy Bird
Nous devons d'abord définir ce que signifie "jouer à Flappy Bird".
Dans la version du jeu que j'ai programmé, il y a un oiseau(le joueur) qui peux décider de "sauter" ou pas à chaque tour de boucle, cet oiseau avance vers deux tuyaux verticaux espacés par un trou.
Le but est de sauter au bon moment pour passer dans le trou et ne pas toucher les tuyaux.
Le programme NRLBIRD1 fait jouer une partie de flappy bird, le voici ci dessous:
ViewWindow 1, 127, 0, 1, 63, 0
1 -> A
32 -> B
0 -> C
30 -> D
RanInt#(0, 63 - 7 -> E
0 -> F
0 -> Z
Cls
Text 24, 61, "0 "
StoPict 1
BG-Pict 1
Do
C > -10 => C - 1 -> C
B + C -> B
D - 1 -> D
If D = 1 :Then
30 -> D
RanInt#(0, 63 - 7 -> E
IfEnd
Getkey => 5 -> C
Cls
If D = 10 :Then
If (B < E Or B > E + 7) :Then
0 -> A
Else
F + 500 -> F
Z + 1 -> Z
Text 24, 61, Z
StoPict 1
BG-Pict 1
IfEnd
IfEnd
PlotOn 10, B
F-Line D, 1, D, E
F-Line D, E + 7, D, 63
'Text 1,1,F
LpWhile A
J'ai ici enlevé le bout de code qui décidait de si il fallait sauter ou non et je l'ai remplacé par Getkey=>-5->G (ce qui signifie : si une touche est pressée, alors on saute)
Ce qu'il faut faire maintenant est définir l'information dont on a besoin pour savoir quand on doit sauter.
J'ai choisit comme information :
-La distance verticale entre l'oiseau et le milieu du trou
-La distance horizontale entre l'oiseau et les tuyaux
-La vitesse verticale de l'oiseau
"Jouer à Flappy Bird", c'est donc ici équivalent à "Doit on sauter ou non en fonction de ces trois valeurs?"
Le problème ici c'est : que faire de ces trois valeurs?
Parce que là on a :
1. récupérer les valeurs
2.???
3.sauter ou non
4.profit
On passe donc à la deuxième partie pour répondre à cette question.
2.Intelligence Artificielle
Pour savoir si on doit sauter ou non, je vais utiliser un réseau de neurones artificiels.
mais qu'est-ce que c'est qu'un réseau de neurones artificiels?
Là, je vais pas vraiment rentrer dans les détails de quesquecé et tout par peur de dire des bêtises parce que je suis pas un pro, mais en gros, c'est un modèle mathématique inspiré des neurones biologiques permettant de résoudre des problèmes(je sais, c'est très large comme définition, mais il y a plusieurs sortes de réseaux de neurones artificiels, je veux pas faire de la désinformation en généralisant, donc on va surtout s'intéresser ici à celui que j'ai utilisé dans le programme, qui est un
perceptron multicouche).
Voici à quoi ressemble le réseau de neurones utilisé ici :
Je vais d'abord expliquer comment un seul neurone fonctionne :
Un neurone a une ou plusieurs entrées et une sortie. Il associe à chaque entrée un poids et a un poids supplémentaire associé à une entrée toujours égale à 1.
Pour calculer la sortie, le neurone va faire la somme de chaque entrée multipliée par son poids respectif, puis va passer le résultat dans une fonction d'activation. J'utilise dans ce programme la fonction sigmoide qui renvoie un nombre entre 0 et 1.
Prenons l'exemple du neurone D sur le schéma, sa sortie aura pour valeur: sigmoide(A*poids1 + B*poids2 + C*poids3 + 1*poids4)
En faisant ça pour chaque neurone, voici le pseudocode pour avoir la sortie du réseau de neurones :
/// neurone D
A*poids1 + B*poids2 + C*poids3 + poids4 -> D /// somme pondérée des entrées
(1/(1 + (e^( - D)))) -> D // calcul de sigmoide(D)
/// neurone E
A*poids5 + B*poids6 + C*poids7 + poids8 -> E
(1/(1 + (e^( - E)))) -> E
/// neurone F
D*poids9 + E*poids10 + poids11-> F
(1/(1 + (e^( - F)))) -> F
voilà maintenant le code qui permet de choisir si il faut sauter ou pas :
(D - 10) / 20 -> G
(E + 3.5 - B) / 32 -> H
C / 5 -> I
List 1[1] * G + List 1[2] * H + List 1[3] * I + List 1[4] -> J
(1/(1 + (e^( - J)))) -> J
List 1[5] * G + List 1[6] * H + List 1[7] * I + List 1[8] -> K
(1/(1 + (e^( - K)))) -> K
List 1[9] * J + List 1[10] * K + List 1[11] -> L
(1/(1 + (e^( - L)))) -> L
L > 0.5 => 5 -> C
On remarque que j'ai stocké les 11 poids du réseau de neurones dans la liste 1 et que les variables ne sont pas les mêmes que dans le pseudocode.
Les trois premières lignes effectuent le calcul des trois entrées du réseau de neurones, on peut aussi remarquer que je divise chaque entrée par la valeur maximale qu'elle peut prendre pour la "normaliser", c'est à dire restreindre sa valeur entre 0 et 1 pour empêcher qu'une entrée influence plus le résultat du réseau de neurones qu'une autre parce qu'elle est d'un autre ordre de grandeur.
Et la dernière ligne fait sauter l'oiseau si la sortie du réseau de neurones est supérieure à 0,5.
Voilà notre "Intelligence artificielle"!
Ainsi, si vous prenez le programme NRLBIRD1 et rajoutez "{-0.7502818134,0.9997988678,0.4780217439,0.596196316,1.048353149,-1.109820854,0.2241587688,-0.7859120504,0.2589741613,-0.7438888932,0.06033758228 -> List 1" au début du programme pour initialiser les poids du réseau de neurones. En lançant le programme, vous devriez voir l'oiseau sauter de lui même quand il lui semble être le bon moment.
hepepep pas si vite, d'où tu les sors ces poids?
Vous avez tout à fait raison de poser cette question car avec ces poids, le réseau de neurones joue parfaitement au jeu, mais avec d'autres, il pourrait être très mauvais.
On peut dire que les poids définissent "l'intelligence" du réseau de neurones.
Ces poids on été obtenus grâce à l'algorithme que je vais présenter dans la 3ème partie, et grâce à Totoyo, que je remercie pour avoir fait tourner le programme pendant 4 jours!
3.Evoluer
Pour trouver les meilleurs poids, j'utilise un
algorithme génétique, voilà comment il fonctionne :
1.générer aléatoirement 10 ensembles de 11 poids
2.répéter 3 à 6 tant que le programme est ouvert
3.calculer le score de chaque ensemble de poids en les mettant dans la liste 1 et les faisant jouer une partie
4.Prendre le meilleur ensemble de poids et le mélanger avec un autre tiré aléatoirement ce qui donne deux nouvaux ensembles de poids
5.remplacer les deux moins bons ensembles de poids par les deux nouveaux
6. modifier au hasard certains poids
chaque tour de la boucle de 3 à 6 s'appelle une "génération".
Cet algorithme est dans le programme NRLBIRD que je vais décomposer étape par étape
1.
11 -> Dim List 11
{1 -> List 13
110 -> Dim List 12
Locate 1, 1, "Initialisation"
Locate 3, 2, "%"
For 1 -> θ To 110
Locate 1, 2, Int (100 * θ / 110)
Ran# * 2 - 1 -> List 12[θ
Next
Cette partie initialise les 10*11 = 110 poids dans la liste 12 avec des valeurs aléatoires entre -1 et 1
La liste 11 est aussi initialisée pour qu'elle puisse stocker les 10 scores de chaque ensemble de poids et le meilleur score atteint
La liste 13 stocke le nombre de générations et la moyenne des scores à chaque génération.
2.
3.
C'est cette partie du programme NRLBIRD qui calcule les scores de chaque ensemble de poids
For 0 -> θ To 9
Cls
Text 4, 80, List 13[1
Text 14, 68, " "
Text 14, 68, θ + 1
StoPict 1
BG-Pict 1
11 -> Dim List 1
For 1 -> r To 11
List 12[r + 11 * θ] -> List 1[r]
Next
Prog "NRLBIRD1"
F -> List 11[θ + 1
If F > List 11[11 :Then
F -> List 11[11
11 -> Dim List 10
For 1 -> r To 11
List 12[r + 11 * θ] -> List 10[r]
Next
IfEnd
Next
C'est une boucle qui à chaque tour copie les 11 valeurs d'un des 10 ensemble de poids contenus dans la liste 12 dans la liste 1, puis fait jouer une partie avec le programme NRLBIRD1 et récupère le score qui est stocké dans la variable F et le met dans la liste 11.
Enfin, si le score est supérieur au record, alors tous les poids qui viennent d'être "testés" sont transférés dans la liste 10 et le nouveau record est sauvegardé.
Une question importante à se poser est "comment définir le score?" puisque si la réponse était juste "le nombre de tuyaux passés", un oiseau sautant tout le temps et mourrant très haut loin du trou serait considéré comme aussi bon qu'un oiseau visant le trou en sautant au bon moment mais se loupant d'un pixel à la fin.
C'est pourquoi le score est défini par cette ligne de code :
F + 60 - Abs (E + 3.5 - B) -> F
à chaque frame de jeu, le score est incrémenté de 60 - la distance verticale entre l'oiseau et le trou, ainsi, plus l'oiseau est proche du trou, meilleur son score sera.
4. et 5.
Je récupère d'abord les deux moins bons ensembles de poids avec ce code :
10000000000 -> N
0 -> O
For 1 -> M To 10
If List 11[M] < N :Then
List 11[M] -> N
M -> O
IfEnd
Next
12345678912345 -> List 11[O
10000000000 -> N
0 -> P
For 1 -> M To 10
If List 11[M] < N :Then
List 11[M] -> N
M -> P
IfEnd
Next
O et P contiennent les "numéros" des deux moins bons ensembles de poids.
Puis je récupère le meilleur et un numéro au hasard :
- 10000000000 -> N
0 -> Q
For 1 -> M To 10
If List 11[M] > N And List 11[M] != 12345678912345 :Then
List 11[M] -> N
M -> Q
IfEnd
Next
RanInt#(1, 10) -> R
Q et R contiennent les "numéros" du meilleur ensemble de poids et d'un autre au hasard.
Ensuite je remplace les ensembles O et P par un mélange de Q et R :
For 1 -> S To 11
If Ran# > 0.5 :Then
List 12[S + (Q - 1) * 11] -> List 12[(O - 1) * 11 + S]
List 12[S + (R - 1) * 11] -> List 12[(P - 1) * 11 + S]
Else
List 12[S + (Q - 1) * 11] -> List 12[(P - 1) * 11 + S]
List 12[S + (R - 1) * 11] -> List 12[(O - 1) * 11 + S]
IfEnd
Next
Pour chaque poids, je met au hasard celui de Q dans O ou dans P et celui de R dans l'autre.
6.
Enfin, pour chaque valeur de la liste 12, il y a une faible chance que celle-ci soit un peu modifiée, ou soit une nouvelle valeur entre -1 et 1 :
For 1 -> S To 110
Ran# <= 0.05 => List 12[S] + Ran# * 0.2 - 0.1 -> List 12[S
Ran# <= 0.02 => Ran# * 2 - 1 -> List 12[S
Next
Voilà c'est tout!
Si je n'ai pas été clair ou si vous voulez que j'approfondisse sur certains passages, n'hésitez pas à poser des questions.
Citer : Posté le 14/06/2018 22:52 | #
J'ai mis le topic dans "vie communautaire" mais peut être qu'il irait mieux dans "vos tutoriels et astuces", je sais pas trop lequel est le plus approprié parce que ce n'est pas vraiment un tutoriel mais on peut s'inspirer de ce que j'ai fait et utiliser mes explications pour créer son propre réseau de neurones.
Citer : Posté le 14/06/2018 22:55 | #
Déplacé dans Tutoriels et astuces oui.
Eh ben, c'est pas rien ! Joli mélange entre le réseau de neurones et l'algo génétique, je n'avais encore jamais vu ça à l’œuvre.
Comment as-tu choisi la forme du réseau en particulier ?
En tous cas bien joué, je suis encore bluffé par les résultats que tu as obtenus en ce qui concerne les tests de Totoyo. x)
Citer : Posté le 14/06/2018 23:18 | #
J'ai un peu choisi la forme au hasard en essayant de minimiser le nombre de poids sans que le réseau soit trop simple car il risquerait de ne pas pouvoir résoudre le "problème" et par chance ça a marché, mais peut être qu'il existe des topologies plus efficaces, pour le savoir on pourrait utiliser un algorithme de type NEAT comme me l'a conseillé Nemhardy.
Citer : Posté le 14/06/2018 23:22 | #
Je suis impressionné par ce que tu donnes à lire et la manière dont tu as su l'appliquer sur le Basic Casio.
Je vais t'avouer que tu m'as perdu au moment des poids – toutefois il est vrai que je suis fatigué. Plus précisément, à partir de cette phrase :
Que sont ces "poids", précisément ? C'est-à-dire que un neurone a un poids plus ou moins important... ? Heuuu, et dans ton schéma, à quoi correspondent chaque neurone (et le neurone 1) ? Si j'ai bien compris la logique, le point de départ se situe au niveau des neuronnes A B C 1, puis D E pour arriver à F, c'est cela ?
Citer : Posté le 14/06/2018 23:30 | #
Finalement c’est mun une dur que ça en a l´air mais je n’en comprend pas le neurone « 1 ».
Si j’ai bien compris À B et C sont les entrées, E et F des neurones intermédiaire caché et F la sortie mais je n’en comprend donc pas d’ou vient le neurone 1
Citer : Posté le 14/06/2018 23:42 | #
@Drak En fait, le poid qu'associe un neurone à une entrée est un peu "l'importance" qu'il lui associe. Sur le schéma, il y a un poids par connection entre deux neurones (ou entre un neurone et une entrée).
Si j'ai bien compris la logique, le point de départ se situe au niveau des neuronnes A B C 1, puis D E pour arriver à F, c'est cela ?
Oui c'est ça.
@Suruk game ah oui désolé, les neurones 1, 2 et 3 sont respectivement les neurones D, E et F, je change ça tout de suite.
Citer : Posté le 14/06/2018 23:52 | #
Question con : pourquoi avoir choisit des listes quand les matrices font exactement la même chose en plus rapide ?
La combinaison linéaire, c'est du pur produit matriciel. Y'a seulement à partir du moment où tu fais ta fonction d'activation que ça devient pas mal de passer par les listes (sauf si tu fais du ReLU de manière subtile)
Citer : Posté le 15/06/2018 00:13 | #
Je viens de me rendre compte que vous parliez pas des premier, deuxième et troisième neurones mais de l'entrée 1.
En fait il faut considérer le réseau de neurones comme une fonction affine(mais en un peu plus compliquée ) f(x) = ax + b où a est le poids associé à x qui est l'entrée et b est le deuxième poid associé à une entrée toujours égale à 1(b*1 = b), sans b, la courbe de f passerait toujours par l'origine, et avec b la courbe de f peut être n'importe quelle droite du plan. L'entrée 1 permet donc d'étendre le nombre de solutions que peut proposer le réseau de neurones.
@Dark Storm, pas pour une raison particulière. Je connaissais pas vraiment le produit matriciel, il faudrait que je m'informe dessus et que j'essaye de programmer ça. Merci pour l'information.
Citer : Posté le 15/06/2018 07:16 | #
Pour information avec n entrées munies de n points, le produit d'une matrice à 1 ligne et n colonnes contenant les poids, par une matrice à n lignes et 1 colonne contenant les entrées donne une matrice 1/1 (habituellement assimilée à la valeur qu'elle contient) contenant le résultat.
Tu peux pas l'étendre immédiatement à p neurones simultanés parce que certains servent d'entrée à d'autres mais c'est déjà un début.
Note : le produit matriciel ci-dessus est juste un produit scalaire.
Citer : Posté le 16/06/2018 11:19 | #
Merci d'avoir partagé ces explications !
J'aime bien le style d'écriture.
Ce que je trouve paradoxal, c'est qu'on parle d'intelligence artificielle alors qu'on devrait dire : Shadock professionnel. L'algorithme n'a aucune connaissance de Physique, aucune modélisation, pas de compréhension du gameplay ou autre. Il s'agit plutôt d'un système, qui comme les Shadocks, sait qu'il fonctionnera probablement après 2 000 000 d'échecs, donc on le gave pour l'entraîner et si on l'a bien entraîné, alors il est bon sur le problème qu'on lui a soumis.
J'ai plusieurs questions :
-> peut-on prouver la sûreté de fonctionnement d'un tel algorithme ?
-> un tel algorithme pourrait-il être entraîné pour répondre à deux problèmes différents mais avec le même nombre d'entrées ?
-> Que se passe-t-il s'il y a plus de sorties que d'entrées ?
La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Citer : Posté le 16/06/2018 11:46 | #
Pour la répondre au 2 première semaine question :
1) il existe des réseaux NEAT qui n’int pas de neurones intermédiaires mais qui en créent au fur et à mesure donc l’algorithme finit toujours par trouver une solution (le nombre de neurones n’est pas fini) je dit peut être n’importe quoi
2) si je ne dit pas de bêtises c’est possible
Citer : Posté le 16/06/2018 11:59 | #
Je suis curieux de voir comment une architecture qui n'est pas fixe peut être démontrée comme étant sûre/fiable. Il y a une preuve que le réseau trouvera une solution quel que soit le problème et surtout, quel que soit l'évolution du problème ?
Pour un jeu pas de soucis, mais si on implémente cette approche à un système de freinage automatique par exemple, est-ce qu'on peut prouver au client que sa voiture n'écrasera jamais un piéton ? Parce que même s'il a évité 1 000 000 accidents, est-ce qu'on peut prouver qu'il n'y en aura pas un le coup d'après ?
Je veux dire, pour moi le réseau de neurone c'est assez "boîte noire", ça me semble être puissant et particulièrement adapté à certains problèmes, mais pas à des systèmes qui requièrent de la sécurité, tout simplement parce que je n'ai pas encore compris si c'est intrinsèquement infaillible.
If piéton détecté
Then freinage
IfEnd
Ça c'est infaillible sur le plan logique.
Alors que neurone truc et neurone machine, avec peut-être neurone bidule en plus si le réseau est NEAT, ça j'ai du mal à prouver quoi que ce soit si je propose ça au BE.
Ajouté le 16/06/2018 à 12:02 :
Tiens ça m'amène à une autre question : on connait la complexité sur le plan algorithmique de ces bidules ? On sait prédire la quantité de ressources nécessaires, en fonction du nombre d'entrées, de sorties ou tout autre critère ?
La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Citer : Posté le 16/06/2018 12:13 | #
Pour le coup, les réseaux de neurones sont absolument pas infaillibles. Ça a été démontré d'ailleurs.
Le coup de la boite noire, c'est ce qui est énormément reproché aux RN actuellement. Vu qu'on en est aux balbutiements du sujet, il n'y a pas encore de base théorique fiable sur laquelle s'appuyer. Beaucoup de recherches sont faites dans le domaine, mais à titre personnel je doute que ça aboutisse. En effet, c'est assez inhérent au concept même que le fonctionnement ne puisse pas être compris par un humain.
Si y'a plus de sorties que d'entrées, tu changes juste la catégorie dans laquelle tu classes ton réseau
Citer : Posté le 16/06/2018 12:45 | #
Merci d'avoir partagé ta façon de faire.
Le plus intéressant est le mix génétique et la fitness (la fonction qui définie le score), c'est très subjectif et propre au programmeur.
un tel algorithme pourrait-il être entraîné pour répondre à deux problèmes différents mais avec le même nombre d'entrées ?
Biensûr. En fait on peut faire une analogie presque exacte en disant chaque neurone d'entrée est un capteur et chaque neurone de sortie un actionneur.
Ici c'est bien le cas :
neurone A : La distance verticale entre l'oiseau et le milieu du trou
neurone B : La distance horizontale entre l'oiseau et les tuyaux
neurone C : La vitesse verticale de l'oiseau
neurone F : Sauter
Que se passe-t-il s'il y a plus de sorties que d'entrées ?
Il y a juste plus (+) d'actions possibles. Dans CE jeu là il n'y en a pas d'autres possibles, gameplay oblige, mais rien n'empèche d'avoir des jeux laissant plus d'actions possibles à l'IA.
Si ton oiseau à besoin de sauter et, imaginons, changer de couleur dès qu'il passe un tuyau, il suffit de rajouter un neurone G : changer de couleur.
Maintenant, ça ne suffit pas, il faut changer la fonction fitness, ici Alexot a choisi F + 60 - Abs (E + 3.5 - B) -> F, cette fonction ne prend pas en compte le changement de couleur. Il faut la modifier pour qu'elle prenne en compte cela : F + 60 - Abs (E + 3.5 - B) + quelque_chose -> F
Le plus difficile étant de définir ce quelque_chose...
PS : je ne connaissais pas ce principe avec le neurone toujours à 1, merci pour l'explication
Ajouté le 16/06/2018 à 12:57 :
Comme le dit Dark Storm, on sait comment ça fonctionne, mais on ne sait pas pourquoi ça fonctionne. C'est très boite noire vous avez raison.
En même temps c'est comme le cerveau humain, on comprend en grande partie comment chaque élément constitutif fonctionne, mais on ne comprend pas pourquoi cet ensemble fonctionne.
Ce que je trouve paradoxal, c'est qu'on parle d'intelligence artificielle...
Citer : Posté le 16/06/2018 13:00 | #
Ouais enfin le RN il a pas cette capacité d'extrapolation qu'on peut avoir et qui fait qu'on apprend vite et avec peu d'erreurs
Citer : Posté le 17/06/2018 11:30 | #
Ah ouais sympa ton image Darks' pour les différents types de réseaux ! Mais je n'ai justement pas l'impression qu'il y ait beaucoup de réseaux avec plus de sorties que d'entrées sur ces exemples (DN uniquement semble-t-il)...
En fait on peut faire une analogie presque exacte en disant chaque neurone d'entrée est un capteur et chaque neurone de sortie un actionneur.
Ici c'est bien le cas :
neurone A : La distance verticale entre l'oiseau et le milieu du trou
neurone B : La distance horizontale entre l'oiseau et les tuyaux
neurone C : La vitesse verticale de l'oiseau
neurone F : Sauter
Oui mais par exemple si on souhaite que le réseau puisse "résoudre" ce jeu et le même jeu à 90°, avec les mêmes neurones, c'est possible ? Et si on souhaite qu'il puisse donner les mêmes sorties avec une permutation des entrées (interversion de deux capteurs par exemple) ?
C'est assez philosophique, mais à quel moment tu peux commencer à parler d'intelligence ou pas ?
Oui c'est philosophique, mais là c'est créé de toute pièce par l'Humain, si ce n'est pas intelligible par l'Humain, est-ce qu'on peut dire que c'est intelligent ? Pour moi dans l’intelligence il y a la Connaissance. Là on parle d'un système qui n'en a vraiment aucune, qui a juste une faculté d'adaptation aveugle (et surtout, pas forcément rationnelle).
La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Citer : Posté le 17/06/2018 11:40 | #
@neotux : je suis peut-être un peu hors sujet mais je tiens à préciser que l'intelligence est quand même
that was my 2 cents on this topic
Dijkstra - The Witcher
Citer : Posté le 17/06/2018 11:45 | #
C'est assez intéressant de voir ce qu'un réseau primaire de neurones peut faire.
Après, je me demande si c'est vraiment efficace niveau temps ou nombre de tours effectués.
Citer : Posté le 17/06/2018 11:49 | #
Je ne suis pas d'accord. Le système "caillou solitaire" qui reste intègre pendant 2000 ans est intelligent parce qu'il s'est adapté au climat ?
Je ne trouve pas la même définition dans mon dictionnaire favoris et ce n'est pas ce que j'ai appris en latin-français-philo (ce qui en soit ne prouve rien, mais m'aide à ne pas être d'accord avec ta définition). D'ailleurs, si on utilise deux mots différents, intelligence et adaptation, c'est peut-être parce qu'ils ne veulent pas dire la même chose. Et si on remonte à la racine du mot intelligence, il me semble que c'est plutôt proche de "faculté de comprendre" avec de la logique (ce que ne fait pas un réseau de neurone, irrationnel et sans connaissance).
C'est pour ça que je préfère le terme "apprentissage profond" (= deep learning), plutôt que "intelligence artificielle" pour les réseaux de neurones.
Mais on s'éloigne des questions techniques que j'avais. J'imagine que nous ne sommes pas les seuls à épiloguer sur l'Intelligence, que l'on a bien du mal à trouver parfois chez certains êtres pas artificiels du tout.
La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Citer : Posté le 17/06/2018 11:51 | #
Et cette histoire de fonction sigmoide, elle permet juste de renvoyer un nombre en 0 et 1 pour les poids ?