Réseaux de neurones 3
Planète Juridique - admin, 16/05/2014
Ce billet fait partie d'une série qu'il vaut mieux avoir lu avant, mais c'est vous qui voyez.
Nous avons vu que pour jouer avec un neurone, il fallait calculer son potentiel (la somme pondérée des sorties des neurones qui lui sont connectés), puis sa sortie grâce à sa fonction d'activation. Je n'en ai pas encore parlé, mais pour pouvoir modifier les coefficients du réseau, il faut aussi connaître la dérivée de la fonction d'activation du neurone. Idem pour la variable "erreur" dont je parlerai un peu plus tard, pendant la phase d'apprentissage du réseau.
Si vous êtes étudiant et que vous souhaitez travailler sérieusement sur les réseaux de neurones, je vous conseille d'étudier attentivement le code source d'une bibliothèque telle que FANN qu'un lecteur m'a recommandé et qui a l'air très bien. Dans mon cas, je suis partisan d'un travail artisanal qui permet de mieux comprendre les différents mécanismes en jeu. Et puis, j'aime bien le blog de Libon: fabriqué à mains nues, alors...
Si vous êtes étudiant et que vous souhaitez travailler sérieusement sur les réseaux de neurones, je vous conseille d'étudier attentivement le code source d'une bibliothèque telle que FANN qu'un lecteur m'a recommandé et qui a l'air très bien. Dans mon cas, je suis partisan d'un travail artisanal qui permet de mieux comprendre les différents mécanismes en jeu. Et puis, j'aime bien le blog de Libon: fabriqué à mains nues, alors...
Pour moi, un neurone, en langage C, c'est donc cela:
Avec cette déclaration, un réseau de neurones peut être le simple tableau suivant: NEUR* neurone[NBMAXNEUR]; où NBMAXNEUR est une constante indiquant le nombre total de neurones (y compris les entrées du réseau).
La création d'un réseau se fera alors de manière dynamique avec un petit programme du type:
Note à moi-même pour plus tard: ne pas oublier un appel à "free()" pour chaque appel à "malloc()".
Parmi tous les réseaux de neurones possibles, j'ai choisi de travailler avec un réseau complètement connecté à une seule sortie. Il s'agit du type de réseau possédant le plus de liens possibles entre les neurones.
Il est assez facile à construire:
- le 1er neurone est relié à toutes les entrées du réseau
- le neurone suivant est relié à toutes les entrées du réseau, et à la sortie du premier neurone,
- le Nème neurone est relié à toutes les entrées du réseau, et à la sortie de tous les neurones précédents,
- la sortie du réseau est la sortie du dernier neurone.
Je vous ai fait un petit dessin qui montre ce type de réseau:
Dans un réseau de neurones, le cœur du problème, ce qu'il faut rechercher, ce sont les coefficients des liens reliant les neurones entre eux. Le coefficient reliant le neurone j vers le neurone i s'appelle Cij. Par exemple, sur la figure 1, le coefficient reliant 3 à 5 s'appelle C53 (attention au sens).
Pour faire très simple, et suivre la notation utilisée, j'ai choisi une matrice pour stocker les coefficients Cij : double coef[NBMAXNEUR][NBMAXNEUR];
où NBMAXNEUR contient le nombre d'entrées et le nombre de neurones (soit 6 sur la figure ci-dessus). Ainsi, le coefficient C53 est stocké dans coef[5][3]. Ma matrice aura beaucoup de zéros, mais je privilégie la simplicité.
La propagation de l'information au sein du réseau se fait donc de la manière suivante:
Note à moi-même pour plus tard: ne pas oublier un appel à "free()" pour chaque appel à "malloc()".
Parmi tous les réseaux de neurones possibles, j'ai choisi de travailler avec un réseau complètement connecté à une seule sortie. Il s'agit du type de réseau possédant le plus de liens possibles entre les neurones.
Il est assez facile à construire:
- le 1er neurone est relié à toutes les entrées du réseau
- le neurone suivant est relié à toutes les entrées du réseau, et à la sortie du premier neurone,
- le Nème neurone est relié à toutes les entrées du réseau, et à la sortie de tous les neurones précédents,
- la sortie du réseau est la sortie du dernier neurone.
Je vous ai fait un petit dessin qui montre ce type de réseau:
Figure 1: Réseau complètement connecté
avec 3 entrées, 3 neurones et une sortie
avec 3 entrées, 3 neurones et une sortie
Dans un réseau de neurones, le cœur du problème, ce qu'il faut rechercher, ce sont les coefficients des liens reliant les neurones entre eux. Le coefficient reliant le neurone j vers le neurone i s'appelle Cij. Par exemple, sur la figure 1, le coefficient reliant 3 à 5 s'appelle C53 (attention au sens).
Pour faire très simple, et suivre la notation utilisée, j'ai choisi une matrice pour stocker les coefficients Cij : double coef[NBMAXNEUR][NBMAXNEUR];
où NBMAXNEUR contient le nombre d'entrées et le nombre de neurones (soit 6 sur la figure ci-dessus). Ainsi, le coefficient C53 est stocké dans coef[5][3]. Ma matrice aura beaucoup de zéros, mais je privilégie la simplicité.
La propagation de l'information au sein du réseau se fait donc de la manière suivante:
La sortie du réseau est donc neurone[NBMAXNEUR-1]->sortie
Les entrées du réseau sont considérées comme des neurones particuliers très simples (pas de liens vers eux, pas de fonction d'activation, potentiel égal à l'entrée).
Le prochain billet sera consacré à l'apprentissage d'un tel réseau de neurones (ie: au calcul des coefficients du réseau). On révisera aussi un peu les fonctions. Il vaut mieux aller doucement.
Ce billet fait partie d'une série qu'il vaut mieux avoir lu avant, mais c'est vous qui voyez.
Nous avons vu que pour jouer avec un neurone, il fallait calculer son potentiel (la somme pondérée des sorties des neurones qui lui sont connectés), puis sa sortie grâce à sa fonction d'activation. Je n'en ai pas encore parlé, mais pour pouvoir modifier les coefficients du réseau, il faut aussi connaître la dérivée de la fonction d'activation du neurone. Idem pour la variable "erreur" dont je parlerai un peu plus tard, pendant la phase d'apprentissage du réseau.
Si vous êtes étudiant et que vous souhaitez travailler sérieusement sur les réseaux de neurones, je vous conseille d'étudier attentivement le code source d'une bibliothèque telle que FANN qu'un lecteur m'a recommandé et qui a l'air très bien. Dans mon cas, je suis partisan d'un travail artisanal qui permet de mieux comprendre les différents mécanismes en jeu. Et puis, j'aime bien le blog de Libon: fabriqué à mains nues, alors...
Si vous êtes étudiant et que vous souhaitez travailler sérieusement sur les réseaux de neurones, je vous conseille d'étudier attentivement le code source d'une bibliothèque telle que FANN qu'un lecteur m'a recommandé et qui a l'air très bien. Dans mon cas, je suis partisan d'un travail artisanal qui permet de mieux comprendre les différents mécanismes en jeu. Et puis, j'aime bien le blog de Libon: fabriqué à mains nues, alors...
Pour moi, un neurone, en langage C, c'est donc cela:
Avec cette déclaration, un réseau de neurones peut être le simple tableau suivant: NEUR* neurone[NBMAXNEUR]; où NBMAXNEUR est une constante indiquant le nombre total de neurones (y compris les entrées du réseau).
La création d'un réseau se fera alors de manière dynamique avec un petit programme du type:
Note à moi-même pour plus tard: ne pas oublier un appel à "free()" pour chaque appel à "malloc()".
Parmi tous les réseaux de neurones possibles, j'ai choisi de travailler avec un réseau complètement connecté à une seule sortie. Il s'agit du type de réseau possédant le plus de liens possibles entre les neurones.
Il est assez facile à construire:
- le 1er neurone est relié à toutes les entrées du réseau
- le neurone suivant est relié à toutes les entrées du réseau, et à la sortie du premier neurone,
- le Nème neurone est relié à toutes les entrées du réseau, et à la sortie de tous les neurones précédents,
- la sortie du réseau est la sortie du dernier neurone.
Je vous ai fait un petit dessin qui montre ce type de réseau:
Dans un réseau de neurones, le cœur du problème, ce qu'il faut rechercher, ce sont les coefficients des liens reliant les neurones entre eux. Le coefficient reliant le neurone j vers le neurone i s'appelle Cij. Par exemple, sur la figure 1, le coefficient reliant 3 à 5 s'appelle C53 (attention au sens).
Pour faire très simple, et suivre la notation utilisée, j'ai choisi une matrice pour stocker les coefficients Cij : double coef[NBMAXNEUR][NBMAXNEUR];
où NBMAXNEUR contient le nombre d'entrées et le nombre de neurones (soit 6 sur la figure ci-dessus). Ainsi, le coefficient C53 est stocké dans coef[5][3]. Ma matrice aura beaucoup de zéros, mais je privilégie la simplicité.
La propagation de l'information au sein du réseau se fait donc de la manière suivante:
Note à moi-même pour plus tard: ne pas oublier un appel à "free()" pour chaque appel à "malloc()".
Parmi tous les réseaux de neurones possibles, j'ai choisi de travailler avec un réseau complètement connecté à une seule sortie. Il s'agit du type de réseau possédant le plus de liens possibles entre les neurones.
Il est assez facile à construire:
- le 1er neurone est relié à toutes les entrées du réseau
- le neurone suivant est relié à toutes les entrées du réseau, et à la sortie du premier neurone,
- le Nème neurone est relié à toutes les entrées du réseau, et à la sortie de tous les neurones précédents,
- la sortie du réseau est la sortie du dernier neurone.
Je vous ai fait un petit dessin qui montre ce type de réseau:
Figure 1: Réseau complètement connecté
avec 3 entrées, 3 neurones et une sortie
avec 3 entrées, 3 neurones et une sortie
Dans un réseau de neurones, le cœur du problème, ce qu'il faut rechercher, ce sont les coefficients des liens reliant les neurones entre eux. Le coefficient reliant le neurone j vers le neurone i s'appelle Cij. Par exemple, sur la figure 1, le coefficient reliant 3 à 5 s'appelle C53 (attention au sens).
Pour faire très simple, et suivre la notation utilisée, j'ai choisi une matrice pour stocker les coefficients Cij : double coef[NBMAXNEUR][NBMAXNEUR];
où NBMAXNEUR contient le nombre d'entrées et le nombre de neurones (soit 6 sur la figure ci-dessus). Ainsi, le coefficient C53 est stocké dans coef[5][3]. Ma matrice aura beaucoup de zéros, mais je privilégie la simplicité.
La propagation de l'information au sein du réseau se fait donc de la manière suivante:
La sortie du réseau est donc neurone[NBMAXNEUR-1]->sortie
Les entrées du réseau sont considérées comme des neurones particuliers très simples (pas de liens vers eux, pas de fonction d'activation, potentiel égal à l'entrée).
Le prochain billet sera consacré à l'apprentissage d'un tel réseau de neurones (ie: au calcul des coefficients du réseau). On révisera aussi un peu les fonctions. Il vaut mieux aller doucement.