.. _chap-coursSVMLineaires: Les informations pratiques concernant le déroulement de l'unité d'enseignement RCP209 « Apprentissage, réseaux de neurones et modèles graphiques » au Cnam se trouvent dans `ce préambule `_. ##################### Cours - SVM linéaires ##################### « *Statistics is the grammar of science.* » (Karl Pearson) [`Diapositives du cours `_] Objectifs et contenu de cette séance de cours ********************************************* Dans cette séance nous examinons les machines à vecteurs de support dans leur version lineaire (en anglais *Support Vector Machines* ou SVM), et dans les séances à suivre les SVM non-linéaires et les autres algorithmes à noyaux. On donne un ensemble d'apprentissage :math:`\{(x_i, y_i)\}_{i=1,...,n}` où :math:`x_i\in \mathcal{X}` (souvent :math:`\mathcal{X} = \mathbb{R}^d`) et :math:`y_i\in\{-1, +1\}`. Dans un problème de classement à deux classes, le but est de construire une fonction :math:`f:\mathcal{X} \rightarrow \mathbb{R}` qui permet de prédire si un nouvel exemple :math:`x\in \mathcal{X}` appartient à la classe −1 ou à la classe +1. On cherche alors une « surface de séparation » :math:`f:\mathcal{X}\rightarrow \mathbb{R}` tel que si :math:`f(x) > 0` alors :math:`x` est affecté à la classe +1 et si :math:`f(x) < 0` alors :math:`x` est affecté à la classe -1. .. figure:: _images/svm01b.png :width: 50% :align: center :name: svm01b Problème de séparation à deux classes : trouver la fonction :math:`f` tel que :math:`f(x) = 0` sépare les deux classes avec le moins d'erreurs possible. Séparateurs à vaste marge ************************* Pour un problème de classification linéaire on suppose que les deux classes (-1 et +1) sont séparables par un hyperplan, la fonction :math:`f` a donc la forme : .. math:: f(x) = \sum_{i=1}^n w_i x_i + b = \langle w, x \rangle + b où :math:`w` est le vecteur orthogonal à l'hyperplan et :math:`b` est le déplacement par rapport à l'origine. .. figure:: _images/svm01a.png :width: 50% :align: center :name: svm01a Problème de séparation linéaire à deux classes : quel est le meilleur hyperplan parmi tous ceux qui séparent les données ? .. figure:: _images/svm05.png :width: 60% :align: center :name: svm05 Pour juger la qualité d'un hyperplan en tant que séparateur on utilise la distance entre les exemples d'apprentissage et ce séparateur. Plus précisément, la « marge » d'un problème d'apprentissage est définie comme la distance entre le plus proche exemple d'apprentissage et l'hyperplan de séparation. Pour un hyperplan :math:`H` on a : .. math:: \textrm{Marge}(H) = \min_{x_i} d(x_i, H) Les SVM linéaires cherchent le séparateur (l'hyperplan de séparation) qui maximise la marge. On appelle cela « séparateur à vaste marge ». .. figure:: _images/svm04.png :width: 60% :align: center :name: svm04 Le séparateur idéal correspond intuitivement à l'hyperplan qui passe « au milieu » entre les données sans préférence pour une classe ou une autre. C'est le séparateur de marge maximale. Les éléments de la classe 1 les plus proches de ce séparateur se trouvent à la même distance du séparateur que les éléments les plus proches de la classe 2 (cette distance est égale à la marge). Ces éléments, soit d'une classe soit de l'autre, s'appellent « vecteurs de support ». .. figure:: _images/svm07.png :width: 60% :align: center :name: svm07 Les « vecteurs de support » se trouvent a une distance égale à la marge d'un côte ou de l'autre de l'hyperplan de séparation Intuitivement, ce sont les vecteurs de support qui déterminent le séparateur (par l’intermédiaire de la fonction distance et de leur configuration géométrique). Une fois le séparateur :math:`f(x)` trouvé, la classification d'un nouvel exemple se fait par une simple décision à seuil zéro : - :math:`f(x) = 0` : l'élément se trouve sur la frontière de séparation, pas de décision, - :math:`f(x) > 0` : classe 1, - :math:`f(x) < 0` : classe 0. SVM linéaire (cas séparable) **************************** On suppose d'abord que les données d’apprentissage sont linéairement séparables, c'est à dire qu'il existe un hyperplan qui sépare les données sans erreur. Dans ce cas, on cherche l'hyperplan de marge maximale : .. math:: f(x) = \langle w, x \rangle + b = w^\top x + b Si :math:`x_s` est un vecteur de support et :math:`H = \{x|w^\top x+b=0\}`, alors la marge est donnée par : .. math:: \mathrm{Marge} = 2d(x, H) = 2\frac{|w^\top x_s+b|}{||w||} En fait cette quantité est deux fois la marge (par rapport à la définition donnée en haut). On utilise cette quantité pour des raisons de simplicité de l'écriture des équations plus tard, mais ceci ne change en rien le problème d'optimisation (maximiser la marge ou deux fois la marge conduit à la même solution). Les paramètres :math:`w` et :math:`b` ne sont pas uniques, :math:`kw` et :math:`kb` donnent la même surface de séparation : .. math:: kw^\top x + kb = k(w^\top x + b) = 0 On impose alors la condition de normalisation :math:`|w^\top x_s + b| = 1` pour les vecteurs de support :math:`x_s`, ce qui conduit à : .. math:: \mathrm{Marge} = \frac{2}{||w||} On arrive donc au problème d'optimisation suivant (appelé *problème primal*) : .. math:: \left\{ \begin{array}{ll} \underset{w,b}{\min} \frac{1}{2}||w||^2\\ \textrm{tel que} \,\, y_i(w\cdot x_i + b) \geq 1, i = 1, \dots, n \end{array} \right. Rappelons la condition de normalisation : :math:`w\cdot x_i + b = 1` si :math:`x_i` est un vecteur de support de la classe +1 et :math:`w\cdot x_i + b = -1` si :math:`x_i` est un vecteur de support de la classe -1. Dans ce cas, comme le problème est séparable, il n'y a pas d'exemple d'apprentissage entre les deux hyperplans, :math:`w\cdot x_i + b = 1` et :math:`w\cdot x_i + b = -1` (on dit par abus de langage « dans la marge »). Nous obtenons : - Si :math:`y_i = 1` alors :math:`w\cdot x_i + b \geq 1` et donc :math:`y_i(w\cdot x_i + b) \geq 1`, - Si :math:`y_i = -1` alors :math:`w\cdot x_i + b \leq -1` et donc :math:`y_i(w\cdot x_i + b) \geq 1`, ce qui explique les conditions présentes dans le problème d'optimisation. La résolution de ce problème peut se faire directement par des méthodes stochastique de type Gauss-Seidel, algorithmes de point intérieur, de type Newton ou de type gradient conjugué. Il est toutefois mieux de passer à la formulation duale de ce problème : - Le dual est un problème quadratique de taille :math:`n` (égal au nombre d’observations). - Pour ce type de problème (optimisation quadratique) il existe des algorithmes bien étudiés et très performants. - La formulation duale fait apparaître la matrice de Gram :math:`XX^T`, ce qui permet de gérer le cas non linéaire à travers des algorithmes à noyaux (qui seront étudiés dans la séance suivante). Pour obtenir la formulation duale, on introduit les multiplicateurs :math:`\alpha_i` de Lagrange (voir la `méthode des multiplicateurs de Lagrange `_). Le lagrangien est donné par : .. math:: L(w, b, \alpha) = \frac{1}{2} ||w||^2 + \sum_{i=1}^n \alpha_i[y_i(w^Tx_i+b - 1)] Le lagrangien doit être optimisé par rapport à :math:`w`, :math:`b` et les multiplicateurs :math:`\alpha`. En annulant les dérivées partielles du lagrangien par rapport à :math:`w` et :math:`b`, on obtient les relations : .. math:: \frac{\partial L}{\partial b} L(w^*, b^*, \alpha^*) = 0 \Longrightarrow \sum_{i=1}^n \alpha_i^* y_i = 0 .. math:: \frac{\partial L}{\partial w} L(w^*, b^*, \alpha^*) = 0 \Longrightarrow w^* = \sum_{i=1}^n \alpha_i^* y_i x_i Par substitution dans l'équation du lagrangien en haut on obtient le problème dual : .. math:: \left\{ \begin{array}{llll} \underset{\alpha}{\max} \sum_{i=1}^n \alpha_i - \sum_{i,j=1}^n \alpha_i \alpha_j y_i y_j x_i^T x_j \\ t.q.\\ \alpha_i \geq 0, i = 1, \dots, n \,\,\, (\mathrm{admissibilité\,\,duale})\\ \sum_{i=1}^n \alpha_i y_i = 0 \,\,\, (\mathrm{stationarité}) \end{array} \right. La solution du problème dual donne les multiplicateurs de Lagrange optimaux :math:`\alpha_i^*`. A partir des :math:`\alpha_i` on obtient :math:`w^*` par les relations en haut. Le paramètre :math:`b^*` est obtenu à partir de la relation :math:`|x_s^T w^* + b^*| = 1` valable pour tous les vecteurs de support :math:`x_s`. Observation : les vecteurs de support sont ceux pour lesquels :math:`\alpha_i \geq 0`. En général leur nombre est beaucoup plus petit que le nombre total d'éléments dans la base d'apprentissage. Ajouter des échantillons qui ne sont pas des vecteurs supports à l’ensemble d’apprentissage n’a aucune influence sur la solution finale, c'est à dire seulement les vecteurs de support interviennent dans la fonction de décision (l'expression de la surface séparatrice entre les deux classes). Cette fonction de décision permettant de classer une nouvelle observation :math:`x` est donnée par : .. math:: f^*(x) = \sum_{i=1}^n \alpha_i^* y_i x_i^T x + b^* - L’hyperplan solution ne dépend que du produit scalaire entre le vecteur d’entrée et les vecteurs de support. Cette particularité permet l'utilisation de fonctions noyau pour aborder des problèmes non linéaires (traités dans la séance de cours suivante). Données non séparables linéairement *********************************** Souvent il arrive que même si le problème est linéaire, les données sont affectées par un bruit (par ex. de capteur) et les deux classes se retrouvent mélangées autour de l'hyperplan de séparation. Pour gérer ce type de problème on utilise une technique dite de **marge souple**, qui tolère les mauvais classements : - Rajouter des variables de relâchement des contraintes :math:`\xi_i`, - Pénaliser ces relâchements dans la fonction objectif. .. figure:: _images/svm08.png :width: 60% :align: center :name: svm08 Plus en exemple est éloigné du mauvais coté du séparateur (point bleu), plus la variable de relâchement :math:`\xi_i` a une valeur importante. *L’idée* est de modéliser les erreurs potentielles par des variables d’écart positives :math:`\xi_i` associées aux observations :math:`(x_i, y_i), i = 1, \dots n`. Si un point :math:`(x_i, y_i)` vérifie la contrainte de marge :math:`y_i w^T x_i + b) \geq 1` alors la variable d’écart (qui est une mesure du coût de l’erreur) est nulle. Nous avons donc deux situations : - Pas d’erreur : :math:`y_i(w^T x_i + b) \geq 1 \Longrightarrow \xi_i = 0`, - Erreur : :math:`y_i(w^T x_i + b) < 1 \Longrightarrow \xi_i = 1 - y_i(w^T x_i + b) > 0`. On associe à cette définition une fonction coût appelée « coût charnière » : .. math:: \xi_i = \max \left(0, 1 - y_i(w^T x_i + b)\right) .. figure:: _images/svm09.png :width: 100% :align: center :name: svm09 Un seul point est mal classé (point bleu). L’écart mesure la distance du point à la marge numérique de l’hyperplan séparateur. A droite on montre plusieurs coûts possibles : coût 0/1, coût charnière et coût quadratique. Le problème d’optimisation dans le cas des données non-séparables est donc : .. math:: \left\{ \begin{array}{ll} \underset{w,b}{\min} \left\{ \begin{array}{ll} \frac{1}{2}||w||^2\\ \sum_{i=1}^n \xi_i \end{array} \right.\\ \textrm{tel que}\\ y_i(w\cdot x_i + b) \geq 1 - \xi_i, i = 1, \dots, n\\ \xi_i \geq 0, i = 1, \dots, n \end{array} \right. Si toutes les variables d’écart :math:`\xi_i = 0`, on retrouve le problème linéairement séparable traité plus tôt. Puisqu'il faut minimiser les deux termes simultanément, on introduit une variable d’équilibrage :math:`C > 0` qui permet d’avoir une seule fonction objectif dans le problème d’optimisation : .. math:: \underset{w,b}{\min} \frac{1}{2}||w||^2 + C \sum_{i=1}^n\xi_i ce qui conduit à : .. math:: \left\{ \begin{array}{lll} \underset{w,b}{\min} \frac{1}{2}||w||^2 + C \sum_{i=1}^n\xi_i\\ \textrm{t.q.}\\ y_i(w\cdot x_i + b) \geq 1 - \xi_i, i = 1, \dots, n\\ \xi_i \geq 0, i = 1, \dots, n \end{array} \right. :math:`C` est une variable de pénalisation des points mal classés faisant un compromis entre la largeur de la marge et les points mal classés. Les variables :math:`\xi_i` s’appellent aussi *variables ressort* (anglais: *slack variables*). Par la même procédure qu'avant, on obtient le problème dual : .. math:: \left\{ \begin{array}{llll} \underset{\alpha}{\max} \sum_{i=1}^n \alpha_i - \frac{1}{2}\sum_{i,j=1}^n \alpha_i \alpha_j y_i y_j x_i^T x_j \\ \textrm{t.q.}\\ C \geq \alpha_i \geq 0, i = 1, \dots, n \,\,\, (\mathrm{admissibilité\,\,duale})\\ \sum_{i=1}^n \alpha_i y_i = 0 \,\,\, (\mathrm{stationarité}) \end{array} \right. Observations : - :math:`C` joue le rôle d’une constante de régularisation (la régularisation est d’autant plus forte que :math:`C` est proche de 0). - La différence pour le problème dual entre le cas séparable et non séparable est que les valeurs des :math:`\alpha_i` sont majorées par :math:`C`. - Les points mal classés ou placés dans la marge ont un :math:`\alpha_i = C`. - :math:`b` est calculé de sorte que :math:`y_i f(x_i) =1` pour les points tels que :math:`C > \alpha_i > 0`. La fonction de décision permettant de classer une nouvelle observation :math:`x` est toujours .. math:: f^*(x) = \sum_{i=1}^n \alpha_i^* y_i x_i^T x + b^* Pratiquement tous les environnements importants de modélisation mathématique (R, Matlab, Mathematica, Scipy, Torch, Scikit-learn, etc.) possèdent des implémentations performantes pour les SVM et méthodes à noyaux : - Torch, http://torch.ch/ - LibSVM, https://www.csie.ntu.edu.tw/~cjlin/libsvm/ - LibLinear, https://www.csie.ntu.edu.tw/~cjlin/liblinear/ - Scikit-Learn, http://scikit-learn.org/ Exemples SVM Toy **************** .. figure:: _images/svm10.png :width: 60% :align: center :name: svm10 Séparation linéaire avec LibSVM. Figure obtenue avec l'outil SVMToy (vecteurs de support en gras). Le blanc correspond à une valeur égale à zéro de la fonction de décision. .. figure:: _images/svm11.png :width: 60% :align: center :name: svm11 Séparation linéaire avec LibSVM pour un problème non linéaire. Figure obtenue avec l'outil SVMToy (vecteurs de support en gras). Le blanc correspond à une valeur égale à zéro de la fonction de décision. Références, livres, articles, web ********************************* .. [CM12] Cornuéjols, Miclet, Apprentissage artificiel : concepts et algorithmes, Eyrolles, 2012. .. [SC08] Steinwart, Christmann, *Support Vector Machines*, Springer 2008. .. [SS01] Scholkopf, Smola, *Learning with Kernels*, The MIT Press, 2001. .. [HTF06] Hastie, Tibshirani, Friedman, *The elements of statistical learning: data mining, inference, and prediction*, New York, Springer Verlag, 2006. .. [WikiStat] Machines à vecteurs supports (WikiStat), http://wikistat.fr