La programmation bayésienne : quésako ?
Mercredi 8 octobre 2008Ceux qui lisent Bishop ont peut-être remarqué qu’il encense les "Bayesian methods" depuis quelques papiers. Entrée en matière complètement pédante et étant juste un moyen de donner un lien d’autorité pour justifier un tant soit peu ce qui va suivre. Au passage, le lecteur non-fatigué, non-saoûl et intelligent de Nofrag aura remarqué que Bayesian prend un "b majuscule" contrairement à bayésien, c’est parce qu’en Anglais les adjectifs tirés des noms propres prennent une majuscule, pas comme en Français. Encore un peu de confiture sur votre tartine ?
Je me disais, avant ce baratin inutile, que ça pourrait être sympa de vulgariser ce qui est une de mes grandes révélations de l’année dans la masse de choses que j’apprend actuellement.
Partons de l’exemple de la robotique. Faire un robot qui fait pleins de choses utiles et/ou marrantes c’est simple dans la simulation, déjà un peu moins simple en expérimentation en labo (environnement controlé) ou à la coupe de France de robotique et carrément la mort en environnement réel. Pourquoi ça ? Déjà quand on écrit son propre simulateur pour sa propre expérience on a un gros biais. Ensuite quand on a des capteurs et des actionneurs bien dimensionnés par rapport à un environnement controlé (luminosité, vent, obstacles, image, bruit, poussière …), on peut assez facilement travailler avec ces données. Même si parfois il faut filtrer un bruit ou faire une analyse d’image pas évidente, ça reste du connu et maitrisé depuis longtemps. En situation réelle, il y a toujours qqch qui est comme il ne devrait PAS être. C’est le fameux gouffre théorie / pratique. Mais à quoi est-ce dû ? Je pense (en m’en étant convaincu et non persuadé) que c’est à cause d’un manque de connaissances. On a MODÉLISÉ un environnement possible et un comportement associé mais on perd forcément des paramètres variables réels en passant au modèle. C’est ces trucs à la con qui vont essayer par toutes les forces de la loi de Murphy et du "Théoriquement en pratique ça marche" de faire capoter votre expérimentation. En gros on en vient à faire un robot qui considère que son modèle mathématique est exact que c’est le monde physique qui a tort. Bah ui, patate ! [Je cite un jeune cousin]
Alors comment on fait pour traiter la feuille morte qui est passée devant la caméra dont on se sert pour faire de la vision sur notre robot ? Ou le chaos de la route imprévu lors du DARPA challenge ? On admet qu’on ne sait pas tout sur le monde réel et essaye de travailler quand même sans modifier le monde réel pour qu’il ressemble à un labo ? En simplifiant, pour raisonner avec des choses incertaines de nos jours on a les logiques floues et les méhodes bayésiennes. Les logiques floues c’est "il pleuvra certainement demain" et chacun y va de son formalisme et de sa méthode. Les méthodes bayésiennes c’est "il pleuvra avec la probabilité 0.8 demain" avec un formalisme qui commence à être solide et éprouvé. C’est numérique et ça c’est cool car les CPU, eux, ils savent bien traiter les nombres. Si on décide que l’on va inférer avec la méta-méthode bayésienne, on procède environ comme ça :

La structure du schéma est empruntée à Pierre Bessière dans son (très bon) Probabilistic Reasoning and Decision Making in Sensory Motor Systems. Note : P(A|B) c’est la probabilité d’avoir l’évènement A sachant que l’évènement B est arrivé. P(A et B) = P(A B) = P(A).P(B|A) prend donc tout son sens : la probabilité d’avoir les évènements A et B en même
temps c’est la probabilité d’avoir l’évènement A multiplié par la probabilité d’avoir l’évènement B en sachant qu’on a eu l’évènement A.
C’est donc simple : on n’as pas d’information totale, on raisonne avec des probabilités au lieu de logiques du 1er ou 2nd ordre pures. En fait on est même plus puissant dans un certain sens car on est capable de faire le Modus Ponens (si A est vrai et que A => B alors B est vrai) et le Modus Tollens (si B est faux et si A => B alors A est faux) avec notre représentation probabiliste. C’est juste pour MP : P(B=vrai | A=vrai) = 1 et pour MT : P(non(A=vrai) | non(B=vrai)) = 1 ou, si vous préférez et en vrai/faux binaire, P(A=faux | B=faux) = 1, essayez !
Mais on peut aller beaucoup plus loin grâce aux probas : P(B|A) = 1 nous apprend que P(A|B) sup ou égal à P(A) : si B est vrai, la probabilité que A soit vrai est supérieure à si on ne savait rien sur B. Ceux qui veulent se creuser un peu les méninges remplacent partout ci-dessus (ça marche à partir de MP / MT) A par "n est divisible par 9" et B par "n est divisible par 3". Ils apercevront alors la force du raisonnement via les probabilités, qui permet de faire une inférence qui est inaccessible à la logique pure : si on sait qu’un nombre est divisible par 3, il a plus de chances d’être divisible par 9 que si on se sait rien du tout. De même P(B|A) = 1 entraine que P(non(B) | non(A)) inf ou égal à P(non(B)) …
Voila, la programmation bayésienne c’est se baser sur le théorème de Bayes pour raisonner, inférer mais également en amont prévoir de traiter l’incomplétude par les probabilités. J’ai mis deux exemples plus appliqués dans un extrait de mon rapport de stage. J’espère avoir été (un peu) clair.
Là de suite je suis très fatigué et vous laisse donc un peu en plan mais n’hésitez pas à poser des questions sur ce pavé. Et si vous voulez en savoir plus, il y a google et bayesian-programming.org …