20 mars 2017

Deep learning, BFGS, GSL, OpenMP et CUDA

Il m'arrive par moment de renouer avec les travaux de recherche de ma jeunesse : les réseaux de neurones. J'ai d'ailleurs écrit ici même quelques billets sur le sujet, dans une série non terminée.

Je tombe régulièrement sur des articles consacrés au deep learning, nouvelle terminologie à la mode remettant en scène les outils de ma jeunesse. Alors je creuse un peu plus, rebondis de publication en publication, jusqu'à retrousser les manches et ressortir mes vieux rêves.

Bien sur, le temps est passé, et de nombreuses avancées ont eu lieu. Mais si j'ai appris une chose de mes années de jeune chercheur, c'est que tout est possible pour qui s'en donne la peine. Je n'ai donc aucune honte à remettre mes habits d'étudiant et à lire toute une bibliographie sur ces sujets.

J'ai recommencé il y a quelques semaines. Une heure par ci, deux heures par là, prises sur mes soirées et mes week-ends, entre deux occupations plus sérieuses. J'ai commencé à apprendre le langage Python, surtout pour sa simplicité. Je suis loin d'en avoir fait le tour et nous nous apprivoisons doucement.

Il faut dire que j'ai enseigné pendant dix ans le langage C... Et que j'aime beaucoup son côté "proche de la machine". Je passe donc souvent de Python au langage C, et depuis quinze jours, j'écris et je réécris un ensemble de programmes de simulation de réseaux de neurones et d'optimisation.

Il est vrai que j'ai découvert sur internet beaucoup d'outils extraordinaires, comme par exemple la bibliothèque mathématique GSL avec laquelle je joue beaucoup, en particulier avec la fonction d'optimisation multidimensionnelle gsl_multimin_fdfminimizer_vector_bfgs2 qui implémente l'un des algorithmes d'optimisation avec lequel j'ai le plus travaillé dans ma jeunesse : BFGS.

Mais rien ne vaut l'écriture soi-même d'un tel algorithme d'optimisation. Cela permet d'en comprendre les subtilités, surtout que sa mathématique reste encore à ma portée, et de l'adapter à son problème précis, le tout piloté par une classique recherche linéaire basée sur les conditions de Wolfe et Powell (attention allergiques aux maths s'abstenir ;-). Comme je n'ai pas de problème précis à régler, je joue avec un problème classique de classification de chiffres manuscrits issus de la base de donnée MNIST.

Je suis encore très loin des performances des meilleurs algorithmes, mais au moins, cela me permet de tester quelques idées.

J'ai donc délaissé provisoirement le langage Python pour écrire un programme en langage C et m'amuser avec des tableaux de pointeurs, des allocations de mémoire et du calcul de matrices de grandes tailles.

En effet, l'apprentissage supervisé d'un réseau de neurones consiste à trouver le meilleur jeu de coefficients permettant de minimiser une fonction d'erreurs. Dans le problème qui m'occupe (la reconnaissance de caractères manuscrits), les entrées sont des images 28x28 en 255 niveaux de gris. Cela fait quand même 784 entrées, plus l'entrée constante qui permet de passer d'un espace vectoriel à un espace affine, soit 785 neurones d'entrée.

Ces 785 entrée injectent les pixels dans un réseau de neurones complètement connectés (je n'aime pas les réseaux à couche cachés, j'ai toujours préféré sa généralisation complètement connectée). Le réseau possède une sortie unique, si l'on code la réponse de 0 à 9, ou dix sorties si l'on préfère un codage hypercube (par exemple chaque chiffre sera codé par 9 zéros et un 1 sur sa sortie correspondante : 7=0000000100) qui semble être la représentation privilégiée.

Un réseau typique dans mon cas sera constitué de 785 entrées, N neurones cachés et 10 neurones de sortie. Si N vaut par exemple 25, cela donne 28 025 coefficients à calculer... C'est-à-dire un vecteur gradient à 28 025 composantes et une matrice "approximation de l'inverse du Hessien" de 28 025 x 28 025 termes, soit plus de 785 millions de nombres réels double précision... Il s'agit de ne pas se tromper dans les "malloc" pour éviter les "segmentation faults" !

Je suis en train de tester une version modifiée par mes soins de l'algorithme BFGS où cette grande matrice est remplacée par N matrices plus petites.

