Hidden Markov Model (HMM)
Un modèle de Markov caché (HMM) déduit une séquence d’états cachés à partir d’observations bruitées. Découvre ses paramètres, l’algorithme de Viterbi et ses applications.
Un modèle de Markov caché (HMM) est un modèle probabiliste d’une séquence dans laquelle un système passe d’un état à l’autre sans que ces états puissent être observés directement, tandis que chaque état caché produit une observation qui, elle, est observable. À partir d’une séquence d’observations, comme des trames audio ou des lettres d’ADN, un HMM calcule la probabilité de chaque séquence d’états cachés, par exemple les phonèmes correspondant à l’audio ou les régions géniques correspondant aux lettres. « Markov » désigne son hypothèse fondamentale : l’état suivant dépend uniquement de l’état actuel. Leonard Baum et ses collègues ont élaboré cette théorie à la fin des années 1960, et les HMM ont ensuite servi à la reconnaissance vocale pendant des décennies. Entièrement fondés sur des probabilités explicites, ils restent un outil standard pour l’analyse des séries temporelles et la bio-informatique, ainsi qu’un exemple classique d’IA statistique.
Composants d’un HMM#
Un HMM comportant N états cachés est défini par trois ensembles de probabilités :
- Probabilités initiales (π) : probabilité de commencer dans chacun des états cachés.
- Probabilités de transition (A) : matrice N × N dont l’entrée
A[i, j]représente la probabilité de passer de l’état i à l’état j en une étape, ce qui fait des états cachés une chaîne de Markov. - Probabilités d’émission (B) : probabilité de chaque observation sachant l’état actuel. Les observations discrètes utilisent une table, et les observations continues, comme les caractéristiques acoustiques, utilisent des distributions telles que les mélanges gaussiens.
Deux hypothèses rendent le modèle exploitable : chaque état dépend uniquement de l’état précédent, et chaque observation dépend uniquement de l’état actuel. Déroulé au fil du temps, le modèle forme une chaîne d’états cachés, chacun émettant une observation :
Trois problèmes classiques des HMM#
Le tutoriel de Lawrence Rabiner, largement cité et publié en 1989, a organisé l’utilisation des HMM autour de trois questions. Chacune admet une solution par programmation dynamique dont le coût augmente comme N² × T pour T observations, plutôt que comme les Nᵀ séquences d’états possibles :
- Évaluation : quelle est la probabilité d’une séquence d’observations selon un modèle donné ? L’algorithme avant somme les probabilités de tous les chemins cachés ; c’est ainsi qu’un système de reconnaissance choisit le modèle de mot qui explique le mieux un énoncé.
- Décodage : quelle séquence d’états cachés explique le mieux les observations ? L’algorithme de Viterbi, publié par Andrew Viterbi en 1967 pour le décodage des codes convolutifs, trouve le chemin le plus probable ; l’algorithme avant-arrière donne la probabilité de chaque état à chaque étape temporelle.
- Apprentissage : quels paramètres correspondent le mieux à un ensemble de séquences d’observations ? L’algorithme de Baum-Welch, une instance de l’algorithme d’espérance-maximisation, estime π, A et B à partir de séquences non annotées. Lorsque les séquences d’états sont annotées, il suffit de compter les transitions et les émissions.
Le décodage de Viterbi tient en quelques lignes de NumPy. Dans ce modèle, l’activité d’une personne — marcher ou courir — est cachée, un traqueur fournit une mesure de vitesse par trame et les activités ont tendance à persister d’une trame à l’autre :
import numpy as np
states = ["walk", "run"]
start = np.array([0.8, 0.2]) # probabilités initiales des états
trans = np.array([[0.9, 0.1], [0.1, 0.9]]) # les activités ont tendance à persister d’une trame à l’autre
emit = np.array([[0.7, 0.25, 0.05], [0.1, 0.3, 0.6]]) # P(vitesse | état) pour lent, moyen, rapide
obs = [0, 0, 2, 0, 0, 1, 2, 2, 1, 2] # mesures de vitesse par trame
# Viterbi : meilleure log-probabilité d’atteindre chaque état, avec des pointeurs de retour
logp = np.log(start) + np.log(emit[:, obs[0]])
back = []
for o in obs[1:]:
scores = logp[:, None] + np.log(trans) # lignes : état précédent, colonnes : état suivant
back.append(scores.argmax(axis=0))
logp = scores.max(axis=0) + np.log(emit[:, o])
# Retrace la séquence d’états la plus probable à rebours, depuis le meilleur état final
path = [int(logp.argmax())]
for pointers in reversed(back):
path.insert(0, int(pointers[path[0]]))
print("Speeds: ", " ".join(["slow", "medium", "fast"][o] for o in obs))
print("Decoded:", " ".join(states[s] for s in path))Le décodage donne walk walk walk walk walk run run run run run. La mesure rapide de la trame 3 reste « walk », car passer à la course puis revenir nécessiterait deux transitions improbables ; les mesures moyennes des trames 6 et 9 deviennent « run » en raison des trames rapides qui les entourent. Un classificateur par trame ignorant les transitions aurait étiqueté la trame 3 comme une course.
Les HMM et les modèles associés#
- Filtre de Kalman : applique la même récurrence de prédiction et de mise à jour aux états continus, avec une dynamique linéaire et un bruit gaussien. L’algorithme avant des HMM est son équivalent pour les états discrets.
- Réseaux bayésiens : un HMM est le réseau bayésien dynamique le plus simple, avec une variable cachée et une variable observée par étape temporelle.
- Processus de décision de Markov (MDP) : ajoute des actions et des récompenses à une chaîne de Markov dont les états sont observés ; c’est le cadre de l’apprentissage par renforcement.
- Réseaux neuronaux récurrents et transformers : apprennent des dépendances non linéaires à longue portée à partir de grands jeux de données et ont remplacé les HMM dans la plupart des tâches vocales et linguistiques. Les HMM nécessitent beaucoup moins de données, et chacune de leurs probabilités est directement interprétable.
- Modèles d’espace d’état (SSM) : les couches d’apprentissage profond comme Mamba reprennent l’idée d’espace d’état issue de la théorie du contrôle et mettent à jour un vecteur caché continu selon une dynamique déterministe apprise.
Applications concrètes#
- Reconnaissance vocale : des années 1980 au début des années 2010, la plupart des systèmes de reconnaissance modélisaient chaque phonème sous la forme d’un petit HMM avec des émissions de mélanges gaussiens. Les réseaux neuronaux profonds ont ensuite remplacé le modèle d’émission dans les systèmes hybrides, puis les modèles de bout en bout ont fini par remplacer entièrement les HMM.
- Bio-informatique : les HMM de profil décrivent des familles de séquences apparentées de protéines ou d’ADN. HMMER les utilise pour rechercher des apparentés éloignés dans les bases de données de séquences et constitue le fondement de la base de données de familles de protéines Pfam. Les outils de prédiction génique utilisent également les HMM pour étiqueter les segments d’un génome comme codants ou non codants.
- Étiquetage morphosyntaxique : les premiers systèmes statistiques de traitement automatique des langues étiquetaient les mots comme noms, verbes ou autres catégories grammaticales en décodant les séquences d’étiquettes avec Viterbi.
- Reconnaissance d’activité : les séquences de poses corporelles ou de mesures de capteurs portés se décodent en activités comme rester debout, marcher ou tomber. La solution Ultralytics de suivi des entraînements suit une séquence à deux états de ce type : elle étiquette chaque personne « up » ou « down » à partir d’un angle articulaire obtenu par les points clés d’estimation de pose de YOLO26 — le coude par défaut —, commute au-dessus de 145° et en dessous de 90°, et compte une répétition à chaque transition de « up » vers « down ».










