Algorithme génétique et réseau de neurones

Signaler
-
Messages postés
12654
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 octobre 2020
-
Bonjour,

Je suis en train de développer un algorithme génétique entre des individus qui disposent chacun de leur propre réseau de neurones afin de pouvoir effectuer des décisions.
Toutefois je bloque sur la partie reproduction car je ne vois pas la bonne méthode afin que l'enfant et son réseau de neurones semblent bien faire des choix a peu près équivalents a chacun de ses parents.

Prendre au hasard des neurones a chacun des parents et les arranger ou encore prendre la moyenne de chaque neurone est autant de solution qui ne ferait pas mieux que générer un individu aléatoire (ce qui doit être fait par l'ajout de nouveaux individus pas par la reproduction)

J'avais l'idée de splitter chaque réseau à une certaine couche et de recoller la moitié de l'un avec l'autre moitié de l'autre mais ça ne me semble pas OK car les neurones ne sont pas ordonnés et on ne peut pas déterminer comment les recoller.

Merci d'avance pour vos suggestions.

Configuration: Android / Chrome 86.0.4240.75

3 réponses

Messages postés
12654
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 octobre 2020
702
bonjour,

dans quel contexte fais-tu ce travail?

il serait utile que tu décrives comment tu as choisi de représenter le réseau de neurones d'un individu.

sur base de quoi écris-tu que les deux premières méthodes que tu décris ne font pas mieux que générer un individu aléatoire?

je suppose que ton choix d'éliminer la troisième méthode sera claire quand tu auras décrit la représentation.
Messages postés
12654
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 octobre 2020
702
par ailleurs, prendre la moyenne me semble bizarre, car cela signifie que tous les enfants d'un couple sont identiques. cela te semble une bonne idée?
Il s'agit de créer des individus qui peuvent évaluer la position dans un jeu (pour l'exemple j'ai commencé sur le jeu des batonnets)

Pour être clair, je vais donner un exemple :
{"neurons": [
[
{
"weights": [1, 2, 3],
"bias": -1
},
{
"weights": [4, 5, 6],
"bias": 3
}
],
[
{
"weights": [1, 2],
"bias": 5
}
]
]
Ceci est une représentation possible.
Dans ce cas il y a la couche d'entrée qui est composée de trois paramètres d'entrée, 1 couche intermédiaire qui contient 2 neurons et la couche de sortie.
Donc "neurons" est un tableau de couche de neurones et pour chaque couche nous avons un tableau de neurones qui contient les poids et biais respectifs.

Dans l'exemple si nous avons par exemple en entrée 8, 9 et 10 ([8, 9, 10]) alors le résultat intermédiaire à la première couche est [-1 + 1/exp(8*1+9*2+10*3), 3 + 1/exp(8*4+9*5+10*6)]

Et idem pour la couche finale afin d'avoir un unique résultat.

Dans ce cas une fois qu'on a créé des individus avec son propre réseau de neurone il sera capable de déterminer une évaluation d'une position de jeu (les paramètres d'entrée) afin de pouvoir indiquer la meilleure position possible.

Ensuite je les fait jouer ensemble (on prend chaque coup possible et on joue le coup qui nous amènerait à la meilleure position selon son propre réseau de neurones)
Je les sélectionne ensuite en fonction de leur résultats (pondération), j'en croise quelques uns puis j'effectue éventuellement des mutations (changement de valeur aléatoire) et je remplis avec des nouveaux individus aléatoires.

Et on recommence une nouvelle génération à partir des individus résultants et ainsi de suite.

Pour le moment sans croisement ça ne marche pas trop mal mais pourrait être grandement amélioré avec un croisement efficace, ce qui est compliqué à trouver.

Quant à l'idée de sélectionner au hasard des neurones ou des les mixer n'importe comment cela ne suit aucune logique donc il est évident que ça ne peut pas marcher.
Il suffit par exemple que deux neurones soient inversés afin de complètement faire le contraire du résultat...
Messages postés
12654
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 octobre 2020
702
tu aurais pu être plus clair ainsi:
{"neurons": [
[
{
"weights": [1, 2, 3],
"bias": -1
},
{
"weights": [4, 5, 6],
"bias": 3
}
],
[
{
"weights": [1, 2],
"bias": 5
}
]
]
Messages postés
12654
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 octobre 2020
702
tous les neurones ont la même structure, sinon peux-tu donner un second exemple?
quand tu fais un croisement, tu pars de deux pour en obtenir deux autres?
Messages postés
12654
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 octobre 2020
702
comment cela s'applique-t'il pour jouer aux bâtonnets?
{"neurons": [
[
{
"weights": [-1, 0, 5],
"bias": 0
},
{
"weights": [8, -1, 1],
"bias": -1
}
],
[
{
"weights": [1, 1],
"bias": 4
}
]
]


Oui c'est ça je dois en obtenir 2 autres comme dans un algorithme génétique classique.
Une solution qui ne résulterait qu'en un seul individu me conviendrait aussi.
Messages postés
12654
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 octobre 2020
702
que pensais-tu en écrivant "les neurones ne sont pas ordonnés et on ne peut pas déterminer comment les recoller"?
que signifie exp()?
>
Messages postés
12654
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 octobre 2020

exp c'est l'exponentielle car j'ai utilisé une régression linéaire et les neurones ne sont pas ordonnés dans le sens où, si on inverse l'ordre de 2 neurones par exemple :
{"neurons": [
[
{
"weights": [8, -1, 1],
"bias": -1
},
{
"weights": [-1, 0, 5],
"bias": 0
}
],
[
{
"weights": [1, 1],
"bias": 4
}
]
]


Dans ce cas on obtient un résultat complètement différent, ce qui fait qu'on ne peut pas manipuler efficacement les neurones comme par exemple en splittant le réseau de neurones et en le recollant avec un autre sans avoir un résultat totalement différent des 2 autres.
Messages postés
12654
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 octobre 2020
702 > Sourivore
tu donnes un exemple qui n'a rien à voir avec le croisement de deux individus, me semble-t-il.
par ailleurs, je ne pense pas qu'il soit utile d'éviter d'obtenir des résultats totalement différents, au contraire.
il ne s'agit pas de manipulation génétique, il s'agit de laisser faire l'évolution naturelle.
tes individus sont, en fait, déterminés par une séquence de 11 nombres.
moi j'utiliserais une méthode de double enjambement, éventuellement avec un calcul aléatoire des positions des pivots.
>
Messages postés
12654
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 octobre 2020

Sauf que si le croisement des individus génère un individu aussi aléatoire que si on avait généré depuis rien un nouvel individu, ça n'a plus d'intérêt de les croiser, autant ne générer que des nouveaux individus...
L'idée c'est quand même de créer des individus à cheval entre les deux parents.
Par exemple si un paramètre est très prépondérant avec des poids importants à chaque neurone pour les deux parents il semble normal que l'enfant garde ce caractère et pas qu'en réalisant les pivot il soit associé à des poids négatifs et fasse complètement le contraire de ses parents...

Dans la sélection naturelle, il est naturel de mixer les gènes mais par contre si on commence à mixer les acides aminés de l'ADN ou mettre des chromosomes sexuels avec des chromosomes classiques, tout ce qu'on aura c'est de la bouillie de vie et non un individu...
C'est pourquoi il est important de se poser la question sur la meilleur façon de croiser la gène afin de garder une cohérence.
Messages postés
12654
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 octobre 2020
702 > Sourivore
as-tu essayé la méthode de double enjambement, peut-être en 4/4/3 ? n'est-ce pas une méthode classique de combinaison dans ce genre d'algorithme? pourquoi considères-tu que cela crée une bouillie?
c'est peut-être alors le modèle en trois couches que tu as choisi qui n'est pas adéquat, d'où ma question de comment cela s'applique au jeu de bâtonnets.
les exemples que tu as donné, il s'agit d'exemples de neurones, ou d'exemples d'individus? si ce sont des exemples de neurones, peux-tu décrire un individu?
qu'appelles-tu une couche?