You are on page 1of 9

How to use BNT for DBNs

http://bnt.insa-rouen.fr/tutoriels/usage_dbn.html

BayesNet Toolbox
Tutoriels Rseaux baysiens dynamiques Modles tudis HMMs filtres de Kalman HMMs coupls Water network BAT network Infrence Noeuds cachs discrets Noeuds cachs continus Apprentissage Apprentissage de paramtres Apprentissage de structure Note: nous vous recommandons de lire tout d'abord une introduction aux Rseaux Baysiens Dynamiques comme ce chapitre. Modles tudis Les rseaux baysiens dynamiques (DBN) sont des modles graphiques dirigs de processus stochastiques. Ils gnralisent les modles de Markov cachs (HMM) et les systmes dynamiques linaires (LDS) en reprsentant les tats cachs (et observs) en tant que variables d'tats, possdant des interdpendances complexes. La structure graphique fournit une manire simple de dtailler ces indpendances conditionnelles, et fournit aussi par consquent une paramtrisation rduite du modle. Notez que "rseau baysien temporel" serait un meilleur nom que "rseau baysien dynamique", partir du moment o nous supposons que la structure du modle ne change pas, mais le terme DBN a t choisi. Nous supposons aussi normalement que les paramtres ne changent pas, c'est--dire que le modle est invariant dans le temps. Toutefois, nous pouvons toujours ajouter des noeuds cachs supplmentaires afin de reprsenter le "rgime" courant, et de ce fait crer des mlanges de modles pour prendre en compte des non-stationnarits priodiques.. Il y a certains cas o la taille de l'espace des tats peut changer dans le temps, comme par exemple l'volution d'un nombre variable mais inconnu, d'objets. Dans ce cas, il faut changer la structure du rseaux baysien dans le temps, ce que BNT ne permet pas. Modles de Markov cachs Le cas le plus simple des DBN estcelui des modles de Markov cachs (HMM). Les HMM possdent un seul noeud cach discret et un noeud observ discret ou continu par tranches (slice), comme illustr ci-dessous. Comme auparavant, les cercles dnotent des noeuds continus, les carrs des noeuds discrets, les noeuds clairs signifient des variables caches, les noeuds griss les variables observes.
Page pricipale

Nous avons "droul" le modle en trois "tranches temporelles" -- la structure et les paramtres sont supposs se rpter chaque nouvelle "tranche". Par consquent, pour dfinir un rseau baysien dynamique, nous devons dfinir la topologie intra-tranche ( l'intrieur d'une tranche), la topologie inter-tranche (entre deux tranches), ainsi que les paramtres des deux premires tranches (Un tel rseau baysien temporel deux tranches est souvent appel un 2TBN). Nous pouvons dfinir la structure comme suit : intra = zeros(2); intra(1,2) = 1; % le noeud 1 dans la tranche t est reli au noeud 2 dans la tranche t

1 sur 9

23/10/2011 17:35

How to use BNT for DBNs

http://bnt.insa-rouen.fr/tutoriels/usage_dbn.html

