Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Vos tutoriels et astuces


Index du Forum » Vos tutoriels et astuces » Explication du fonctionnement de Neural Bird
Alexot Hors ligne Membre Points: 539 Défis: 18 Message

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.



1, 2 Suivante
Alexot Hors ligne Membre Points: 539 Défis: 18 Message

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.
Cliquez pour découvrir
Cliquez pour recouvrir
2b 5b 2d 2d 2d 2d 2d 3e 2b 2b 2b 3c 5d 3e 2b 2e 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2e 2e 2d 2d 2d 2d 2e 2b 2b 2b 2e 2b 5b 2d 2d 3e 2b 3c 5d 3e 2e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2e 2e 2b 5b 2d 2d 3e 2b 2b 2b 2b 2b 3c 5d 3e 2b 2e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2e 2b 2b 2b 2b 2b 2b 2e 2d 2e 2b 2e 2d 5b 2b 2b 3e 2d 2d 2d 3c 5d 3e 2e 2b 2b 2b 5b 2d 3e 2b 2b 3c 5d 3e 2e 2b 2b 2b 2e 5b 2d 3e 2b 2b 2b 3c 5d 3e 2e 5b 2d 2d 2d 3e 2b 3c 5d 3e 2d 2e 2d 5b 2d 3e 2b 2b 2b 2b 2b 2b 3c 5d 3e 2d 2e 2d 5b 2d 2d 3e 2b 2b 2b 3c 5d 3e 2d 2e 2b 5b 2b 2b 3e 2d 2d 2d 3c 5d 3e 2e 5b 2d 2d 2d 3e 2b 2b 3c 5d 3e 2d 2e 2d 5b 2d 2d 3e 2b 3c 5d 3e 2d 2d 2e 2b 5b 2d 2d 3e 2b 2b 2b 3c 5d 3e 2e 2b 2b 2b 5b 2d 3e 2b 2b 2b 2b 3c 5d 3e 2d 2e 3e 2b 5b 2d 2d 2d 3e 2b 2b 3c 5d 3e 2b 2b 2e 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2e 5b 2d 3e 2b 2b 2b 2b 2b 2b 3c 5d 3e 2d 2e
Lephenixnoir Hors ligne Administrateur Points: 24700 Défis: 170 Message

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)
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Alexot Hors ligne Membre Points: 539 Défis: 18 Message

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.
Cliquez pour découvrir
Cliquez pour recouvrir
2b 5b 2d 2d 2d 2d 2d 3e 2b 2b 2b 3c 5d 3e 2b 2e 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2e 2e 2d 2d 2d 2d 2e 2b 2b 2b 2e 2b 5b 2d 2d 3e 2b 3c 5d 3e 2e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2e 2e 2b 5b 2d 2d 3e 2b 2b 2b 2b 2b 3c 5d 3e 2b 2e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2e 2b 2b 2b 2b 2b 2b 2e 2d 2e 2b 2e 2d 5b 2b 2b 3e 2d 2d 2d 3c 5d 3e 2e 2b 2b 2b 5b 2d 3e 2b 2b 3c 5d 3e 2e 2b 2b 2b 2e 5b 2d 3e 2b 2b 2b 3c 5d 3e 2e 5b 2d 2d 2d 3e 2b 3c 5d 3e 2d 2e 2d 5b 2d 3e 2b 2b 2b 2b 2b 2b 3c 5d 3e 2d 2e 2d 5b 2d 2d 3e 2b 2b 2b 3c 5d 3e 2d 2e 2b 5b 2b 2b 3e 2d 2d 2d 3c 5d 3e 2e 5b 2d 2d 2d 3e 2b 2b 3c 5d 3e 2d 2e 2d 5b 2d 2d 3e 2b 3c 5d 3e 2d 2d 2e 2b 5b 2d 2d 3e 2b 2b 2b 3c 5d 3e 2e 2b 2b 2b 5b 2d 3e 2b 2b 2b 2b 3c 5d 3e 2d 2e 3e 2b 5b 2d 2d 2d 3e 2b 2b 3c 5d 3e 2b 2b 2e 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2e 5b 2d 3e 2b 2b 2b 2b 2b 2b 3c 5d 3e 2d 2e
Drak Hors ligne Rédacteur Points: 1925 Défis: 40 Message

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 :
Il associe à chaque entrée un poids et a un poids supplémentaire associé à une entrée toujours égale à 1.


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 ?

