Machine Learning contre Programmation

Cet article est issu de la newsletter IA Comprise et reproduit ici par commodité. Recevez toutes les lettres dans votre boîte mail au fur et à mesure de leur publication en laissant votre adresse dans le cadre à droite !


Chère lectrice, cher lecteur,

L’apprentissage automatique (ou Machine Learning en anglais) est décidément à la mode depuis quelques années.

J’ai rencontré récemment un jeune ingénieur en informatique qui me racontait son cursus dans une prestigieuse université suisse : l’immense majorité de ses camarades de promotion voulaient en faire leur carrière. Lui, après avoir fait un stage dans le domaine, a décidé de s’orienter vers une carrière de programmeur « traditionnel » où il optimise le fonctionnement de routeurs pour un grand groupe de téléphonie – et où il est d’autant plus heureux que les profils comme le sien deviennent rares…

Quelles sont les différences au juste entre la programmation classique et l’apprentissage automatique ?

La programmation classique : une ligne de production

Tout d’abord, il ne faut pas se méprendre : l’apprentissage automatique est une forme de programmation.

Les data scientists et ingénieurs en machine learning passent bel et bien leur temps à programmer à l’aide de langages qui peuvent tout à fait être utilisés pour autre chose que de l’apprentissage automatique. Il s’agit dans tous les cas de construire un programme qui, à partir de données d’entrée (des tableaux de chiffres, des touches pressées sur le clavier, un mouvement de souris, des images…), va fournir un résultat souhaité.

Par exemple, un programme peut avoir pour fonction de « flasher » une voiture roulant trop vite devant un radar, de calculer le chemin le plus rapide pour aller d’un point à un autre, ou encore d’ajuster la trajectoire d’une fusée lorsqu’elle traverse l’atmosphère pour la mettre en orbite.

Le programme proprement dit est une succession d’instructions, comme par exemple l’instruction conditionnelle « si … alors … sinon » : si une certaine condition est remplie, alors cette opération est exécutée, sinon cette autre opération est exécutée.

On peut comparer cela à une ligne de production dans une usine : des tapis roulants transportent des matériaux d’une machine à l’autre selon une organisation définie (pas forcément linéaire) jusqu’à obtenir le produit final.

Une ligne de production, comparable à une séquence d’instructions définies une à une pour obtenir le résultat souhaité

Le travail du ou des programmeurs consiste à organiser intelligemment ces instructions pour obtenir le résultat souhaité. C’est une tâche qui peut s’avérer extrêmement complexe pour des projets d’envergure, au point qu’il devient impossible d’avoir une vision complète de l’ensemble des possibilités.

C’est ainsi qu’apparaissent des bugs, une situation où le programme ne donne pas le résultat souhaité : il faut alors se plonger dans les détails du code pour retrouver les instructions à l’origine du problème et modifier le programme en conséquence…

Voici comment on peut représenter schématiquement la programmation classique :

Une représentation simplifiée de la programmation classique

L’apprentissage automatique : un programme qui construit un programme

La grande idée de l’apprentissage automatique consiste à créer le programme non pas directement en écrivant manuellement les instructions, mais en écrivant un programme qui lui-même créera le programme (ou modèle) final.

Le programmeur s’appuie sur des données connues et sur le résultat associé qu’il souhaite obtenir lorsque le programme recevra ces données. Par exemple, pour créer un programme qui saura reconnaître des panneaux de circulation sur une image, il collecte de nombreuses images de toutes sortes (les données connues) dont on sait si elles contiennent ou non un panneau de circulation (le résultat que l’on veut obtenir) [1].

Le travail du programmeur consiste alors à construire un programme qui lui-même définira les opérations permettant de passer des données (connues) aux résultats (connus lui aussi) : on dit que ce programme est entraîné sur ces données. Ces opérations forment en quelque sorte un second programme, ou modèle. Ces opérations forment en quelque sorte un second programme, ou modèle. Une fois l’entraînement terminé, le modèle est utilisé en lui fournissant de nouvelles données dont on ne connaît pas le résultat (une image où il faudra retrouver un éventuel panneau de circulation).

Voici comment on peut représenter l’apprentissage automatique :

Une représentation simplifiée de la programmation par apprentissage automatique (Machine Learning)

Qu’est-ce que cela change en pratique ?

Voici quelques grandes différences.

L’apprentissage automatique nécessite beaucoup de données

Pour construire un modèle par apprentissage automatique, ce n’est pas l’intelligence, la capacité du programmeur à envisager toutes les possibilités qui compte.

Au lieu de cela, on entraîne le modèle sur une grande quantité de données où existent ces possibilités, sans chercher à reconstruire « pourquoi » les données conduisent à chaque résultat : ce sera justement le rôle du modèle.

