PDA

Voir la version complète : code source


delfare
17/09/2005, 09h57
voila,
ca fait pas mal de temps que je m'interresse a l'IA, j'ai deja compris l'algorithme de A* mais je m'interresse beauoups aux resaux de neurones, j'ai deja vu beaucoups d'exemples en pseudo-code mais je ne comprend pas vraiment comment ca marche.
Est-ce que quelqu'un aurait un code source basique d'une appliquation que je pourrais compiler(de preference avec dev-cpp car sur code-source.com, j'en ai trouve des avec visualcpp que j'ai pas reussi a lancer)?
merci d'avance

Rhakys
05/10/2005, 13h13
http://stephane.duverger.free.fr/xor.tar.gz
c'est un réseau de neurones qui apprend à faire un XOR (un OU exclusif en logique)
le code source se trouve dans /src/main.c, à priori il devrait être compilable directement, ou tu devras peut-être virer ce passage dans la fonction alea():
#ifndef DEV_RNG
struct timeval timer;
gettimeofday(&timer, 0);
srand(timer.tv_usec);
#endif

par contre il n'est pas documenté donc bon courage pour comprendre comment ça marche exactement.


pour ce qui est de "comment marche un réseau de neurones" je vais essayer d'en faire une explication simple et succinte.
D'abord ce qu'est un neurone, en gros, aussi bien biologique qu'informatique :
un neurone est une petite boite contenant une sortie et plusieurs entrées. Un neurone c'est très bête, on lui donne des valeurs dans ses entrées, et il répond "oui" ou "non" en sortie. Pour ce faire, chacune de ses entrées a un "poids" qu'on pourrait appeler coefficient multiplicateur. Le neurone applique donc ses poids aux valeurs en entrées puis fait la somme de tout ça.
Ensuite, il compare cette somme à son "seuil" ou encore valeur d'activation. Si la somme était plus grande que le seuil, alors le neurone s'active et donne 1 en sortie, sinon il donne 0.
Les poids servent donc à donner de l'importance aux entrées, ce qui permet de faire le tri entre des entrées pertinentes et des parasites.
Avec un seul neurone, on ne peut donc pas faire grand-chose, mais dans un réseau de neurones, il peut y avoir pleins de neurones, recevant tous les mêmes entrées, et dirigeant tous leurs sorties vers les entrées d'un nouveau neurone. Plus on rajoute de neurones et/ou de couches de neurones (qui sont entre les neurones d'entrée et les neurones de sortie) et plus le réseau peut être "potentiellement" intelligent.
Dernier détail : quand on crée un réseau de neurones, on initialise tous les neurones en tirant aléatoirement leurs poids et seuils, puis pour entraîner le réseau de neurone (par exemple pour faire de la reconnaissance de caractères) on lui donne une grande liste de "patterns" qui sont tout simplement des valeurs extraites de la forme à reconnaitre avec la liste des réponses. Le réseau entre donc les valeurs, regarde ce qu'il trouve en sortie et compare avec la réponse. S'il avait trouvé la bonne réponse, c'est bon on fait rien, sinon on fait une correction des poids et seuils, puis on continue l'apprentissage. Par contre les algorithmes de correction les plus efficaces sont assez complexes, je ne suis pas capable d'en parler.

Quelques chiffres:
- une étoile de mer a 1 neurone.
- un réseau de neurone capable de faire la difference entre un bruit de sonar ayant résonné sur de la pierre ou du métal (pour détecter un sous-marin par exemple) avec 80 neurones obtient les mêmes performances qu'un humain.
- un moustique en a environ 400.
- les Norns dans le jeu Creatures en ont 1000
- un humain en a environ 1000 milliards.