Zum Inhalt springen

6.6 Sequenz-Likelihood und der Forward-Algorithmus

6.6 Sequenz-Likelihood und der Forward-Algorithmus

Abschnitt betitelt „6.6 Sequenz-Likelihood und der Forward-Algorithmus“

Im vorherigen Abschnitt haben wir das Dekodierungsproblem mithilfe des Viterbi-Algorithmus behandelt. Dort bestand das Ziel darin, eine einzelne verborgene Zustandsfolge zu finden, die die beobachteten Daten am besten erklärt.

Nun wenden wir uns einer anderen, ebenso grundlegenden Frage zu:

Wie wahrscheinlich ist die beobachtete Sequenz unter einem gegebenen Modell?

Dies nennt man das Evaluationsproblem.


Erinnern wir uns: Im Dekodierungsproblem suchten wir nach

maxSP(X,SM)\max_S P(X, S \mid M)

also nach dem einzelnen wahrscheinlichsten verborgenen Pfad.

Im Evaluationsproblem wollen wir dagegen

P(XM)P(X \mid M)

berechnen, also die Gesamtwahrscheinlichkeit, die beobachtete Sequenz unter dem Modell zu sehen.

Dazu müssen wir über alle möglichen verborgenen Zustandsfolgen summieren:

P(XM)=SP(X,SM)P(X \mid M) = \sum_S P(X, S \mid M)

Dieser Unterschied ist zentral.

  • Viterbi wählt einen Pfad
  • Forward berücksichtigt alle Pfade

Eine hilfreiche Intuition für diesen Unterschied lautet:

  • Der Viterbi-Algorithmus fragt: Was ist die beste Erklärung?

  • Der Forward-Algorithmus fragt: Wie viel gesamte Unterstützung liefert das Modell für diese Sequenz?

Auch wenn kein einzelner Pfad besonders hohe Wahrscheinlichkeit besitzt, kann die Summe vieler moderat wahrscheinlicher Pfade dennoch zu einer hohen Gesamt-Likelihood führen.


Auf den ersten Blick erscheint die Berechnung von P(XM)P(X \mid M) sogar noch schwieriger als das Dekodierungsproblem. Anstatt einen Pfad auszuwählen, müssen wir alle Pfade berücksichtigen.

Für eine Sequenz der Länge nn und kk Zustände bedeutet dies wieder knk^n Terme.

Für realistische Sequenzen ist eine direkte Summation unmöglich.

Wie im Fall von Viterbi erlaubt uns die Struktur des Modells jedoch, Zwischenergebnisse wiederzuverwenden. Daraus ergibt sich erneut eine Lösung mittels dynamischer Programmierung: der Forward-Algorithmus.


Wir definieren die Forward-Variable

αi(j)\alpha_i(j)

als die Wahrscheinlichkeit, die ersten ii Symbole zu beobachten und in Zustand sjs_j zu enden:

αi(j)=P(x1,x2,,xi,Si=sjM)\alpha_i(j) = P(x_1, x_2, \dots, x_i, S_i = s_j \mid M)

Diese Größe fasst alle Pfade zusammen, die:

  • das Präfix x1,,xix_1, \dots, x_i erzeugen
  • und in Zustand sjs_j enden

Statt also einzelne Pfade zu verfolgen, komprimieren wir alle relevanten Pfade an jeder Position und für jeden Zustand in einen einzigen Wert.


Wie bei Viterbi verläuft der Algorithmus in drei Phasen.

Für die erste Beobachtung gilt:

α1(j)=πjej(x1)\alpha_1(j) = \pi_j \, e_j(x_1)

Dies ist identisch mit der Initialisierung im Viterbi-Algorithmus, weil an der ersten Position pro Zustand nur ein einziger Pfad existiert.

Für jede folgende Position berechnen wir:

αi+1(j)=kαi(k)tkjej(xi+1)\alpha_{i+1}(j) = \sum_k \alpha_i(k) \, t_{kj} \, e_j(x_{i+1})

Auch diese Gleichung lässt sich klar interpretieren.

Um an Position i+1i+1 in Zustand sjs_j anzukommen, müssen wir:

  1. aus irgendeinem vorherigen Zustand sks_k kommen
  2. von sks_k nach sjs_j übergehen
  3. das Symbol xi+1x_{i+1} aus Zustand sjs_j emittieren

Im Unterschied zum Viterbi-Algorithmus wählen wir nicht nur den besten Vorgänger, sondern summieren über alle möglichen Vorgänger.

Nachdem die gesamte Sequenz verarbeitet wurde, erhalten wir die Gesamt-Likelihood durch Summation über alle Endzustände:

P(XM)=jαn(j)P(X \mid M) = \sum_j \alpha_n(j)

Der Forward-Algorithmus ist strukturell dem Viterbi-Algorithmus sehr ähnlich, unterscheidet sich jedoch in einem entscheidenden Punkt:

  • Viterbi verwendet ein Maximum über Vorgängerzustände
  • Forward verwendet eine Summe über Vorgängerzustände