Mes programmes sont désespéramment longs dans leurs calculs sur mon pauvre PC perso, un "vieux" i7 à 8 cœurs. Constatant qu'un seul cœur était mis à contribution, je me suis tourné avec un peu d'appréhension vers le calcul parallèle. Et j'ai découvert (ne riez pas) l'interface de programmation OpenMP : quelques lignes de directives bien placées, et hop, le programme utilise les 8 cœurs de ma machine. C'est magique !

Je commence enfin à avoir des résultats corrects avec l'apprentissage de mon réseau de 25 neurones sur ce fichu problème de reconnaissance de chiffres manuscrits.

Les semaines passent, le temps me glisse entre les doigts. J'aimerais bosser un peu la question de l'utilisation de mon GPU à travers la bibliothèque CUDA, surtout que je peux accéder au boulot à une carte NVidia Tesla (pendant quelques minutes, histoire de voir si j'arrive à programmer une multiplication matricielle). Si j'arrive à maîtriser CUDA, alors il me faudra négocier avec Mme Zythom l'achat d'une carte NVidia supportant cette technologie et accessible financièrement (parce que la NVidia Tesla K80 à 7000 euros, ça va pas être possible...)

Encore de longues soirées en perspective, à regarder évoluer les coefficients de mes petits réseaux de neurones...

Ensuite, dès que j'en aurai le courage, je réattaque TensorFlow que j'ai lâchement abandonné en attendant des tutos plus détaillés.

Si mes neurones réels ne flanchent pas d'ici là ;-)

08 mars 2017

La parole aux femmes

How it Works
xkcd.com/385
J'ai trouvé l'idée de Kozlika très intéressante : profiter de ce 8 mars pour relayer ici des articles de blogs écrits par des femmes.

Du coup, j'ai fait le tour de mes sites favoris, et quelques recherches sur internet, sous l'angle "est-ce écrit par une femme ?".

Il y a dans ma blogroll beaucoup de sites tenus par des femmes (vous trouverez sur le côté droit du blog, version web, tous les sites de ma blogroll). Je voudrais mettre en avant mes préférés :
- De bric et de blog tenu par Veuve Tarquine
- Judge Marie, tenu par... Judge Marie, juge des enfants et présidente d’audience correctionnelle
- Kozeries en dilettante, par Kozlika
- Oh Joy Sex Toy (NSFW), tenu par un couple, mais surtout par Erika Moen, qui m'a appris beaucoup de choses, vraiment beaucoup, sur les femmes
Et comme ce 8 mars est l'occasion d'ouvrir mon horizon, j'ai cherché et trouvé les sites suivants, que j'ai ajoutés à mon lecteur de flux RSS :
- Le blog de Fatiha, "fan de Linux, open source et développement personnel" que je vous laisse découvrir.
- Romy.tetue.net, "conceptrice web UX, parisienne et têtue".
- Comme une Geek, de Julie, "femme qui aime l’informatique, le hacking, les jeux vidéos, les séries TV, le high tech et l’humour".
- Le blog de Valérie Aurora (en anglais)
Je n'ai pas trouvé de site tenu par une femme dans le domaine de la sécurité informatique, ni dans celui de l'expertise judiciaire informatique :-( mais j'ai certainement raté pleins de sites intéressants, donc si vous avez des sites tenus par des femmes à recommander (qui ne sont pas dans ma blogroll), n'hésitez pas à les indiquer en commentaires.

[Edit 08/03/17 10h48]
- blog.linuxgrrl.com de Mairin Duffy (via @Jehane_fr)
- decentsecurity.com de @SwiftOnSecurity (via @Kozlika)



14 février 2017

Et pourtant la journée avait bien commencé

Extrait de http://salemoment.tumblr.com/
avec l'aimable autorisation de l'auteur
Je suis installé devant mon ordinateur et je commence à faire défiler les images.

Ce dimanche matin, je suis tout content de voir que la copie numérique du disque dur, commencée la veille, s'est bien déroulée. Le disque dur original est remis dans le scellé, après avoir pris les photos d'usage du numéro de série, du modèle et de la marque d'icelui.

J'ai sur mon bureau mon cahier papier sur lequel je prends toutes sortes de notes : l'heure où le gendarme m'a amené le scellé, l'heure où j'ai brisé le sceau du scellé, les diverses descriptions physiques que j'en ai fait, les photos que j'ai prises avant et après l'ouverture de l'unité centrale, l'état général de l'intérieur, l'ordre des connecteurs de branchement du disque dur, etc.

Les dernières lignes inscrites sur mon cahier concernent la fin de la prise d'image bit à bit du disque dur d'origine, l'extraction des fichiers encore présents même sous forme de traces, et l'heure de début de mes investigations sur ces fichiers.

J'ai en tête la mission que le magistrat m'a confiée : je dois lui dire si le disque dur contient des images et/ou des films de nature pédopornographique. Je dois également, à titre subsidiaire, signaler tout élément qui pourrait l'intéresser. Non seulement mes compétences techniques l'intéressent, mais aussi mes capacités divinatoires...

Je suis installé devant mon ordinateur et je commence à faire défiler les images. J'ai une sexualité "normale", j'allais dire "banale", une vie tranquille bourgeoise centrée sur l'informatique, les jeux vidéo et la science-fiction. Je mène une existence protégée des atrocités "lointaines", des meurtres, des guerres. Je travaille dans une école d'ingénieurs généralistes comme directeur informatique et technique. J'aime transmettre mes connaissances et ma passion pour l'informatique. Le pire stress que je subis est la pression que je m'inflige pour que les utilisateurs bénéficient du meilleur service possible.

Les images que je regarde sont atroces. Rien ne prépare à ce type de spectacle. Je ferme la porte de mon bureau et demande à mes enfants de ne pas me déranger. Toutes les atrocités humaines défilent sur mon écran : viol d'enfants de moins de 10 ans, actes de tortures filmés pendant les guerres de Yougoslavie, êtres humains enflammés au lance-flamme...

Je trie ces images et ces films en différentes catégories. Mon cerveau se sature de ces scènes tout en "évaluant" le degré d'atrocité. Au bout de trois heures, quelques larmes coulent sur mon visage. Je viens de penser à mes enfants.

Je note l'heure sur mon cahier avec la mention "pause".
Je prends un temps pour moi.

Il y a des gens qui font des métiers très durs : pompiers, policiers, médecins, etc. Je lis ici ou là qu'ils s'endurcissent avec l'habitude, par force. Ils exercent leurs métiers avec passion et efficacité, malgré les drames qu'ils côtoient.

Je me rends compte que je n'arrive pas à m'endurcir. Que ma sensibilité gène mon activité d'expert judiciaire, du moins sur ce type de mission. Rien ne m'a préparé à cela, et je n'ai pas demandé à l'être. Je sais que bon nombre de confrères qui me lisent sont beaucoup plus forts que moi et arrivent à aller au delà de l'horreur pour se concentrer sur la mission.

Il y a les héros du quotidien, anonymes, qui surmontent leurs angoisses et leurs dégoûts pour le bien de la communauté. Et il y a les autres, dont je fais partie, ceux qui n'arrivent pas à s'habituer.

Je reprends l'analyse des images. L'utilisateur de l'ordinateur collectionne des images qui me terrifient. Je passe d'un cadavre décapité à une enfant au regard triste face à un sexe trop grand pour elle. Je la reconnais et j'en ai déjà parlé ici, il s'agit d'une petite fille qui revient souvent dans les collections pédopornographiques. Je l'ai surnommée Yéléna et elle hante souvent ma mémoire, parfois à des moments les plus saugrenus.

La matinée passe lentement. Je fais une pause repas avec les enfants et mon épouse. J'arrive à faire bonne figure, mais tout le monde sent que je suis un peu "en panne". J'explique que je suis fatigué et l'excuse passe comme une lettre à la poste. Je n'ose pas parler à mon épouse de ce que je vois. Je reste vague. Elle connaît la mission sur laquelle je travaille et n'insiste pas.

Je me ré-installe devant mon ordinateur et je continue à faire défiler les images. "Décidément, je le concevais, je m'étais embarqué dans une croisade apocalyptique. On est puceau de l'Horreur comme on l'est de la volupté." Écrivait Louis-Ferdinand Céline à propos de la guerre dans "Voyage au bout de la nuit". Comment aurais-je pu me douter de cette horreur en devenant expert judiciaire ?

Et pourtant la journée avait bien commencé avec le succès de la copie numérique du disque dur du scellé. Elle se terminera tard dans la nuit avec le transfert sur DVD des images et des films trouvés, et l'impression de quelques "morceaux choisis" qui feront le cauchemars de la greffière, du juge d'instruction et des avocats qui auront mon rapport entre les mains.

Partager ses cauchemars n'adoucit en rien son propre fardeau.

03 février 2017

Mi-temps

Ce billet est publié dans la catégorie "privée" et n'a aucun intérêt autre que pour mes proches (et encore ;-). Vraiment aucun intérêt, vous êtes prévenus.

Quand j'avais 7 ans, j'avais un petit rituel quotidien dont j'étais persuadé que si je le réussissais, j'allais vivre encore 100 ans : quand j'urinais, je faisais le tour de l'eau du fond de la cuvette sans toucher le bord extérieur, ni l'eau du fond, le tout sans éclabousser. Mesdames, vous avez là l'un des secrets qui peut occuper la vie des petits garçons...

Pendant toute l'année de mes 7 ans, j'ai réussi cet exploit sans faillir, à la grande joie de ma mère qui a certainement pensé que j'étais particulièrement propre, ou adroit (ou que j'urinais assis...).

Pendant toute l'année de mes 7 ans, j'ai réussi cette épreuve difficile, ce qui m'a permis de savoir, tout jeune, que j'allais vivre jusqu'à 107 ans !

Pourquoi en parler maintenant ? Et bien, pile aujourd'hui, j'ai 53,5 ans, et donc encore 53,5 années à vivre.

Je suis à la mi-temps de ma vie, avec encore plein de choses à faire :-)
Si la tête et le corps tiennent...