inter = zeros(2); inter(1,1) = 1; % le noeud 1 dans la tranche t-1 est reli au noeud 1 dans la tranche t Nous pouvons spcifier les paramtres comme suit, o pour simplifier nous supposons que les noeuds observs sont discrets. Q = 2; % nombre d'tats cachs O = 2; % nombre de symboles observables ns = [Q O]; dnodes = 1:2; bnet = mk_dbn(intra, inter, ns, 'discrete', dnodes); for i=1:4 bnet.CPD{i} = tabular_CPD(bnet, i); end Nous supposons que les distributions P(X(t) | X(t-1)) et P(Y(t) | X(t)) sont indpendants de t pour t > 1. Par consquent les CPD (distributions de probabilit conditionnelles) pour les noeuds 5, 7, ... sont les mmes que pour le noeud 3,que nous regroupons dans la mme classe quivalente, le noeud 3 tant "reprsentatif" de la classe. En d'autres termes, nous avons "partag" les paramtres des noeuds 3, 5, 7, ... De mme, les noeuds 4, 6, 8, ... sont lis. Notez, toutefois, que (les paramtres pour) les noeuds 1 et 2 ne sont pas lis avec les noeuds suivants. Jusqu'ici nous avons suppos que le modle observ P(Y(t) | X(t)) est indpendant de t pour t>1, mais par convention nous affirmons que c'est vrai pour tout t. Donc nous voudrions placer les noeuds 2, 4, 6, ... dans la mme classe. Nous pouvons le faire en dfinissant explicitement les classes quivalentes, comme suit (allez voir ici pour plus de dtails sur les liens des paramtres). Nous dfinissons eclass1(i) comme tant la classe quivalente laquelle le noeud i appartient dans la tranche 1. De mme, nous dfinissions eclass2(i) comme tant les classes quivalentes auxquelles les noeuds i appartiennent dans les tranches 2, 3, ... Dans le cas du HMM, nous avons eclass1 = [1 2]; eclass2 = [3 2]; eclass = [eclass1 eclass2]; Cela lie le modle de la variable observable travers les tranches, puisque par exemple, eclass(4) = eclass(2) = 2. Par dfaut, eclass1 = 1:ss, et eclass2 = (1:ss)+ss, o ss = slice size = le nombre de noeuds par tranche. Mais en utilisation le partage de paramtres prcdent, nous avons seulement 3 CPD spcifier au lieu de 4: bnet = mk_dbn(intra, inter, ns, 'discrete', dnodes, 'eclass1', eclass1, 'eclass2', eclass2); prior0 = normalise(rand(Q,1)); transmat0 = mk_stochastic(rand(Q,Q)); obsmat0 = mk_stochastic(rand(Q,O)); bnet.CPD{1} = tabular_CPD(bnet, 1, prior0); bnet.CPD{2} = tabular_CPD(bnet, 2, obsmat0); bnet.CPD{3} = tabular_CPD(bnet, 3, transmat0); Il est expliqu plus bas comment faire de l'inference et de l'apprentissage avec ce modle. (Jetez aussi un oeil sur la toolbox HMM de K. Murphy qui est comprise dans BNT.) Voici quelques variantes des HMM que BNT peut aussi grer.

2 sur 9

23/10/2011 17:35

How to use BNT for DBNs

http://bnt.insa-rouen.fr/tutoriels/usage_dbn.html

Systmes Dynamiques Linaires (LDS) et Filtres de Kalman Un systme dynamique linaire (LDS) possde la mme topologie qu'un HMM, mais l'on suppose que tous les noeuds ont une distribution linaire-gaussienne, c'est--dire : x(t+1) = A*x(t) + w(t), w ~ N(0, Q), x(0) ~ N(init_x, init_V) y(t) = C*x(t) + v(t), v ~ N(0, R) Voici quelques variantes ci-dessous :

Nous pouvons crer un LDS classique dans BNT comme suit : intra = zeros(2); intra(1,2) = 1; inter = zeros(2); inter(1,1) = 1; n = 2; X = 2; % taille de l'tat cach Y = 2; % taille de l'tat observ ns = [X Y]; dnodes = []; onodes = [2]; eclass1 = [1 2]; eclass2 = [3 2]; bnet = mk_dbn(intra, inter, ns, 'discrete', dnodes, 'eclass1', eclass1, 'eclass2', eclass2); x0 = rand(X,1); V0 = eye(X); % doit tre semi-definie positive! C0 = rand(Y,X); R0 = eye(Y); A0 = rand(X,X); Q0 = eye(X); bnet.CPD{1} = gaussian_CPD(bnet, 1, 'mean', x0, 'cov', V0, 'cov_prior_weight', 0); bnet.CPD{2} = gaussian_CPD(bnet, 2, 'mean', zeros(Y,1), 'cov', R0, 'weights', C0, ... 'clamp_mean', 1, 'cov_prior_weight', 0); bnet.CPD{3} = gaussian_CPD(bnet, 3, 'mean', zeros(X,1), 'cov', Q0, 'weights', A0, ... 'clamp_mean', 1, 'cov_prior_weight', 0);

