Aller au contenu
Kudos AI
Read in English
Raisonnement probabiliste

Réseaux bayésiens et inférence probabiliste

Comment un graphe et quelques petites tables tiennent lieu d’une loi jointe à des milliers d’entrées, comment y répondre exactement à une requête par énumération et élimination de variables, et que faire quand l’inférence exacte est hors de portée : échantillonnage par rejet, pondération par vraisemblance et échantillonnage de Gibbs, chacun travaillé sur les deux mêmes réseaux.

9 min de lectureKudos AI

Prérequis : Le théorème de Bayes et la mise à jour des croyances

Cinq nœuds et dix nombres qui s’assemblent en un graphe, puis un événement complet suivi de haut en bas tandis que ses cinq facteurs se multiplient jusqu’à 0,000628.

Le théorème de Bayes vous dit comment mettre à jour une croyance sur une observation. Un agent réel entretient des croyances sur des dizaines de variables à la fois, et la loi jointe sur celles-ci - l’objet qui répond à toute question - compte 2n2^n entrées pour nn variables booléennes. Personne ne peut l’écrire. Cet article porte sur la représentation qui rend la loi jointe utilisable, et sur les algorithmes qui l’interrogent.

A. Le réseau est la loi jointe

Un réseau bayésien est un graphe orienté acyclique. Chaque nœud est une variable aléatoire ; une flèche de XX vers YY fait de XX un parent de YY ; et chaque nœud porte une table de probabilités conditionnelles donnant P(Xi∣Parents(Xi))P(X_i \mid \mathrm{Parents}(X_i)), une ligne par combinaison de valeurs des parents. Un nœud booléen à kk parents booléens demande 2k2^k nombres.

L’exemple de Russell et Norvig est une alarme. Elle réagit aux cambriolages et, moins fidèlement, aux séismes ; deux voisins, John et Mary, appellent quand ils l’entendent, John confondant parfois le téléphone avec l’alarme et Mary la ratant parfois derrière sa musique forte. Les flèches B→AB \to A, E→AE \to A, A→JA \to J, A→MA \to M, et dix nombres :

P(b)=0.001P(e)=0.002P(a∣b,e)=0.95P(a∣b,¬e)=0.94P(a∣¬b,e)=0.29P(a∣¬b,¬e)=0.001P(j∣a)=0.90P(j∣¬a)=0.05P(m∣a)=0.70P(m∣¬a)=0.01\begin{array}{ll} P(b) = 0.001 & P(e) = 0.002 \\[4pt] P(a \mid b, e) = 0.95 & P(a \mid b, \lnot e) = 0.94 \\ P(a \mid \lnot b, e) = 0.29 & P(a \mid \lnot b, \lnot e) = 0.001 \\[4pt] P(j \mid a) = 0.90 & P(j \mid \lnot a) = 0.05 \\ P(m \mid a) = 0.70 & P(m \mid \lnot a) = 0.01 \end{array}

Le sens du dessin tient en une équation. Pour toute affectation complète,

P(x1,…,xn)=∏i=1nP(xi∣parents(Xi)).P(x_1, \dots, x_n) = \prod_{i=1}^{n} P\big(x_i \mid \mathrm{parents}(X_i)\big).

La probabilité que l’alarme sonne sans cambriolage ni séisme, et que les deux voisins appellent, est donc

P(j,m,a,¬b,¬e)=0.90×0.70×0.001×0.999×0.998=0.000628.P(j, m, a, \lnot b, \lnot e) = 0.90 \times 0.70 \times 0.001 \times 0.999 \times 0.998 = 0.000628 .

Chacune des 32 entrées de la loi jointe est accessible ainsi, à partir de dix nombres plutôt que 31. L’économie n’est pas une astuce : c’est l’affirmation, faite par les flèches absentes, que chaque variable est conditionnellement indépendante de ses non-descendants étant donné ses parents. Plus fort encore, chaque nœud est indépendant de tous les autres étant donné sa couverture de Markov - parents, enfants, et autres parents des enfants. Étant donné l’alarme et le séisme, les appels téléphoniques ne disent plus rien d’un cambriolage.

B. Inférence exacte

Une requête demande P(X∣e)\mathbf{P}(X \mid \mathbf{e}). Comme chaque entrée de la loi jointe est un produit d’entrées de TPC, la requête est une somme normalisée de produits sur les variables cachées. Les deux voisins ont appelé ; est-ce un cambriolage ?

P(b∣j,m)=α P(b)∑eP(e)∑aP(a∣b,e) P(j∣a) P(m∣a).P(b \mid j, m) = \alpha\, P(b) \sum_{e} P(e) \sum_{a} P(a \mid b, e)\,P(j \mid a)\,P(m \mid a).

