27 mars 2013

Game of gones

Ce dimanche, mon fils fêtait son anniversaire avec ses copains. Il nous avait demandé si nous acceptions de les emmener tous dans une salle de jeux portant le doux nom de "laser game évolution".

Les parents organisant des anniversaires connaissent l'énergie dégagée par la réunion de 9 enfants de 11 ans et les dégâts pouvant en résulter. J'ai le plus grand respect pour les instituteurs, dont le métier et le savoir faire consistent à empêcher d'atteindre le point de fusion thermonucléaire d'un groupe pouvant aller jusqu'à 30 composants plus ou moins stables.

J'ai donc étudié avec la plus grande attention la requête de mon petit dernier.
Mmmmmm, laser game, qu'est-ce que c'est que ça...
Waaaouuuu, un jeu où l'on enferme les monstres gamins drôles gones dans une pièce et où ils peuvent courir partout en se tirant dessus, mais ça a l'air géniaaal !
Et en plus, on se tire dessus avec des pistolets lasers...
Mon rêve !Il faut que j'y participe aussi !

Et nous voilà donc tous réunis, mes 9 compagnons de jeu et moi, sous le regard un peu embarrassé attendri de mon épouse pour accomplir un rêve d'enfance : un combat au laser... Certes, loin du mythique sabre laser qui a nourri mon adolescence (encore que j'étais plus intéressé par Z6PO et R2D2), mais suffisamment près de mon univers mental mélangeant Halo, Call of Duty et autres jeux où l'on trouve des rayons de la mort, des armes Tesla et autres Wunderwaffen.

La préparation est très simple: une vidéo nous indique comment ajuster le harnais sur lequel se trouvent les cibles lumineuses et les règles de combat. On utilise le pistolet laser pour viser l'une des 9 cibles du harnais d'un des adversaires (il y a deux couleurs de joueurs, les rouges et les bleus), si l'on "touche" on gagne 100 points et l'adversaire visé en perd 50. En cas de "tir ami" chacun perd 50 points. On ne doit pas "tuer" quelqu'un dans les escaliers. Si l'on se fait tuer en hauteur, il faut redescendre. On ne doit pas masquer ses cibles. Quand on s'est fait toucher, les lumières sont éteintes pendant 8 secondes avant de pouvoir rejouer. On ne doit pas s'affronter à une distance inférieur à un mètre. Un peu de fumée dans la pièce permet de visualiser les rayons lasers sur toute leur longueur. Les parties durent 20 mn, et à ma grande surprise, les 9 gones avec lesquels j'ai joué ont parfaitement respecté ces règles.

La stratégie que j'ai choisie s'est avérée plutôt gagnante: il vaut mieux être très mobile et bouger sans arrêt, mort ou vivant, pour rencontrer le plus de cibles possibles. Sniper de temps en temps peut être amusant, surtout assisté d'un spotter. Mais on est vite repéré et encerclé.

Le jeu en équipe est assez difficile à faire comprendre à des enfants de 11 ans. J'ai donc opté pour la stratégie du mouvement brownien : chacun court de son côté dans tous les sens et vise la couleur adverse... En fait, je n'en ai parlé à personne et la stratégie s'est mise en place toute seule ;-) Je reconnais qu'il y a eu un peu de confusion lors de la deuxième partie quand les équipes ont été modifiées et qu'un certain nombre d'entre nous ont changé de couleur: il a fallu comprendre qu'il fallait tirer sur une autre couleur que lors de la partie précédente, ce qui, dans un jeu où les tirs réflexes ont une priorité importante, a valu quelques tirs amis malencontreux.

Le décor est assez bien fait: la pièce est dans la pénombre, on se déplace dans un labyrinthe sans réelle possibilité de se cacher. L'une des parties s'est déroulée dans une pièce où se trouvait une voiture sans porte ni coffre ni toit. Les gones ont adoré! Il y a des tours permettant de se placer au dessus de la mêlée, mais l'on est vite repéré avec toutes les lumières que l'on a sur soi. 

