PROJET AUTOBLOG


Zythom

Site original : Zythom
⇐ retour index

Réseaux de neurones 3

vendredi 16 mai 2014 à 17:27
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...

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:

Figure 1: Réseau complètement connecté
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.


Source : http://zythom.blogspot.com/feeds/1113245963999151165/comments/default


Expert près la Cour Administrative d' Appel

vendredi 9 mai 2014 à 17:18
Pour la première fois, les Cours Administratives d'Appel sont tenues de mettre en place un tableau des experts. Si vous souhaitez postuler pour y être inscrit, il faut déposer la demande d'inscription avant le 15 septembre prochain. Je vous recommande d'anticiper cette date le plus possible pour éviter le rejet inéluctable de votre demande en cas de dossier incomplet.

Mais avant, revoyons tout cela tranquillement.

Qu'est-ce que donc que la justice administrative ?
N'ayant jamais étudié le droit, je fais parti des Mékeskidi en la matière. Heureusement, il y a d'excellents sites qui expliqueront tout cela mieux que moi, à commencer par celui de Maître Eolas:
- le grand divorce de 1790 : la séparation des autorités administratives et judiciaires
- L'autre justice
- L'autre Justice (2)

Pour ceux qui ont le tort de ne pas lire ces trois billets, voici un raccourci :
Il existe en France deux juridictions séparées : l'ordre administratif et l'ordre judiciaire. L'existence de ces deux ordres de juridictions distincts est en France le produit de l'histoire, fruit de la volonté d'empêcher le juge judiciaire de s'immiscer dans les questions de l'administration (source Wikipédia).
Tenant compte des déboires qu'ont connus les Rois de France avec les parlements et craignant d'être entravés à leur tour dans leur action, les révolutionnaires construisent un système visant à empêcher les magistrats d'influer sur la vie politique et législative.
Du juge, ils n'attendent que la stricte application de la loi, émanation de la souveraineté populaire, qui ne souffre ni interprétation, ni détournement -interdiction leur est faite de prendre des décisions de règlement, et obligation leur est faite d'en référer au législateur pour interpréter la loi. Mais avant tout, les révolutionnaires interdisent aux juridictions judiciaires d'exercer leur contrôle sur les différends susceptibles de naître entre les administrés et l'administration.
Dès lors, sont créés deux ordres distincts : un ordre administratif, chargé du contentieux administratif opposant les citoyens à l'administration, et un ordre judiciaire, chargé de régler les conflits entre personnes privées et de sanctionner les infractions à la loi. (source justice.gouv.fr)

Et les experts dans tout cela ?
Attention, en parlant d'"experts", il faut bien préciser le mot, tant la notion est floue et prête à confusion dans la langue française. Les tribunaux de l'ordre judiciaire, lorsqu'ils ont besoin de l'aide d'un technicien pour juger une affaire, font appel à des personnes inscrites sur une liste tenue par chaque Cour d'Appel. Les personnes inscrites sur ces listes sont appelés "experts judiciaires".
Jusqu'au 31 décembre 2013, un seul article du code de justice administrative faisait référence à l'établissement des tableaux d'experts: "chaque année, le président procède, s'il y a lieu, à l'établissement du tableau des experts près la juridiction qu'il préside". Depuis le 1er janvier 2014, cet article est remplacé et les Cours Administratives d'Appel doivent mettre en place une liste expertale.

Expert administratif ?
Quel sera le titre donné à ces "nouveaux" experts, je ne sais pas. Le décret n°2013-730 du 13 août 2013 portant modification du code de justice administrative, ne parle en effet (dans son chapitre IV) que "d'un tableau des experts auprès de la cour et des tribunaux administratifs du ressort". Mais les associations qui regroupent les personnes inscrites sur ce type de liste ont trouvé un terme: au lieu "d'expert judiciaire", il faudrait maintenant parler "d'expert de justice". Toutes les associations ont donc changé leurs noms (ou sont en train de le faire), ce que vous pouvez constater dans votre moteur de recherche favori en tapant les mots clefs "compagnie" "expert" "judiciaire" (exemple ici avec mon moteur préféré).

Pour ma part, je trouve tout cela un peu confus, puisque l'inscription à une association d'experts n'est pas obligatoire, et qu'il y aura des experts judiciaires non administratifs, des experts administratifs non judiciaires et des experts judiciaires et administratifs... J'attends d'y voir plus clair avec un texte de loi. En attendant, je parlerai d'expert administratif, ou d'expert près une cour administrative d'appel.

