6.5 Dekodierung mit dem Viterbi-Algorithmus
6.5 Dekodierung mit dem Viterbi-Algorithmus
Abschnitt betitelt „6.5 Dekodierung mit dem Viterbi-Algorithmus“Sobald ein Hidden-Markov-Modell spezifiziert ist, stellt sich eine der ersten Fragen ganz unmittelbar:
Gegeben eine beobachtete Sequenz: Welche verborgene Zustandsfolge hat sie am wahrscheinlichsten erzeugt?
Dies ist das Dekodierungsproblem, und seine klassische Lösung ist der Viterbi-Algorithmus.
Auf den ersten Blick wirkt das Problem einfach. Wenn die beobachtete Sequenz kurz ist und die Zahl der verborgenen Zustände klein, könnte man sich vorstellen, alle möglichen verborgenen Pfade aufzulisten, ihre Wahrscheinlichkeiten zu berechnen und den besten auszuwählen. Dies wird jedoch sehr schnell unpraktikabel. Für eine Sequenz der Länge und ein HMM mit verborgenen Zuständen gibt es mögliche Zustandsfolgen. Schon für moderate Werte von ist eine erschöpfende Suche unmöglich.
Der Viterbi-Algorithmus löst dieses Problem, indem er eine zentrale strukturelle Eigenschaft von Hidden-Markov-Modellen ausnutzt: Obwohl die Gesamtzahl vollständiger Pfade enorm ist, teilen viele dieser Pfade gemeinsame Präfixe. Daraus entsteht genau jene Struktur überlappender Teilprobleme, die mit dynamischer Programmierung behandelt werden kann.
6.5.1 Das Dekodierungsproblem noch einmal formuliert
Abschnitt betitelt „6.5.1 Das Dekodierungsproblem noch einmal formuliert“Sei die beobachtete Sequenz
und die verborgene Zustandsfolge
Für ein festes Modell besteht das Dekodierungsproblem darin, zu bestimmen:
Das heißt: Unter allen möglichen verborgenen Pfaden suchen wir denjenigen, der die gemeinsame Wahrscheinlichkeit von Beobachtungen und Pfad maximiert.
Diese Formulierung ist wichtig. Wir fragen nicht einfach, welcher Pfad für sich plausibel ist, sondern welcher Pfad unter dem Modell die wahrscheinlichste Erklärung der beobachteten Daten liefert.
Im Promotor-Hintergrund-Beispiel bedeutet dies, dass wir jedem beobachteten Nukleotid jenen Zustand zuordnen möchten, der es am besten erklärt, ohne dabei die Übergangsstruktur des Modells zu verletzen. Ein Pfad mit sehr plausiblen Emissionen, aber extrem unwahrscheinlichen Übergängen, wird nicht optimal sein. Ebenso wenig ein Pfad mit plausiblen Übergängen, aber schlechten Emissionen. Der Viterbi-Algorithmus balanciert beide Beiträge gegeneinander aus.
6.5.2 Warum Brute Force scheitert
Abschnitt betitelt „6.5.2 Warum Brute Force scheitert“Um den Wert des Algorithmus zu verstehen, lohnt sich ein Blick auf eine naive Lösung.
Nehmen wir an, unser HMM habe nur zwei verborgene Zustände:
und die beobachtete Sequenz habe Länge fünf. Dann gibt es bereits
mögliche verborgene Pfade.
Für eine Länge von zwanzig wären es schon
mögliche Pfade.
Für biologisch realistische Sequenzlängen ist eine erschöpfende Bewertung nicht mehr praktikabel. Zudem wäre ein Großteil der Arbeit redundant. Viele unterschiedliche Pfade teilen dieselben partiellen Präfixe, und die beste Fortsetzung solcher Präfixe wiederholt immer wieder neu zu berechnen, wäre verschwenderisch.
Der Viterbi-Algorithmus vermeidet diese Redundanz, indem er für jede Position und jeden Zustand die Wahrscheinlichkeit des besten Pfades speichert, der dort endet.
6.5.3 Die Grundidee des Algorithmus
Abschnitt betitelt „6.5.3 Die Grundidee des Algorithmus“Die zentrale Beobachtung ist einfach und zugleich sehr mächtig.
Angenommen, wir wollen an Position den besten Pfad kennen, der in Zustand endet. Dann muss dieser beste Pfad an Position aus irgendeinem Vorgängerzustand gekommen sein. Unter allen möglichen Vorgängerzuständen gibt es genau einen, der den optimalen Pfad nach liefert.
Das bedeutet, dass wir nicht alle vollständigen Pfade gleichzeitig betrachten müssen. Stattdessen können wir die besten partiellen Pfade zu jedem Zustand schrittweise berechnen.
Definieren wir dazu den Viterbi-Score
als die Wahrscheinlichkeit des wahrscheinlichsten Pfades, der die ersten Beobachtungen erzeugt und in Zustand endet.
Diese Größe fasst genau die Information zusammen, die wir für die weitere dynamische Programmierung benötigen.
6.5.4 Rekursionsrelation
Abschnitt betitelt „6.5.4 Rekursionsrelation“Der Algorithmus besteht aus drei Teilen: Initialisierung, Rekursion und Terminierung.
Initialisierung
Abschnitt betitelt „Initialisierung“Für die erste Beobachtung ist der beste Pfad, der in Zustand endet, einfach die Wahrscheinlichkeit, in diesem Zustand zu starten und das Symbol zu emittieren:
wobei
- die Anfangswahrscheinlichkeit von Zustand ist
- die Emissionswahrscheinlichkeit des Symbols aus Zustand ist
Rekursion
Abschnitt betitelt „Rekursion“Für jede folgende Position berechnen wir:
Diese Gleichung hat eine sehr natürliche Interpretation.
Um an Position in Zustand zu enden, müssen wir
- dem besten Pfad zu einem Vorgängerzustand an Position gefolgt sein
- von nach übergehen
- das beobachtete Symbol aus Zustand emittieren
Unter allen Vorgängerzuständen wählen wir denjenigen, der dieses Produkt maximiert.
Backpointer
Abschnitt betitelt „Backpointer“Um nicht nur die Wahrscheinlichkeit, sondern auch den eigentlichen Pfad rekonstruieren zu können, müssen wir zusätzlich speichern, welcher Vorgängerzustand das Maximum erreicht hat. Deshalb führen wir parallel eine Backpointer-Tabelle:
Diese Tabelle speichert für jede Position und jeden Zustand, aus welchem Vorgängerzustand der optimale Pfad kommt.
Terminierung
Abschnitt betitelt „Terminierung“Nachdem die letzte Beobachtung verarbeitet wurde, ist der Score des besten vollständigen Pfades
und der Endzustand dieses Pfades ist
Von diesem Endzustand aus rekonstruieren wir den gesamten Pfad, indem wir den Backpointern rückwärts folgen.
6.5.5 Ein durchgerechnetes Beispiel
Abschnitt betitelt „6.5.5 Ein durchgerechnetes Beispiel“Wir gehen nun ein einfaches Beispiel durch, wie es auch in der Lehrveranstaltung verwendet wird, und betrachten ein Zwei-Zustands-HMM mit einem Promotorzustand und einem Hintergrundzustand .
Angenommen, die Anfangswahrscheinlichkeiten lauten:
Übergangswahrscheinlichkeiten:
Emissionswahrscheinlichkeiten:
Für den Promotorzustand :
Für den Hintergrundzustand :
Betrachten wir nun die beobachtete Sequenz
Wir berechnen den besten Pfad Schritt für Schritt.
6.5.6 Schritt 1: Initialisierung
Abschnitt betitelt „6.5.6 Schritt 1: Initialisierung“Für das erste Symbol gilt:
Nach dem ersten Symbol hat also der beste Pfad, der in endet, eine deutlich höhere Wahrscheinlichkeit als der beste Pfad, der in endet. Intuitiv wird das erste also eher als Hintergrund als als Promotor erklärt.
6.5.7 Schritt 2: Zweite Beobachtung
Abschnitt betitelt „6.5.7 Schritt 2: Zweite Beobachtung“Das zweite Symbol ist .
Für den Promotorzustand berechnen wir:
Einsetzen der Zahlen ergibt:
Der beste Vorgänger ist also .
Für den Hintergrundzustand gilt:
Wieder ist der beste Vorgänger .
An diesem Punkt ist der beste Pfad zu etwas besser als der beste Pfad zu . Nach der Beobachtung von bevorzugt das Modell also den Promotorzustand.
6.5.8 Schritt 3: Dritte Beobachtung
Abschnitt betitelt „6.5.8 Schritt 3: Dritte Beobachtung“Das dritte Symbol ist erneut .
Für den Promotorzustand:
Der beste Vorgänger ist also .
Für den Hintergrundzustand:
Der beste Vorgänger ist also .
Nun ist der Promotorpfad klar im Vorteil.
6.5.9 Schritt 4: Vierte Beobachtung
Abschnitt betitelt „6.5.9 Schritt 4: Vierte Beobachtung“Das vierte Symbol ist .
Für den Promotorzustand:
Der beste Vorgänger ist also .
Für den Hintergrundzustand:
Der beste Vorgänger ist also .
Nun ist der beste Pfad zu besser als der beste Pfad zu , was auf einen Rückübergang in den Hintergrund hinweist.
6.5.10 Schritt 5: Fünfte Beobachtung
Abschnitt betitelt „6.5.10 Schritt 5: Fünfte Beobachtung“Das fünfte Symbol ist .
Für den Promotorzustand:
Der beste Vorgänger ist also .
Für den Hintergrundzustand:
Der beste Vorgänger ist also .
Der insgesamt beste Endzustand ist damit , weil
6.5.11 Traceback
Abschnitt betitelt „6.5.11 Traceback“Nun rekonstruieren wir den besten Pfad, indem wir den Backpointern rückwärts folgen.
Aus den obigen Berechnungen ergibt sich als bester Endzustand . Die Vorgängerentscheidungen lauteten:
- an Position 5:
- an Position 4:
- an Position 3:
- an Position 2:
- an Position 1: Start in
Damit lautet der wahrscheinlichste verborgene Pfad:
Genau dies erwarten wir von einem Dekodierungsalgorithmus. Die beobachtete Sequenz wird so erklärt, dass sie im Hintergrund beginnt, eine kurze promotorähnliche Region durchläuft und dann wieder in den Hintergrund übergeht.
6.5.12 Interpretation des Ergebnisses
Abschnitt betitelt „6.5.12 Interpretation des Ergebnisses“Dieses Beispiel illustriert mehrere wichtige Punkte.
Erstens hängt der wahrscheinlichste Zustand an einer gegebenen Position nicht nur vom beobachteten Symbol an dieser Position ab. Er hängt auch von der Wahrscheinlichkeit ab, diesen Zustand aus dem vorhergehenden Pfad zu erreichen. Genau deshalb lässt sich der Viterbi-Algorithmus nicht durch eine einfache positionsweise Klassifikationsregel ersetzen.
Zweitens balanciert der Algorithmus Emissionsevidenz gegen Übergangsstruktur aus. Ein Symbol, das mäßig gut mit dem Promotorzustand vereinbar ist, kann dennoch dem Hintergrund zugeordnet werden, wenn der Übergang in den Promotor unwahrscheinlich ist, und umgekehrt.
Drittens ist das Resultat nicht bloß ein Score, sondern eine interpretierbare Segmentierung der Sequenz. Biologisch kann diese Segmentierung Regionen unterschiedlichen funktionellen Charakters entsprechen.
6.5.13 Die dynamische Programmierungsstruktur
Abschnitt betitelt „6.5.13 Die dynamische Programmierungsstruktur“Es lohnt sich, das Prinzip der dynamischen Programmierung an dieser Stelle explizit zu machen.
Warum ist es zulässig, an jeder Zelle der Viterbi-Tabelle nur den besten Pfad zu speichern, der in diesem Zustand endet, und alle anderen partiellen Pfade zu verwerfen?
Weil jede zukünftige Fortsetzung nur vom aktuellen Zustand und vom aktuellen Score abhängt, nicht aber von der detaillierten Geschichte, wie dieser Zustand erreicht wurde. Wenn ein partieller Pfad zu Zustand schlechter ist als ein anderer, kann er ihn später nie mehr überholen, da beide dieselben zukünftigen Übergangs- und Emissionsoptionen sehen.
Dies ist genau die Eigenschaft optimaler Teilstruktur, die den Viterbi-Algorithmus möglich macht.
6.5.14 Rechnerische Komplexität
Abschnitt betitelt „6.5.14 Rechnerische Komplexität“Angenommen, ein HMM habe Zustände und die beobachtete Sequenz Länge .
An jeder Position betrachten wir für jeden Zustand alle möglichen Vorgängerzustände. Daraus ergibt sich eine Zeitkomplexität von
Dies ist dramatisch besser als die exponentielle Komplexität erschöpfender Enumeration.
Die Speicherkosten betragen typischerweise
wenn die vollständige Tabelle und die Backpointer gespeichert werden, was für moderate Zustandsräume in der Regel akzeptabel ist.
6.5.15 Konzeptionelle Zusammenfassung
Abschnitt betitelt „6.5.15 Konzeptionelle Zusammenfassung“Der Viterbi-Algorithmus löst das Dekodierungsproblem, indem er drei Ideen verbindet:
- zustandsspezifische Emissionen
- Übergänge zwischen Zuständen
- dynamische Programmierung
Sein Output ist der einzelne wahrscheinlichste verborgene Pfad, der die beobachtete Sequenz erklärt.
Für die biologische Sequenzanalyse macht ihn dies zu einem leistungsfähigen Werkzeug für:
- Promotorerkennung
- Vorhersage von Genstruktur
- Annotation von Proteinsekundärstruktur
- profilbasierte Sequenzklassifikation
In all diesen Anwendungen geht es nicht nur darum, eine Sequenz zu bewerten, sondern die verborgene biologische Organisation zu rekonstruieren, die ihr zugrunde liegt.
Fragen zur Selbstkontrolle
Abschnitt betitelt „Fragen zur Selbstkontrolle“- Warum ist eine erschöpfende Suche über alle verborgenen Pfade nicht praktikabel?
- Was repräsentiert die Größe im Viterbi-Algorithmus?
- Warum werden Backpointer benötigt?
- In welchem Sinn verwendet der Viterbi-Algorithmus dynamische Programmierung?
- Warum kann der wahrscheinlichste Zustand an einer Position von früheren Positionen abhängen?