Markov in Dub - Nicolas de DREUILLE
Transcription
Markov in Dub - Nicolas de DREUILLE
UV Libre Markov in Dub Markov in Dub Nicolas de Dreuille Juin 2002 Remerciements Henri MAZUE, Carlos TEIXERA, Bénédicte RINALDI, Marie SOYEUX, Vincent LORIMY UV Libre Markov in Dub Sommaire REMERCIEMENTS ............................................................................................................................................ 1 INTRODUCTION : .............................................................................................................................................. 3 DU DUB A MARKOV :........................................................................................................................................ 3 LES MODELES DE MARKOV :........................................................................................................................ 5 LES CHAINES DE MARKOV DISCRETES :............................................................................................................... 6 Présentation du modèle :............................................................................................................................... 6 Apprentissage et vraisemblance :.................................................................................................................. 6 Conclusion : .................................................................................................................................................. 7 LES MODELES DE MARKOV CACHES A OBSERVATIONS DISCRETES [3]: ............................................................... 8 Présentation du modèle :............................................................................................................................... 8 Apprentissage et problèmes liés : .................................................................................................................. 8 Evaluation : ................................................................................................................................................................ 9 Explication : ............................................................................................................................................................. 10 Apprentissage : ......................................................................................................................................................... 11 Conclusion : ................................................................................................................................................ 12 LES MODELES DE MARKOV CACHES FACTORIELS [4]: ....................................................................................... 13 Présentation du modèle :............................................................................................................................. 13 Apprentissage et problèmes liés : ................................................................................................................ 14 Algorithme général :................................................................................................................................................. 14 Calcul exact lors de l’étape E : ................................................................................................................................. 14 Echantillonnage de Gibbs :....................................................................................................................................... 14 Mean field approximation : ...................................................................................................................................... 15 L’approximation structurée : .................................................................................................................................... 16 Etape M : .................................................................................................................................................................. 17 Conclusion : ................................................................................................................................................ 17 CONCLUSION SUR LES MODELES :...................................................................................................................... 19 IMPLEMENTATION ........................................................................................................................................ 19 PRETRAITEMENT DES DONNEES :....................................................................................................................... 19 IMPLEMENTATION EN MATLAB : ....................................................................................................................... 20 Prétraitement :............................................................................................................................................. 20 Apprentissage :............................................................................................................................................ 20 Chaînes de Markov : ............................................................................................................................................ 20 Modèle de Markov caché : ....................................................................................................................................... 21 Vraisemblance :........................................................................................................................................... 21 Chaînes de Markov : ............................................................................................................................................ 21 Modèle de Markov caché : ....................................................................................................................................... 22 Distribution de probabilités du prochain symbole : .................................................................................... 22 Chaînes de Markov :................................................................................................................................................. 22 Modèle de Markov caché : ....................................................................................................................................... 22 Génération d’une séquence :....................................................................................................................... 23 Chaînes de Markov :................................................................................................................................................. 23 Modèle de Markov caché : ....................................................................................................................................... 23 TESTS SOUS MATLAB : ...................................................................................................................................... 25 Influence des différents paramètres............................................................................................................. 25 Ensemble de validation ?............................................................................................................................. 26 Génération de séquence............................................................................................................................... 27 IMPLEMENTATION EN JAVA :............................................................................................................................. 28 Diagrammes de classes ............................................................................................................................... 28 Avancement : ............................................................................................................................................... 29 CONCLUSION : ................................................................................................................................................. 30 BIBLIOGRAPHIE : ........................................................................................................................................... 31 Nicolas de Dreuille 2 UV Libre Markov in Dub Introduction : Les musiques électroniques font de nos jours de plus en plus appel à l’outil informatique, et ce à tous les stades de production ou presque. La structure répétitive de certaines d’entre elles renforce d’ailleurs cette impression d’intervention humaine quasiment absente dans le processus de développement. Nous nous sommes donc interrogés sur la possibilité d’une composition assistée par un ordinateur ou d’un apport d’une sorte d’"intelligence" à cette musique. Les modèles de Markov permettent justement de caractériser et même de simuler des séries temporelles auxquelles pourraient êtres assimilés ces morceaux. Après avoir présenté brièvement le cheminement de nos pensées jusqu’à cette idée, nous présenterons le modèle et tenterons de le tester sur un jeu de données de test à l’aide de MATLAB. Enfin, nous mettrons en place les bases d’une implémentation future en JAVA. Du dub à Markov : Au début du vingtième siècle, les noirs jamaïcains commencent de se battre pour l’abolition de l’esclavage dans leur pays, ils puisent dans leurs racines africaines et fondent le rastafarisme, qui peut être ressenti comme un moyen de résistance ethnique. Ils commencent alors de jouer le nyabinghi, mélange de percussions et de chants issu des réminiscences du folklore Africain ayant traversé l’atlantique. Quelques années plus tard ce style métissé aux divers courants musicaux en vogue tels que le calypso ou le rythm&blues donneront naissance au ska, puis au rock steady et enfin au fameux reggae au début des années soixante dix. A l’époque, les 45 tours sortent accompagnés d’une version instrumentale. Les "sound systems", sortes de discothèques mobiles en plein air sont alors les vecteurs médiatiques de cette musique. Un "selector" y diffuse ces fameuses "versions" sur lesquelles des "DJ" chantent les paroles originales ou improvisent. L’important était à l’époque de produire le son le plus impressionnant possible, c’est pourquoi les producteurs commencent à travailler les instrumentaux pour mettre en valeur les percussions et la basse. C’est la naissance du dub qui n’est donc à la base qu’un instrumental reggae un peu étoffé. En 1973/74, deux génies, King-Tubby et Lee "Scratch" Perry commencent à utiliser la stéréo ainsi que certains effets comme la distorsion la reverb l’écho. Le dub se tourne alors résolument vers l’expérimentation électronique. Dans les années 80, le phénomène est internationalisé, les effets se multiplient, les musiciens deviennent de véritables ingénieurs du son, alchimistes créant une synergie au sein de leurs machines. L’ère du tout numérique est amorcée et l’informatique commence à intervenir dans la production musicale. De nos jours, le dub, s’il a tendance à renouer avec ses racines instrumentales et exotiques, reste l’étalage de technologies que nous connaissons. Une musique syncopée où les samples jouent avec les effets, le tout rythmé des percussions puissantes menées par une ligne de basse ronde et envoûtante qu’agrémente encore souvent le contre-temps omniprésent cher au reggae. Ce qui est intéressant dans la genèse de ce style, c’est qu’elle s’est faite historiquement sur une quarantaine d’années, mais a évolué en termes de technologie à une vitesse prodigieuse. Ceci peut s’expliquer par le fait qu’il puise ses sources dans la musique Nicolas de Dreuille 3 UV Libre Markov in Dub traditionnelle africaine, que ses initiateurs soient très traditionalistes, et qu’il soit né à une époque à laquelle la médiatisation et l’avancée technologique on beaucoup fait progresser la musique. Ce constat amène une question : quelles pourront être les apports des dernières technologies ? On a déjà vu les home studio et un nombre sans cesse croissant de logiciels qui ont démocratisé la production musicale et rendu son traitement toujours plus facile, peut être ne lui manque-t-il que l’intelligence ? Or les techniques d’apprentissage popularisées sous le nom d’intelligence artificielle pourraient pallier à ce défaut. Imaginez qu’un compositeur puisse transmettre sa sensibilité à une machine… C’est ce que nous allons tenter d’étudier dans ce projet. L’approche est simple, les musiques électroniques telles que le dub la house ou même le hip hop sont souvent relativement répétitives, ce qui a fait naître l’idée de la découper en samples et de fournir un éditeur permettant d’organiser ces derniers afin de produire des morceaux. La gamme e-jay par exemple est l’outil le plus populaire permettant de réaliser ce type d’opération. On se souvient aussi du format de fichier mod qui permettait d’arranger des samples. Nous allons utiliser ce principe et tenter d’apprendre l’art et la manière d’arranger ces morceaux afin de le reproduire ensuite, tentant ainsi de créer un morceau de musique à "géométrie variable". A cette fin, nous devrons tout d’abord trouver un modèle mathématique permettant de réaliser cet apprentissage, et ensuite de générer une série temporelle. Nicolas de Dreuille 4 UV Libre Markov in Dub Les modèles de Markov : Comme nous l’avons dit précédemment, nous allons décomposer un morceau de musique en fragments que nous appellerons samples et nous designerons le descriptif de leur arrangement par un enregistrement. Celui-ci sera composé pour chaque granule de temps t, d’un vecteur d’entiers représentant l’indice du sample à jouer pour chaque voix, une voix pouvant être assimilée à un instrument. En termes de série temporelle, chacun des éléments de ces vecteurs sera assimilé à un symbole d’un alphabet défini au fur et à mesure de la lecture, et pourra être assimilés à un entier permettant de retrouver le symbole concerné. Nous nous restreindrons donc à l’étude d’un vecteur d’entiers soit une série temporelle discrète et partirons par ailleurs de l’hypothèse selon laquelle l’ensemble des samples joués à un instant, soit le symbole courant dépend de ceux joués avant. Notre enregistrement peut donc être traité à l’aide d’un outil simple : les chaînes de Markov. Morceau Nicolas de Dreuille Sample1 Sample3 Sample2 Sample4 Symbole 1, Symbole 2 Symbole 1 Symbole 2 Sample1 Sample3 Sample2 Sample4 5 UV Libre Markov in Dub Les chaînes de Markov discrètes d’ordre 1 : Présentation du modèle : Considérons un système pouvant être décrit à tout instant par un état parmi N distincts : S1 , S 2 … S N . Les transitions d’un état à un autre ou à lui même se font à intervalles réguliers dans le temps (t=1,2…) selon une distribution de probabilités liée aux états. Soit qt l’état courant. Une description probabiliste courante prendrait en compte tous les états précédents, mais dans une chaîne de Markov discrète d’ordre K, seuls les K ordres précédents sont pris en compte. P[qt = Sit qt −1 = S it −1 ,..., q1 = Si1 ] = P[qt = S it qt −1 = S it −1 ,..., qt − K = Sit − K ] (1) Notre étude porte sur les chaînes d’ordre 1, les chaînes d’ordres supérieurs pouvant être simulés en faisant des combinaisons de symboles. On a donc la distribution suivante des probabilités de transition : [ ] aij = P qt = S j qt −1 = S i , 1 ≤ i, j ≤ N D’où les propriétés suivantes : N aij ≥ 0, ∑ aij = 1 j =1 A ces probabilités de transition, on associe des probabilités d’émission : π i = P[q1 = S i ],1 ≤ i ≤ N Apprentissage et vraisemblance : L’apprentissage des chaînes de Markov se résume à un simple comptage, il suffit en effet de compter les émissions et les transitions en incrémentant par exemple les éléments d’un vecteur ayant la longueur de π et d’une matrice ayant les dimensions de a, puis de normaliser le vecteur et les lignes de la matrice. Soit O une séquence d’observation, on appelle la vraisemblance de O pour un Modèle que nous nommerons M P[O M ] . Soit par exemple O = S 3 , S 2 , S 2 , S1 on a P[O M ] = P[S 3 , S 2 , S 2 , S1 M ] = P[S3 ].P[S 2 S3 ].P[S 2 S 2 ].P[S1 S 2 ] Nicolas de Dreuille 6 UV Libre Markov in Dub P[O M ] = π 3 .a32 .a22 .a21 Conclusion : Les chaînes de Markov sont un modèle très simple, ce qui rend très facile l’implémentation, mais quelques problèmes se posent : la matrice utilisée a pour dimension le carré de la taille de l’alphabet, si celui ci est important, la matrice peut donc être énorme et relativement vide. Mais le problème principal ne se situe pas au niveau de l’implémentation, ce modèle est un peu réducteur pour être appliqué à un tel problème. Tentons donc d’appliquer un modèle un peu plus complexe. Nicolas de Dreuille 7 UV Libre Markov in Dub Les modèles de Markov cachés à observations discrètes d’ordre 1 [3]: Présentation du modèle : Les modèles de Markov cachés étendent le concept des chaînes dans la mesure ou l’observable est une fonction d’états cachés, eux même régis par une chaîne de Markov, ce qui revient à dire que l’organisation paramétrée est un phénomène sous-jacent non connu dont dépendent les séquences observées. Soit N le nombre d’états cachés que nous noterons S = {S1 , S 2 ,..., S N } et qt l’état caché courant. Soit M le nombre de symboles observables par état, nous noterons ces symboles V = {V1 ,V2 ,...,VM } . On a donc la distribution suivante des probabilités de transition entre états cachés : [ ] aij = P qt +1 = S j qt = S i , 1 ≤ i, j ≤ N La distribution des probabilités des observables sera la suivante : [ ] b j (k ) = P vk qt = S j , 1 ≤ i, j ≤ N Les probabilités d’émission : π i = P[q1 = Si ],1 ≤ i ≤ N Soit T le nombre d’observations d’une séquence on la notera O = O1 , O2 ,..., OT . Le modèle est donc défini par λ = ( A, B, π ) Apprentissage et problèmes liés : Nicolas de Dreuille 8 UV Libre Markov in Dub Soit T le nombre d’observations d’une séquence on la notera O = O1 , O2 ,..., OT . Avant de commencer à penser à l’apprentissage, il nous faut répondre à deux problèmes classiques des HMM, soit : • L’évaluation où l’on cherche à déterminer la vraisemblance d’une séquence, soit P[O λ ] • L’explication où l’on cherche à déterminer la meilleure séquence ayant pu mener à une séquence soit Q = q1 , q2 ,..., qT telle que P[Q O, λ ] soit maximal. Ensuite seulement on pourra passer à l’apprentissage, soit l’ajustement du modèle afin de maximiser P[O λ ] . Evaluation : En principe, le calcul de P[O λ ] reviendrait à effectuer la somme sur toutes les séquences Q de longueur T de P[O, Q λ ] = P[O Q, λ ]P[Q λ ] avec P[O, Q λ ] = ∏ P[Ot , Qt λ ] = bq1 (O1 )...bqT (OT ) T t =1 et P[O, Q λ ] = π q1 a q1q2 ...a qT −1qT Ce calcul a pour complexité de 2TN T opérations, ce qui est très vite incalculable. Heureusement, l’algorithme forward-backward permet un calcul beaucoup plus rapide. Soit la variable forward α (i ) = P (O1 ,..., Ot , qt = S i λ ) soit la probabilité de la séquence partielle O1 ,..., Ot et de l’état Si au temps t d’après un modèle λ . Nous pouvons la calculer de manière récursive et ainsi arriver à nos fins comme suit : • Initialisation : α1 (i ) = π i bi (O1 ) , 1 ≤ i ≤ N • N Récurrence : α t +1 ( j ) = ∑ α t (i )aij b j (Ot +1 ) , 1 ≤ t ≤ T − 1 , 1 ≤ j ≤ N j =1 • Finalement, on a P[O λ ] = ∑α T (i ) N i =1 De la même façon la variable backward β (i ) = P (Ot +1 ,..., OT , qt = S i λ ) soit la probabilité de la séquence partielle restante Ot +1 ,..., OT et de l’état Si au temps t d’après un modèle λ . Nous pouvons la calculer de manière récursive et ainsi arriver à nos fins comme suit, ce qui s’avérera utile par la suite : • Initialisation : β T (i ) = 1 , 1 ≤ i ≤ N • Récurrence : β t (i ) = ∑ aij b j (Ot +1 ) β t +1 ( j ) , T = T − 1, T − 2...1 , 1 ≤ i ≤ N N j =1 Nicolas de Dreuille 9 UV Libre Markov in Dub • Finalement, on a P[O λ ] = ∑ P[α ]β (i ) N i =1 t t La complexité de ces algorithmes n’est que de TN 2 ce qui explique leur utilisation par rapport au calcul précédent. Explication : Ce problème est plus complexe que l’évaluation dans la mesure où l’on ne cherche pas à obtenir un résultat exact, mais optimal. En effet plusieurs chemins existent en général qui permettent d’obtenir une séquence d’observables, on va donc chercher celle dont la probabilité est maximale. Il n’est naturellement pas question de parcourir tous les chemins afin de calculer leur probabilité, une solution naïve consisterait à déterminer les états les plus vraisemblables individuellement. α (i) β t (i) α (i) β t (i) γ t (i) = P(qt = S i O, λ ) = t = N t P(O λ ) ∑α t ( j)β t ( j) j =1 P (O λ ) est un facteur de normalisation permettant que γ t (i ) soit une probabilité telle que N ∑γ i =1 t (i ) = 1 on a donc qt = arg max[γ t (i )] , 1 ≤ t ≤ T 1≤i ≤ N Cette méthode maximise le nombre d’états corrects, mais pose quelques problèmes à cause du mode de sélection individuel sans prendre en compte la vraisemblance de la séquence obtenue. Par exemple, si certaines transitions sont impossibles, on pourrait se retrouver avec une séquence ayant cette transition. Il faut donc trouver un meilleur critère d’optimalité, soit vraiment maximiser P[Q O, λ ] ou P[Q, O λ ] ce qui est équivalent. L’algorithme de Viterbi permet d’effectuer cette opération : δ t (i ) = max P(q1 ,..., qt = i, O1 ,..., Ot λ ) q1 ,..., qt −1 δ t (i ) étant la plus grande probabilité le long d’un chemin donné au temps t pour les t dernières observations et s’arrêtant au temps Si. On a donc δ t +1 ( j ) = max δ t (i )aij .b j (Ot +1 ) i On en déduit l’algorithme suivant sachant que l’on ne cherche pas des probabilités mais un chemin qui sera stocké dans la variable ψ t ( j ) : • • Initialisation : δ1 (i ) = π i .bi (O1 ) , 1 ≤ i ≤ N ψ 1 (i ) = 0 Récurrence : δ t ( j ) = max δ t −1 (i )aij .b j (Ot ) , 2 ≤ t ≤ T , 1 ≤ j ≤ N [ ψ ( j ) = arg max[δ (i )a ]. 1≤i ≤ N t Nicolas de Dreuille 1≤i ≤ N t −1 ] ij 10 UV Libre Markov in Dub • Finalement, on a P * = max[δ T (i )] * T q 1≤i ≤ N = arg max[δ T (i )] 1≤i ≤ N et on retrouve le chemin avec qt* = ψ t +1 (qt*+1 ) , t=T-1,T-2,…,1 Nous avons maintenant tous les outils qui nous permettront de réaliser l’apprentissage. Apprentissage : Il nous faut maintenant ajuster λ afin de maximiser la vraisemblance de l’observable. Il n’existe pas de solution analytique connue permettant de réaliser cette opération, mais on peut cependant maximiser localement P[O λ ] , ce qui peut être réalisé par l’algorithme de Baum-Welch, une méthode EM (expectation modification). Soit ξ t (i, j ) = P(qt = S i , qt +1 = S j O, λ ) la probabilité d’être à l’état Si à t et à Sj à t+1 sachant le modèle, ξ t (i, j ) = P (qt = S i , qt +1 = S j , O λ ) P(O λ ) α t (i )aij b j (Ot +1 )β t +1 ( j ) = N N ∑∑α (i )a b (O )β ( j ) i =1 j =1 t ij j t +1 t +1 N On obtient donc γ t (i ) = ∑ ξ t (i, j ) j =1 Si l’on somme γ t (i ) sur t=1…T-1, on obtient une quantité qui peut être assimilée au nombre de fois où l’état Si est visité. De la même façon si l’on somme ξ t (i, j ) su t=1…T-1 on une quantité pouvant être assimilée au nombre de transitions entre Si et Sj. On peut ainsi réestimer les paramètres du modèle. π i = γ 1 (i) T −1 aij = ∑ ξ (i, j ) t =1 T −1 t ∑γ t t =1 T −1 (i ) ∑ γ t (i ) b j (k ) = t =1 Ot =vk T −1 ∑γ t =1 t (i ) Il a été prouvé par Baum et ses collègues, que λ est plus probable que λ au sens où P O λ > P[O λ ] , on tend donc vers une solution optimale. [ ] Ces mêmes personnes ont aussi démontré que la maximisation auxiliaire de Baum, soit Q (λ , λ ) = ∑ P(Q O, λ )log P O, Q λ [( )] de la fonction Q Il nous faut donc itérer cette opération jusqu’à une condition d’arrêt qu’il nous reste à déterminer. C’est une méthode de maximum de vraisemblance. Il est tout de même important Nicolas de Dreuille 11 UV Libre Markov in Dub de savoir que cet algorithme ne mène qu’à un maximum local sur une surface d’optimisation relativement complexe. Conclusion : Ce modèle, s’il est beaucoup plus élaboré que les chaînes de Markov, peut encore sembler limité dans la mesure où le phénomène étudié, soit un morceau de musique sur plusieurs voix, peut sembler plus complexe. On peut en effet considérer que si le thème principal peut être assimilé à un fil directeur, chaque voix influence le morceau différemment. Or de récentes recherches ont mis en évidence le problème de découvrir des causes multiples indépendantes influençant des données. Les HMM Factoriels font partie de ces recherches. Nicolas de Dreuille 12 UV Libre Markov in Dub Les modèles de Markov cachés factoriels [4]: Présentation du modèle : Les modèles de Markov cachés factoriels se différencient des HMM classiques par le fait que chaque observable est déterminé par plusieurs états cachés. On a donc des états cachés de la forme qt = qt(1) ,..., qt( m ) ,...qt( M ) , chacun pouvant prendre K (m ) valeurs, pour plus de simplicité, on se restreindra à K (m ) = K , ∀m . Sachant que les probabilités de transition P (qt qt −1 ) devraient être définies pour les K M combinaisons des variables qt( m ) , l’absence de contraintes sur les structures de transitions nous amènerait donc à une matrice de transitions en K M * K M , ce qui n’est pas intéressant pour deux raisons : d’une part ça reviendrait à étudier un HMM de K M états, d’autre part, il est très peu probable d’arriver à apprendre une structure complexe entre les états cachés du fait des interactions totalement libres et de la complexité des algorithmes qui permettraient de le faire exponentiels en K. Nous nous concentrerons donc sur un HMM factoriel dont les états cachés sont contraints, et considérerons donc une structure où les états sont indépendants. M ( P (qt qt −1 ) = ∏ P qtm qtm−1 m =1 ) On arrive ainsi à M matrices de transition K*K On remarque sur la figure que la probabilité d’émission dépend de toutes les variables d’états cachés. Ce qui peut se traduire pour des observations continues par l’hypothèse qu’elles suivent une distribution gaussienne dont la moyenne est déterminée par une fonction linéaire des variables d’états cachés. Représentons donc chaque état caché par un vecteur de dimension K de valeur 1 sur une position et 0 sur les autres. On a alors Nicolas de Dreuille 13 UV Libre Markov in Dub ' M M 1 (m) m −1 P (vt qt ) ∝ exp − vt − ∑W qt C vt − ∑W ( m ) qtm m =1 m =1 2 où W ( m ) sont les contributions à la moyenne de chaque variable d’état caché, et C la matrice de Covariance. Apprentissage et problèmes liés : Algorithme général : L’algorithme d’apprentissage des FHMM est un algorithme EM comme celui de Baum-Welch. Tout d’abord, il nous faut définir la vraisemblance logarithmique espérée des données complètes, soit l’observable et les états cachés. Q φ new ,φ = E log P Q, O φ new φ , O avec φ = W ( m ) , π ( m ) , P ( m ) , C et π ( m ) = P q1( m ) , ( ( ) { [( )] } ) { } ( ) P ( m ) = P qt( m ) qt(−m1) . L’étape E consiste à développer Q à l’aide des équations précédentes. En utilisant . comme abréviation de E{.φ , O}, on trouve que Q peut être exprimé sous forme d’une fonction de trois types de probabilités sur les variables d’états cachés qt(m ) qt(−m1) qt( m )' . On remarque que selon les notations des HMM, qt( m ) qt( n )' et qt( m ) correspond à γ t et qt(−m1) qt( m )' à ξ t alors que qt( m ) qt( n )' n’a pas d’équivalent. L’étape M utilise ces hypothèses pour maximiser Q, Dempster et al. (1977), en utilisant l’inégalité de Jensen, ont montré que chaque itération des étapes E et M augmente la vraisemblance P (O φ ) jusqu’à convergence en un maximum local. L’étape M comme pour les HMM, est relativement simple et calculable, mais le problème se pose surtout au niveau de l’étape E. Calcul exact lors de l’étape E : Un algorithme naïf de calcul exact de l’étape existe, mais il consiste à transformer le FHMM en un HMM à K M états sur lequel on utilise l’algorithme forward-backward. Il a donc une complexité en O TK 2 M . Ce problème est dû à la nature coopérative du modèle. ( ) Echantillonnage de Gibbs : Plutôt que de calculer les probabilités à posteriori exactes, on peut les approximer en utilisant une procédure d’échantillonnage, et ainsi éviter une somme sur le nombre exponentiel de modèles d’états cachés, quitte à perdre un peu en précision. Une des plus simples est l’échantillonnage de Gibbs. Pour une séquence O de longueur T, la procédure commence par établir une séquence Q aléatoire. Ensuite à chaque t, chaque vecteur d’états cachés est mis à jour stochastiquement selon ses distributions de probabilité fondées sur tous les autres vecteurs d’états cachés. Nicolas de Dreuille 14 UV Libre Markov in Dub ( { } qt( m ) ~ P qt( m ) qt( n ) : n ≠ m , qt( m ) , vt ,φ ) Une fois les variables d’états cachés échantillonnées, on a réestimé Q. La séquence des Q après chaque itération définit une chaîne de Markov sur l’espace des états du modèle, qui, si les probabilités sont toutes non nulles, doit converger vers les probabilités à posteriori des états par rapports aux observations. Ainsi, après un nombre à définir d’itérations, les échantillons de la chaîne de Markov peuvent être considérés comme approximant les probabilités postérieures. Les statistiques nécessaires pour calculer qt(m ) qt( m ) qt( n )' et qt(−m1) qt( m )' seront collectées en utilisant les états visités et les probabilités estimées pendant la procédure. Le problème de l’échantillonnage est qu’il est difficile de réellement diagnostiquer la convergence. Mean field approximation : Voici une deuxième approximation des probabilités à posteriori des états cachés à la fois calculable et déterministe. L’idée est d’approximer la distribution à posteriori P par une distribution calculable Θ . Toute distribution approximante du type Θ(Q O ) fournit une borne inférieure sur la vraisemblance qui peut être utilisé pour un algorithme d’apprentissage efficace, ce qui est facile à démontrer. D’après l’inégalité de Jensen, on peut dire que log P(O ) = log ∑ P(Q, O ) Q P(Q, O ) = log ∑ Θ(Q O ) Q Θ(Q O ) P(Q, O ) ≥ ∑ Θ(Q O )log Q Θ(Q O ) La différence entre cette limite et la vraisemblance logarithmique étant donnée par la divergence de Kullback-Liebler : P(Q, O ) KL(Θ P ) = ∑ Θ(Q O )log Q Θ(Q O ) On choisit donc l’approximation la plus simple pour laquelle les variables d’état sont indépendantes. T ( M Θ(Q θ ) = ∏∏ Θ qt( m ) θ t( m ) { } t =1 m =1 ) les paramètres θ = θ tm étant les moyennes des variables d’état. ( ) Θ qt( m ) θ t( m ) = θ t( m ) Cette approximation est connue sous le nom de "mean field approximation" que l’on calcule avec Nicolas de Dreuille 15 UV Libre Markov in Dub θ t( m ) new = ϕ {W ( m ) ' C −1 (v t − vˆ t ) + W ( m ) ' C −1W ( m )θ t( m ) − 12 ∆( m ) + (log P ( m ) )θ t(−m1 ) + (log P ( m ) )'θ t(+m1) } M avec vˆ t = ∑W ( l )θ t( l ) l =1 ∆( m ) est le vecteur des éléments diagonaux de W ( m ) ' C −1W ( m ) , et ϕ {X } = exp{X i } ∑ exp{X i } i est la non linéarité softmax qui permet une normalisation exponentielle à la somme de 1. Chaque vecteur d’état caché est mis à jour avec une complexité en O(TKM) par itération. La convergence est déterminée par l’observation de la divergence de KullbackLiebler, en pratique elle est très rapide (2 à 10 itérations). Une fois la convergence atteinte, les paramètres de l’étape E sont facilement obtenus : qt( m ) = θ tm qt( m ) qt( n )' = θ tmθ tm−1 ' q (m) t −1 q ( m )' t θ t( m )θ t( n ) ' , m ≠ n = diag θ t( m ) , m = n { } L’approximation structurée : L’approximation précédente partait de l’hypothèse selon laquelle les variables d’état étaient complètement indépendantes, ce qui est une supposition assez extrême. L’approximation structurée reste calculable, mais conserve une plus grande partie de la structure originale. Le HMM factoriel est ici approximé par M HMM distincts au sein desquels l’inférence est implémentée à l’aide de l’algorithme forward backward. Cette structure offre aussi une borne inférieure sur la vraisemblance logarithmique. On utilisera l’approximation suivante : M ( Θ(Q θ ) = ∏ Θ q1( m ) θ m =1 )∏ Θ(q T (m) t t =2 qt(−m1) ,θ ) où Θ(q1( m ) θ ) = π ( m ) h1( m ) ( ) ( ) Θ qt( m ) qt(−m1) ,θ = P qt( m ) qt(−m1) ,φ ht( m ) = P ( m ) ht( m ) Les paramètres de cette distribution sont θ = {π ( m ) , P ( m ) , ht( m ) } les probabilités d’émission et de transition des états cachés, et un biais variant dans le temps pour chaque variable. De la même façon qu’auparavant, on obtient ht( m ) new ∝ exp W ( m ) ' C −1 (v t − vˆ t ) + W ( m ) ' C −1W ( m ) qt( m ) − 12 ∆( m ) { } M avec vˆ t = ∑W (l ) qt(l ) l =1 ( m) t Le paramètre h obtenu est l’entrée des variables d’état qt( m ) dans le HMM m. Son utilisation permet de recalculer qt(m ) grâce à l’algorithme forward-backward, qui sert donc ici à minimiser la divergence de Kullback-Liebler. Nicolas de Dreuille 16 UV Libre Markov in Dub Etape M : Une fois une de ces méthodes choisie, il faut effectuer l’étape de maximisation. A cette fin, il nous faut tout d’abord développer Q. T M M M Θ = − 12 ∑ vt ' C −1vt − 2∑ vt ' C −1W ( m ) qt( m ) + ∑∑ tr W ( m ) C −1W ( m ) qt( m ) qt( n ) t =1 m =1 m =1 n =1 { M T M {( } } ) + ∑ q1( m ) ' log π ( m ) + ∑∑ tr log P ( m ) qt(−m1) qt( m ) ' − log Z m =1 t = 2 n =1 où Z est un terme de normalisation indépendant des états et observations permettant d’avoir une somme de probabilités égale à un. Pour maximiser cette quantité, il nous faut annuler sa dérivée par rapport au paramètre à réestimer : T ∂Θ M (n) (n) (m) = W qt qt ' − vt qt( m ) ' = 0 . ∑ ∑ (m) ∂W t =1 n =1 On obtient donc h W new T T = ∑ vt qt ' ∑ qt qt ' , t =1 t =1 où h signifie le pseudo inverse de Moore-Penrose. De la même façon on obtient π ( m ) new = q1( m ) T Pi ,new j = ∑ qt(,mi ) qt(−m1)', j t =1 T ∑ t =1 qt(−m1)', j Finalement pour réestimer la covariance, il faut dériver par rapport à C −1 T 1 1 M M ( n) (n) ( m) ∂Θ M (m) (m) 1 C v q ' W ' v v ' W qt qt ' W ( m ) ' . = + − − ∑ ∑ ∑∑ t t t t 2 −1 2 2 m=1 n=1 ∂C t =1 m =1 On obtient donc M T M C new = ∑ vt vt '−∑∑W ( m ) qt( m ) vt ' m =1 t =1 m =1 On note que pour M=1, cet algorithme est équivalent à celui de Baum-Welch. Conclusion : Si le FHMM semble beaucoup plus intéressant que le simple HMM autant en termes de capacité d’apprentissage que de vitesse, il reste un problème à résoudre. En effet, il a été présenté pour des observations continues suivant une distribution gaussienne, or, nous Nicolas de Dreuille 17 UV Libre Markov in Dub disposons de données discrètes et rien ne nous permet d’affirmer que leur distribution sera gaussienne. Le modèle peut être généralisé pour gérer ce type d’observations, mais on se heurte alors à différents problèmes : Si l’on tente de modéliser les probabilités d’émission sous forme d’une matrice, elle sera de dimension D* K M ce qui n’est pas concevable. Il existe des méthodes d’approximation de cette matrice, mais elles compliquent l’algorithme EM . Le HMM factoriel ne pourra donc pas être utilisé dans le cadre de cette étude. Nicolas de Dreuille 18 UV Libre Markov in Dub Conclusion sur les modèles : Comme nous venons de voir, deux des modèles présentés seulement sont applicables à l’apprentissage de nos données : • Les chaînes de Markov, qui constituent un modèle simple et facile à mettre en œuvre, mais au pouvoir d’apprentissage limité par sa simplicité • Les modèles de Markov cachés qui sont un peu plus difficiles à appréhender et à mettre en œuvre mais semblent pouvoir offrir un apprentissage plus poussé. Le modèle que nous choisirons est destiné à pouvoir fonctionner sur un nombre raisonnable de données d’apprentissage, l’utilisateur ne pouvant raisonnablement pas fournir beaucoup plus de 50 enregistrements. Nous effectuerons donc des tests sur un jeu de donnée typique afin de déterminer la légitimité de chaque modèle. Il pourrait par ailleurs être intéressant de travailler sur des modèles d’ordre k supérieur à 1, soit dépendant des k derniers évènements. Implémentation Prétraitement des données : Comme nous l’avons vu, les données originales peuvent être assimilées à une matrice d’entiers de largeur le nombre de voix que nous nommerons Nv, et de longueur le nombre d’enregistrements * leurs longueurs respectives. Nous avons ensuite transformé cette matrice en vecteur d’entiers en considérant chaque ligne comme un symbole d’un dictionnaire à définir. Naïvement, nous aurions pu considérer le dictionnaire comme l’ensemble des combinaisons de Nv entiers, ce qui aurait constitué un dictionnaire en puissance Nv. Mais comme on peut considérer que les symboles non visités par les observables auront une probabilité d’apparition nulle, on peut limiter le dictionnaire aux seuls symboles apparaissant dans le jeu de données. Par ailleurs nous avons vu pour les chaînes de Markov que la simulation d’un ordre K>1 se faisait par combinaison des symboles, nous construirons donc à cette fin chaque symbole en concaténant le symbole courant aux k-1 symboles précédents. Nous pourrons aussi tester cette méthode pour les HMM sans toutefois pouvoir affirmer qu’il s’agit d’un HMM d’ordre K car cette "mémoire" n’est définie que sur les observables. Nous avons maintenant des données utilisables par les modèles présentés précédemment, nous pouvons donc tester nos algorithmes sous Matlab. Nicolas de Dreuille 19 UV Libre Markov in Dub Implémentation en Matlab : Afin de réaliser des tests sur les modèles, nous devons tout d’abord implémenter le prétraitement et l’apprentissage, mais aussi quelques fonctions destinées à évaluer la qualité de cet apprentissage : • La vraisemblance logarithmique d’une séquence O soit − log(P[O Modèle]) permettra d’évaluer la vraisemblance d’une séquence. Plus celle ci est proche de zéro, plus le modèle est apte à produire la séquence • La distribution de probabilités du prochain symbole émis suivant une séquence donnée afin d’éprouver plus facilement l’adéquation avec nos données. • La génération de séquence qui est le produit final et qui nous permettra de voir dans quelle mesure nos modèles sont aptes à produire une séquence convenable. Prétraitement : % ========================================================================= % Markov in dub, prétraitement des données % % En entrée : X, les données brutes % ordre, l'ordre simulé qui entraine la concaténation de symboles. % % En sortie : Xfin les données formattées en vecteurs d'entiers contenus dans un Cell-Array % alphabet l'alphabet des symboles, matrice dont chaque colonne est un symbole repéré par son n° de colonne % Nalphabet le nombre de symboles. % % ========================================================================= function [Xfin,alphabet,Nalphabet] = alphabet(X,ordre); Apprentissage : Chaînes de Markov : Comme nous l’avons vu, l’apprentissage est simple et se fait par comptage, le comptage s’est fait sans normaliser au fur et à mesure afin d’éviter d’éventuelles erreurs de précision. % ========================================================================= % Markov in dub, apprentissage des Chaînes de Markov % % En entrée : X, les données formatées à l'aide de la fonction alphabet % NBAlpha le nombre de symboles dans l'alphabet % Nicolas de Dreuille 20 UV Libre Markov in Dub % En sortie : Pi les probabilités d'émission % Probas, les probabilités de transition % % ========================================================================= function [Pi,Probas] = chaines(X,NBAlpha); Modèle de Markov caché : Il a fallu implémenter l’étape E et l’étape M, l’optimisation a été réalisée sur la fonction auxiliaire de Baum. % ========================================================================= % Markov in dub, apprentissage d'un Modèle de Markov caché % % En entrée : X, les données formatées à l'aide de la fonction alphabet % nbalphabet le nombre de symboles dans l'alphabet % K le nombre d'états cachés (default 3) % cyc le nombre maximum de cycles de Baum Welch (default 100) % tol la condition d'arret, tolérance sur l'évolution de la vraisemblances (default 0.0001) % % En sortie : E les probabilités d'émission des observations % P, les probabilités de transition des états cachés % Pi, les probabilités d'émission des états cachés % LL, la courbe de vraisemblance logarithmique % % ========================================================================= function [E,P,Pi,LL]=DHMM(X,nbalphabet,K,cyc,tol) Vraisemblance : Chaînes de Markov : Comme nous l’avons vu, elle se calcule facilement par L = − log( P[O M ]) = π 3 ∏ aij % ========================================================================= % Markov in dub, vraisemblance d'une série de sequences pour les Chaînes de Markov % % En entrée : X, les données formatées à l'aide de la fonction alphabet % Pi les probabilités d'émission % Probas, les probabilités de transition % % En sortie : Vraisemblance, la vraisemblance pour chaque Sequence de X % % ========================================================================= function vraisemblance = vraisemblanceChaines(X,Pi,Probas); Nicolas de Dreuille 21 UV Libre Markov in Dub Modèle de Markov caché : La vraisemblance calculée lors de l’apprentissage n’étant pas calculée de la même façon que celle des chaînes de Markov, une fonction est donc spécialement dédiée, elle somme les alphas après un forward. % ========================================================================= % Markov in dub, vraisemblance d'une série de sequences pour un HMM % % En entrée : X, les données formatées à l'aide de la fonction alphabet % E les probabilités d'émission des observations % P, les probabilités de transition des états cachés % Pi, les probabilités d'émission des états cachés % % En sortie : Vraisemblance, la vraisemblance pour chaque Sequence de X % % ========================================================================= function vraisemblance = vraisemblanceDHMM(X,E,P,Pi); Distribution de probabilités du prochain symbole : On cherche PPS = P(O t +1 O1 ,..., Ot ) Chaînes de Markov : Ici pas de fonction car il s’agit simplement de la ligne correspondant dans la matrice de transition. Modèle de Markov caché : Le problème est un peu compliqué car on ne connaît pas l’état caché courant à la fin d’une séquence, mais la variable forward nous permet de l’estimer, on a en effet α (i ) = P(O1 ,..., Ot , qt = S i λ ) . Or b j (k ) = P vk qt = S j , d’où PPS = α .b . [ ] % ========================================================================= % Markov in dub, distribution de probabilités du prochain symbole % % En entrée : Observations la séquence % E les probabilités d'émission des observations % P, les probabilités de transition des états cachés % Pi les probabilités d'émission % Nicolas de Dreuille 22 UV Libre Markov in Dub % En sortie : probas, la distribution de probabilités du prochain carractère % % ======================================================================== function probas = ProbasProchain(Observations,E,P,Pi); Génération d’une séquence : La génération d’une séquence est un processus stochastique, en effet, il ne faut pas chercher à maximiser la probabilité du prochain symbole, car on risquerait d’entrer dans une boucle. Il nous faut donc choisir aléatoirement le prochain symbole d’après la distribution de probabilités de transition ou d’émission. La fonction suivante a donc été développée. % ========================================================================= % Markov in dub, obtention d'un indice aléatoire dans une distribution de probabilités % % En entrée : distrib, la distribution (! la somme doit absolument être =1) % % En sortie : indice, indice choisi % % ========================================================================= function indice = getRandFromDistrib(distrib); Chaînes de Markov : La génération d’une séquence consiste à choisir le premier symbole à l’aide des probabilités d’émission, puis les suivants à l’aide des probabilités de transition jusqu’à obtenir le symbole terminal. % ========================================================================= % Markov in dub, génération de séquence en utilisant les chaines de markov % % En entrée : Pi les probabilités d'émission % Probas, les probabilités de transition % alphabet, l'alphabet des symboles généré par la fonction alphabet() % ordre, l'ordre simulé dans l'alphabet % % En sortie : output, la sequence retournée sous sa forme initiale % Observable, la sequence sous forme de vecteur d'entiers % % ========================================================================= function [output,Observable] = generationChaines(Pi,P,alphabet,ordre); Modèle de Markov caché : Nicolas de Dreuille 23 UV Libre Markov in Dub La génération d’une séquence revient à choisir le premier état caché à partir des probabilités d’émission des états cachés, puis chaque état caché suivant à partir des probabilités de transition, puis pour chaque état caché, obtenir un observable à partir des probabilités d’émission des observables. % ========================================================================= % Markov in dub, génération de séquence en utilisant les chaines de markov % % En entrée : E les probabilités d'émission des observations % P, les probabilités de transition des états cachés % Pi, les probabilités d'émission des états cachés % alphabet, l'alphabet des symboles généré par la fonction alphabet() % ordre, l'ordre simulé dans l'alphabet % % En sortie : output, la sequence retournée sous sa forme initiale % Observable, la sequence sous forme de vecteur d'entiers % % ========================================================================= function [output,Observable] = generationHMM(E,P,Pi,alphabet,ordre); Nicolas de Dreuille 24 UV Libre Markov in Dub Tests sous Matlab : Influence des différents paramètres Ces fonctions, une fois implémentées, nous ont permis de réaliser une série de tests permettant de déterminer la légitimité de l’utilisation ultérieure de tel ou tel modèle. Le premier test effectué a été un comparatif en temps et en vraisemblance logarithmique des différents modèles avec différents paramètres : Ind Données type Nb états cachés ordre 1 2 3 Limitées Chaine X HMM 5 10 1 1 2 3 4 5 6 7 8 9 10 11 12 15 5 10 15 5 10 15 2 3 13 14 15 Complètes Chaine X 17 18 19 20 21 22 23 24 HMM 5 10 15 5 10 15 5 10 15 1 1 2 3 16 2 3 Interprétation de l’histogramme Nicolas de Dreuille 25 UV Libre Markov in Dub On note grâce à ce jeu de tests l’influence de quatre facteurs sur deux types d’observation, en notant bien que la vraisemblance logarithmique ainsi définie est fonction inverse de la probabilité d’une séquence : • L’importance du dictionnaire de données : on remarque que la vraisemblance log augmente avec le nombre de données participant à l’apprentissage pour le HMM, ce qui paraît normal, dans la mesure ou la taille du dictionnaire augmente. Par contre, ce facteur a moins d’influence sur les chaînes de Markov. Le nombre de données est multiplié par deux, on peut donc dire que l’augmentation de temps est raisonnable. • Le type de modèle utilisé a la plus grande influence sur le temps et la vraisemblance log. On prendra en compte l’influence sur le temps : l’apprentissage des chaînes est quasi instantané, mais pas l’influence sur la vraisemblance, car le calcul est tout de même relativement différent. • Le nombre d’états cachés quant à lui augmente considérablement le temps de calcul et diminue la vraisemblance, on peut donc considérer qu’un nombre supérieur d’états cachés peut induire un meilleur apprentissage. Il ne semble par contre pas raisonnable d’en utiliser beaucoup plus de 10. • L’ordre quant à lui n’a pas la même influence sur les deux modèles, dans le cas des chaînes il diminue la vraisemblance log, et dans l’autre il l’augmente. Ce qui peut s’expliquer par le fait que cette simulation d’ordre sur l’observable n’a pas vraiment lieu d’être dans un HMM. Dans les deux cas, le temps de traitement augmente. En conclusion on peut dire que chaque modèle a ses avantages : les chaînes de Markov apprennent très vite avec peu de données, et les HMM ont un apprentissage plus poussé mais moins facile à paramétrer. Ensemble de validation ? Il aurait aussi été intéressant de procéder à des tests avec un ensemble de validation, mais ce type de test s’est révélé impossible. En effet, le principe était de construire un alphabet et un ensemble de vecteurs à partir des données initiales, puis de réaliser un apprentissage sur la moitié seulement de ces vecteurs, afin de comparer la vraisemblance des deux ensembles. Mais comme dans pratiquement tous les vecteurs de validation il existait au moins une transition de probabilité trop proche de zéro, la vraisemblance tendait alors vers l’infini et la moyenne finale était faussée. On peut tout de même en tirer un enseignement, soit que l’échantillon produit pour créer le jeu de données doit présenter le plus de diversité possible afin de multiplier les possibilités de transition. On peut ajouter que ce résultat est positif, dans la mesure où si l’on introduit une "faute de goût" dans un morceau et qu’on éprouve sa vraisemblance log, il y a de fortes chances qu’elle soit grande. Nicolas de Dreuille 26 UV Libre Markov in Dub Génération de séquence Aucune méthode mathématique ne sera appliquée pour déterminer la qualité de la génération des séquences. On pourrait par exemple utiliser la méthode du plus proche voisin et comparer ensuite les deux séquences, mais l’intérêt serait limité. Il nous a semblé que la meilleure solution était de donner les impressions de l’auteur du jeu de données sur la séquence de sortie. • • Les chaînes de Markov, surtout quand on utilise un ordre légèrement supérieur à 1, permettent d’obtenir un enregistrement dont les séquences sont relativement bien assemblées en termes d’enchaînement. C’est à dire que de grosses fautes ne sont pas commises. Mais l’enregistrement n’a pas la structure d’introduction développement qu’on a tenté d’apprendre au modèle. Les HMM par contre ont plus tendance à produire ce genre d’architecture, mais produisent des séquences relativement chaotiques en termes d’enchaînement. Ces critiques sont cependant fondées sur l’observation de matrices, ce qui est un bien piètre critère d’analyse d’une harmonie musicale. Il nous faudra donc éprouver ce processus avec de vrais samples, et donc programmer une interface de construction des enregistrements et un lecteur, ce qui implique déjà l’implémentation des algorithmes étudiés dans un langage plus généraliste, en l’occurrence le Java. Nicolas de Dreuille 27 UV Libre Markov in Dub Implémentation en Java : Il existe déjà une classe sur le Web codant les HMM en java, mais la licence ne nous convenait pas, c pourquoi l’implémentation sera reprise dans le cadre de ce projet. Malheureusement, il ne restait plus beaucoup de temps pour cette étape du projet, l’important était donc de bien spécifier afin de rendre le développement ultérieur facile en cas de codage incomplet. C’est pourquoi nous nous concentrerons sur le diagramme de classes, les algorithmes étant décrits et même implémentés en MATLAB. Diagrammes de classes Une classe appelée Markov, se spécialisant en Chain et HMM centralisera donc les traitements, soit l’apprentissage, les méthodes de test et la génération de séquences. Nicolas de Dreuille 28 UV Libre Markov in Dub Son constructeur comporte un objet de type TimeSeries, qui centralise le prétraitement, soit la mise à disposition de données à partir de fichiers. Enfin il nous faut pouvoir générer et ensuite sauvegarder un modèle de Markov. La classe MarkovModel qui comporte une spécialisation pour chaque type de modèle devra réaliser ces opérations. Avancement : Une partie a déjà été développée, soit tout TimeSeries et les classes agrégées. Le développement de la classe Markov et de celles qui en héritent à débuté mais n’est pas terminé. Comme nous l’avons dit précédemment, les spécifications sont suffisamment claires pour que le travail puisse être repris ensuite, il ne reste qu’à adapter les fonctions MATLAB en méthodes Java, soit utiliser le paradigme objet, transformer les indices et recoder quelques fonctions matricielles. Nicolas de Dreuille 29 UV Libre Markov in Dub Conclusion : L’idée originale de ce projet était d’utiliser les chaînes de Markov afin de réaliser une Classe java permettant de réaliser un apprentissage sur un morceau de musique découpé. On voit bien ici l’importance de l’étude préliminaire qui nous a fait étudier des modèles plus ou moins évolués, et évaluer ensuite la possibilité de les intégrer dans la réalisation. Un projet à tendance initiale développement fait intervenir des connaissances de statistiques, de génie logiciel, et des concepts étudiés en RNA. Une bonne connaissance de l’Anglais a par ailleurs été nécessaire pour comprendre la documentation. On a donc affaire à un projet innovant relativement général qui semble devoir ressembler à ce que sera plus tard notre métier. Nicolas de Dreuille 30 UV Libre Markov in Dub Bibliographie : 1 : http://www.wtm-paris.com/art_dubvf.html 2 : http://www.ejay-fr.com/ 3 : L.R. Rabiner, “Tutorial on Hidden Markov Models and Selected Applications in Speech Recognition”, in Proceedings of the IEEE, vol. 77, no. 2, February 1989, pp. 257-286. 74 4 : Z. Ghahramani, M.I. Jordan, “Factorial Hidden Markov Models” Nicolas de Dreuille 31