Cela rend l’apprentissage automatique peu adapté aux tâches de programmations relativement simples ou dans les situations où l’on ne dispose pas déjà de grandes quantités de données étiquetées (dont on connaît les résultats).

L’apprentissage automatique permet de traiter des problèmes beaucoup plus complexes

Certains problèmes sont extrêmement difficiles à traiter par programmation classique.

Prenons le problème de reconnaissance de panneaux de signalisation. Il faudrait définir des instructions pour reconnaître les couleurs et la forme d’un panneau, selon des angles de vue différents et une luminosité variable, avec des obstacles ou des reflets les masquant partiellement, des défauts sur les panneaux à cause de l’usure… Si la tâche n’est pas impossible, elle reste titanesque.

En revanche, elle devient beaucoup plus abordable par apprentissage automatique : il n’y a plus besoin d’entrer dans ces détails, mais « seulement » d’entraîner un modèle bien choisi à partir d’un nombre suffisant d’images de panneaux de toutes sortes.

Le modèle n’est pas lisible en tant que tel

Un modèle conçu par apprentissage automatique n’est pas constitué d’instructions classiques de programmation, mais de coefficients mathématiques associés à un certain algorithme statistique.

Il ne peut pas se lire comme on lirait du code informatique et ne se « débuggue » pas directement : on ne fait que constater son efficacité (ou non) en pratique. S’il ne fait pas l’affaire, il est écarté au profit d’un autre modèle plus adéquat.

L’intelligence du programmeur est utilisée différemment

La programmation classique fait appel aux connaissances et à l’intelligence du programmeur pour assembler logiquement les instructions et construire brique par brique le programme.

En revanche, dans l’apprentissage automatique, l’intelligence du programmeur n’est pas utilisée dans le programme final (le modèle), mais dans le programme qui crée ce programme : savoir préparer les données, connaître les méthodes statistiques pertinentes, évaluer correctement les résultats des modèles.

Un biais naturel de programmeurs « classiques » consiste à vouloir introduire leur propre intelligence dans le modèle plutôt que de laisser fonctionner l’apprentissage automatique. Par exemple, il est tentant d’ajouter des règles arbitraires comme « tous les panneaux ont du rouge, donc s’il n’y a pas de rouge, je force le modèle à indiquer que l’image ne contient pas de panneaux ».

Même bien intentionnées, ces règles ont toutes les chances de nuire à la qualité du modèle, notamment car cette règle arbitraire peut être fausse dans certains cas (un panneau mal éclairé à l’ombre qui apparaîtrait en gris).

J’aime comparer cela à une synthèse en chimie organique. L’ingénieur chimiste ne va pas s’intéresser à la transformation individuelle de chaque molécule de réactif : ce serait impossible. Il va construire un protocole expérimental et en définir les paramètres (température, concentration…), puis va tester la présence et la pureté des molécules produites.

Comme dans l’apprentissage automatique, on ne sait pas exactement comment chaque molécule est transformée dans un réacteur chimique, mais on est capable d’évaluer le résultat (image : Wikipedia)

Ce qui compte est le résultat, peu importe ce qui s’est passé en détail dans le réacteur : s’il n’est pas satisfaisant, le protocole (température, concentration, etc.) est modifié jusqu’à obtenir le résultat souhaité.

Le modèle n’est jamais parfaitement précis

Lorsqu’un programme traditionnel ne donne pas le résultat attendu, c’est un bug à corriger. Il existe généralement une certaine tolérance aux bugs les moins importants, mais un bug reste un défaut du programme.

En revanche, un modèle issu d’apprentissage automatique donne par nature parfois un résultat incorrect, la possibilité de se tromper est inévitable et intrinsèque à cette approche. L’enjeu principal consiste donc à évaluer la marge de tolérance à l’erreur (et aux conséquences de ces erreurs) pour aboutir à un modèle « suffisamment correct » pour l’usage qui en est fait.

Cela vous inquiète ?

Peut-on réellement confier la conduite d’une voiture autonome à une « boîte noire », à un modèle dont il est impossible d’analyser précisément le fonctionnement, que l’on n’évalue qu’à travers ses résultats passés ?

Ce n’est pourtant pas fondamentalement différent d’un être humain au volant, après tout…

À la prochaine !


Inscrivez-vous gratuitement pour ne rater aucune lettre !


[1] Si cela vous fait penser aux CAPTCHA sur lesquels il faut cliquer pour accéder à certains sites, c’est normal : ils servent aussi à faire étiqueter des images par des humains afin qu’elles puissent être utilisées pour entraîner des modèles ensuite !
Les voitures autonomes basées sur l’apprentissage automatique étant une des frontières actuelles de l’Intelligence Artificielle, rien d’étonnant de tomber si souvent sur des CAPTCHA liés à la circulation routière…

Laisser un commentaire

Abonnez-moi à la newsletter