J'ai beaucoup aimé les deux parties que j'ai faites. Un grand dadais de 49 ans qui court partout au milieu de neuf gones, ça ne passe pas vraiment inaperçu...

Un dernier détail: on joue à ce jeu comme on surfe sur internet, sous pseudonyme. Mon fils a choisi "Dark Vador". En bon père, j'ai donc choisi "Luke"... La prochaine fois, je serai Muad'Dib, ou Ripley, ou T800, ou Dave.

A moins que pour ce "game of gones", je ne choisisse Jon Snow...

--------------------------------------------------
Source image: nowhereelse.fr

15 mars 2013

La sécurité sous toutes ses formes

Je viens de finir mon recyclage de conduite des chariots élévateurs. Il s'agit du CACES (Certificat d'Aptitude à la Conduite En Sécurité) cariste catégorie 3. Pendant deux jours, j'ai réappris à conduire un chariot que je ne conduis qu'une fois ou deux par an, voire qu'une fois tous les deux ans.

Mais j'ai fait cela pour être avec mes collaborateurs techniques, qui eux utilisent régulièrement le chariot élévateur de l'entreprise. Je serai un chef moins nul que d'habitude (enfin j'essaye).

C'est un moment curieux que de s'écarter des ordinateurs où je me sens à l'aise et de se (re)mettre à conduire un engin bizarre, de soulever des charges de plus d'une tonne, de faire des slaloms avec et de les poser sur des paletiers...

Le hasard fait que cette année, je dois faire plusieurs formations de recyclage en quelques semaines: CACES chariot élévateur, CACES nacelle, manipulation des extincteurs, habilitation électrique et Sauveteurs Secouriste du Travail.

L'informatique mène à tout...
Et il y a encore beaucoup d'efforts à faire sur la sécurité ;-)


05 mars 2013

Trois tranches de mort

1ère tranche.

Je marche tranquillement vers mon petit restaurant de midi, quand tout à coup, j'entends un bruit métallique assez fort, assorti d'un cri du genre "haaaaaaaaaa".

Je me retourne et assiste à la fin de glissade d'un motard précédé de sa moto. Je reste immobile de surprise, puis fait demi tour pour m'approcher de l'homme allongé sur la chaussée, en plein carrefour. Heureusement, il y a peu de véhicules qui circulent à ce moment là.

Son pantalon est déchiré, il saigne un peu à la jambe, son blouson est sérieusement rappé dans le dos. Il regarde sa moto couchée sur le flanc, et alors que je m'inquiète de ses blessures, toute son attention est tournée vers sa moto vers laquelle il rampe en disant: "Oh putain, ma bécane".

J'arrive à l'aider à se relever et à aller s'asseoir sur le trottoir. Je lui pose quelques questions pour voir s'il est en état de raisonner un peu, mais lui me demande si je peux m'occuper de sa moto. Je retourne alors près de sa superbe Kawasaki de 240 kg que j'arrive péniblement à relever. Le carter du moteur est percé et une partie de l'huile est répandue sur le sol. Quelques protections sont rappées et un cale-pied est brisé, mais dans l'ensemble la moto semble réparable. Je la pousse difficilement jusqu'au trottoir.

Je garderai une douleur au dos pendant quelques jours et dans le poignet pendant deux mois.

Je discute un peu avec le motard, je lui conseille d'appeler son assurance : il appelle sa copine. Après quelques appels infructueux, il raccroche rageur : "Putain, ça sert à quoi qu'elle ait un portable si c'est pour pas répondre !". J'essaye de sauver son couple en suggérant qu'elle n'est peut-être pas joignable...

Je m'assure qu'il va bien, qu'il n'a plus besoin de moi et le laisse appeler une dépanneuse. La mort l'a raté de peu, mais toutes ses pensées sont pour sa "bécane".

2ème tranche.

Je sors de l'école par une petite porte. Je jette un bref regard à droite pour ne bousculer personne et me dirige vers la gauche. Je marche quelques pas et m'arrête interloqué. Dans ma mémoire courte se trouve stockée l'image d'un homme allongé sur le sol. Je me retourne et aperçois une forme sur le sol : un homme gît par terre, ce n'est pas normal...