13 janvier 2017

Twitter en images

Pour ce billet du vendredi, je voulais faire un bilan, en images, sur les années que j'ai pu passer sur ce formidable réseau social qu'est Twitter :


Quand j'explique Twitter à mon épouse
Quand j'explique Twitter à mes parents
Quand je lis les CGU de Twitter
Quand tu essayes de twitter discrètement
Pour certains, Twitter est un village
Pour certains, Twitter est un village (bis)
Certains Twittos cherchent à rester à la pointe
Quand tu demandes de l'aide sur un sujet sensible
Quand tu veux jouer dans la cour des grands
Quand un Twittos emm... tout le monde
Quand tu commences à twitter avec ton compte tout neuf
Quand tu comprends que la vie sera dure sur Twitter
Quand tu demandes à tes étudiants d'explorer Twitter
... en toute sécurité
Quand tu veux attirer l'attention de @Maitre_Eolas
... ou celle de @MaitreMo
Quand tu résistes aux pressions
Quand ton bon goût n'est pas reconnu
Twitter permet de rencontrer des gens différents 1/2
... vraiment différents 2/2
... vraiment vraiment différents 3/2
Twitter nous donne une vision originale du monde
... même si c'est souvent un peu ça...
Quand un twittos ou une twittas drague discrètement sur Twitter
Quand un mec vaguement connu arrive dans ta TL...
... et que tu te rends compte qu'il te follow
Quand tu en fais des caisses pour attirer l'attention
Twitter est une source d'informations fiable
Au moins autant que la PQR
Sur Twitter, on discute de choses sérieuses...
... mais toujours avec une pointe de dérision
... et un peu d'humour
... même si certains sont très "premier degré"
Sur Twitter, attention à l'orthographe !
... même si certaines fautes peuvent être intentionnelles
... l'essentiel étant toujours d'être compris
... mais bon, les fautes c'est quand même pénible
Twitter peut être sexiste...
... ou pas
Bien sûr, il y a toujours des connards XXL
... des inconscients
... et des mythos
... beaucoup de mythos
... mais on y trouve aussi de belles chaînes de solidarité
Quand tu nettoies un peu ta TL
Quand tu es un peu trop prêt d'un tweetclash
Quand tu fais un DM fail sur Twitter
... et que tu t'en rends compte
Quand tu demandes si GNU/Linux a des outils de sauvegarde aussi simples que Apple
Quand tu choisis le camp des rouges...
... ou celui des bleus
Finalement, Twitter, c'est un peu ça...