Erstellen eines Markov-Modells für maximale Entropie aus einem vorhandenen Klassifikator für maximale Entropie mit mehreren Eingängen

9

Ich bin fasziniert vom Konzept eines Maximum Entropy Markov-Modells (MEMM) und denke darüber nach, es für einen POS-Tagger (Part of Speech) zu verwenden. Im Moment verwende ich einen herkömmlichen ME-Klassifikator (Maximum Entropy), um jedes einzelne Wort zu kennzeichnen. Dies verwendet eine Reihe von Funktionen, einschließlich der beiden vorhergehenden Tags.

MEMMs verwenden den Viterbi-Algorithmus, um den optimalen Pfad durch die Markov-Kette zu finden (dh um einen vollständigen optimalen Satz von Tags für den Satz zu finden, anstatt einzelne Optima für jedes Wort). Wenn man darüber liest, scheint dies eine wunderbare Eleganz und Einfachheit zu haben. Jede Stufe stützt sich jedoch nur auf die "Ergebnisse" der vorherigen Stufe (dh gemäß einer Markov-Kette).

Mein ME-Modell verwendet jedoch die beiden vorherigen Stufen (dh die Tags für die beiden vorhergehenden Wörter). Es scheint, ich habe zwei mögliche Ansätze:

  • Verwenden Sie wie bei einer herkömmlichen Viterbi-Implementierung eine Reihe von Pfaden, die gemäß einer (der vorherigen) Stufe gespeichert sind. Mein ME-Klassifizierer würde diese und eine vorher eingefrorene Stufe (eingefroren in den betrachteten Pfad) verwenden, um die Übertragungsfunktion zu erzeugen.

  • Oder ich schreibe den Algorithmus, um zwei Stufen zu verfolgen. Dies ist komplizierter und wäre kein echtes Markov-Modell mehr, da jede Übertragungsfunktion (dh vom ME-Modell) von den vorhergehenden zwei Stufen und nicht von einer Stufe abhängen würde.

Es fällt mir auf, dass die zweite genauer sein wird, obwohl sie komplizierter sein wird.

Beispiele dafür habe ich bei meiner Literaturrecherche noch nicht gefunden. Wurde es versucht? Hat der zweistufige Ansatz die Gesamtgenauigkeit verbessert?

winwaed
quelle

Antworten:

4

(Dies ist wirklich eine echte Frage, mit der ich konfrontiert bin, und der Start der ML StackExchange-Website war ein ziemlich perfektes Timing: Ich hatte ein paar Tage lang Bücher gelesen und online recherchiert und wollte mit der Implementierung beginnen. Hier sind meine Ergebnisse Sie sind nicht streng. Ich denke, sie beantworten meine eigene Frage. Ich werde die Frage vorerst offen lassen, falls jemand nützliche Eingaben hat, etwas Ähnliches versucht hat oder nützliche Referenzen hat.)

Okay, in den letzten Tagen habe ich das verschlüsselt. Der Code ist nicht sehr effizient - viele Sammlungen erstellen und kopieren, aber das Ziel der Übung war es zu sehen, ob es funktionieren würde und wie gut es funktioniert.

Ich teile meine Daten zufällig in zwei Listen auf: Trainingsdaten und Testdaten. Ich führe die Testdaten über den herkömmlichen Maximum Entropy POS Tagger aus. und mein neuer MEMM-Tagger. Daher sehen sie die gleichen Testdaten, was direkte Vergleiche ermöglicht. Aufgrund der Zufälligkeit der ausgewählten Daten sehe ich einige Unterschiede zwischen den Tests (typischerweise etwa 0,2 bis 0,4%).

Der erste Test verwendet einen MEMM-Tagger mit einer einzelnen Stufe (dh einer echten Markov-Kette). Dies schnitt durchweg um etwa 0,1 bis 0,25% besser ab als der einfache ME-Tagger.

Als nächstes habe ich den zweistufigen Ansatz ausprobiert, der korrekter zu sein scheint. Die Ergebnisse waren jedoch noch marginaler. Oft waren die Ergebnisse identisch, gelegentlich waren sie etwas schlechter, aber wahrscheinlich war es meistens etwas besser (also +/- 0,05%).

Der MEMM-Tagger ist langsam. Okay, ich habe keine Optimierungen angewendet, aber die 1 Stufe (echte Markov-Kette) ist N-mal langsamer (wobei N = Anzahl der Beschriftungen), da dies die Anzahl der Pfade ist, die zwischen den einzelnen Schritten übertragen werden. Die zweistufige Implementierung ist N * N langsamer (aufgrund der größeren Anzahl übertragener Pfade). Obwohl Optimierungen die Dinge verbessern könnten, ist dies für die meisten praktischen Anwendungen wahrscheinlich zu langsam.

Eine Sache, die ich versuche, ist, eine untere Wahrscheinlichkeitsgrenze auf die Pfade anzuwenden. Dh. Die Viterbi-Pfade werden während jeder Iteration beschnitten, wobei alle Pfade unterhalb einer bestimmten Wahrscheinlichkeit (derzeit Log (Gesamtpfad P) <- 20,0) beschnitten werden. Das geht zwar viel schneller, aber es bleibt die Frage, ob es sich lohnt. Ich denke, das ist es wahrscheinlich nicht.

Warum sehen wir keine Verbesserung? Ich denke, dies liegt hauptsächlich an der Art und Weise, wie sich POS-Tags verhalten, und am Maximum-Entropy-Modell. Obwohl das Modell Funktionen verwendet, die auf den beiden vorherigen Tags basieren, ist das unmittelbar vorhergehende Tag viel wichtiger als das vorhergehende. Intuitiv wäre dies für die englische Sprache sinnvoll (z. B. folgt auf ein Adjektiv normalerweise ein Substantiv oder ein anderes Adjektiv, dies hängt jedoch nicht wirklich davon ab, was vor dem Adjektiv stand).

winwaed
quelle