Title

1  Préambule.

L'implémentation du réseaux de neurones que je me propose de réaliser sera en partie grandement inspirée, du moins au début, de l'implémentation proposée par Brian Satterfield.

2  Organisation structurelle des réseaux de neurones.

L'architecture retenue pour l'implémantation de ce réseaux de neurones ce veut proche de la réalité biologique. Cependant, la complexité des réseaux de neurones biologiques est telle qu'il n'est pas possible de la modéliser facilement ; c'est pourquoi on à recourt à un model plus simple :
Le schèma suivant devrait préciser plus clairement la stucture d'un tel réseau.

3  Implémentation

3.1  Choix du langage

En regard de la structure physique du réseau de neurones simplifié que l'on veut créer, le choix d'un langage orienté objet s'impose de lui même. Car en effet, il apparaît naturel de créer pour chaque élément/structure du réseau un objet regoupant les propriétés de cet élément et des méthodes associées.

Ensuite, pour un développement rapide, élégant et non complètement optimisé d'un point de vue de la gestion de la mémoire et de la vitesse d'exécution, un langage de haut niveau conviendrait parfaitement.

Enfin, un langage portable serait le bienvenu, afin de pouvoir utiliser et développer le réseau aussi bien sous Linux que sous Windows. Evidemment un tel langage doit être libre, et donc être dotée d'une licence GPL ou BSD.

Objectif Caml (Ocaml), le méta langage développé à l'INRIA, semble donc parfaitement adapté pour répondre à ces exigences. De plus, ce langage permet de programmer de façon élégante, de façon fonctionnel et assez proche des mathématiques. Qui plus est, c'est un langage français :-).

3.2  Représentation des données

Comme on l'a dit précedemment, chaque élément important du réseau (neurone, couche, réseau), sera implémenté sous la forme d'un objet, que l'on stockera dans un module indépendant.

3.2.1  Le neurone

Ci dessous ce trouve le code décrivant l'objet neuron.

 

class neuron =

  object (self)

    val mutable neuron_type  = Hidden

    val mutable weights = []

    val mutable bias_weight = 1

    val mutable activation = 0.0

    val mutable error = 0.0

    val mutable error_signal = 0.0

    val mutable theorical_output = 0.0

   

    method set_weights poids =

      weights <- poids;

    method set_theorical_output theorical_value =

      theorical_output <- theorical_value;

    method set_type n_type =

      neuron_type <- n_type;

 

 

    method activate previous_layer_outputs = (*compute the activation by * wheight and previous_oupts*)

      let rec compute x y  = match (x,y)  with

        ([], []) -> 0.0;

      | (t1::q1, t2::q2) -> (t1*. t2) +. compute q1 q2;

      | (_,_) -> raise Weight_Size_Error;

    in

    activation <- compute previous_layer_outputs weights;

 

    method get_output (transmittance : float -> float )= transmittance activation;

  end;;

La classe reprend donc de façon simple les éléments de la théorie des réseaux de neurones. Seule la méthode d'activation mérite peut-être une brève explication.

Cette fonction calcule l'activation du neurone, c'est à dire qu'elle fait la somme pondérée de la valeur de sortie de chaque neurones de la couhe précédente.

Elle utilise la fonction auxiliaire récursive compute, qui à tous couples de listes de nombres réels ((On)n,(Wn)n) fait correspondre le produit O0*W0 qu'elle somme avec la valeur de retour de compute appliquée aux deux listes précédentes privées de leur premier élément. Losrque les listes sont vides, compute retourne 0.

Cette fonction est un exemple de possibilité de récursion de Ocaml, qui permettent d'effectuer sans boucles des traitements itératifs.

La méthode get_output mérire en fait elle aussi l'attention, car elle prend en paramêtre une fonction, ce qui permet d'avoir pour chaque neurone, ou plus généralement pour chaque couche de neurones une fonction de seuil différente. Ce genre de tricks est assez courant dans les langages fonctionnels, mais aurait aussi pu être impléménté en C avec un pointeur sur une fonction.
This document was translated from LATEX by HEVEA.