Il est à noter qu'aucune procédure n'a été créée (à ma connaissance) pour le tableau des experts près le Conseil d’État, qui est le pendant de la Cour de Cassation.

La procédure d'inscription
Le président de la cour administrative d’appel procède aux inscriptions, après avis d’une commission composée des présidents des tribunaux administratifs du ressort et d’experts en nombre au moins égal au tiers de ses membres. Il arrête les inscriptions en fonction des besoins des juridictions dans les différents domaines d’activité dans lesquels les juridictions administratives peuvent avoir recours à une expertise. Ces domaines d’activité sont recensés dans une nomenclature arrêtée par le vice-président du Conseil d’Etat.

Vous noterez la ressemblance avec la nomenclature utilisée par l'ordre judiciaire.

Voici quelques rubriques pouvant intéresser un informaticien:

E. ― INDUSTRIES
E.1. Électronique et informatique.
E.1.1. Automatismes.
E.1.2. Internet et multimédia.
E.1.3. Logiciels et matériels.
E.1.4. Systèmes d'information (mise en œuvre).
E.1.5. Télécommunications et grands réseaux.

F. ― SANTÉ
F.5. Biologie médicale et pharmacie.
F.5.5. Biostatistiques, informatique médicale et technologies de communication.

G. ― MÉDECINE LÉGALE, CRIMINALISTIQUE ET SCIENCES CRIMINELLES
G.2. Investigations scientifiques et techniques.
G.2.5. Documents informatiques.

Si vous travaillez dans un service informatique:

G.3. Armes. ― Munitions. ― Balistique.
G.3.1. Balistique.
G.3.2. Chimie des résidus de tir.
G.3.3. Explosifs.
G.3.4. Munitions.
G.3.5. Technique des armes.

sans oublier

H.1. Interprétariat.
H.1.3. Langue française et dialectes.
H.3. Langue des signes et langage parlé complété.

(rhooo, je plaisante...)

Les conditions pour être inscrit au tableau des experts administratifs
Pour être inscrit, l’expert doit satisfaire à cinq conditions définies à l’article R. 221-11 du code de justice administrative :
- Justifier d’une qualification et avoir exercé une activité professionnelle, pendant une durée de dix années consécutives au moins, dans le ou les domaines de compétence au titre desquels l’inscription est demandée, y compris les qualifications acquises ou les activités exercées dans un État membre de l’Union européenne autre que la France ;
- Ne pas avoir cessé d’exercer cette activité depuis plus de deux ans avant la date de la demande d’inscription ou de réinscription ;
- Ne pas avoir fait l’objet d’une condamnation pénale ou d’une sanction disciplinaire pour des faits incompatibles avec l’exercice d’une mission d’expertise ;
- Justifier du suivi d’une formation à l’expertise ;
- Avoir un établissement professionnel ou sa résidence dans le ressort de la cour administrative d’appel.

Les experts déjà inscrits sur les listes d’experts judiciaires sont réputés satisfaire, à l’issue de la période probatoire, aux conditions énoncées aux quatre premiers points.

Comment s'inscrire ?
Le dossier de demande d’inscription doit être adressé au président de la cour administrative d’appel avant le 15 septembre (il serait folie de l'envoyer le 14 septembre!). La première inscription est faite pour une durée probatoire de trois ans à l'issue de laquelle l'expert peut demander sa réinscription pour une période de cinq ans (art. R.221-12).

Le président de la cour administrative d'appel prend l’avis d'une commission présidée par lui-même et composée des présidents des tribunaux administratifs du ressort de la cour et d’experts inscrits au tableau de la cour (au moins deux experts sans que leur nombre puisse excéder le tiers des membres de la commission) (art. R.221-10). La commission tient compte des besoins des juridictions du ressort (art. R.221-14). La décision de refus d'inscription ou de réinscription d'un candidat doit être motivée (art. R.221-15). Les décisions de refus d'inscription ou de réinscription d'un candidat, de retrait ou de radiation d'un expert du tableau peuvent être contestées. Elles sont examinées par une autre cour administrative d'appel (art. R.221-19).

Les experts inscrits au tableau d'une cour administrative d'appel doivent adresser à la fin de chaque année civile un état des missions qui leur ont été confiées, des rapports déposés et des missions en cours ainsi que des formations suivies au cours de l'année (art. R.221-16).

Il est important de noter que l'importance de la partie du document suivante :
« Les organismes de droit public ou privé intervenant dans mon domaine d’activité avec lesquels j’entretiens des liens directs ou indirects sont les suivants : …… » où le candidat doit mentionner les organismes de droit public (État, collectivités territoriales, établissements publics tels que CHU, etc.) ainsi que les organismes de droit privé (sociétés de droit commercial, compagnies d’assurances, laboratoires privés, associations, etc.) avec lesquels il entretient des relations qui ne sont pas occasionnelles, sous quelque forme que ce soit.

Et après ?
Je suis en train de constituer mon dossier. Je suis toujours enthousiaste à l'idée de mettre mes compétences au service de la justice. Mes contacts au sein de la magistrature administrative sont dubitatifs sur l'idée d'avoir besoin d'un expert en informatique. Cela m'étonne: n'y aurait-il pas de litiges entre les citoyens et l'administration en France où l'informatique serait partie prenante ?

On verra bien si mon dossier est retenu. Si non, tant pis, je retenterai une deuxième fois (comme pour celui d'expert judiciaire).

Je ne manquerai pas de vous tenir au courant du suivi.

Je vous prie de croire, chère lectrice, cher lecteur, à l'expression de mes salutations distinguées.

Zythom

Source : http://zythom.blogspot.com/feeds/5442911298906918798/comments/default


Réseaux de neurones 2

mercredi 7 mai 2014 à 22:10
Ce billet est la suite de celui-ci qu'il est préférable de lire avant mais c'est vous qui voyez.

Après quelques heures passées sur l'apprentissage du langage Go, je me suis résolu à revenir à mes fondamentaux: le langage C. Cela fait 20 ans que je n'ai pas codé sérieusement, et j'ai eu peur de perdre trop de temps à m'initier à un nouveau langage. Ce qui suit va faire sourire tous les développeurs actuels et définitivement me décrédibiliser auprès d'eux...

Il y a 20 ans, j'étais chercheur et je programmais sur une station de calcul Apollo, dans un environnement de développement équivalent à vi (sous Domain/OS). J'appelais quelques routines graphiques de base, à une époque où l'environnement graphique informatique était en pleine révolution. Mes langages favoris étaient le langage OCCAM et le langage C.

Lorsque de chercheur, je suis devenu professeur en école d'ingénieurs, j'ai enseigné le langage C. La mode était alors au Turbo C de Borland. Mon enseignement n'incluait pas la partie graphique. Mes étudiants se contentaient très bien des tableaux de pointeurs de fonctions de structures doublement chaînées, et des envois de données sur le réseau.

Me voici donc aujourd'hui (enfin, il y a quelques mois), à me demander ce qui pouvait être utilisé comme IDE aujourd'hui, avec tous les progrès informatiques. Je me suis dit qu'un environnement multiplateformes pourrait être intéressant, pour profiter du meilleur des univers Windows ou GNU/Linux.

J'ai choisi Code::Blocks.

Me voici donc en train de compiler quelques programmes simples trouvés sur les différents sites d'initiation à cet IDE. Je redécouvre alors la joie de compiler un code source, d'éditer les liens avec les bibliothèques standards, et de voir les premiers "Hello world" à l'écran. J'ai eu une petite pensée pour Dennis MacAlistair Ritchie...

Très vite, je me suis retrouvé à écrire quelques procédures de calcul concernant les réseaux de neurones. J'ai créé mon premier réseau, mes premières structures, mes premiers malloc (et à chaque malloc son free correspondant ;-).

Comme 20 ans auparavant, j'ai vite trouvé l'affichage standard limité: il me fallait tracer des courbes, des nuages de points, des évolutions de critères en cours de minimisation. Il me fallait appeler quelques fonctions graphiques...

Et là... Grosse déception !

En 20 ans de foisonnement d'interfaces graphiques et d'amélioration de processeurs spécialisés, aucune bibliothèque graphique SIMPLE n'a l'air de s'être imposée. Un truc du genre: j'ouvre une fenêtre, je dessine un pixel dedans quand je veux et basta. Si je suis sous Windows, ça m'ouvre une fenêtre Windows, si je suis sous GNU/Linux, et bien ça m'ouvre une fenêtre GNU/Linux... Bon, j'avoue que je n'ai pas beaucoup cherché, et je compte un peu sur vous pour me montrer la voie si je me suis fourvoyé.

J'ai choisi la bibliothèque graphique SDL parce que pas mal de sites ont l'air de dire que c'est très bien pour s'initier. Ça tombe bien, parce que je ne souhaite pas devenir un professionnel du graphisme, je veux juste dessiner quelques courbes.

Ce qui m'a un peu surpris, c'est de devoir "bidouiller" Code:Blocks pour que mes premiers programmes utilisant SDL puissent fonctionner (je n'ai pas conservé les messages d'erreur, mais j'ai ramé). Heureusement, pas mal de monde utilise le combo Code::Blocks + SDL et la communauté publie des tutos bien faits.

Me voici donc en train de faire mes premières courbes. Bon, mes programmes sont devenus beaucoup moins lisibles maintenant que je les ai truffé d'appels à des routines graphiques plus ou moins claires, mais j'ai compris les bases du truc. Jusqu'au jour où j'ai voulu tracer une courbe dans une nouvelle fenêtre... En effet, SDL ne permet pas d'ouvrir plusieurs fenêtres. Mais heureusement SDL2 peut le faire! Sauf qu'il faut tout réécrire car les concepts graphiques n'ont rien à voir. Je me suis donc tapé le guide de migration SDL1.2 vers SDL2.0 dans la même journée que l'apprentissage de SDL1.2. Je râle, je râle, mais je remercie tous les développeurs qui consacrent leur vie à créer tous ces outils (et les manuels qui vont avec). Je sais maintenant manipuler (un peu) les pointeurs de fenêtres et de Renderer.

Comme SDL2 est sortie en août 2013, j'ai un peu galéré à trouver comment adapter Code::Blocks pour faire fonctionner mes premiers programmes SDL2 (mais j'ai trouvé!). Et j'ai pleuré des larmes de joie quand j'ai vu mes premières courbes tracées dans deux fenêtres séparées.

J'ai ensuite pu attaquer les choses sérieuses avec la mise au point des routines d'optimisation. J'en ai déjà expliqué une partie dans ce billet. Mes premiers programmes ont consisté à mettre au point les routines suivantes:
- calcul du gradient par rétropropagation de l'erreur
- méthode d'optimisation par descente de gradient à pas constant
- amélioration de la méthode précédente avec calcul économique d'un pas variable (méthode de Wolfe et Powell)
- amélioration de la méthode précédente avec calcul itératif de l'inverse du Hessien (méthode de Broyden, Fletcher, Goldfarb et Shanno).

Je suis toujours bluffé par l'accélération foudroyante des méthodes quasi-newtoniennes pour s'approcher du minimum de la fonction.

J'en suis là aujourd'hui.
J'ai un programme illisible qui fonctionne malgré tout parfaitement: je peux créer un réseau de neurones complètement connecté qui peut apprendre virtuellement n'importe quel ensemble d'apprentissage, dès lors que celui-ci est constitué d'un nombre fini de couples {entrées connues, sorties désirées}. Je suis à la recherche d'un problème pas trop complexe, en évitant si possible tous les problèmes de classification (type mémorisations de visage ou reconnaissance de caractères). J'aimerais plutôt un problème de modélisation, comme par exemple la prédiction des éruptions du "Old Faithful" (si quelqu'un a des données récentes sur ce geyser, avec températures, pression, etc.).

Il me faut du temps pour rendre mes routines plus lisibles, pour sauvegarder les coefficients calculés, pour tester d'autres environnements, pour créer un tableur Excel et OpenOffice, pour trouver un problème intéressant à ma portée...

Il me faut aussi comprendre comment faire pour exploiter toute la mémoire de ma machine. Je n'arrive pas encore à créer des matrices de grandes tailles (du genre 10000x10000 réels double précision). Je suis pour l'instant limité à un réseau d'au maximum 50 neurones et 1224 connexions.

Mais 50 neurones, c'est déjà beaucoup ;-)








Source : http://zythom.blogspot.com/feeds/5087158602592948290/comments/default


42 ans

dimanche 27 avril 2014 à 10:00

Source : http://www.blogger.com/feeds/33889351/posts/default/6967350739647506624


Les géants

mardi 22 avril 2014 à 14:08

Source : http://zythom.blogspot.com/feeds/6645528618213232492/comments/default