Eon the Dragon : version 1.2
Let's have a look!
Marre de ces RPGs qui t'imposent des classes, des compétences et des sorts ? Crée tes propres capacités sur Eon the Dragon ! Des monstres, des dragons et des combats aussi épiques que difficiles t'attendent !
Un RPG unique et immense t'attend ! Joue dès maintenant à Aventura, le Royaume Poudingue !
Vous aussi, soyez swag et rejoignez Planète Casio !
Suruq game Hors ligne Membre de CreativeCalc Points: 621 Défis: 20 Message

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
There is only one thing that makes a dream impossible to achieve : the fear of failure
Alexot Hors ligne Membre Points: 539 Défis: 18 Message

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).
Drak a écrit :
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.
Cliquez pour découvrir
Cliquez pour recouvrir
2b 5b 2d 2d 2d 2d 2d 3e 2b 2b 2b 3c 5d 3e 2b 2e 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2e 2e 2d 2d 2d 2d 2e 2b 2b 2b 2e 2b 5b 2d 2d 3e 2b 3c 5d 3e 2e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2e 2e 2b 5b 2d 2d 3e 2b 2b 2b 2b 2b 3c 5d 3e 2b 2e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2e 2b 2b 2b 2b 2b 2b 2e 2d 2e 2b 2e 2d 5b 2b 2b 3e 2d 2d 2d 3c 5d 3e 2e 2b 2b 2b 5b 2d 3e 2b 2b 3c 5d 3e 2e 2b 2b 2b 2e 5b 2d 3e 2b 2b 2b 3c 5d 3e 2e 5b 2d 2d 2d 3e 2b 3c 5d 3e 2d 2e 2d 5b 2d 3e 2b 2b 2b 2b 2b 2b 3c 5d 3e 2d 2e 2d 5b 2d 2d 3e 2b 2b 2b 3c 5d 3e 2d 2e 2b 5b 2b 2b 3e 2d 2d 2d 3c 5d 3e 2e 5b 2d 2d 2d 3e 2b 2b 3c 5d 3e 2d 2e 2d 5b 2d 2d 3e 2b 3c 5d 3e 2d 2d 2e 2b 5b 2d 2d 3e 2b 2b 2b 3c 5d 3e 2e 2b 2b 2b 5b 2d 3e 2b 2b 2b 2b 3c 5d 3e 2d 2e 3e 2b 5b 2d 2d 2d 3e 2b 2b 3c 5d 3e 2b 2b 2e 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2e 5b 2d 3e 2b 2b 2b 2b 2b 2b 3c 5d 3e 2d 2e
Dark storm Hors ligne Labélisateur Points: 11641 Défis: 176 Message

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)
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Alexot Hors ligne Membre Points: 539 Défis: 18 Message

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.
Cliquez pour découvrir
Cliquez pour recouvrir
2b 5b 2d 2d 2d 2d 2d 3e 2b 2b 2b 3c 5d 3e 2b 2e 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2e 2e 2d 2d 2d 2d 2e 2b 2b 2b 2e 2b 5b 2d 2d 3e 2b 3c 5d 3e 2e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2e 2e 2b 5b 2d 2d 3e 2b 2b 2b 2b 2b 3c 5d 3e 2b 2e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2e 2b 2b 2b 2b 2b 2b 2e 2d 2e 2b 2e 2d 5b 2b 2b 3e 2d 2d 2d 3c 5d 3e 2e 2b 2b 2b 5b 2d 3e 2b 2b 3c 5d 3e 2e 2b 2b 2b 2e 5b 2d 3e 2b 2b 2b 3c 5d 3e 2e 5b 2d 2d 2d 3e 2b 3c 5d 3e 2d 2e 2d 5b 2d 3e 2b 2b 2b 2b 2b 2b 3c 5d 3e 2d 2e 2d 5b 2d 2d 3e 2b 2b 2b 3c 5d 3e 2d 2e 2b 5b 2b 2b 3e 2d 2d 2d 3c 5d 3e 2e 5b 2d 2d 2d 3e 2b 2b 3c 5d 3e 2d 2e 2d 5b 2d 2d 3e 2b 3c 5d 3e 2d 2d 2e 2b 5b 2d 2d 3e 2b 2b 2b 3c 5d 3e 2e 2b 2b 2b 5b 2d 3e 2b 2b 2b 2b 3c 5d 3e 2d 2e 3e 2b 5b 2d 2d 2d 3e 2b 2b 3c 5d 3e 2b 2b 2e 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2e 5b 2d 3e 2b 2b 2b 2b 2b 2b 3c 5d 3e 2d 2e
Lephenixnoir Hors ligne Administrateur Points: 24700 Défis: 170 Message

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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Ne0tux Hors ligne Membre d'honneur Points: 3526 Défis: 265 Message

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 ?