3 sur 9

23/10/2011 17:35

How to use BNT for DBNs

http://bnt.insa-rouen.fr/tutoriels/usage_dbn.html

Nous expliquons plus bas comment faire de l'inference et de l'apprentissage de ce modle. (Jetez aussi un oeil sur la toolbox Kalman filter, comprise dans BNT) HMM couples Voici un exemple de HMM couple avec N=5 chaines, droules pour T=3 tranches. Chaque noeud cach discret possde sa propre observable gaussienne.

Nous pouvons le faire en utilisant ces fonctions :


Q = 2; % noeuds cachs binaires discrete_obs = 0; % cts observed nodes Y = 1; % scalar observed nodes bnet = mk_chmm(N, Q, Y, discrete_obs);

Water network Considrons le modle (usine de purification des eaux) conu par Finn V. Jensen, Uffe Kjrulff, Kristian G. Olesen, et Jan Pedersen.

Dtaillons maintenant comment implmenter ce modle l'aide de BNT.


ss = 12; % taille des tranche intra = zeros(ss); intra(1,9) = 1; intra(3,10) = 1; intra(4,11) = 1; intra(8,12) = 1; inter = zeros(ss); inter(1, [1 3]) = 1; % le noeud 1 dans la tranche 1 est reli aux noeuds 1 et 3 dans la tranche 2

4 sur 9

23/10/2011 17:35

How to use BNT for DBNs

http://bnt.insa-rouen.fr/tutoriels/usage_dbn.html

inter(2, inter(3, inter(4, inter(5, inter(6, inter(7, inter(8,

[2 [3 [3 [3 [4 [7 [6

3 7]) 4 5]) 4 6]) 5 6]) 5 6]) 8]) = 7 8])

= 1; = 1; = 1; = 1; = 1; 1; = 1;

onodes = 9:12; % observs dnodes = 1:ss; % discrets ns = 2*ones(1,ss); % noeuds binaires eclass1 = 1:12; eclass2 = [13:20 9:12]; eclass = [eclass1 eclass2]; bnet = mk_dbn(intra, inter, ns, 'discrete', dnodes, 'eclass1', eclass1, 'eclass2', eclass2); for e=1:max(eclass) bnet.CPD{e} = tabular_CPD(bnet, e); end

Nous avons partag les paramtres observs travers les tranches. Cliquez ici pour un exemple plus complexe de partage des paramtres.

Bat network Comme exemple de DBN plus compliqu, considrons l'exemple ci-dessous, qui traduit trs prcisment l'tat d'une voiture, et qui pourrait tre utilis pour la conduite automatique. (Ce modle provient de Forbes, Huang, Kanazawa et Russell, "The BATmobile: Towards a Bayesian Automated Taxi", IJCAI 95. Le schma est tir de Boyen et Koller, "Tractable Inference for Complex Stochastic Processes", UAI98. Pour simplifier, nous avons seulement affich les noeuds observs dans la tranche 2)

Cette structure tant complexe, Il est s'avre utile d'affecter des noms aux noeuds, au lieu de nombres.
names = {'LeftClr', 'RightClr', 'LatAct', ... 'Bclr', 'BYdotDiff'}; ss = length(names);

Nous pouvons implmenter la structure intra-tranche en utilisant un cell array comme suit, o chaque colonne dnote un lien entre les deux noeuds spcifis.
intrac = {... 'LeftClr', 'LeftClrSens'; 'RightClr', 'RightClrSens'; ... 'BYdotDiff', 'BcloseFast'};

