Algorithme génétique et réseau de neurones
Sourivore
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
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.
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
A voir également:
- Algorithme génétique et réseau de neurones
- Mot de passe reseau - Guide
- Opérateur de réseau mobile - Guide
- Le message n'a pas été envoyé car le service n'est pas activé sur le réseau - Forum Xiaomi
- Messenger en attente de réseau ✓ - Forum Facebook
- Partage reseau - Guide
3 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
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.
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.
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
1 584
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...
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...
{"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.
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 :
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.
{"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.
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.
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.
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.
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.
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?
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?