Je m'approche de lui et constate qu'il baigne dans une flaque d'eau. Il respire et est conscient mais ne répond pas à mes questions. Il sent fortement l'alcool.

Il fait froid, à peine quelques degrés. S'il reste immobile dans cette flaque d'eau, affaibli par l'alcool, il risque d'y passer vite fait. Je suis rejoins par une dame de l'immeuble d'en face qui a vu la scène : l'homme titubait, ce qui a attiré son attention depuis la fenêtre de sa cuisine. Elle l'a vu s'appuyer sur la balustrade près de l'école et basculer par dessus.

J'appelle le 112 sur mon téléphone portable et je décris la situation. Je réponds aux questions du régulateur et il me rassure rapidement : les secours sont en route. Effectivement, quelques minutes plus tard, l'ambulance des pompiers chante dans le lointain. Je les guide depuis le bord de la route à grand renfort de gestes.

Je les laisse faire leur travail : résultat, suspicion de fracture de la jambe. L'homme est embarqué avec précaution. Il aurait pu mourir seul dans cette flaque à l'abri des regards. Si cette femme ne l'avait pas vu. Si je ne l'avais pas vu. Détresse humaine.

3e tranche.

Ce soir, en rentrant du travail à vélo, je manque de tomber sur un scooter renversé dans un virage. Je m'arrête. Un homme a la jambe coincée sous le scooter. Je gare rapidement mon vélo et soulève le scooter pour dégager l'individu. Celui-ci reste allongé, le regard un peu vide. Je mets le scooter sur sa béquille et me penche sur l'homme pour lui parler. Il me regarde et tente de se relever. Je l'aide tout en me demandant s'il est en état de se lever. Je ne sais pas s'il est blessé. Une fois debout, il titube et retombe de tout son long sur le sol. Heureusement, son casque l'empêche de se faire mal.

Il est complètement ivre.

Je l'aide une deuxième fois à se relever et il arrive tout juste à tenir debout. Il veut remonter sur son scooter... Je lui conseille de ne pas essayer de conduire, mais il veut à tout prix rentrer chez lui en scooter. Quelques personnes s'arrêtent à notre hauteur et observent la scène. Je ne sais pas trop quoi faire.

Je décide d'enlever les clefs du scooter et de m'écarter un peu.

L'homme est un peu énervé, mais n'arrive pas à monter sur le scooter. Il a vu que j'avais enlevé les clefs et je continue à lui parler pour le dissuader de rouler dans cet état. "Je suis le diable", me dit-il. "J'ai fait de la prison", ajoute-t-il.

Qui suis-je pour juger une personne ? Ai-je le droit d'empêcher quelqu'un de faire ce qu'il lui plait ? Mon cerveau un peu fatigué réagit quand même correctement : il n'est pas question que cet homme mette sa vie en danger sur un scooter dans cet état, ni d'ailleurs celle des autres.

Un instant, je pense appeler la police pour qu'elle gère ce problème. Je réalise qu'il finira au poste en cellule de dégrisement et qu'il sera probablement verbalisé pour conduite en état d'ivresse. Je n'arrive pas à me résoudre à cette solution de facilité. Je dois pouvoir l'aider sans me défausser.

Je lui rends le trousseau de clefs après avoir ponctionné la clef du scooter et lui propose de le raccompagner à pied chez lui. Curieusement, il accepte aussitôt. Je gare mon vélo près de son scooter pendant qu'il range son casque et récupère ses papiers. Nous voilà parti tous les deux : lui titubant d'un bord à l'autre du trottoir, et moi avec mon casque de vélo sur la tête et mon gilet jaune bien voyant, à ses côtés. J'essaye de l'empêcher de traverser n'importe où, et de l'amener sain et sauf jusque chez lui. Nous marchons ainsi 1/2 heure...