Enfin, nous pouvons convertir ce cell-array en une matrice d'adjacence en utilisant la fonction suivante:
[intra, names] = mk_adj_mat(intrac, names, 1);

Cette fonction effectue aussi des permutations entre les noms de manire ce qu'ils soient classs dans l'ordre topologique. Une fois que nous avons l'ordre des noms, nous pouvons raliser la matrice d'adjacence inter-tranche de cette manire:
interc = {... 'LeftClr', 'LeftClr';

5 sur 9

23/10/2011 17:35

How to use BNT for DBNs

http://bnt.insa-rouen.fr/tutoriels/usage_dbn.html

'LeftClr', 'LatAct'; ... 'FBStatus', 'LatAct'}; inter = mk_adj_mat(interc, names, 0);

Pour faire rfrence un noeud, nous devons connatre son numro, qui peut tre obtenu avec l'exemple suivant :
obs = {'LeftClrSens', 'RightClrSens', 'TurnSignalSens', 'XdotSens', 'YdotSens', 'FYdotDiffSens', ... 'FclrSens', 'BXdotSens', 'BclrSens', 'BYdotDiffSens'}; for i=1:length(obs) onodes(i) = stringmatch(obs{i}, names); end onodes = sort(onodes);

(Nous classons les onodes puisque la plupart des fonctions de BNT supposent que leurs arguments sont classs de manire ordonne.) Nous pouvons maintenant construire le DBN:
dnodes = 1:ss; ns = 2*ones(1,ss); % binary nodes bnet = mk_dbn(intra, inter, ns, 'discrete', dnodes);

Pour dtailler les paramtres, nous devons connatre l'ordre des parents. Allez voir la fonction BNT/general /mk_named_CPT afin de trouver un moyen de le faire dans le cas des noeuds "tabular". Pour simplifier nous gnrerons des paramtres alatoires:
for i=1:2*ss bnet.CPD{i} = tabular_CPD(bnet, i); end

Une version complte de cet exemple est accessible dans BNT/examples/dynamic/bat1.m. Infrence Le problme gnral de l'infrence pour les DBN est le calcul de P(X(i,t0) | Y(:, t1:t2)), o X(i,t) reprsente la ime variable cache au temps t et Y(:,t1:t2) reprsente toutes les vidences entre les temps t1 et t2. Il y a plusieurs cas intressants, ils sont illustrs ci-dessous. La flche indique t0: c'est X(t0) que nous tentons d'estimer. Les rgions ombres correspondent t1:t2, les donnes fournies.