Quatre termes pour bb, quatre pour ¬b\lnot b, chacun un produit de cinq nombres :

P(B∣j,m)=α ⟨0.00059224, 0.00149186⟩=⟨0.284, 0.716⟩.\mathbf{P}(B \mid j, m) = \alpha\, \langle 0.00059224,\ 0.00149186 \rangle = \langle 0.284,\ 0.716 \rangle .

Deux signalements indépendants font monter un a priori de un sur mille à 28 %, et pas davantage, parce que la masse sans cambriolage arrive par trois voies comparables : une alarme sans cause puis les deux appels, 0,0006280{,}000628 ; aucune alarme mais les deux appels quand même, 0,0004980{,}000498 ; et une alarme due à un séisme puis les deux appels, 0,0003650{,}000365. Ensemble elles pèsent 2,5 fois la voie du cambriolage, 0,0005920{,}000592.

L’énumération évalue ceci comme un arbre en profondeur, et l’arbre se répète : le produit P(j∣a) P(m∣a)P(j \mid a)\,P(m \mid a) est calculé une fois sous ee et de nouveau sous ¬e\lnot e. Sur nn variables booléennes le coût est O(2n)O(2^n) - mieux que le O(n 2n)O(n\,2^n) de la construction séparée de chaque entrée jointe, mais pour l’essentiel du recalcul. L’élimination de variables stocke chaque morceau comme un facteur - une table sur les variables dont il dépend encore - et combine les facteurs par produit point à point et par sommation. Sommer sur AA donne un facteur sur (B,E)(B, E) :

f6(B,E)=e¬eb0.5985250.592230¬b0.1830550.001130f_6(B, E) = \begin{array}{c|cc} & e & \lnot e \\ \hline b & 0.598525 & 0.592230 \\ \lnot b & 0.183055 & 0.001130 \end{array}

Sommer sur EE contre P(E)P(E) laisse f7(B)=⟨0.592243, 0.001493⟩f_7(B) = \langle 0.592243,\ 0.001493 \rangle, et multiplier par P(B)P(B) puis normaliser rend ⟨0.284,0.716⟩\langle 0.284, 0.716 \rangle, chaque produit de feuille n’ayant été fait qu’une fois.

Que ce soit rapide dépend de la forme du graphe. Sur un polyarbre - au plus un chemin non orienté entre deux nœuds quelconques, comme ici - l’élimination de variables est linéaire en la taille du réseau. Ajoutez un second chemin et les facteurs intermédiaires peuvent croître exponentiellement dans le pire cas. Le problème général est #P-difficile : aussi difficile que compter les affectations qui satisfont une formule propositionnelle. C’est la raison d’être du reste de cet article.

Le réseau ci-dessous est celui-là, et chacun de ses nombres est exact : les probabilités a posteriori viennent de la somme des 32 affectations, non d’un échantillonnage. Cliquez un nœud pour dire ce que vous savez. Commencez par les deux voisins qui appellent : le cambriolage monte à 28,4 %, ce qui mérite déjà qu’on s’y arrête, car les appels renseignent excellemment sur l’alarme et l’alarme témoigne mal du cambriolage. Ajoutez ensuite le séisme. Il rend les appels plus probables, et il renvoie le cambriolage vers rien.

Interactif : dites ce que vous savez, observez la suite

Cliquez un nœud pour le faire tourner : inconnu, survenu, écarté.

Cambriolage0.1%Séisme0.2%Alarme0.3%John appelle5.2%Mary appelle1.2%
P(cambriolage)
0.1%
P(séisme)
0.2%
P(alarme)
0.3%
P(observations)
1.000000

Rien n’est encore connu : chaque nœud est à son a priori, un cambriolage à 0,1 %, un séisme à 0,2 %. Cliquez un voisin et regardez l’influence remonter les flèches jusqu’à l’alarme puis redescendre vers l’autre voisin, alors qu’aucune flèche ne relie les deux voisins.

C. Échantillonner quand l’exact est impossible

Le réseau de l’arroseur a quatre variables booléennes et deux chemins de Cloudy\mathit{Cloudy} à WetGrass\mathit{WetGrass}, l’un par l’arroseur et l’autre par la pluie :

P(c)=0.5P(s∣c)=0.10P(s∣¬c)=0.50P(r∣c)=0.80P(r∣¬c)=0.20P(w∣s,r)=0.99P(w∣s,¬r)=0.90P(w∣¬s,r)=0.90P(w∣¬s,¬r)=0.00\begin{array}{ll} P(c) = 0.5 & \\[4pt] P(s \mid c) = 0.10 & P(s \mid \lnot c) = 0.50 \\ P(r \mid c) = 0.80 & P(r \mid \lnot c) = 0.20 \\[4pt] P(w \mid s, r) = 0.99 & P(w \mid s, \lnot r) = 0.90 \\ P(w \mid \lnot s, r) = 0.90 & P(w \mid \lnot s, \lnot r) = 0.00 \end{array}