Mes principaux jeux : Ice Slider - CloneLab - Arkenstone

La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Suruq game Hors ligne Membre de CreativeCalc Points: 621 Défis: 20 Message

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
There is only one thing that makes a dream impossible to achieve : the fear of failure
Ne0tux Hors ligne Membre d'honneur Points: 3526 Défis: 265 Message

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 ?
Mes principaux jeux : Ice Slider - CloneLab - Arkenstone

La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Dark storm Hors ligne Labélisateur Points: 11641 Défis: 176 Message

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
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Ninestars Hors ligne Membre Points: 2462 Défis: 24 Message

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.

Neotux a écrit :
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

Neotux a écrit :
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.

Neotux a écrit :
Ce que je trouve paradoxal, c'est qu'on parle d'intelligence artificielle...
C'est assez philosophique, mais à quel moment tu peux commencer à parler d'intelligence ou pas ? Ca pourrait être pareil avec notre cerveau. Notre enfance, et même nôtre vie est constituée d'échecs et de réussites. On dit bien qu'on apprend de nos échecs, un réseau de neurones c'est pareil
Dark storm Hors ligne Labélisateur Points: 11641 Défis: 176 Message

Citer : Posté le 16/06/2018 13:00 | #


On dit bien qu'on apprend de nos échecs, un réseau de neurones c'est pareil

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
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Ne0tux Hors ligne Membre d'honneur Points: 3526 Défis: 265 Message

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)...

Ninestars a écrit :
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) ?

Ninestars a écrit :
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).
Mes principaux jeux : Ice Slider - CloneLab - Arkenstone

La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Lightmare Hors ligne Membre de CreativeCalc Points: 690 Défis: 0 Message

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
la capacité d'un être vivant ou d'un système à s'adapter à son environnement


that was my 2 cents on this topic
"Quand je dis à la cour : "Sautez ! ", tout le monde me demande "jusqu'où ?" "
Dijkstra - The Witcher
-florian66- Hors ligne Ancien rédacteur Points: 2384 Défis: 20 Message

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.


In Arch, I trust ! And you ?
Ne0tux Hors ligne Membre d'honneur Points: 3526 Défis: 265 Message

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.
Mes principaux jeux : Ice Slider - CloneLab - Arkenstone

La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
-florian66- Hors ligne Ancien rédacteur Points: 2384 Défis: 20 Message

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 ?
In Arch, I trust ! And you ?
1, 2 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 41 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd