30 mai 2014

Points de vue

Nous sommes plusieurs hommes en costume ou en uniforme dans la pièce, sous le regard stressé du locataire des lieux qui assiste à notre perquisition.

Quelques minutes auparavant, nous avons sonné à 6h05 à la porte du logement, comme demandé par notre ordre de mission. J'assiste les forces de l'ordre, l'huissier et le serrurier. Je n'en mène pas large.

L'homme nous a ouvert la porte un peu hagard. Il était déjà debout et en train de se préparer pour aller travailler. Sa femme est en robe de chambre, se demande ce qu'il se passe, qui peut frapper à la porte à cette heure, et nous dit de ne pas faire de bruit pour ne pas réveiller les enfants.

Chacun observe la scène de son propre point de vue. L'huissier explique l'intervention à l'homme qui vient d'ouvrir la porte, les policiers sont en attente, légèrement en retrait. Le serrurier et moi sommes derrière ce rideau humain en train de découvrir la violence psychologique de ce type d'intervention. L'homme qui ouvre la porte écarquille les yeux et écoute les griefs qui lui sont reprochés. Sa femme qui est derrière lui est en colère mais pense à ses enfants qui dorment...

Je suis maintenant dans une pièce encombrée de matériel informatique : plusieurs ordinateurs fixes, des ordinateurs portables, des téléphones, des switchs, des câbles... Sans bruit, les policiers ouvrent les armoires, les tiroirs, les placards, pendant que l'huissier prend des notes. La liste du matériel à analyser s’allonge, me dis-je. Le serrurier s’ennuie dans un coin.

J'entends un enfant qui pleure et sa maman qui lui parle pour le rassurer. Quelques minutes après, je le vois entrer dans le bureau où nous sommes. Il me regarde. De son point de vue, je suis un étranger qui est dans le bureau de son papa en train de fouiller ses affaires.

Je l'ai lu quelque part, les enfants voit le monde plus grand qu'il n'est, plus impressionnant. Pour leur parler, il est conseillé de se mettre à leur hauteur. Face à cet enfant apeuré, mais suffisamment courageux pour affronter un groupe d'inconnus, je m'assois sur les talons et met mon regard au niveau du sien. Je lui parle avec ma voix la plus douce possible en essayant d'y gommer toute la tension que je ressens. Je le rassure sur nos intentions, je reprends les arguments utilisés par sa mère. Il repart prendre son petit déjeuner.

Pendant notre échange de moins d'une minute, tout le monde s'est arrêté de parler et de travailler, pour nous regarder et nous écouter. Les policiers ont hoché la tête en voyant le "petit d'homme" partir la tête haute. Le père a hoché la tête. La mère, toujours en colère, m'a foudroyé du regard. Question de point de vue.

Avant de me relever, je perçois sous le plan de travail du bureau, un petit NAS qui est jusqu'à présent passé inaperçu à la fouille du bureau. J'ai pu le signaler à l'huissier qui l'a ajouté à ses notes, et a allongé ma liste des choses à analyser. Il n'était visible qu'accroupi devant le bureau. Question de point de vue.

--oOo--

Il y a plusieurs façons de réagir à cette anecdote :
- il y a le lecteur qui privilégiera le point de vue "intrusion dans la vie privée".
Le réflexe est alors de se mettre du côté de la famille, de se demander si c'est bien normal de pouvoir entrer chez les gens comme cela. La maison doit être sanctuarisée. C'est un point de vue que je partage aussi.

- il y a celui qui se demandera comment mieux planquer ses données.
Cacher ses données privées pour les protéger devrait être un réflexe chez tout le monde. Les solutions ne manquent pas: externalisation chez un tiers de confiance, répartition dans plusieurs pièces, chiffrement, etc. Les données privées doivent répondre à des niveaux d'accès contrôlés: le monde extérieur, les amis, les enfants, le conjoint... Et il faut bien sur prévoir le cas où le monde extérieur s'invite à l'intérieur. C'est mon point de vue.

- il y a celui qui se placera du côté de la loi, du côté de la force publique, du côté de la société, du côté des victimes de cet homme.
Cet homme est suspecté d'avoir commis des actes criminels odieux. Il est facile de le voir comme un monstre, comme un danger pour les autres. Et si c'était mes enfants qui avaient été les victimes de ses actes ? Je partage ce point de vue.

- il y a celui qui se placera du côté de l'expert.
Comment un homme de science réagit-il lorsqu'il est sorti de sa tour d'ivoire pour être plongé dans le quotidien d'un huissier, d'un policier ? Est-il formé, est-il prêt ? Doit-il assister en simple spectateur et refuser d'être acteur ? Doit-il tout accepter, ou tout laisser faire ? L'expérience de Milgram est passée par là...

- il y a le point du vue du policier, de l'huissier, du magistrat, de l'informaticien, de l'avocat, mais aussi du comptable, de l'instituteur, de l'ancienne victime, du politique, du médecin, de la secrétaire... J'écoute souvent ses points de vue lorsque je discute avec ces personnes. Je partage souvent leurs vues.

Prêter ses connaissances au service de la justice, c'est aussi remettre en cause ses positions, ses opinions, son point de vue. C'est faire du doute un élément de méthodologie scientifique. Les choses sont toujours plus compliquées qu'elles n'en ont l'air. Le café du commerce est un monde en noir et blanc sans nuances de gris ni couleurs.

Enfin, c'est mon point de vue.

Et le votre ?

16 mai 2014

Réseaux de neurones 3

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.


09 mai 2014

Expert près la Cour Administrative d' Appel

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:

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

07 mai 2014

Réseaux de neurones 2

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 ;-)