L’échantillonnage a priori tire chaque variable dans sa TPC, parents d’abord. La probabilité de produire un événement est le produit des entrées consultées, c’est-à-dire la loi jointe elle-même : [c,¬s,r,w][c, \lnot s, r, w] sort avec probabilité 0.5×0.9×0.8×0.9=0.3240.5 \times 0.9 \times 0.8 \times 0.9 = 0.324. Les fréquences convergent donc vers les probabilités, et l’estimation est consistante.

L’échantillonnage par rejet répond à une requête conditionnelle en écartant tout échantillon qui contredit l’évidence. Pour P(Rain∣Sprinkler=true)P(\mathit{Rain} \mid \mathit{Sprinkler} = \text{true}), de valeur exacte 0.30.3, une exécution à graine fixée de 1 000 échantillons a priori en a rejeté 703 et gardé 79 avec pluie contre 218 sans, pour une estimation de 0.2660.266. Soixante-dix pour cent de l’effort n’ont servi à rien, et c’est le cas bénin : le taux de survie est P(e)P(\mathbf{e}), qui décroît exponentiellement avec le nombre de variables d’évidence. Demandez au réseau du cambriolage P(B∣j,m)\mathbf{P}(B \mid j, m) et environ 21 échantillons sur 10 000 survivent.

Python

S'exécute dans votre navigateur. La première exécution télécharge l'environnement Python (~10 Mo), puis il est mis en cache.

La pondération par vraisemblance fixe les variables d’évidence au lieu de les tirer, si bien que chaque événement est compatible, et pondère chaque événement par la probabilité de l’évidence étant donné les parents que l’échantillonneur a choisis. Pour P(Rain∣c,w)\mathbf{P}(\mathit{Rain} \mid c, w) dans l’ordre C,S,R,WC, S, R, W : le poids part de 11, CC est une évidence donc w←0.5w \leftarrow 0.5 ; SS est tiré selon ⟨0.1,0.9⟩\langle 0.1, 0.9 \rangle, disons faux ; RR selon ⟨0.8,0.2⟩\langle 0.8, 0.2 \rangle, disons vrai ; WW est une évidence donc w←0.5×P(w∣¬s,r)=0.45w \leftarrow 0.5 \times P(w \mid \lnot s, r) = 0.45. L’événement est compté sous pluie avec le poids 0.450.45. Rien n’est écarté et, parce que la probabilité d’échantillonnage multipliée par le poids égale la loi jointe, le décompte pondéré est consistant : mille échantillons avec la même graine donnent 0.97580.9758 contre une valeur exacte de 0.97580.9758. La méthode se dégrade quand l’évidence est improbable sous les valeurs tirées, parce que quelques poids lourds dominent alors tout.

L’échantillonnage de Gibbs est une méthode de Monte-Carlo par chaînes de Markov. Fixez l’évidence, partez d’un état quelconque, et rééchantillonnez de façon répétée une variable hors évidence conditionnellement à sa couverture de Markov. Cette loi conditionnelle est un produit d’une poignée d’entrées de TPC :

P(xi′∣mb(Xi))=α P(xi′∣parents(Xi))∏Yj∈Children(Xi)P(yj∣parents(Yj)).P(x_i' \mid \mathrm{mb}(X_i)) = \alpha\, P\big(x_i' \mid \mathrm{parents}(X_i)\big) \prod_{Y_j \in \mathrm{Children}(X_i)} P\big(y_j \mid \mathrm{parents}(Y_j)\big).

Pour P(Rain∣s,w)\mathbf{P}(\mathit{Rain} \mid s, w) depuis l’état [c,s,¬r,w][c, s, \lnot r, w], rééchantillonner CC utilise P(C) P(s∣C) P(¬r∣C)P(C)\,P(s \mid C)\,P(\lnot r \mid C), ce qui donne P(c∣s,¬r)=0.048P(c \mid s, \lnot r) = 0.048 ; disons que le tirage donne faux. Rééchantillonner RR utilise ensuite P(R∣¬c) P(w∣s,R)P(R \mid \lnot c)\,P(w \mid s, R), ce qui donne P(r∣¬c,s,w)=0.216P(r \mid \lnot c, s, w) = 0.216. Chaque état visité est un échantillon. Mille pas avec une graine fixée estiment 0.3150.315 contre la valeur exacte 0.3200.320.