Actuellement, BNT ne peut grer que le offline smoothing (Le moteur des HMM supporte aussi le filtrage et, jusqu' un certain point, la prediction). Son utilisation est similaire aux moteurs d'infrence statiques, except qu' prsent l'vidence est un cell-array 2D de taille ss*T, o ss est le nombre de noeuds par tranche (ss = slice size) et T est le nombre de tranche. Par consquent, 'marginal_nodes' prends deux arguments, les noeuds et les tranches

6 sur 9

23/10/2011 17:35

How to use BNT for DBNs

http://bnt.insa-rouen.fr/tutoriels/usage_dbn.html

temporelles. Par exemple, pour calculer P(X(i,t) | y(:,1:T)), il faut procder comme suit (o onodes sont les indices des noeuds observs dans chaque tranche, correspondant y):
ev = sample_dbn(bnet, T); evidence = cell(ss,T); evidence(onodes,:) = ev(onodes, :); % Toutes les cellules aprs onodes sont vides [engine, ll] = enter_evidence(engine, evidence); marg = marginal_nodes(engine, i, t);

Noeuds cachs discrets Si tous les noeuds cachs sont discrets, nous pouvons utiliser l'algorithme junction tree pour effectuer l'infrence. L'approche la plus simple, jtree_unrolled_dbn_inf_engine, droule le DBN en un rseau statique et applique jtree; Toutefois, pour de longues squences, cela peut-tre trs lent et peut amener des problmes numriques. Une meilleure approche consisterait appliquer l'algorithme jtree chaque couple de tranches voisines pour un temps donn; Ceci est implment dans jtree_dbn_inf_engine. Un DBN peut tre transform en un HMM si tous ses noeuds cachs sont discrets. Dans ce cas, nous pouvons utiliser hmm_inf_engine. Cette fonction est plus rapide que jtree pour de petits modles du fait que les facteurs constants de l'algorithme sont plus petits, mais peut tre exponentiellement plus lente pour des modles avec beaucoup de variables (par exemple, > 6 noeuds binaires cachs). L'utilisation des deux fonctions jtree_dbn_inf_engine et hmm_inf_engine la fois n'est pas recommand. Une meilleure approche consisterait construire un moteur plus souple autre que les moteurs de bas-niveau, qui implmente des oprateurs forward/backward. Vous pouvez crer ces moteurs comme suit : engine = smoother_engine(hmm_2TBN_inf_engine(bnet));
ou

engine = smoother_engine(jtree_2TBN_inf_engine(bnet)); Vous pouvez prsent les appeller avec la manire habituelle :
engine = enter_evidence(engine, evidence) m = marginal_nodes(engine, nodes, t);

Note: Vous devez dclarer les noeuds observs dans le rseau avant d'utiliser hmm_2TBN_inf_engine. Malheureusement, lorsque tous les noeuds cachs sont discrets, le calcul de l'infrence exacte est de l'ordre de O(2^n), o n est le nombre de noeuds cachs par tranche, mme si le modle n'est pas dense. La raison en est simple: deux noeuds deviennent corrls, mme s'il n'y a pas de relation directe entre eux dans le 2TBN, du fait qu'ils ont partag le mme anctre par le pass. Par consquent nous devons utiliser des approximations. Un algorithme clbre d'infrence approche pour les DBN discrets, connu sous le nom de BK, est expliqu ici : Tractable inference for complex stochastic processes , Boyen and Koller, UAI 1998 Approximate learning of dynamic models, Boyen and Koller, NIPS 1998. Cela approxime l'tat de croyance avec un produit marginal sur des sous-ensembles donns de variables. Par exemple, dans Water network, nous devrions utiliser les sous-ensembles suivants :
engine = bk_inf_engine(bnet, { [1 2], [3 4 5 6], [7 8] });

Ce moteur peut-tre utilis tout comme le jtree engine. Deux cas particuliers de l'algorithme BK sont grs : 'ff' (fully factored) qui signifie que chaque noeud est considr comme un sous-ensemble, et 'exact' qui signifie qu'on considre un seul ensemble, qui contient la tranche entire. Ils peuvent tre crs de cette faon :
engine = bk_inf_engine(bnet, 'ff'); engine = bk_inf_engine(bnet, 'exact');

Une implmentation de l'algorithme BK-FF but pdagogique utilisant un HMM au lieu de junction tree est disponible avec bk_ff_hmm_inf_engine.

Noeuds cachs continus Si tous les noeuds cachs sont linaires-gaussiens, et que les noeuds observs sont linaires-gaussiens, le modle est un systme dynamique linaire (LDS). un DBN peut tre transform en LDS si tous ses noeuds cachs sont

7 sur 9

23/10/2011 17:35

How to use BNT for DBNs

http://bnt.insa-rouen.fr/tutoriels/usage_dbn.html

linaires-gaussiens et qu'il sont tous persistants. Dans ce cas, vous pouvez utiliser kalman_inf_engine. Pour des modles linaires-gaussiens plus gnraux, vous pouvez utiliser jtree_dbn_inf_engine ou jtree_unrolled_dbn_inf_engine. Pour des systmes non-linaires avec un bruit gaussien, le filtre de Kalman Unscented Kalman (UKF), que nous devons Julier et Uhlmann, et de loin suprieur tous les filtres de Kalman tendus (EKF) connus, aussi bien en thorie qu'en pratique. l'ide de base de l'UKF est qu'il est plus facile d'estimer une distribution gaussienne partir d'un ensemble de points que d'approcher une fonction non-linaire arbitraire. Nous commenons avec les points qui sont une distance de plus ou moins sigma de la moyenne pour chaque dimension, pour les transformer travers la non-linarit, et ajuster une gaussienne ces points. (Pas besoin de calculer les Jacobiens, contrairement l'EKF!) Pour les systmes avec un bruit non-gaussien, je recommande d'utiliser le filtrage de particules (PF), qui est une clbre technique de Monte Carlo squentielle. l'EKF peut tre utilis pour proposer des distribution un PF. Ce regroupement de fonction donne des rsultats meilleurs que les deux fonctions spares. Allez voir The Unscented Particle Filter, par R van der Merwe, A Doucet, JFG de Freitas et E Wan, May 2000. Le code Matlab de l'UPF est aussi disponible. Note: aucune de ces fonctionnalits ne fait partie de BNT.

Apprentissage L'apprentissage des DBN peut tre effectu "online" ou "offline". Actuellement seul l'apprentissage offline est implment dans BNT. Apprentissage de paramtres L'apprentissage des paramtres offline est trs similaire l'apprentissage dans les rseaux statiques, except qu' prsent les donnes d'apprentissage sont un cell-array de cell-array 2D. Par exemple, cases{l}{i,t}est la valeur du noeud i dans la tranche t lors de la sequence l, ou [] si la donne est manquante (non-observe). Chaque squence peut tre de taille diffrente, et peut avoir des valeurs manquantes des endroits diffrents. Il s'agit d'un fragment de code typique o l'on peut utiliser EM.
ncases = 2; cases = cell(1, ncases); for i=1:ncases ev = sample_dbn(bnet, T); cases{i} = cell(ss,T); cases{i}(onodes,:) = ev(onodes, :); end [bnet2, LLtrace] = learn_params_dbn_em(engine, cases, 'max_iter', 10);

Si le noeud observ est un vecteur de valeurs stock sous la forme d'un tableau de dimension OxT, vous devez affecter chaque vecteur une seule cellule, comme dans l'exemple ci-dessous :
data = [xpos(:)'; ypos(:)']; ncases = 1; cases = cell(1, ncases); onodes = bnet.observed; for i=1:ncases cases{i} = cell(ss,T); cases{i}(onodes,:) = num2cell(data(:,1:T), 1); end

Pour un listing du code complet dcrivant l'application de l'algorithme EM sur un simple DBN, cliquez ici. Apprentissage de structure Actuellement il n'existe qu'un seul algorithme d'apprentissage de structure pour les DBN. Il suppose que tous les noeuds sont discrets et sont observs, et qu'il n'y a pas de connexion intra-tranche. Par consquent nous pouvons trouver l'ensemble optimal de parents pour chaque noeud sparment, sans se soucier des cycles ou de l'ordre des noeuds. La fonction est appell comme suit :
inter = learn_struct_dbn_reveal(cases, ns, max_fan_in, penalty)

Un exemple complet est disponible ici : BNT/examples/dynamic/reveal1.m. Affecter le terme de pnalit 0 nous renvoie le modle possdant le maximum de vraisemblance; cela revient maximiser l'information mutuelle entre les parents et les enfants (dans la communaut bioinformatique, cet

8 sur 9

23/10/2011 17:35

How to use BNT for DBNs

http://bnt.insa-rouen.fr/tutoriels/usage_dbn.html

algorithme est connu sous le nom de REVEAL). une pnalit qui n'est pas zro correspond l'utilisation d'un critre BIC, ce qui diminue les possibilits de sur-apprentissage. Dirk Husmeier a tendu sa selection de modle MCMC aux DBNs Auteurs Date de mise jour : 18 Dcembre 2007

9 sur 9

23/10/2011 17:35