D'un seul coup, il me regarde et me demande qui je suis, où est son scooter et pourquoi je l'accompagne... Il se met en colère, crie et me demande de le laisser. Je lui propose de s'asseoir sur un banc, mais il continue de m'insulter et s'éloigne en zigzagant.

Je le regarde s'éloigner sur le trottoir.

Je me rends compte à ce moment que j'ai laissé dans les sacoches de mon vélo tous mes papiers et mon portefeuille. Je jette un dernier coup d’œil à mon diable titubant. Il marche sur l'herbe vers un immeuble. Il ne court a priori aucun danger. Je cours jusqu'à mon vélo et vérifie que rien ne manque. Je range le scooter dans un coin en espérant que personne ne le vole et qu'il le retrouvera plus tard. J'enfourche mon vélo et retourne surveiller mon gars.

Je ne l'ai pas retrouvé.
J'espère qu'il est rentré correctement chez lui.
J'espère qu'il ne lui est rien arrivé.
Je me fais un sang d'encre et je trouve le monde injuste.
J'ai cette réponse en tête : "IL N'Y A PAS DE JUSTICE, IL N'Y A QUE MOI"

-------------------------------------------------------------------------------------------
Source image boumbang (dessin de Jean-Jacques Sempé)
La dernière phrase du billet est une citation de Terry Pratchett (La Mort dans Les Annales du Disque-Monde).

03 mars 2013

Réseaux de neurones 1

Depuis que je me suis mis en tête de reprendre mes travaux de recherches sur les réseaux de neurones (lire le billet "désir de vieux quadra"), j'essaye de voir comment aborder cette question sur ce blog.

Je crois que je vais le faire de la manière la plus simple du monde: en mélangeant les billets avec les autres thèmes abordés ici, dans un joyeux chaos qui me correspond tellement bien.

Les lecteurs qui ne sont pas intéressés pourront rapidement zapper les billets qui seront intitulés "réseaux de neurones N", et ceux éventuellement intéressés pourront s'abonner au flux Rss (ou Atom) de la rubrique "Réseaux de neurones".

Mais je vous préviens tout de suite, je n'ai aucune idée de où cela va mener, ni du temps que je pourrai y consacrer, ni même si j'arriverai à quelque chose. Ce que j'appelle ici "recherche" est un travail personnel que je souhaite partager sur ce blog. Vous y verrez certainement des défauts, des failles et des maladresses que je vous encourage à signaler.

Je rappelle enfin aux nouveaux lecteurs que ce blog est un blog personnel sans prétention mais pour lequel j'ai des principes d'indépendance.

Je suis allé regarder la page Wikipédia consacrée aux réseaux de neurones, et je la trouve très bien faite. Elle constitue une très bonne introduction à ce billet et je vous invite à aller l'étudier.

Les neurones biologiques peuvent être modélisés d'une manière très très simplifiée de la façon suivante:
- un neurone reçoit de l'information de la part d'un certain nombre d'autres neurones. Ces informations seront supposées être de nature principalement électrique. Je noterai ces informations Xi où i sera le numéro du neurone dans le réseau.
- toutes les liaisons entre neurones ne sont pas équivalentes en importance, il est donc judicieux de pondérer l'information électrique avec un coefficient associé à la liaison concernée. Ce coefficient sera noté Cij où i et j sont les numéros respectifs de deux neurones reliés l'un à l'autre dans le réseau.
- le neurone reçoit toutes les informations pondérées et en fait la somme (comme pour un potentiel électrique). Cette somme sera appelée "potentiel du neurone". On le notera Vi.
- un neurone ne peut pas avoir une sortie Xi trop importante, sinon il va "griller". Il faut donc limiter la valeur de Xi par le haut.
- inversement, un neurone ne génèrera un signal d'information Xi que si son potentiel Vi est suffisamment élevé. Il faut donc fixer un seuil d'activation (au dessous duquel le neurone restera inactif).

Toutes ces constations, issues plus ou moins d'observations sur les neurones biologiques, amènent à établir les relations suivantes:

Le potentiel Vi du neurone i = somme des produits ( Cij Xj ) où j parcourt l'ensemble des indices des neurones qui sont reliés au neurone numéro i, où Cij est le poids de la synapse reliant le neurone j au neurone i (on dit également coefficient synaptique) et où Xj est la sortie du neurone j.

La sortie Xi du neurone i = f ( Vi ) où f est une fonction de transformation du potentiel limitant la valeur de la sortie quand Vi est grand et permettant d'avoir une sortie Xi nulle si Vi est trop faible. Cette fonction est appelée fonction d'activation.

Soit, grace à la concision du langage mathématique, pour chaque neurone d'indice i :








où Pi est l'ensemble des indices des neurones envoyant leurs valeurs au neurone i

La fonction d'activation :

Comme indiqué précédemment, cette fonction a pour rôle d'introduire une non linéarité dans le réseau. Elle limite la valeur maximum de la sortie d'un neurone et reste nulle pour des potentiels trop faibles.

La fonction d'activation souvent utilisée est la fonction sigmoïde ou la tangente hyperbolique. Pour ma part, je choisis cette dernière car elle est centrée sur zéro, ce qui permettra d'amorcer plus facilement l'algorithme d'apprentissage, comme nous le verrons plus tard.




Fonction tangente hyperbolique - Image source Wikipédia


En préparant ce billet, je me suis demandé s'il n'était pas plus simple d'utiliser une fonction sinus pour les potentiels compris entre -pi/2 et +pi/2 et deux demi-droites horizontales à -1 et +1 pour le reste. Je n'ai jamais testé, mais cela me semble une idée intéressante pour abréger l'apprentissage (qui dépend des fonctions dérivées). On verra.

Pour simplifier le comportement du futur ensemble de neurones que l'on appellera "réseau de neurones", je fais l'hypothèse que tous les neurones utilisent la même fonction d'activation, ce qui me permet de retirer l'indice "i" sur le "f" des formules précédentes.

J'ai volontairement omis des formules précédentes le fait que les potentiels (et donc les sorties) des neurones vont varier au cours du temps. Vi et Xi sont donc des fonctions du temps. J'aurais du écrire Vi(t) et Xi(t). Mais comme je vais travailler dans un univers discrétisé, je préfère écrire Vi(n) et Xi(n).

Nous aurons donc comme modèle pour un neurone i à un instant n :







où Pi est l'ensemble des indices des neurones envoyant leurs valeurs au neurone i.

Un schéma est peut-être plus explicite :

Modèle de neurone



La mise en réseau :

Un réseau de neurones de ce type est un ensemble de neurones reliés les uns aux autres de façon à ce que l'information puisse circuler sans boucle pour que tous les potentiels soient calculables à un instant n.

En outre, afin de relier le réseau au monde extérieur, le réseau dispose de capteurs d'entrée qui seront considérés comme des sorties de neurones imposées par le monde extérieur.

Voici un exemple de réseau de 3 neurones avec deux entrées :



Le monde extérieur impose le comportement des neurones d'entrée E1 et E2.
J'ai choisi de mesurer les sorties des deux neurones X4 et X5.
La sortie du neurone numéro 3 est interne au réseau.
Tous les choix faits ici sont pour l'instant arbitraires (nombre d'entrées, nombre de neurones, architecture des connexions, sorties sélectionnées...).

Il est important de comprendre que les six coefficients Cij de ce réseau sont les inconnues à calculer si l'on souhaite que le réseau ait un comportement particulier pour un ensemble de stimuli imposés.

Nous verrons tous cela dans un autre billet.

Pour l'instant, j'ai beaucoup de choses à apprendre sur le langage Go que Stéphane Bortzmeyer m'a fait découvrir sur Twitter, et cela va me prendre beaucoup de temps... Ça parle de parallélisme, de passage de messages sur des canaux, toutes choses prometteuses pour mes futures simulations. Mais je ne dois pas oublier qu'il va aussi me falloir mettre en place mes routines d'optimisation favorites...

Je me sens l'âme d'un étudiant (et j'aime ça ;-).

----------------------------------------------
Source image Megaportail