Il y a un an, je gagnais pour mon équipe la médaille d’or sur l’épreuve de Machine Learning lors de l’@EuCyberCup.
Dans ce thread on va parler de quelques outils fondamentaux d'IA, puis je vous explique comment j'ai obtenu un score parfait sur ce challenge.
Tout d'abord, le principe du challenge : à partir d'un très grand volume de logs sur le réseau d'une entreprise (factice) de 2500 employés, nous devions retrouver les utilisateurs malveillants en détectant leurs comportements suspects.
Ce genre d'application de l'IA à la cybersécurité est hyper intéressant dans le monde réel, car l'automatisation décuple la performance de traitement et les sources d'information tout en permettant une détection et un traitement des attaques quasi-instantanément.
À ce sujet, j'ai assisté le mois dernier à une conférence de @JamesAtack, responsable du CERT (centre de gestion des incidents cyber) de la Banque de France, qui expérimente exactement ce genre d'IA de détection sur les systèmes que supervise son équipe !
Revenons-en à notre épreuve : il s'agit d'une tâche de classification supervisée, qui représentent une grande partie des problèmes d'IA actuels (et pour lesquels il existe plein de méthodes de résolution).
Classification supervisée, ça veut dire quoi ?
Dans un problème de classification, on cherche à appliquer des étiquettes et/ou prendre une décision sur la donnée fournie. Quelques exemples:
- Filtrage anti-spam
- Reconnaissance de visages
- Maintenance prédictive et détection d'anomalies
- Analyse de thématiques dans un texte
Lorsque le machine learning est dit "supervisé", c'est quand on dispose de plein d'exemples déjà étiquetés, qui permettent à l'algorithme de comprendre et apprendre les patterns qu'il doit extraire.
Ça représente une grande majorité des problématiques actuelles en IA.
Alors c'est vrai qu'on a du mal à se représenter le contraire, un algorithme "non supervisé" : si on ne lui explicite pas sa mission de classification, comment peut-il deviner les règles à appliquer ?
En fait, on a un exemple très simple parmi tant d'autres : le clustering.
Sur l'épreuve d'IA de l'#EC2, chaque utilisateur était étiqueté (inoffensif ou malveillant), ce qui nous permettait donc un apprentissage supervisé.
Le roi de cette discipline, vous le connaissez sûrement, c'est le réseau de neurones.
Un réseau de neurones, c'est quoi ? Perso j'ai longtemps cru que c'était une puce hardware ultra complexe qui permet d'imiter le cerveau humain, mais en fait c'est BEAUCOUP plus simple que ça : un réseau de neurones, c'est un enchaînement d'additions et de multiplications.
Ça s'appelle ainsi car c'est une modélisation du fonctionnement du cerveau animal, dont les impulsions électriques entre les neurones utilisent des principes similaires à ces opérations mathématiques et sont capables d'apprendre en modifiant les variables du système.
Je ne vais pas entrer dans plus de détails, mais si ça vous intéresse d'en apprendre davantage je ne peux que vous conseiller l'excellente série de vidéos créées par @3blue1brown sur le sujet : youtube.com/playlist?list=…
En revanche, dans le cadre de l'#EC2, les réseaux de neurones ne sont pas les plus adaptés. Pour apprendre correctement, il leur faut énormément de données d'entraînement, ou alors un modèle ridiculement petit qu'on peut finalement remplacer par quelque chose de plus efficace.
Et justement, parmi ces modèles simples et puissants, il y en a un que j'apprécie en particulier. Vous avez déjà entendu parler des arbres de décision ?
Voici par exemple un arbre de décision qui détermine à quel âge vous avez le droit de passer le permis :
Ces arbres sont simplement une modélisation d'un processus de décision, à la base ils n'ont rien à voir avec le machine learning.
On commence au noeud tout en haut, on évalue l'expression qu'il contient, on emprunte le chemin qui correspond au résultat et ainsi de suite.
Les arbres de décision sont super faciles à implémenter sous forme de programme informatique, on peut tout coder avec des if/else imbriqués !
Le lien avec le machine learning, c'est qu'il existe des algorithmes qui peuvent les générer en s'appuyant sur un ensemble de décisions existantes.
Une fois l'apprentissage terminé, on peut donc utiliser l'arbre pour prendre une décision sur une donnée jamais vue auparavant.
On pouvait parfaitement utiliser cet algorithme pour le challenge de détection de l'European Cyber Cup.
L'apprentissage a besoin de données qui sont organisées et bien formatées. Impossible donc de lui filer les 60GB de logs fournis, il va falloir lui prémâcher le traitement.
Pour entraîner un arbre de décision efficacement ici, on va calculer pour chaque utilisateur plusieurs caractéristiques telles que :
- Nombre de connexions nocturnes
- Écart-type sur le nombre d'emails journaliers
- Niveau hiérarchique
On appelle ça du "feature engineering".
J'ai déterminé au total un ensemble de 41 valeurs "intéressantes" sur lequel serait basée la classification.
Ensuite, l'algorithme se charge de calculer un arbre de décision qui fait correspondre à chaque utilisateur sa classification réelle (inoffensif/malveillant).
Ce processus d'apprentissage est assez compliqué et pourrait faire l'objet d'un thread à part entière (#teasing), mais en résumé l'algorithme va essayer de trouver des critères de découpes successives qui vont séparer au mieux les données par catégorie.
Comme pour la plupart des tâches de machine learning, on n'a pas vraiment besoin d'implémenter l'algorithme car de nombreux packages le font déjà pour nous (et de manière optimisée). Notre vraie mission de data scientist, c'est le paramétrage du modèle et le feature engineering.
Le calcul des 41 features prend environ 3 minutes sur 300 lignes de Python (dont quelques calculs tricky non détaillés ici).
Pour l'apprentissage, toujours en Python, j'utilise le package Scikit-learn qui prend à peine 10 lignes et s'exécute en moins d'un millième de seconde !
La performance du modèle est déjà très correcte : le score (basé sur la mesure F1, très utilisé en machine learning) avoisine les 70%.
Mais avec une astuce très simple, on peut en réalité faire largement mieux.
En vérité, les arbres de décision sont peu utilisés tels quels en IA, à cause de leur taux d'erreur élevé.
Pour un même ensemble de données, on aura plein de configurations différentes d'arbres que l'algorithme pourra générer, sans savoir laquelle est la plus judicieuse.
À cause de leur simplicité, les arbres de décision ont du mal à généraliser et comprendre tous les cas particuliers du jeu de données d'apprentissage, surtout quand celui-ci est petit comme dans notre cas avec seulement 2500 exemples.
Ce grand nombre de configurations possibles est en réalité une force : en prenant un grand nombre d'arbres (plusieurs milliers) entraînés sur les mêmes données, on se rend compte que la décision collective des arbres sera bien meilleure que n'importe quel arbre individuel.
Ce type de classificateur s'appelle une random forest, et on peut le mettre en place en changeant deux lignes de code puisque les données d'entraînement sont rigoureusement les mêmes.
Je pensais pouvoir atteindre un score de 80-90% avec cette méthode, et ensuite devoir ajouter/modifier des features pour l'optimiser.
Finalement ça n'a pas été nécessaire, le classificateur a obtenu du premier coup le score parfait de 100% sur le dataset de validation !
Le sujet de cette première édition était vraiment cool, avec une thématique réaliste et qui a su aborder un domaine d'actualité entre la cyber et l'IA. C'est à nouveau @Quantmetry qui organise cette année, j'ai vraiment hâte de découvrir le sujet 😊
Je ne peux pas me rendre au FIC la semaine prochaine pour participer à l'@EuCyberCup 2022, mais je suivrai le direct des épreuves et des résultats sur twitch.tv/EuCyberCup.
L'EC2 est sponsor de ce thread que je voulais sortir depuis longtemps, merci pour leur soutien !
Et si je vois que ce contenu vous plaît, j'en écrirai sûrement un autre plus technique pour vous parler d'un challenge de machine learning sur StarCraft II auquel j'avais participé pendant mes études.
Vous savez ce qu'il vous reste à faire si vous voulez que je publie ça 😇
• • •
Missing some Tweet in this thread? You can try to
force a refresh
THREAD - Une immense avancée pour l'humanité : on a réussi à afficher Bad Apple et jouer à Doom sur une croix de pharmacie.
Petit complément technique à la vidéo de @Sylvqin pour vous montrer les coulisses du reverse-engineering de cet objet mystique.
Le socle de la croix de pharmacie est occupé par une carte de contrôle électronique relativement simple, entourée de composants d'électronique de puissance (mine de rien, 2560 LED ça consomme pas mal de watts)
Les composants ont résisté au temps et aux éléments, mais les gravures des puces ont quasiment disparu.
Heureusement, on peut les identifier grâce au circuit imprimé sur lequel figurent les références, et comprendre le layout de la carte :
J'en ai trop marre de voir des smicards pleurer pour qu'on augmente pas les impôts des millionnaires.
J'ai gagné un peu plus de 7000€/mois pendant plusieurs années, si tu te considères pas riche à ce niveau c'est du déni ou de la malhonnêteté. Thread ⤵️
J'aime pas trop parler d'argent ici parce que ça peut passer pour de l'orgueil, mais on voit tellement de conneries se propager en ce moment que je me suis senti obligé de partager mon expérience (je supprimerai probablement le thread d'ici quelques jours)
Commençons par "tu t'offres un ou deux resto par mois" : je mange au resto quasiment chaque midi en semaine.
Le soir j'aime bien cuisiner, jamais aucune hésitation avant de prendre des produits bio ou premium.
THREAD - les manipulations illicites du classement lors de la compétition la plus chère d'Europe.
Cette semaine, l'équipe de l'European Cyber Cup a trafiqué arbitrairement son scoreboard pour favoriser certaines équipes qui lui faisaient pression. 1/14
Je suis coach de 10 étudiant·es de @Guardia_School qui ont participé cette semaine aux épreuves de l'European Cyber Cup.
Cette compétition est organisée par le forum InCyber (anciennement FIC, qui a discrètement changé de nom à cause de quelques casseroles).
Le prix d'inscription n'est pas rendu public, mais en 2021 je me souviens que mon entreprise avait dû payer 10.000€ pour nous inscrire, sachant que le cash prize pour l'équipe gagnante est de 5.000€ 🙃
J'ai besoin de votre aide pour m'aider à entraîner l'équipe de France de cybersécurité !
Quelques détails ci-dessous, merci de partager au maximum 🙏
En janvier, j'ai eu l'honneur d'être nommé entraîneur des compétiteurs français en cybersécurité, pour la prestigieuse compétition WorldSkills qui opposera 65 pays cette année.
Contrairement aux excellentes compétitions FCSC/ECSC qui sont très orientées CTF, le challenge WorldSkills va plutôt demander des compétences métier, appliquées à des environnements réalistes.