Diese scheinbar kleine Änderung hat weitreichende Konsequenzen:

AspektViterbiForward
Operationmaxsum
Outputbester PfadGesamtwahrscheinlichkeit
Interpretationbeste Erklärunggesamte Unterstützung

Diese Dualität ist zentral für das Verständnis von HMMs.


6.6.6 Durchgerechnetes Beispiel (konzeptioneller Durchlauf)

Abschnitt betitelt „6.6.6 Durchgerechnetes Beispiel (konzeptioneller Durchlauf)“

Betrachten wir erneut die Sequenz

X=A C C T AX = \text{A C C T A}

und das Zwei-Zustands-Modell mit den Zuständen PP (Promotor) und BB (Hintergrund).

An der ersten Position gilt:

α1(P)=πPeP(A),α1(B)=πBeB(A)\alpha_1(P) = \pi_P e_P(A), \quad \alpha_1(B) = \pi_B e_B(A)

An der zweiten Position berechnen wir:

α2(P)=α1(P)tPPeP(C)+α1(B)tBPeP(C)\alpha_2(P) = \alpha_1(P)t_{PP}e_P(C) + \alpha_1(B)t_{BP}e_P(C) α2(B)=α1(P)tPBeB(C)+α1(B)tBBeB(C)\alpha_2(B) = \alpha_1(P)t_{PB}e_B(C) + \alpha_1(B)t_{BB}e_B(C)

Hier wird der zentrale Unterschied zu Viterbi unmittelbar sichtbar:

  • Statt den besseren der beiden Pfade zu wählen,
  • addieren wir beide Beiträge.

Das bedeutet, dass auch Pfade, die für sich genommen nicht optimal sind, dennoch zur Gesamtwahrscheinlichkeit beitragen.

Wenn wir entlang der Sequenz fortschreiten, akkumuliert jeder Forward-Wert Beiträge aus exponentiell vielen Pfaden, allerdings in stark komprimierter Form.


6.6.7 Intuition: Über alle Erklärungen summieren

Abschnitt betitelt „6.6.7 Intuition: Über alle Erklärungen summieren“

Der Forward-Algorithmus integriert effektiv über alle möglichen Erklärungen der Daten.

Dies ist besonders in biologischen Kontexten wichtig, weil

  • mehrere evolutionäre Geschichten eine Sequenz erklären können
  • Unsicherheit ein grundlegendes Merkmal biologischer Daten ist

Durch die Summation über alle Pfade berücksichtigt das Modell diese Unsicherheit, anstatt sich frühzeitig auf eine einzige Interpretation festzulegen.


Wie beim Viterbi-Algorithmus muss auch der Forward-Algorithmus im Log-Raum implementiert werden, um numerischen Unterlauf zu vermeiden.

Die Rekursion enthält nun jedoch Summen, die im Log-Raum zur Form

logαi+1(j)=logkexp(logαi(k)+logtkj+logej(xi+1))\log \alpha_{i+1}(j) = \log \sum_k \exp\bigl( \log \alpha_i(k) + \log t_{kj} + \log e_j(x_{i+1}) \bigr)

führen.

Dies ist die sogenannte log-sum-exp-Operation.

Um diesen Ausdruck numerisch stabil zu berechnen, verwendet man:

logkeak=m+logkeakm\log \sum_k e^{a_k} = m + \log \sum_k e^{a_k - m}

wobei

m=maxkakm = \max_k a_k

gilt.

Dies verhindert Überlauf oder Unterlauf bei exponentiellen Ausdrücken.


Der Forward-Algorithmus ist besonders nützlich für:

  • die Bewertung von Sequenzen unter Modellen
  • den Vergleich alternativer Modelle
  • die Berechnung von Motiv-Likelihoods entlang eines Genoms

Beim Scanning eines Genoms könnten wir zum Beispiel P(XMMotiv)P(X \mid M_{\text{Motiv}}) berechnen und mit P(XMHintergrund)P(X \mid M_{\text{Hintergrund}}) vergleichen. Dadurch lassen sich Regionen identifizieren, die vom einen Modell besser erklärt werden als vom anderen.


Der Forward-Algorithmus erweitert den dynamischen Programmierungsansatz von Viterbi, indem er Maximierung durch Summation ersetzt.

Er liefert:

  • eine vollständige probabilistische Bewertung der Sequenz
  • einen prinzipiellen Umgang mit Unsicherheit
  • die Grundlage für Parameterschätzung mit Baum–Welch

  1. Was ist der Unterschied zwischen der Summation über alle Pfade und der Auswahl des besten Pfades?
  2. Was repräsentiert die Forward-Variable αi(j)\alpha_i(j)?
  3. Warum ist die direkte Berechnung von P(XM)P(X \mid M) unpraktikabel?
  4. Welche Rolle spielt die log-sum-exp-Operation?
  5. Warum ist der Forward-Algorithmus für die Analyse biologischer Sequenzen wichtig?