MACHINE LEARNING POUR
TOUS
L'éducation a des racines amères, mais ses fruits sont doux
Forum AFUP, Paris, 2015
AGENDA
Comment enseigner à un ordinateur
Application à la recherche de code dans les commentaires
Des apprentissages complexes
INTERVENANT
Damien Seguy
Directeur technique à Exakat
Services d'analyse de code
APPLICATIONS
Detection de fraude et estimation du risque
Traduction automatique ou la transcription automatique
Reconnaissance de caractères ou de visages
Les diagnostics médicaux
La reconnaissance de bon code PHP
MACHINE LEARNING
Machine : l'ordinateur
Learning : apprentissage
Il se bâtit un modèle tout seul : phase d'entrainement
Il propose alors des prédictions : phase d'utilisation
APPRENTISSAGE SURPERVISÉ
Données
Historiques Apprentissage
ModèleDonnées
réelles
Résultat
APPLICATION PRATIQUE
Détecter du code dans les commentaires
Un problème classique
Un bon problème de machine learning
Complexe, pas de solution simple
Permet de faire des tests avec beaucoup de données
THE FANN EXTENSION
ext/fann (https://pecl.php.net/package/fann)
Fast Artificial Neural Network
http://leenissen.dk/fann/wp/
Réseaux Neuronaux en PHP
RÉSEAUX NEURONAUX
Imitation de la nature
Couche d'entrée
Couche de sortie
Neurones intermédiaires et
couches de neurones
RÉSEAUX NEURONAUX
Imitation de la nature
Couche d'entrée
Couche de sortie
Neurones intermédiaires et
couches de neurones
INITIALISATION
<?php
$num_layers  = 1;
$num_input  = 5;
$num_neurons_hidden = 3;
$num_output  = 1;
$ann = fann_create_standard($num_layers, $num_input, 
$num_neurons_hidden, $num_output);
// fonction d'activation
fann_set_activation_function_hidden($ann, 
FANN_SIGMOID_SYMMETRIC);
fann_set_activation_function_output($ann, 
FANN_SIGMOID_SYMMETRIC);
EXPERTISE
// Test if the if is in a compressed format
// none need yet
// icon
// There is a parser specified in `Parser::$KEYWORD_PARSERS`
// Show generated config file in a <textarea>
// numGlyphs + 1
// $a && $b and multidimensional
// $result should exist, regardless of $_message
// if(ob_get_clean()){
//$annots .= ' /StructParent ';
// $cfg['Servers'][$i]['controlpass'] = 'pmapass';
VECTEUR D'ENTRÉE
'length' : taille du commentaire
'countDollar' : présence du $
'countEqual' : présence du =
'countObjectOperator' présence du ->
'countSemicolon' : présence de ;
DONNÉES D'ENTRÉE
46 5 1
825 0 0 0 1
0
37 2 0 0 0
0
55 2 2 0 1
1
61 2 1 3 1
1
...
 * This file is part of Exakat.
 *
 * Exakat is free software: you can redist
 * it under the terms of the GNU Affero Ge
 * the Free Software Foundation, either ve
 * (at your option) any later version.
 *
 * Exakat is distributed in the hope that 
 * but WITHOUT ANY WARRANTY; without even 
 * MERCHANTABILITY or FITNESS FOR A PARTIC
 * GNU Affero General Public License for m
 *
 * You should have received a copy of the 
 * along with Exakat.  If not, see <http:/
 *
 * The latest code can be found at <http:/
 *
*/
// $x[3] or $x[] and multidimensional
//if ($round == 3) { die('Round '.$round);
//$this->errors[] = $this->language->get('
APPRENTISSAGE
$max_epochs  = 500000;
$desired_error  = 0.001;
// apprentissage lui-même
if (fann_train_on_file($ann, 
'leçon.data', 
$max_epochs, 
$epochs_between_reports, 
$desired_error)) {
        fann_save($ann, 'appris.out');
}
fann_destroy($ann);
?>
APPRENTISSAGE
47 leçons
5 caractéristiques
3 neurones
Durée d'exécution : 5,711 s
EXPLOITATION
Données
Historiques Apprentissage
ModèleDonnées
réelles
Résultat
EXPLOITATION
<?php 
$ann = fann_create_from_file('appris.out'); 
$commentaire = "//$gvars = $this->getGraphicVars();";
$input  = makeVector($commentaire);
$resultats = fann_run($ann, $input); 
if ($resultats[0] > 0.8) { 
     print ""$commentaire" : -> $resultats[0] %n"; 
} 
?>
DONNÉES RÉELLES
Testé sur 14093 cas
Durée d'exécution 367.01ms
Trouvé 665 cas (5%)
99.999893
// $cfg['Servers'][$i]['controlhost'] = '';    
99.999928
//$_SESSION['Import_message'] = $message->getDisplay();    
/* 99.999928
if (defined('SESSIONUPLOAD')) {
    // write sessionupload back into the loaded PMA session
    $sessionupload = unserialize(SESSIONUPLOAD);
    foreach ($sessionupload as $key => $value) {
        $_SESSION[$key] = $value;
    }
    // remove session upload data that are not set anymore
    foreach ($_SESSION as $key => $value) {
        if (mb_substr($key, 0, mb_strlen(UPLOAD_PREFIX))
            == UPLOAD_PREFIX
            && ! isset($sessionupload[$key])
        ) {
            unset($_SESSION[$key]);
        }
    }
98.780382
//LEAD_OFFSET = (0xD800 - (0x10000 >> 10)) = 55232    
99.361396
// We have server(s) => apply default configuration
    
98.383027
// Duration = as configured    
99.999928
// original -> translation mapping    
97.590065
// = (   59 x 84   ) mm  = (  2.32 x 3.31  ) in    
Vrai positif Faux positif
Vrai négatif Faux négatif
Rapporté
par le RN
Objectif
Vrai positif Faux positif
Vrai négatif Faux négatif
Rapporté
par le RN
Objectif
// $cfg['Servers'][$i]['table_coords'] = 'pma__tabl
//(isset($attribs['height'])?$attribs['height']: 1)
// if ($key != null) did not work for index "0"    
// the PASSWORD() function    
99.999923
73.295981
99.999851
2.104115
BILAN
665 code trouvés
72% de faux positifs
mais après nettoyage facile, il reste 23% de faux positif
Analyse de 14k commentaires en 367 ms
// = (   59 x 84   ) mm  = (  2.32 x 3.31  ) in    
RETROACTION
Amélioration de la base
d'entrainement
Ajout/retraits de caractéristiques
Changement de configuration du
RN
Nouvel apprentissage
Nouvelle validation
Données
réelles
Données
Historiques
Apprentissage
Modèle Résultat
Rétraction
AMÉLIORATION DE LA BASE
Augmentation de la taille
Variété des situations
Inclusion des cas particuliers rencontrés
Accumulation d'expérience
REVUE DES CARACTÉRISTIQUES
Ajouts de nouvelles caractéristiques
Retrait des caractéristiques moins pertinentes
CONFIGURATION DU RN
Vecteurs d'entrée
Couches intermédiaires 

et neurones cachés
Fonction d'activation
Vecteur de sortie
PILOTAGE AUTOMATIQUE
Tester sur différentes

configurations
Identifier les résultats
Idéalement, retirer 

les faux positifs
Résultats
Nombre de couches
Nombre de neurones
SYNOPSIS
Selection d'une base de données d'apprentissage
Configuration du RN
Apprentissage
Validation sur des données de tests
Retroaction
AUTRESTECHNIQUES
Réseaux Bayésiens
Algorithmes génétiques
Apprentissage par renforcement
APPRENTISSAGE PAR
RENFORCEMENT
Logiciel
Monde réel
Récompense
ActionRéaction
FILTRES BAYESIENS
ALGORITHMES GÉNÉTIQUES
Population
Population
Selection
Reproduction
PopulationVariations
QUELQUES OUTILS
PHP ext/fann
Langage R
https://github.com/kachkaev/php-r
Scikit-learn
https://github.com/scikit-learn/scikit-learn
Mahout
https://mahout.apache.org/
MERCI
@exakat
http://joind.in/talk/view/15265
AUTRES CONFIGURATIONS
Fonction d'activation
FANN_SIGMOID_SYMMETRIC
FANN_LINEAR
FANN_THRESHOLD
FANN_SIN_SYMMETRIC
Linéaire Seuil
Tangeante
Gaussienne Quadratique
Sigmoide
QUELLES APPLICATIONS?
Non-déterministe
Elimination de tout ce qui est systématique à trouver
Accès à l'expertise et aux vecteurs de caractéristiques
Couche finale après les résultats
Classification, priorisation, approximation rapide

Machine learning pour tous