Cela fonctionne parce que la chaîne possède une distribution stationnaire et que le pas de Gibbs satisfait le bilan détaillé par rapport à la loi a posteriori, ce qui force les deux à coïncider : la fraction du temps passée à la longue dans chaque état est P(x∣e)P(\mathbf{x} \mid \mathbf{e}). Aucun échantillon n’est rejeté et aucun poids ne s’effondre. Le coût est la corrélation entre états consécutifs, si bien que la chaîne a besoin de temps pour oublier d’où elle est partie.

La convergence est une affirmation sur une limite : la figure ci-dessous met donc la limite à l'écran. La ligne pointillée est la loi a posteriori exacte, obtenue en énumérant la loi jointe, sans partager une ligne de code avec les échantillonneurs. Faites glisser la taille du tirage et regardez les deux estimations marcher vers elle. Passez ensuite à la requête du cambriolage, où le rejet conserve 21 tirages sur 10 000 et où la pondération les garde tous et peine encore, parce que fixer les observations supprime le gaspillage et non la variance.

Interactif : deux échantillonneurs face à la valeur exacte

La valeur exacte vient de l’énumération de la loi jointe, non des échantillonneurs.

0.3000
Exact
0.3000
Rejet
0.3045
Pondération
0.3029
Gardés par le rejet
289

Le rejet lit 0.3045 sur les 289 échantillons conservés parmi 1 000 ; la pondération lit 0.3029 sur la totalité ; la valeur exacte est 0.3000. Les deux estimateurs sont convergents, ce qui est une affirmation sur une limite : faites donc glisser la taille du tirage et regardez les deux nombres marcher vers le troisième. La part rejetée n’est pas du bruit, c’est 70.00% du travail.

Où cela vous mène

Un réseau bayésien est une loi jointe que l’on peut réellement écrire. L’inférence exacte est une somme de produits que l’élimination de variables effectue sans répétition, bon marché sur les polyarbres et intraitable en général. Quand le graphe est trop enchevêtré, l’échantillonnage donne des estimations consistantes à un coût qui dépend de la façon dont l’évidence est traitée : le rejet gaspille, la pondération concentre, et Gibbs vagabonde - chacun étant le bon choix quelque part. Le parcours de formation Raisonnement probabiliste avec les réseaux bayésiens travaille chacun de ces calculs à la main et en code.

Références et lectures complémentaires

  • Stuart Russell, Peter Norvig, Artificial Intelligence: A Modern Approach, Pearson (3rd edition), 2010· Bibliothèque de référence Kudos AI

Les œuvres protégées par le droit d’auteur sont citées à titre de référence uniquement et ne sont pas hébergées ici ; veuillez consulter l’éditeur pour y accéder.

Lecture associée

4 min de lectureRaisonnement probabiliste

Cent mille échantillons, quatre cents qui comptent

Sur le réseau du cambriolage avec les deux voisins qui appellent, l’échantillonnage par rejet garde 183 tirages sur 100 000 et la pondération par vraisemblance les garde tous pour une taille d’échantillon efficace de 396. Les deux estimations s’écartent d’environ 10 % d’une probabilité a posteriori de 0,284172, et la raison se calcule exactement : 252 échantillons portent 76 % du poids et 99,975 % du poids au carré.

Intelligence artificielleProbabilité
5 min de lectureRaisonnement probabiliste

La semaine qui n’a pas pu avoir lieu

Prenez l’état le plus probable chaque jour, écrivez-les dans l’ordre, et vous obtenez un rapport auquel le modèle attribue une probabilité exactement nulle : sur un exemple de surveillance de machine sur quatre jours, la réponse jour par jour est sain, sain, en panne, en panne, et passer de sain à en panne est une transition impossible. Ce que sont réellement les deux questions, pourquoi le lissage et Viterbi n’y répondent pas de la même manière, et ce que signifie la probabilité a posteriori de 0,411 du meilleur chemin pour qui doit décider.

Intelligence artificielleProbabilité
11 min de lectureRaisonnement probabiliste

Apprendre les nombres d’un modèle probabiliste

D’où viennent réellement les nombres d’un réseau bayésien ou d’une gaussienne : la recette en trois temps du maximum de vraisemblance déroulée sur des paramètres discrets puis continus, l’a priori Beta qui répare ce qu’elle fait d’un événement jamais vu, Bayes naïf et l’unique effectif nul qui le détruit, et l’algorithme EM pour le cas où les effectifs ne peuvent pas être relevés du tout - chaque chiffre calculé plutôt qu’affirmé.

ProbabilitéStatistiqueIntelligence artificielle
← Retour à tous les articles