Da wir nun in der letzten Vorlesung die drei großen Themengebiete,
vier großen Themengebiete in der Spracherkennung besprochen hatten,
angefangen mit der Vorverarbeitung, danach die akustische
Modellierung, die Sprachmodellierung und die Suche, gehen wir jetzt
und schauen uns noch ein paar kleinere Vertiefungen an in den
einzelnen Gebieten.
Und heute schauen wir uns insbesondere an das Gebiet der Adaption in
der automatischen Spracherkennung.
Wie wir schon mehrmals betont haben und wie wir auch ganz am Anfang
der Vorlesung schon gesehen hatten, sind automatische Spracherkenne
Musterklassifikationssysteme.
Sie bekommen ein Muster rein, vergleichen das Muster gegen Modelle,
berechnen Wahrscheinlichkeiten, dass bestimmte Modelle dieses Muster
hervorgebracht haben, das Sprachmodell, das akustische Modell, und
suchen dann nach dem Modell, das mit der höchsten Wahrscheinlichkeit
dieses Muster hervorgebracht hat.
Es ist also ein insgesamt generatives Modell, das wir da verwenden
mithilfe der HMMs, der Sprachmodelle und der Fundamentalformel der
Spracherkennung.
Wir hatten ganz am Anfang mal angefangen, mit einfachen Templates zu
arbeiten, mit einfachen Referenzmustern, zum Beispiel mit dem DTW oder
dem One-Stage Dynamic Programming.
Und da sieht es halt so aus, dass insbesondere da man mit solchen
Distanzen zwischen Referenzmustern und neu aufgenommenen Mustern
arbeitet.
Und auch bei der statistischen Spracherkennung macht man im Prinzip
nicht viel anderes, außer dass jetzt halt diese Distanzberechnung
zwischen der Referenz, zwischen dem Referenzmuster und der neuen
Aufnahme ein bisschen komplizierter wird.
Statt des Referenzmusters haben wir ein ganzes Modell, bestehend aus
Sprachmodell und akustischem Modell.
Und statt Distanzen haben wir Wahrscheinlichkeiten, mit denen dieses
Modell, diese Muster aus der Vorverarbeitung der neuen Aufnahme
hervorgebracht haben.
Das heißt aber insbesondere, dass wir sehr sensitiv sind gegen
Variabilität.
Wir hatten ganz am Anfang der Vorlesung gesagt, Variabilität ist das,
was Spracherkennung schwierig macht.
Jeder Mensch spricht selbst dieselbe Wortfolge unterschiedlich aus,
selbst unter den gleichen Bedingungen, wenn er sie ein zweites Mal
spricht.
Unterschiedliche Sprecher haben unterschiedliche Akzente,
unterschiedliche Räume haben unterschiedliche Akustiken,
unterschiedliche Mikrofone haben unterschiedliche Charakteristiken.
Ich kann Umgebungsgeräusche haben, etc., etc.
Und alles das sorgt dafür, dass dieses Muster, das ich klassifizieren
möchte, das aus meiner Vorverarbeitung herausfällt, variiert von
Sprecher zu Sprecher, von Situation zu Situation.
Wir hatten gesehen in der Vorverarbeitung, wie man ein bisschen
versuchen kann, diese Sprechervariabilität herauszubekommen.
Die Vorverarbeitung hatte zwei große Ziele.
Was waren die zwei großen Ziele der Vorverarbeitung?
Irgendeiner.
Was sind die zwei?
Warum machen wir Vorverarbeitung?
Warum nehmen wir nicht einfach das Audiosignal, wie es ist?
Das hatte zwei Gründe, die wir dafür gesagt haben.
Erstens, wir wollen wichtige, für die Klassifikation wichtige
Informationen extrahieren und betonen, unwichtige wegwerfen und wir
wollen die Datenrate reduzieren.
Und in dieser Vorverarbeitung haben wir bestimmte Sachen automatisch
schon herausgefiltert und normalisiert, die jetzt die Variabilität
betrifft.
Zum Beispiel, wenn wir Keppstrahlkoeffizienten verwenden, sind wir
automatisch inhärent lautstärkend unabhängig.
Das heißt zum Beispiel, eine Variabilität wie die Lautstärke des
Signals wird herausgenommen.
Wenn wir eine Mailskalierung durchführen, wird die genaue Position der
Formanten verwischt.
Die landet da in irgendwelchen grob auflösenden Filterbänken.
Man kann, das konnten wir uns anschauen im Spektrogramm, wenn man das
mailskaliert hatte, konnte man zum Beispiel den genauen Ort der
Fundamentalfrequenz nicht mehr so richtig schön feststellen.
Das war alles irgendwie so verschmiert.
Da kam es auf ein paar Hertz hoch oder runter nicht mehr drauf an.
Auf die Art und Weise hat man eine gewisse Sprecher-Normalisierung
gemacht.
Im Keppstrom haben wir geliftert.
Wir haben die Mikrostruktur weggeworfen und wir haben die
Makrostruktur behalten.
Auch damit wirft man sprecherspezifische und situationsspezifische
Informationen weg.
Wir haben gesehen, wie man mit einer Keppstrahl-Mittelwertsubstraktion
zum Beispiel ein bisschen den Kanal versuchen kann abzuziehen und
heraus zu normalisieren.
Aber auch wenn man das alles macht, das sind keine perfekten
Techniken, die helfen zwar ein bisschen die Variabilität zu
reduzieren, aber sie werden sie nicht hundertprozentig los.
Das heißt, das Muster, das wir klassifizieren, wird immer noch
variieren in Abhängigkeit von bestimmten Umgebungsbedingungen.
Welcher Sprecher ist das?
Ganz prominent.
In welcher Umgebung nehme ich auf?
Mit welchem Mikrofon nehme ich auf?
In welchem Zustand bestimmt sich der Sprecher?
Auch auf der Sprachmodellseite haben wir das ähnliche Problem.
Wir hatten gesagt, wir haben Variabilität zum Beispiel auf
Signalebene, aber wir haben auch Variabilität auf linguistischer
Ebene.
Unterschiedliche Domänen verlangen unterschiedliche Vokabularien.
Und unser Spracherkenner kann immer nur die Wörter erkennen, die er in
seinem Suchvokabular hat.
Das, was in dem ArcMax unter dem ArcMax steht, da steht die Menge
aller Wortfolgen und die ist definiert durch das Suchvokabular des
Erkenners und nur diese Wortfolgen können wir erkennen.
Und unser Sprachmodell, zum Beispiel das N-Gramm-Sprachmodell, wird
auf großen Textmengen trainiert, die idealerweise aus dieser Domäne
kommen, die wir hinterher erkennen wollen, damit halt die Schätzungen
der Wahrscheinlichkeiten möglichst auf diese Domäne aus der hinterher
die Testdaten kommen, passen.
Das heißt aber auch, dass wenn ich die Domäne wechsle, ich zum
Beispiel Probleme bekomme, dass ich plötzlich Wörter sehe, die ich
nicht in meinem Suchvokabular habe, weil ich das Suchvokabular anhand
von Beispieltexten, Trainingstexten aus einer anderen Domäne aufgebaut
habe.
Ich werde bestimmte Wortfolgen plötzlich in den Testdaten sehen, die
ich vorher nicht immer im Sprachmodell Training gesehen habe.
Die Texte, die ich bekomme, sind häufig geschriebene Texte,
Zeitungstexte zum Beispiel.
Die Sprache, die ich reinbekomme, ist je nach Domäne unter Umständen
etwas sehr Spontansprachliches.
Konversationen zwischen Personen, Terminfindungen, Steuerung,
Vorlesungen, die gehalten werden, die jetzt auch von der Sprache her
nicht unbedingt geschriebenen Texten entsprechen.
Das heißt, da habe ich auch einen Mismatch.
Und wenn ich dann jetzt da zum Beispiel das Problem habe, ich habe auf
Zeitungstexten trainiert und als nächstes kommt einer und liest
Märchen vor, dann wird das nicht gut funktionieren.
Dann muss ich etwas machen.
Beim Sprachmodell, beim Thema Sprachmodelle hatten wir schon eine
Technik gesehen, was man da machen kann.
Die hatte sich damit beschäftigt, dass ich halt häufig viel
geschriebene Texte habe, Zeitungstexte, aber wenig geschriebene Texte
zum Beispiel von Konversationen, wo sich Leute miteinander
unterhalten.
Was konnte man da machen?
Was war da eine Technik, die man anwenden konnte?
Was war die Standardtechnik da, um diesen Domänen-Mismatch besser in
den Griff zu bekommen, um damit leben zu können, dass ich häufig sehr
viel Trainingsmaterial in der falschen Domäne habe und nur sehr wenig
Trainingsmaterial in der richtigen Domäne?
Was war da die Standardtechnik?
Ja, aber wir hatten da insbesondere gesehen als Standardwerkzeug die
Interpolation, dass ich mir ein Hintergrundsprachmodell trainiere auf
diesen großen Mengen an Texten, die jetzt nicht auf meine Domäne
passen.
Und Ziel des Hintergrundsprachmodells war es, allgemein Sprache in
dieser Zielsprache zu modellieren.
Und das habe ich dann interpoliert mit einem Sprachmodell, das nur auf
sehr wenig Trainingstexten trainiert war, wo teilweise die Schätzungen
bestimmter N-Gramme nicht robust waren oder sehr viele N-Gramme aus
der allgemeinen Sprache auch nicht vorkamen.
Und auf die Art und Weise konnte ich mich so ein bisschen auf diese
Zieldomäne adaptieren.
Das war zum Beispiel dann eine Möglichkeit der Adaption.
Und diese Möglichkeiten der Adaption hat man nicht nur jetzt in dieser
Form für dieses Sprachmodell, sondern die hat man auch auf allen
Ebenen in der Vorverarbeitung, im akustischen Modell und natürlich
auch im Sprachmodell.
Und die Idee, die dahinter steckt, ist häufig, ich habe Daten aus
einer bestimmten Domäne, die sind transkribiert, die liegen als
elektronischer Text vor und auf denen kann ich trainieren.
Aber diese Domäne entspricht nicht unbedingt der Domäne auf der ich
hinterher testen muss.
Oder es kann auch sein, ich trainiere für ein bestimmtes Szenario, ein
Spracherkennungssystem und dann wird dieses Spracherkennungssystem
angewandt in der Domäne.
Und das soll da für eine gewisse Zeit laufen, idealerweise über Jahre
und die Domäne ändert sich.
Nachrichten verändern sich, es kommen andere Themen hoch, man spricht
über andere Themen.
Wenn ich zum Beispiel ein Spracherkennungssystem trainiert habe, um
die Tagesthemen zu verschriften, dann habe ich viele Jahre Tagesthemen
gesammelt, die verschriftet, funktioniert wunderbar, insbesondere auf
dem Studiosprecher, da gibt es eh nur 3, 4 Studiosprecher, da habe ich
in meinen Trainingsdaten tonnenweise Material von gesehen und dann
wechselt der Studiosprecher.
Allerdings nachdem ich das System halt schon rausgegeben habe.
Plötzlich ist ein anderer Studiosprecher.
Theoretisch müsste ich jetzt wieder zurückgehen und von dem
Studiosprecher Daten transkribieren und das dann in das System
einpflegen, damit das dann wieder so super toll funktioniert auf
diesem neuen Sprecher, wie es für die alten Bekanntensprecher
funktioniert.
Ist natürlich nicht realistisch in der Praxis.
Themen ändern sich.
Heute ist es Syrien, morgen ist es vielleicht Lateinamerika,
übermorgen ist es wieder Südafrika oder vielleicht ist irgendwann mal
was irgendwo in Australien los.
Kommen plötzlich ganz andere Namen, andere Bezüge etc.
Es gibt Wahlen, die Politiker wechseln sich etc.
Das heißt auch dadurch, dass ein System halt eine Weile im Einsatz
ist, ändert sich die Welt drum herum und die Domäne, für die es
gedacht ist, ist zwar von der generischen Beschreibung immer noch
gleich, aber die Daten, die aus dieser Domäne kommen, ändern sich.
Sprecherabhängigkeit versus Sprecherunabhängigkeit ist ein
Paradebeispiel.
Wenn ich Spracherkennungssysteme genau auf einen Sprecher zuschneide,
wenn ich von ihnen zehn Stunden Sprache nehme und darauf ein
Spracherkennungssystem trainiere, kann das super sie erkennen.
Wenn sie dem dann Texte diktieren und ich von der Domäne her das
richtige Sprachmodell habe, können wir da ganz super tolle
Sprachergebnisse liefern.
Jetzt kann ich natürlich nicht von jedem, der hinterher in ein
Spracherkennungssystem reinsprechen soll, erstmal zehn Stunden Daten
sammeln und die transkribieren.
Also hatten wir uns gesagt, okay, wir behelfen uns mit so einer
Krücke.
Wir nehmen nämlich einen Sprecher, wir nehmen möglichst viele
Sprecher, auf denen trainieren wir und dann hoffen wir, dass das, was
bei herauskommt, irgendwie repräsentativ ist für beliebige Sprecher,
sodass wenn ein neuer Sprecher reinspricht, das auch funktionieren
wird.
In der Praxis ist es aber immer noch so, dass ein sprecherabhängiges
System nach wie vor immer besser sein wird als ein
sprecherunabhängiges System.
Kann man sich auch leicht vorstellen, wenn man sich da vorstellt, man
hat diese Gauss-Mixtur- Modelle, die werden trainiert und je mehr
unterschiedliche Sprecher ich bringe, desto mehr Variabilität bringe
ich da rein.
Die Variabilität kann eine Gauss-Mixtur durch zwei Dinge auffangen.
Die erste Möglichkeit ist, dass es mehrere Gauss- Mixturen für
unterschiedliche Variationen hat und da die Mittelwerte hin
verschiebt.
Aber da komme ich auch irgendwann an die Grenzen, weil pro Gauss
-Mixtur brauche ich ein bestimmtes Trainingsmaterial plus das müssen
ja auch noch andere Varianzen abgebildet werden.
Und die andere Möglichkeit ist, dass ich die Varianz der Gauss
-Glocken, der einzelnen Gauss-Glocken breiter mache.
Wenn ich natürlich die Varianz der einzelnen Gauss-Glocken breiter
mache, werden die unspezifischer.
Das heißt, die schlagen nicht mehr so stark an auf das, wofür sie
anschlagen sollen, für das Polyfon, für das sie stehen, sondern die
schlagen dann an für beliebige Sprache, für Sachen, für die sie auch
nicht stehen.
Das heißt, ich mache da Modellierungsfehler.
Deswegen schöner ist es, wenn ich möglichst von meinem Muster her mich
auf einen Sprecher einschieße.
Aber ich kann halt nicht erstmal zehn Stunden Sprache aufnehmen.
Das heißt, idealerweise wäre es so, dass ich zum Beispiel ein
sprecherunabhängiges System trainiert habe und dann kommt ein neuer
Sprecher und fängt an zu diktieren und nur indem ich dem Sprecher
zuhöre, mache ich meine Modelle besser, spezifischer für diesen
Sprecher.
Früher hatte man so einen Mittelweg gewählt, dass man nicht gesagt
hat, okay, ich will jetzt erstmal zehn Stunden reinsprechen und
transkribieren.
Früher, wenn man ein Diktiersystem gekauft hat, das kann sein, dass es
heutzutage immer noch so ist, würde Sinn machen, hat man halt ein
sprecherunabhängiges System genommen und dann hat man dem Sprecher,
dem neuen Sprecher, der da diktieren will, gesagt, lies doch mal bitte
15 Minuten Text vor.
Und hat dem Text gegeben, 15 Minuten hat er den vorgelesen.
Damit mit diesen 15 Minuten kann ich nicht ein komplett neues Modell
von Grund auf trainieren, das auf diesen Sprecher passt, aber ich kann
mein sprecherunabhängiges Modell so modifizieren, dass es besser auf
diesen neuen Sprecher passt.
Und das Ganze, diese Art der Anpassung, nennt sich Adaption.
Die erste Idee, die man da haben kann, ist die Adaption des
akustischen Modells.
Wir verwenden sprecherunabhängiges Modell als Grundlage.
Wir haben wenig Material vom Zielsprecher und passen jetzt das Modell
auf diesen Zielsprecher an.
Das ist erstmal so das generische.
Und dann kann man sich so grundlegende Sachen überlegen.
Man kann sich zum Beispiel ein bestimmtes Merkmal herausnehmen, zum
Beispiel die Grundfrequenz.
Man kann feststellen, okay, der Sprecher hat jetzt eine bestimmte
Grundfrequenz, hat einen besonders tiefen oder besonders hohen Stimme
und weiß dann, was das bedeutet für das Modell und kann das Modell
dann versuchen, zum Beispiel so zu transformieren, dass es besser auf
diese andere abweichende Grundfrequenz von dem Durchschnitt, den das
Modell hat, anzuwenden.
Die umgekehrte Möglichkeit ist, dass man sich die Merkmale, die man
extrahiert, hernimmt und dann die Merkmale versucht so zu
transformieren, dass sie besser auf dieses Durchschnittsmodell passen.
Das Durchschnittsmodell wurde so trainiert, dass es auf so eine
durchschnittliche Grundfrequenz passt.
Jetzt habe ich einen Sprecher, dessen Grundfrequenz weicht ab.
Dann transformiere ich die Merkmale so, verzerre ich das Spektrum, das
herauskommt so, dass es besser auf ein Spektrum passt, als hätte es
diese Grundfrequenz.
Jetzt ist natürlich die Frage, wo bekommt man diese Sachen her?
Man muss ja irgendwie, man kann den Sprecher nicht fragen, sag mal,
mit was für einer Grundfrequenz sprichst du denn?
Ah, 300 Hertz, super, dann weiß ich.
Das muss ich ja irgendwie automatisch schätzen.
Und dann muss ich ja auch irgendwie wissen, wie verändere ich denn
mein Modell?
Wie verändere ich mein Spektrum, wenn ich jetzt weiß, wie das Ganze im
Durchschnitt abweicht?
Da gibt es keine handgeschriebenen Regeln.
Wenn jetzt Grundfrequenz 50 Hertz höher, dann Gauss-Glocke 1, dann
muss der Mittelwert nach da verschoben werden und die Varianz so
gequetscht und Gauss-Glocke 3455 in die Richtung.
Auch das muss irgendwie datengetrieben passieren.
Das muss maschinell gelernt werden.
Das hatten wir schon gesagt.
So eine Konormalisierung hatten wir schon beim Capstrum.
Wir hatten gesehen, dass das Capstrum zum Beispiel Signalenergie, also
ob einer laut oder leise spricht, fast ignoriert.
Die Signalenergie beim Capstrum fließt nur in die Berechnung des 0.
Koeffizienten ein.
Alle anderen Capstralkoeffizienten sind automatisch völlig unabhängig
von der Signalenergie.
Und jetzt kann man so ein bisschen hergehen und sich überlegen, was
sind das denn so die möglichen Sachen, in denen ein Sprecher variiert.
Wir hatten schon gesagt, er kann zum Beispiel in der Grundfrequenz
variieren.
Jetzt hatten wir aber schon gesehen, bei der Mailskalierung wird die
Grundfrequenz, die genaue Position der Grundfrequenz, wird sowieso
verschoben, wird sowieso verschmiert.
Das kennen wir nicht so genau.
Was aber durchaus interessant ist, ist dann auch zum einen die
Position der Oberschwingungen.
Und dann interessiert uns natürlich insbesondere die Position der
Formanten, also die Frage, welche, wie viel der Oberschwingung schlägt
denn besonders stark an und wo liegt die.
Und das wird halt bestimmt nicht so sehr durch die Länge der
Stimmlippen, durch die Grundfrequenz, sondern das wird unter anderem
bestimmt, also welcher wird zu einem Formant und die wievielte
Oberschwingung ist denn dann der Formant?
Das wird bestimmt durch die Länge des Vokaltraktes und die Form des
Vokalkraktes.
Dann können wir uns halt auf bestimmte Stimmcharakteristiken
einsprechen.
Zum Beispiel, der eine hat einen Sprachfehler und lispelt, der andere
nuschelt, der andere spricht wieder sehr nasal.
Wir haben sowas wie regionale Akzente.
Das heißt also, Vokale können zum Beispiel eine andere Klangfarbe
bekommen.
Ich kann andere Phoneme verwenden für ein und dasselbe Wort.
Die einen sprechen besonders schnell, die anderen sprechen besonders
langsam.
Der eine betont bestimmte Wörter oder Silben besonders stark etc.
etc.
Dann habe ich Sprachakzente, also Fremdsprachler versus
Muttersprachler.
Hören sich unterschiedlich an, haben unterschiedliche
Charakteristiken.
Dann muss ich mir was überlegen, wie kann ich unterschiedliche
Mikrofon - charakteristiken mit denen umgehen.
Wie kann ich mit Hall umgehen?
Hall ist etwas, das auf Signalebene das Signal stört.
Kann ich das irgendwie rausbekommen?
Kann ich sowas wie Hintergrundgeräusche versuchen raus zu adaptieren,
zu normalisieren?
Was ist mit übersprechen?
Das heißt, wenn ich in meinem Mikrofon noch irgendeinen anderen
Sprecher höre, dann will ich den ja auch nicht erkennen.
Das Besondere bei der Adaption oder was die Adaption vom Training
unterscheidet ist.
Auch beim Training haben wir insbesondere beim EM-Training diese
Situation, ich brauche ja erstmal irgendein Modell, das ich mir
irgendwo vom Himmel her zaubere und dieses Modell kann ich dann
mithilfe des EM-Algorithmuses besser machen.
Ich brauche irgendwo ein initiales Modell.
Jetzt könnte man da sagen, ja gut, das ist ja hier das gleiche.
Das sprecherunabhängige Modell ist halt genauso ein initiales Modell
wie das zufällig initialisierte oder das mit irgendwelchen Labels
initialisierte Modell.
Darauf mache ich ein... und dann wende ich ein Training an.
Der Unterschied bei der Adaption zum Training ist, beim Training
werden immer alle Parameter angepasst.
Beim EM-Algorithmus, wenn ich den einmal über die Trainingsdaten
überlaufen lasse, passt der mir danach alle Parameter meines Modells
an.
Bei der Adaption habe ich in der Regel aber deutlich zu wenig
Trainingsdaten, um alle Parameter anpassen zu können.
Werde zum Beispiel für bestimmte Parameter nur sehr wenig
Trainingsdaten sehen und jetzt schätze ich diese Parameter auf sehr
wenigen Trainingsdaten, die zwar charakteristisch sind, aber trotzdem
so wenig sind, dass ich gar nicht robust meinen Parameter darauf
schätzen kann.
Sondern das kann sein, dass ich dann ins Overfitting komme oder auf
zufälligen Ausreißern meine Parameter völlig verhunze.
Andere Parameter werde ich überhaupt kein Trainingsmaterial haben.
Die werden dann überhaupt nicht angepasst.
Das ist aber schade, weil ich ja aus den Adaptionsdaten vielleicht so
eine grobe Tendenz absehen kann, die ich auf alle Trainingsdaten
anwenden kann.
Das heißt, bei der Adaption kommt man dann dahin, dass ich nicht im
regulären Training alle Parameter so anpasse, wie ich es im regulären
Training mache, sondern ich muss irgendwie aus diesen Adaptionsdaten
abstrahieren können, um eine in der Regel Transformation zu finden,
die mir meine Parameter ändert.
Aber die Transformation selber muss deutlich weniger Parameter haben
als die Anzahl derjenigen Parameter, die ich verändere.
Einfaches Beispiel, da hat einer, der spricht halt zufälligerweise so,
dass alles zehn Hertz nach oben verschoben ist.
Dann kann ich mir das umrechnen.
Was bedeutet das denn in meinem CapStrom?
Und dann kann ich in meinem CapStrom die Mittelwerte aller Gauss
-Glocken einfach entsprechend in die Richtung verschieben.
Da brauche ich genau einen Parameter.
Das ist nämlich die Distanz, oder sagen wir mal zwei Parameter.
Die Distanz, also um wie viel und in welche Richtung verschiebe ich
denn in diesen multidimensionalen Raum?
Und dieser Vektor, der eine gewisse Länge hat und eine gewisse
Richtung zeigt, hat genauso viele Parameter zum Beispiel wie die
Dimension meines Merkmalsvektors, 42.
Und mit dem kann ich dann 60.000 Parameter automatisch adaptieren,
wenn ich diesen einschätze.
Das wäre eine einfache additive Transformation, einfach auf alle
Mittelmerzvektoren, die ich habe, mit noch mal ein Vektor drauf
addiert.
Fertig.
Und diesen einen Vektor kann ich dann halt, der hat nur 42 Parameter,
relativ robust auf den wenigen Adaptionsdaten haben, die ich habe,
schätzen.
Das heißt, ich habe hier irgendwo unadaptierte Modelle, bekomme diese
wenigen Adaptionsdaten rein, schätze darauf eine Transformation, die
deutlich weniger Parameter hat als die unadaptierten Modelle.
Diese geschätzte Transformation wende ich auf die unadaptierten
Modelle an und bekomme meine adaptierten Modelle.
Und jetzt gibt es hier noch einen Pfeil, der zeigt von den
unadaptierten Modellen in die Transformationsschätzung rein.
Und das liegt daran, ich muss ja irgendwie diese Transformation
schätzen.
Ich muss ja irgendwie schätzen können, macht die Transformation, wenn
ich die Parameter so wähle, das Ganze besser oder macht die
Transformation das Ganze schlechter, wenn ich die Parameter so wähle.
Und dann muss ich irgendwie optimale Parameter finden.
Und um diese Schätzung durchzuführen, ist eine bestimmte
Transformation eher gut oder eher schlecht, verwende ich die
unadaptierten Modelle, um daraus im Prinzip zu gucken, okay, das sind
die unadaptierten Modelle, das passiert, wenn ich die unadaptierten
Modelle auf die Adaptionssprache loslasse, wie kann ich denn jetzt die
Transformation verändern, anpassen, so dass hinterher adaptierte
Modelle besser sind.
Wenn ich so auf die Art und Weise meine Adaption durchführe, kann ich
erst mal prinzipiell unterschiedliche Operationsmodi unterscheiden.
Das Erste wäre Batch-Verarbeitung oder auf gut Deutsch
Stapelverarbeitung versus Incremental.
Die Idee dahinter ist, wo bekomme ich die Adaptionsdaten her.
Bei diesem ersten Beispiel mit dem Diktiersystem, bitte mal 15 Minuten
reinsprechen, kriege ich auf einen Stapel in einer großen Menge 15
Minuten Adaptionsdaten, kann die einmal anwenden, also einmal komplett
von vorne, hinten durchverarbeiten, auf das Modell anwenden, bekomme
ein adaptiertes Modell.
Das gegenteilige Szenario wäre, ich lasse den Sprecher einfach
losdiktieren und während er so losdiktiert, sammle ich Daten über ihn
und mache dadurch im Laufe der Zeit, je mehr Daten ich habe, desto
besser wird meine Transformation, desto mehr Parameter kann meine
Transformation haben, so im Laufe der Zeit wird dann halt meine
Transformation immer besser und besser.
Das wäre die Art der inkrementellen Adaption, dass man je mehr
Trainingsdaten man hat, desto besser, größer, mächtiger wird die
Adaption, die ich schätze.
Dann unüberwacht versus überwacht.
Wieder das erste Szenario, hier ist ein Text, lies mir mal vor.
Dann weiß ich, was der Sprecher vorgelesen hat.
Ich weiß genau, das Audio, das er jetzt spricht, entspricht dem, was
er vorliest.
Ich habe die Transkription dessen, was er gesagt hat.
Oder noch aufwändiger, ich lasse den 15 Minuten vorlesen, das manuell
transkribieren, weiß ich auch.
Oder lasse den 15 Minuten sprechen, transkribiere das manuell, weiß
ich auch, was er gesagt hat.
Ich habe die Supervision.
Ich kann dann überwacht trainieren, ich habe die korrekte Klasse zu
meinen Merkmalsvektoren.
Das zweite Szenario, wo ich ihn einfach mal losdiktieren lasse und ich
höre zu und mache dann meine Adaption im Laufe der Zeit besser, das
ist unüberwacht.
Ich weiß nicht, was der diktiert.
Ich kann nur erkennen mit meinem bisherigen sprecherunabhängigen
Modell, was er vermutlich gesagt hat, was mein Spracherkenner glaubt,
dass es ist.
Das wird Fehler enthalten.
Trotzdem kann ich jetzt aber so tun, als sei das, was ich erkannt
habe, mehr oder minder die korrekte Transkription dessen, was er
gesagt wurde.
Ich kann mir dann zum Beispiel die Konfidenzmaße, über die wir schon
gesprochen hatten, diese wortbasierten Posteriori-
Wahrscheinlichkeiten hernehmen als Konfidenzmaß und damit zum Beispiel
den Einfluss von erkannten Gewichten, wenn ich mal so sehr sicher bin,
dieses Wort habe ich sicher, sicher, sicher richtig erkannt, kann ich
das stärker für die Adaption verwenden als ein Wort, wo ich mir sage,
oh, da bin ich mir überhaupt nicht sicher, ob ich das richtig erkannt
habe.
Dann Training versus Normalisierung.
Man kann diese Adaptionsdaten zum Beispiel für ein EM-Training
verwenden.
Hat halt den Nachteil, dass ich viele Parameter nicht anfassen werde,
für die ich nicht genügend Trainingsdaten habe.
Das ist nicht schlimm, die werden dann nicht verändert.
Das EM-Training ist dann nicht so, dass es sagt, okay, wir werden auf
Null gesetzt, sondern die Daten, die Parameter, für die ich keine
Trainingsdaten gesehen habe, werden in der Regel nicht angefasst.
Und dann irgendwann im Laufe der Zeit, wenn ich das zum Beispiel in
inkrementell durchlaufen lasse, wird die ASR irgendwann
sprecherabhängig.
Schöner ist, wenn ich halt so eine Transformation finde, die die
Variation zwischen den Sprechern minimiert.
Sprich, ich kann zum Beispiel die Eingabe so transformieren, dass ich
sämtliche Sprecherinformationen raustransformiere und die Modelle gar
nicht mehr anfassen muss.
Das nennt man dann Normalisierung.
Man macht das Audio, man macht den Sprecher, den man jetzt bekommt,
den biegt man so um, dass er auf den Standardsprecher, auf den
Normsprecher passt.
Dementsprechend kann ich mir überlegen, was transformiere ich denn?
Transformiere ich die Merkmalsvektoren, die reinkommen, und passe die
so an, dass sie besser auf das Modell passen?
Oder modifiziere ich die Modelle, verschiebe ich die
Mittelwertsvektoren, mache ich irgendwas mit den Varianzen, so dass
sie besser auf das einkommende Signal passen?
Das ist dann die Merkmals- versus die Modelltransformation.
Die Batchadaption ist etwas, das ist eigentlich sehr gut, wenn man ein
System lange Zeit benutzt.
Diktiersystem.
Kann man davon ausgehen, dass das, wenn sich der Sprecher das gekauft
hat und endlich völlig unzufrieden damit ist, dass er das über lange
Zeit lange verwenden wird.
Dann kann man es sich durchaus, dann lohnt sich dieser Trade-off
zwischen Zeit, Aufwand, die es kostet, dass er da 15, 20 Minuten was
vorlesen muss, versus Gewinn, den ich dadurch erziele.
Danach kann er jahrelang ein deutlich besseres System benutzen.
Da kann ich Batchadaption machen.
Ich sollte mir natürlich überlegen, dass die Daten, die ich vorlesen
lasse, die Texte, die ich vorlesen lasse, möglichst gut geeignet sind
für die Adaption.
Das spielt dann so was, sind die Sachen phonetisch balanciert, also
sehe ich möglichst alle Phoneme, sehe ich möglichst alle Polyphone in
irgendeiner Form.
Alle Polyphone werde ich nicht sehen, aber möglichst irgendwie
repräsentativ für möglichst viele Polyphone.
Und in der Regel dann adaptiere ich einmal im Batchmodus, am besten
überwacht auf den Einschreibungsdaten.
Also es macht nichts, macht wenig Sinn zu sagen, hier red mal 15
Minuten frei was rein und dann mache ich eine unüberwachte Adaption,
sondern dann kann ich Ihnen auch sagen, hier liest bitte 15 Minuten
was vor und kann dann überwacht darauf adaptieren, was natürlich dann
auch besser funktioniert.
Wenn ich ein System kürzer verwende, zum Beispiel ich habe fünf Leute,
die treffen sich zu einem Meeting und die haben dann anderthalb
Stunden Meeting und danach möchte ich ein automatisches Transkript
haben, automatischen Protokoll, dann lohnt es sich, dass man so was
wie eine inkrementelle Adaption macht.
Das heißt, je länger jemand dann in der Besprechung spricht, desto
mehr Daten bekomme ich, desto mehr adaptiere ich mich auf ihn und kann
das zum Beispiel nach jedem Satz machen oder wenn ich eine bestimmte
Anzahl, Mindestmenge an Adaptionsdaten gesammelt habe und mache dann
meine Transformation immer wieder weiter, weiter, weiter oder weiter.
In der Regel macht man sowas unüberwacht.
Überwacht macht man das meistens nicht, außer man kann das irgendwie
in den Anwendungsfall reinbauen, so dass man den Benutzer sozusagen
überlistet.
Einfaches Beispiel, ich spiele ein Spiel, so ein Lernspiel zum
Beispiel, wo man Fremdsprache lernen und üben soll und dann spielt er
halt das Spiel, dann lasse ich den jetzt nicht 15 Minuten vorher mal
was vorlesen und sage ihm, pass auf, damit meine Spracherkennung
hinterher im Spiel funktioniert, muss ich dich mal 15 Minuten was
vorlesen lassen.
Sondern man lässt den losspielen, man adaptiert sich auf dem, was er
sagt und dann baut man irgendwo eine Aufgabe ein.
Die Aufgabe lautet, was weiß ich, da sitzt einer, ich bin blind, lese
mir bitte den Text vor.
Und dann auf die Art und Weise kann man dann mehr oder minder das
Ganze zum Beispiel überwacht machen.
Und über solche Tricks kann man halt dann versuchen, Überwachung
reinzubekommen.
Und macht halt das System kontinuierlich besser.
Und dann gibt es noch den dritten Fall, der Autoadaption.
Das ist für eine sehr kurze oder einmalige Benutzung des Autosystems.
Jemand ruft an und möchte Flugtickets reservieren.
Kann man natürlich sagen, ja mach ich doch inkrementell.
Lass ich vorher nicht was vorlesen, sondern den mache ich inkrementell
und lass das loslaufen.
Hat natürlich das Problem, wenn ich dann inkrementell anfange, nach
drei Sätzen ist die ganze Sache eh schon vorbei.
Da ist es dann sinnvoll, dass man, nachdem man eine Audioaufnahme
gemacht hat, vom ersten Satz erkennt, adaptiert und dann nicht zum
nächsten Satz übergeht, sondern gleich die Schleife zurück macht und
das Ding nochmal erkennt.
Damit man schon nach dem ersten Satz ein adaptiertes Modell hat.
Damit man dann nach drei Sätzen schon, hat man zwar dann noch mehr
Material und ist noch besser, aber damit man dann schon nach dem
ersten Satz und nach dem zweiten Satz was hat, warte ich jetzt nicht
erst bis ich zehn Sätze habe und mache die inkrementelle Adaption und
dass dann der elfte Satz adaptiert ist, sondern direkt gleich die
Schleife zurück, erkennen, adaptieren, erkennen.
In der Hoffnung, dass beim zweiten Mal erkennen das Ganze dann schon
besser ist.
Die Idee hatten wir schon, dass man also bei der unüberwachten
Adaption halt einen Erkennungslauf durchführt und dann so tut, als sei
dieser Erkennungslauf die korrekte Transkription, die ich auch bei der
manuellen Transkription bekomme und gewichte gegebenenfalls einzelne
Teile der Transformation noch durch die Konfidenzmaße.
Und bei Überwacht kann ich den entweder den vorgegebenen Text vorlesen
lassen, das nennt man dann Enrollment auf Deutsch Einschreibung oder
eine Möglichkeit wäre natürlich auch, dass der Sprecher Fehler des
Systems korrigiert.
Beispiel Diktatsystem, sollte man meinen, dass der hoffentlich die
Fehler, wenn das System Fehler macht, die irgendwie diktiert nochmal
anders tippt und da kann man auch versuchen, das dann als Überwachung
zu verwenden, wobei man natürlich da auch aufpassen muss, korrigiert
er jetzt, weil das System falsch erkannt hat oder korrigiert er, weil
er sich da vielleicht versprochen hat an der Stelle.
Da muss man dann auch versuchen, ein bisschen zu diagnostizieren,
warum wurde jetzt geändert.
Also Training versus Normalisation haben wir schon gesagt.
Beim Training modifizieren wir nur die Modellparameter, bei denen auch
Adaptionsdaten vorkommen.
Wenn ich unendlich viele Daten habe oder sehr viele Daten habe, wird
es dann irgendwann ein sprecherabhängiges System, weil alle Parameter,
wie beim EM-Training, adaptiert wurden.
Bei der Normalisierung, wenige Daten, aber eine große Transformation,
die trotzdem irgendwie auf alle Daten irgendwie passt, ist natürlich
dann teilweise suboptimal für einige Daten.
Ich generalisiere von Phonemen, die ich gesehen habe in den
Adaptionsdaten, auf andere Phoneme, andere Modelle, die ich nicht
gesehen habe, kann natürlich die Generalisierung unter Umständen nicht
ganz so optimal sein, als hätte ich Daten davon gesehen.
Hier sind Beispiele von einer Merkmalstransformation während einer
Modelltransformation.
Was wir hier sehen, sind erstmal wieder die
Emissionswahrscheinlichkeiten eines HMM-Zustands als GMM.
Ich habe hier K Gaussglocken, ich habe hier die Gewichte der
Gaussglocken, hier vorne den Normalisierungsfaktor und dann E hoch
Merkmalsvektor minus Mittelwertsvektor mal Inversen der
Kovarianzmatrix.
Bei der Merkmalstransformation habe ich jetzt eine Funktion, die auf
dem Merkmal X, auf dem extrahierten Merkmalsvektor X operiert und den
irgendwie entsprechend anpasst, sodass es besser wird.
Umgekehrt bei der Modelltransformation habe ich diese
Adaptionsfunktion F, die auf den Modellen operiert.
Hier zum Beispiel gibt es diese Funktion Fj, die auf den Mittelwerten
operiert, die die Mittelwerte anfasst.
Genauso könnte ich mir eine andere Funktion F anschauen, die zum
Beispiel die Kovarianzmatrix adaptiert.
Oder ich könnte mir noch eine dritte Funktion F anschauen, die die
Gewichte irgendwie transformiert.
Diese Funktion F hier ist global.
Es gibt eine Funktion F, die auf alle Merkmale angewandt wird und
nicht für unterschiedliche Merkmalsvektoren, unterschiedliche
Transformationsmatrixen.
Hier gibt es mehrere Funktionen.
Deswegen haben die einen Index Fj.
Dieser Index j geht von 0 bis einem Wert n, der deutlich kleiner ist
als die Anzahl der Parameter, die ich transformiere.
Ich habe hier K Gaussglocken pro Modell und ich habe vielleicht Groß m
Modelle, dann habe ich K mal m mögliche Mittelwertsvektoren.
Und dieses j sollte natürlich deutlich, deutlich, deutlich, deutlich
kleiner sein als K mal m.
Wenn ich 10.000 Modelle habe, dann sollte das j vielleicht zum
Beispiel 100 sein, damit ich dann mit deutlich weniger Parametern
dieses, dass ich deutlich weniger Funktionen schätzen muss und die
Funktion selber sollte dann selber auch noch deutlich weniger
Parameter haben, die es zu schätzen gilt als dieses K mal m, sodass
dieses j mal Anzahl Parameter vom F deutlich kleiner ist als die
Anzahl der Parameter, die ich transformieren möchte.
Generell gilt, mit so einer Modelltransformation kann ich jederzeit
eine Merkmalstransformation simulieren.
Also wenn ich hier zum Beispiel bei dem x eine Funktion habe, die auf
das x immer 10 drauf addiert, dann kann ich genauso gut eine Funktion
haben, die halt hier die 10 abzieht.
Ist das gleiche.
Und je nachdem, was ich da halt mit dem x global mache, kann ich das
Ganze auch auf dem x sein lassen und entsprechend auf den Parametern
in der Regel anwenden.
Frage ist, wann wende ich die Modelltransformation an?
Ich habe halt eine Trainingsphase und ich habe eine Erkennungsphase.
Während des Trainings der Modelltransformation oder während des
Trainings schätze ich mein Modell, das ich für die Erkennung anwende.
Und dann während der Erkennung selber, wo komme ich jetzt Sprache
rein, schätze eine Modelltransformation, die ich dann anwende und
wobei die Schätzung der Modelltransformation in der Regel von diesen
Modellen auch abhängt.
Und dann werden die Modelle transformiert und gehen in den Erkenner
rein.
Das heißt, die Verbindung wird durchgeschnitten und bei der
Merkmalstransformation ist es entsprechend auch so, dass hier die
Merkmale durch so eine Transformation durchgeschleust werden, die die
Erkennung dann kommt.
Und die Schätzung dieser Merkmalstransformation ist in der Regel auch
abhängig von den Modellen.
Jetzt hat man natürlich die Frage, man muss irgendwie eine Optimierung
haben.
Ich habe also eine Transformation, da habe ich Parameter, ich kann
jetzt die Parameter irgendwie frei wählen und die Frage ist, was sind
gute Parameter, was sind schlechte Parameter?
Brauche ich wieder ein Optimierungskriterium?
Genauso wie ich beim HMM-Training auch ein Kriterium brauche, das mir
sagt, was sind gute Parameter, was sind schlechte Parameter, brauche
ich das hier auch.
Beim HMM hatten wir gesagt, gute Parameter eines HMMs sind diejenigen,
die die Trainingsdaten mit möglichst großer Wahrscheinlichkeit
generieren.
Das hatten wir die Maximum-Likelihood-Schätzung genannt.
Und das können wir auch bei der Schätzung dieser Transformation
natürlich anwenden, dass wir also die Testdaten, die wir reinkommen,
durch die Transformation durchschleusen und dann dafür sorgen, dass
die Transformation auf den Modellen am Ende dafür sorgt, dass die
transformierten Modelle die einkommenden Merkmale mit möglichst größer
Wahrscheinlichkeit hervorbringen.
Man kann versuchen, direkt mit Distanzmaßen zu arbeiten.
Zum Beispiel kann man versuchen, irgendwie die Merkmale so zu
transformieren, dass die Distanz zwischen den Durchschnittsmerkmalen,
die ich im Training verwendet habe und den Merkmalen, die jetzt
reinkommen, möglichst klein wird.
Oder ich habe wieder ein Maximum-Aposteriori-Kriterium, wie insgesamt
bei der Spracherkennung auch, dass ich die wahrscheinlichsten
Parameter finde, gegeben meine Daten.
Das hängt dann natürlich wieder von dem Fall ab, wie ich das schätzen
kann.
Diese Art der Schätzung hat halt wieder den Nachteil, dass wenn ich
keine Daten habe, keine Parameter geändert werden.
Wenn ich nur wenig Daten habe, werden in der Regel nur die Parameter
geändert, für die ich wenig Daten habe und für die, die ich keine
Daten habe, werden die Parameter nicht geändert.
Die haben keinerlei Einfluss auf dieses P von Param gegebenen Daten.
Je mehr Daten ich dann im Laufe der Zeit reinkomme, desto mehr nähere
ich mich dann in der Regel auch der Maximum-Likelihood-Schätzung an.
Wir werden uns jetzt mal ein paar unterschiedliche Adaptionsmethoden
anschauen, beispielshaft.
Wir müssen uns also überlegen, was transformieren wir?
Merkmale oder Modelle?
Dann, was für eine Distanz, was für eine Korrespondenz?
Wollen wir Unterschiede zwischen Sprache und Sprache klein machen?
Wollen wir Unterschiede machen zwischen den Merkmalen der Sprache, die
reinkommt, und den Modellen, den adaptierten Modellen möglichst klein
machen?
Wie transformieren wir?
Haben wir eine parametrische Transformation?
In der Regel ja.
Wie viele Parameter spendieren wir denn dieser Transformation?
Und dann, wie schätzen wir die Parameter der Transformation?
Und was wir uns anschauen werden, sind folgende Transformationen.
An erster Stelle steht so etwas, das nennt sich eine
Vokaltraktlängentransformation, die von der Motivation, Idee dahinter
ist, ich schätze die Länge des Vokaltraktes und nummiere meine
Merkmale entsprechend zurück auf Standard-Vokaltraktlängen.
Die Länge des Vokaltraktes ist genau ein Parameter, den ich schätzen
muss.
Die andere Möglichkeit ist, dass ich meine reinkommenden Merkmale um
konstanten Offset verschiebe.
Hat dann halt so viele Parameter wie die Dimension des
Merkmalsvektors.
Für jede Dimension brauche ich einen.
Oder ich kann zum Beispiel linear transformieren, eine lineare
Abbildung durchführen.
Das heißt, Merkmale mit einer d x d Matrix multiplizieren und dann
noch dieses d große Offset drauf addieren.
Dann habe ich d Quadrat plus d Parameter.
Statt das einmal global zu haben, kann ich auch unterschiedliche
Modelle, unterschiedliche Transformationen, lineare Transformationen
spendieren.
Angenommen, ich habe n unterschiedliche lineare Transformationen und
habe irgendeine Abbildung, die mir sagt, für den Parameter bitte die
Transformation, für den Parameter die Transformation, dann habe ich da
entsprechend n x d Quadrat plus d.
Oder wenn ich nur die Mittelwerte verschiebe, statt linear
transformiere und davon insgesamt m habe, dann hätte ich nur sowas wie
m x d.
Und anhand dieser Auflistung kann man schon sehen ungefähr, welche
Transformation braucht wie viel Daten.
Die offensichtlich ganz wenig, die immer noch ein bisschen wenig, aber
schon ein bisschen mehr.
Da wird schon deutlich mehr.
Da haben wir plötzlich die Dimension, die schon im Quadrat reinfließt,
aber absolut gesehen ist es wenig.
Hier skaliert es dann mit der Anzahl der Transformationen, die ich
habe.
Das hier offensichtlich am meisten bei gleicher Anzahl
Transformationen hat das hier den größten konstanten Faktor und hier
einen kleineren konstanten Faktor bei gleicher Anzahl
Transformationen.
Da muss man sich dann auch überlegen, wie viele Transformationen nehme
ich denn und kann das dann entsprechend abhängig machen, auch wieder
von der Größe, von der Menge der Adaptionsdaten.
Das einfachste ist die Vokaltraktlängen
Nummierung.
Prinzipiell gilt, die Grundfrequenz ist nur abhängig von der Länge der
Stimmbänder.
Die betrachten wir hier nicht.
Was aber abhängig ist von der Länge des Vokaltraktes, ist da, wo die
Resonanzfrequenzen verstärkt auftreten.
Die harmonischen, die Oberschwingungen sind natürlich abhängig davon,
welche Grundfrequenz ich habe.
Vielfache der Grundfrequenzen sind die harmonischen, aber einige
dieser harmonischen werden halt besonders stark verstärkt.
Das sind dann die Resonanzen.
Und wo diese Resonanzen liegen, beim Wievielten der Oberschwingung,
das hängt dann ab von der Länge des Vokaltraktes.
Das ist dann das Beispiel große Flöte, Bassflöte, kleine Flöte,
Piccolo -Flöte.
Das ist das, was hier passiert.
Und dementsprechend Menschen mit langem Vokaltrakt werden eher
niedrige Resonanzfrequenzen haben und werden die Verwandten eher
weiter nach unten verschoben haben.
Umgekehrt Menschen mit kurzem Vokaltrakt werden eher hohe
Resonanzfrequenzen haben, irgendwo weiter nach oben geschoben.
Und die Idee ist jetzt, dass man das Spektrum verzerrt.
Und da muss man ein paar Nebenbedingungen beachten.
Ich male das hier parallel nochmal an der Tafel aus, dann sieht man
besser, wie das da im Bild zustande kommt, was die Idee von dem Bild
ist.
Wie das schon auf der Folie steht, die Vokaltraktlängennomierung ist
etwas, das ich im Spektrum anwende.
Sprich, die Vokaltraktlängennomierung wird nach der Berechnung der DFT
angewandt.
Dementsprechend hier steht nur x als Merkmal und ein transformiertes
Merkmal x.
Für uns ist das natürlich dann entsprechend die Frequenz, die aus dem
Spektrum rauskommt.
Wir schreiben das Ganze hier mal kontinuierlich auf.
In Wirklichkeit hat man natürlich hier diskreten Frequenzbänder.
Hier unten, auf der Achse ist die x-Achse, trage ich sinnigerweise
dann mein Merkmal x auf, das ich habe.
Das Merkmal x geht von 0 Hertz bis... wie viel Hertz?
Was muss da oben stehen?
Bis wie viel Hertz geht mein Merkmal?
Wovon hängt das ab, was da oben steht?
Genau, von der Abtastrate.
Abtastrate ist 16.000, also steht da oben...
genau, sagt mir das Shannon-Theorien.
Okay, nehmen wir mal 8000 an.
f halber, wenn f die Grenzfrequenz ist.
Und was ich jetzt machen möchte, ist, dass ich Frequenzen, die ich
hier habe, verschiebe, auf andere Frequenzen abbilde.
Das ist mein x-Strich, mein adaptiertes.
Ich ordne Frequenzen hier, andere Frequenzen dazu und schiebe die dann
entsprechend rüber.
Jetzt habe ich zwei Nebenbedingungen.
Der Merkmalsvektor, den ich rausbekomme, der geht wieder von 0 bis
8000 Hertz.
Wenn ich jetzt adaptiere, wenn ich von 0 Hertz, irgendwo habe ich bei
0 Hertz irgendwas und das soll jetzt adaptiert werden, dann geht man
in der Regel davon aus, dass was bei 0 Hertz war, das bleibt bei 0
Hertz.
Das heißt, der erste Datenpunkt in meiner Funktion, die man jetzt
abbildet, welche Frequenz wird auf welche abgebildet, sagt hier, was
bei 0 Hertz war, soll bitteschön bei 0 Hertz bleiben.
Andersherum habe ich nicht mit dem Problem, wenn ich sagen würde, was
bei 0 Hertz war, das soll hier bei 50 Hertz rauskommen, was mache ich
denn dann hier damit von 0 bis 50 Hertz?
Da kann ich dann nichts reinschreiben.
Das will man vermeiden.
Genauso bei den 8000 Hertz.
Die 8000 Hertz kann ich jetzt nicht irgendwie hochschieben auf 9000
Hertz, weil die Merkmalsvektoren, die rauskommen sollen, sollen jetzt
nicht in der Länge vergrößert oder verkleinert sein, die sind immer
noch gleich viele, haben gleich viele Koeffizienten, soll also auch
auf 8000 Hertz bleiben.
Das heißt, ich kann sie nicht höher machen.
Wenn ich sie jetzt niedriger mache, wie fülle ich denn dann den oberen
Teil wieder auf?
Das will man auch vermeiden.
Also wird 8000 Hertz auch auf 8000 Hertz abgebildet.
Das sind die beiden Nebenbedingungen meiner Transformation.
Und was jetzt zwischendrin passiert, kann beliebig sein.
Ich kann jetzt hier irgendeine beliebige Funktion einzeichnen, die
Frequenzen auf Frequenzen abbildet.
Und da die Idee ist, dass ich im Prinzip sowas wie so einen globalen
Shift habe, der aber kein Shift ist, weil 0 Hertz und 8000 Hertz sind
oben festgetackert, ist das sowas wie eine Art Gummiband, das ich hin
und her schiebe.
Und dieses Gummiband wird an einer Stelle festgehalten.
Zum Beispiel sage ich, hier die 4000 Hertz
sollen auf 2000 abgebildet werden und der Rest bleibt linear.
Dann kann ich hier zwei Linien zeichnen und habe dann hier so eine
stückweise lineare Abbildung.
Hier wird entmäß dieser Linie, werden Frequenzen auf Frequenzen
abgebildet, also diese Frequenz auf diese, diese auf diese, bis
schließlich 4000 Hertz.
4000 Hertz wird auf 2000 Hertz abgebildet und danach hole ich nach und
nach immer weiter auf wieder.
Dieses Runterdrücken wird weniger dadurch und hinterher wird wieder
8000 Hertz auf 8000 Hertz abgebildet.
Wenn ich also 4000 Hertz auf 2000 Hertz abbilde, dann sage ich also,
okay, das Ganze ist, ich sehe gerade auf der Folie steht es, nicht
richtig, 4000 Hertz wird auf 2000 Hertz abgebildet, dann sage ich,
okay, hier ist ein Sprecher, der spricht eigentlich was mit 4000
Hertz, das eigentlich bei 2000 Hertz sein soll.
Das heißt, dessen Formanten sind nach oben geschoben, der hat eine
besonders hohe Stimme, das heißt, die Formanten müssen runtergeschoben
werden, damit sie wieder auf den Mittelsprecher passen.
Umgekehrt, wenn ich hier jemanden hätte, der 4000 Hertz hat und das
Ganze soll auf 6000 Hertz abgebildet werden, mache ich dann halt
entsprechend so eine stückweise Abbildung, dann ist das also einer,
der hat Sachen, die sind zu weit unten, die müssen, damit es zum
Durchschnitt passt, wieder nach oben geschoben werden, das ist das
eine mit einem sehr langen Vokaltrakt, einer Stimme, die die Formanten
zu weit unten hat.
Und das ist so eine stückweise lineare Funktion, die hat genau einen
Parameter, nämlich, oder die hat zwei Parameter, erstmal per se,
nämlich die Position dieses Punktes.
Jetzt hatten wir vorhin auf der Folie gesagt, die hat nur einen
Parameter.
Und warum hat die nur einen Parameter?
Diese Dimensionen lege ich vorher fest, die verändern ja nicht, ich
nicht, sondern ich sage immer bei der Hälfte, zum Beispiel bei 4000
Hertz, bestimme ich, ob hoch oder runter geschoben werden soll, dann
sind die 4000 Hertz fest und das einzige, was ich jetzt noch bestimme
als Parameter ist, auf was werden denn die 4000 Hertz abgebildet.
Und danach habe ich automatisch diese zwei linearen Stücke, mit der
ich das Spektrum verschiebe.
Und bei diesem festgehaltenen Wert, um wie viel ich den verschiebe,
das nennt man den sogenannten Warping-Faktor, hier mit Alpha
hingeschrieben.
Das sagt mir, ob ich den Vokaltrakt, ob der zu lang ist oder ob er zu
kurz ist.
Frage ist, wie schätze ich jetzt das Alpha?
Und da habe ich zwei Möglichkeiten.
Das eine ist wissensgetrieben und das andere ist datengetrieben.
Bei der wissensgetriebenen habe ich ein Wissen, dass ich schätze, wo
sind meine Formanten und Grundfrequenz und berechne das Verhältnis von
Formanten zu Grundfrequenz.
Das heißt, ich weiß, liegen die Formanten im Verhältnis zur
Grundfrequenz eher hoch oder eher niedrig und aus diesem Verhältnis
kann ich die Verzerrung ableiten und dann mein Alpha direkt als Formel
schätzen.
Oder ich kann es so machen, dass ich das Ganze mit Maximum-Likelihood
-Schätzung habe.
Also angenommen, ich habe eine überwachte Adaption, ich weiß, was
gesprochen wurde.
Dann kann ich jetzt ausrechnen, okay, bei diesem Alpha werden die
Adaptionsdaten von dem Modell mit der und der Wahrscheinlichkeit
hervorgebracht.
Und dann kann ich mein Alpha so variieren, dass diese
Wahrscheinlichkeit, mit der die Adaptionsdaten hervorgebracht wurden,
maximiert werden.
Jetzt könnte man sich überlegen, ja, da muss ich halt Funktionen
ableiten auf den Trainingsdaten und Parameter schätzen.
Das ist nur ein Parameter und der ist auch nicht sonderlich hibbelig,
was jetzt den genauen Parameter angeht.
Da probiere ich einfach 10 durch oder probiere ich halt 20 durch und
wähle mir dann den aus, für den es am besten funktioniert.
Nennt sich dann das Ganze als ganze Gitter-Suche.
Bringt das was?
Ich meine, das ist ja eine relativ billige, relativ einfache Art der
Adaption.
Hat man halt mal ausprobiert in
Experimenten und zwar auf eine unüberwachte Art und Weise.
Ich habe eine Aufnahme von einem Satz, ich dekodiere den Satz, erhalte
so eine Hypothese H, tue so, als sei diese Hypothese das tatsächlich
Gesagte und finde dann mit so einer Gitter-Suche einen Alpha, das am
besten funktioniert und dann dekodiere ich noch mal mit diesem neuen
Alpha.
Und das Ganze dann im Batch-Modus.
Das heißt, ich habe einen Sprecher, den dekodiere ich einmal komplett
durch, erhalte viele Hypothesen, bestimme wahrscheinlichste Alpha auf
all diesen Hypothesen, dekodiere den gesamten Sprecher noch mal einmal
neu.
Und wenn man sich das anschaut, auf zwei verschiedenen Sätzen, einmal
Switchboard unterhalte dich über ein Gegebenensthema, Call Home
unterhalte dich mit deiner Familie, worüber du gerade Lust hast, dann
sieht man, ohne VTLN zu VTLN gewinnt man immer dazu.
In diesem Fall 0,9 Prozent, in diesem Fall sogar 3,3 Prozent.
Sprich, das hier sind so was wie 8 Prozent relativ, mit der ich meine
Fehlerrate senke.
Hier sind das immer noch hin noch so was wie 3 Prozent relativ, mit
der ich meine
Fehlerrate senke.
Das ist schon relativ viel.
Ich meine, das ist, muss man gucken, dadurch, dass man nur so einen
einzigen Parameter schätzt, einen einzigen zusätzlichen Parameter in
einem System, das eh schon 10.000, 20.000, 30.000 Parameter hat,
reduziere ich meine Wortfehlerrate mal so gerade locker flockig um 3
bis 8 Prozent relativ, je nachdem, wie schwierig und wie groß der
Mismatch war.
Das ist also eine Methode, die recht beliebt ist, recht gut
funktioniert und natürlich auch den riesen Vorteil hat, dass sie mit
sehr, sehr wenig Daten auskommt.
Sprich, die kann ich auch dann schon anwenden, wenn ich nur sehr, sehr
wenig Trainingsdaten, Adaptionsdaten für meinen Sprecher habe.
Zum Beispiel in diesem, wo auch einer nur kurz mal so ein
Auskunftssystem anruft, vielleicht so fünf, sechs Sätze überhaupt noch
einspricht.
Von der Theorie her kann man sich jetzt ein bisschen überlegen, wie
sehen denn diese Alphas so aus?
Das Alpha kann man ja datengetrieben schätzen, wie hier, oder man kann
sich überlegen, das muss in Relation stehen zur Grundfrequenz zu
Formanten und letztendlich hängt das ab direkt, irgendwie direkt
korreliert mit der Vokaltraktlänge.
Jetzt kann man sich überlegen, okay, wie müssen die Vokaltraktlängen
aussehen?
Bei den Stimmbändern hat man das schon gesagt, Männer eher hoch,
Frauen eher niedrige Stimmen, Männer haben halt lange Stimmbänder,
weil durch Testosteron wächst das, Frauen haben halt kürzere
Stimmbänder und dann variiert das irgendwie über so einen geschlechter
- spezifischen Mittelwert drumherum und wenn irgendwas in der Natur
variiert, dann ist das meistens normal verteilt, weil halt die
Normalverteilung sehr häufig in der Natur gefunden ist.
Das heißt also, Stimmbänderlängen kann man sehen, sind so normal
verteilt für Frauen und für Männer, jeweils so ein
geschlechterspezifischen Mittelwert, so mit Normalverteilung.
Hatten wir gesehen, glaube ich, sogar schon ein Bild.
Das gleiche Argument gilt natürlich auch für die Vokaltraktlängen.
Auch wieder Länge des Vokaltraktes, genauso wie Körpergröße ist halt
zwischen den Geschlechtern gleich ungleich verteilt, hängt auch wieder
mit Hormonen zu tun, Wachstumshormonen etc.
Und dann Männer haben also in der Regel eher einen langen Vokaltrakt,
Frauen eher einen kürzeren Vokaltrakt, dann kann man für Männer und
für Frauen halt einen Mittelwert bilden, über beide Mittelwerte wieder
eine Gaussglocke legen und kommt dann ungefähr so der Wahrheit nahe.
Im umgekehrten Schluss müsste das bedeuten, wenn ich so diese
Warpfaktoren, diese Alphas auf einer großen Menge Daten schätze, dann
sollte ich ja auch diese beiden Gaussglocken entsprechend
wiederfinden.
Hat man dann entsprechend mal gemacht, die Sprecher nach Männern und
Frauen unterteilt und sich dann abgetragen, wir sehen so diese
Warpfaktoren aus und dann sieht man genau schön diese bimodale
Verteilung.
Hier sieht man, ist so ein gewisser Überlapp, was die Vokal, die
Warpfaktoren angeht.
Das ist ein Histogramm, hier unten abgetragene Warpfaktor, da oben
abgetragen, wie viele Sprecher haben denn diesen jeweiligen
Warpfaktor.
Und dann sieht man halt hier die mit dem niedrigen Warpfaktor, die mit
dem hohen Warpfaktor und hier sieht man, sind so Säulen
übereinandergelegt.
Das ist da, wo die beiden Geschlechter sich entsprechend überschneiden
bei den Warpfaktoren.
Und man sieht, dass man das, was man aus der Theorie erwarten würde,
sehr schön auch in der Praxis dann auch bei den Warpfaktoren
wiederfindet.
Das heißt also, dieser Warpfaktor, den wir uns hier überlegt haben,
mit diesem einen Gummiband und diesem stückweise linearen Warpen der
Frequenzen, scheint das, was wir erwarten würden von den
Vokaltraktlängen her, auch gut abzubilden.
Scheint man nichts falsch gemacht zu haben.
Eine Frage, die man sich auch stellen kann, ist natürlich, okay, hier
ist jetzt so ein Punkt festgelegt worden und der Punkt ist halt, die
beiden Punkte Anfang und Ende sind fest und hier haben wir einen Punkt
festgelegt, da haben wir festgelegt hier, das kann man doch auch noch
komplizierter machen.
Das ist jetzt stückweise linear mit zwei Stücken.
Das kann man in der Tat auch komplizierter machen.
Das ist die Art und Weise, wie wir es machen.
IBM zum Beispiel macht sowas.
Die haben zwei,
die können so etwas machen.
Die haben also zwei Punkte festgelegt und bekommen entsprechend dann
zwei Faktoren raus.
Wenn die eine Gittersuche machen, müssen die halt dann nicht zehn
Werte ausprobieren, sondern zehn mal zehn Werte.
Ist aber auch noch erträglich.
Bringt aber nicht so viel, lohnt sich nicht.
Noch ein Wort zur inkrementellen Adaption.
Wenn man so eine Adaptionstechnik hat, wie die VTLN, hat man immer das
gleiche Problem.
Ich brauche erstmal Daten, um die Adaption zu schätzen und wenn ich
dann meine Erkennung mit den adaptierten Daten machen will, muss ich
nochmal einen zweiten Erkennungsdurchlauf machen.
Wenn man das jetzt so im Batchmodus macht, heißt das, man muss den
gesamten Batch zweimal durchgehen.
Also die Codin-Zeit mal zwei plus noch die Zeit für das Schätzen der
Transformation.
Verlangsamt natürlich das gesamte System deutlich.
Oder man macht halt diese inkrementelle Adaption, dass man auch
wirklich nur einmal durch alle Daten durchgeht und die Adaption halt
im Laufe der Zeit immer besser und besser wird.
Hat natürlich den Nachteil, dass man die Sätze am Anfang mit
schlechteren Modellen erkennt, als die Sätze am Ende hin.
Wenn man es sich nicht leisten kann, zweimal über die Daten drüber zu
gehen, weil man zum Beispiel nicht Batch verarbeitet, sondern in so
einem interaktiven Dialogsystem sich befindet, muss man halt es so
machen.
Oder wenn man halt will, dass die Rechenzeit nicht so stark leidet,
dass ich also nicht Ewigkeiten Zeit habe, diesen Batch- Datensatz
durchzugehen, dass ich es mir halt nicht leisten kann, zweimal über
alle Testdaten, die ich habe, drüber zu gehen.
Das dauert zu lange.
Okay,
also Ansatz ist sprecherabhängig.
Es ist hier schlecht aufgeschrieben.
Also das ist dieses Inkrementelle.
Jetzt gibt es noch einen anderen Trick, den man machen kann.
Wenn ich es mir nicht leisten kann, zweimal über die Daten drüber zu
gehen, kann ich zum Beispiel auch so einen Trick machen, gerade bei
solchen relativ billigen Ansätzen, dass ich mehrere adaptierte Modelle
oder mehrere Adaptionen vorrätig habe.
Zum Beispiel kann ich parallel mit zehn verschiedenen oder fünf
verschiedenen Warp-Parametern arbeiten.
Dann, die kann ich parallel dekodieren lassen.
Angenommen, ich mache normalerweise eine Gitter-HC-Auflösung 10.
Jetzt will ich nicht zehn parallel dekodieren lassen.
Ich will nur drei parallel dekodieren lassen.
Nehme ich mir drei Warp- Parameter her und lasse die dekodieren.
Einer ist so im Durchschnitt genau die Hälfte.
1,0 wird gar nichts gemacht.
Einer ist der Durchschnitt der männlichen, einer ist der Durchschnitt
der weiblichen Sprecher.
Dann die dekodieren.
Habe ich nach dem ersten Dekodierungsdurchlauf drei verschiedene
Erkennungsergebnisse mit drei unterschiedlichen Scores von den
Wahrscheinlichkeiten her.
Entscheide ich mich von den drei, natürlich von denen mit dem höchsten
Score.
Das wird vielleicht noch nicht der perfekte Warp-Faktor gewesen sein
für diese Person.
Vielleicht ist es zwar ein Mann, aber der weicht ein bisschen von dem
Durchschnitt ab, aber ich habe schon mal mit etwas deutlich Besserem
erkannt als dem Nuller, wo ich gar nichts mache.
Und dann im nächsten Mal kann ich dann entsprechend ausgehen von
diesem Parameter, der beim ersten Mal in dieser groben Gitter-Suche
der Beste war, um den drumherum dann nochmal genauer absuchen.
Auf die Art und Weise kann ich auch die Zeit dafür reduzieren für die
Gitter -Suche.
Dass ich also nicht immer das volle Zehnergitter absuche, sondern ich
gucke erstmal, wo liegt der grob, höher, mittel, niedriger und dann
suche ich dann in den darauffolgenden Sätzen nur noch so fein
aufgelöst um diesen vorher grob gefundenen Bereich ab.
Und auf die Art und Weise kann ich dann halt die Sachen entsprechend
besser machen.
Dann ist die Frage, wenn ich so incrementell adaptiere, sammle ich ja
die Adaptionsdaten, werden immer mehr, immer mehr und die
Transformation ist in der Regel so gestaltet, dass wenn ich immer neue
Adaptionsdaten hinzunehme, adaptiere ich die Transformation und zwar
auf die Art und Weise, dass das, was hinterher rauskommt, so wäre, als
hätte ich es auf allen Daten geschätzt.
Kann man zum Beispiel bei so einer einfachen Suche für den Vokaltrakt
-Längen - Parameter ganz einfach machen.
Ich muss halt ein paar alte Statistiken vorrätig halten, nämlich wie
hoch war die Wahrscheinlichkeit mit dem alten Warpfaktor auf den
bisher gesehenen Daten und wie viele Samples, wie viele Frames waren
denn die bisher gesehenen Daten.
Und dann bekomme ich 10 dazu, kann darauf wieder die
Wahrscheinlichkeit schätzen für die neuen Parameter und werde das dann
entsprechend gewichtet, der Menge der Daten mit den bisherigen
Parametern zusammen mischen, bekomme neuen Parameter raus, der genau
so aussieht, als hätte ich on batch alles bekommen inklusive der neuen
Adaptionsdaten und darauf den Parameter geschätzt.
Jetzt kann man sagen, beim Vokaltrakt-Länge scheint das ja sinnvoll zu
sein, also dass sich die Länge des Vokaltraktes des Sprechers spontan
ändert, während er da sitzt, ist eher unwahrscheinlich.
Also der wird jetzt nicht während der Benutzung des Systems wachsen,
wenn es jetzt nicht gerade ein Kind ist, das ein Diktiersystem über
viele Jahre verwendet.
Bei anderen Adaptionen, wie zum Beispiel sich auf den Kanal
konzentrieren oder auf Umgebungsrauschen oder Positionen, Mund zum
Mikrofon, kann sich das durchaus ändern.
Also wenn er längere Zeit am Telefon ist, kann sich der Kanal, die
Charakteristik des Kanals ändern.
Wenn er sich in Raum bewegt, ist die Raumcharakteristik anders, je
nachdem an welcher Stelle er steht, je nachdem wie er den Kopf dreht
etc.
Das heißt, es kann durchaus sinnvoll sein, das nicht so zu machen,
dass man immer alle Adaptionsdaten betrachtet, die man bisher bekommen
hat, sondern dass man ältere Adaptionsdaten vergisst oder schlechter,
geringer gewichtet.
Das entsprechend nennt sich dann Sliding Window, gleitendes Fenster.
Und das hier ist zum Beispiel so ein Beispiel von Gewichtung.
Null, aktueller Zeitpunkt, die Zeit in der Vergangenheit, das Gewicht,
mit dem die Daten einfließen und je älter die Daten sind, desto
geringeres Gewicht bekommen sie für den Einfluss und die Schätzung der
aktuellen Transformation.
Bei der Vokal-Trakt-Längen-Nummierung muss man so ein paar kleinere
Tricks beachten, die sich aus der Praxis ergeben haben.
Ein Phänomen, das man sieht, ist zum Beispiel das Phänomen der
davonlaufenden Faktoren.
Wenn man das Ganze mal macht für relativ viele Sprecher, wird man
feststellen, dass man immer mal wieder Sprecher hat.
Da wird halt geschätzt, der VTL-Faktor hoch und dann setzt man den VTL
-Faktor hoch und beim nächsten Mal sucht man wieder in diesem Bereich
darum ab und dann setzt er den wieder noch höher und beim nächsten Mal
setzt er noch höher und so weiter und so fort.
Und wenn man sich die Adaption anschaut, will aus irgendeinem Grund
die Adaption, sagt das Maximum-Likelihood-Kriterium, den Vokal-Trakt
-Faktor praktisch gegen unendlich sitzen.
Geht natürlich nicht, will man nicht.
Ist offensichtlich falsch.
Die Wortfehlerrate wird danach auch schlechter, auch wenn das Maximum
-Likelihood -Kriterium sagt, ist besser.
Das heißt, man muss auf alle Fälle die Vokal-Trakt-Warping-Faktoren
auf einen sinnvollen Bereich, den man durch Ausprobieren feststellen
muss, beschränken und dann nicht aus diesem Bereich die Sachen
herauslaufen lassen.
Wir haben jetzt hier die VTLn immer nur während des Testens
angewendet, in dem vorhergehenden Beispiel.
Das heißt, ich habe mein System erstmal trainiert, ohne VTLn und dann
im Testen warpe ich dann das reinkommende Material so, dass es diesem
Durchschnitt, den die Modelle während des Trainings gesehen haben,
entspricht.
Man kann das natürlich auch während des Trainings machen.
Man kann schon während des Trainings das reinkommende Audio von den
Trainingssprechern so normieren, dass es dem Durchschnitt entspricht.
Das hätten sie Einheits-Vokal-Trakt-Länge.
Und das macht die Sache dann natürlich noch mal deutlich besser, wenn
ich dann solche Modelle habe, die schon während des Trainings geworbte
Merkmale gesehen haben und dann während des Testens die Merkmale auch
entsprechend geworbt waren, sodass sie gut dem Modell passen, bekomme
ich noch mal zusätzliche Gewinne.
Umgekehrt funktioniert das nicht.
Es funktioniert nicht, wenn ich aber nur während des Trainings Vokal
-Trakt -Längen-Normierung einschalte, aber das während des Testens
nicht.
Dann stürzt der Erkenner ab, dann funktioniert, passt das, was man
jetzt reinkommt im Test, nicht mehr auf das Normierte.
Hintergrund ist klar, wenn ich Vokal-Trakt-Länge-Normierung während
des Trainings ausschalte, bekomme ich ein Modell, das hat alle
möglichen Vokal-Trakt- Längen schon mal gesehen.
Wenn ich es während des Trainings einschalte, ist das für das Modell
so, als hätte es nur Sprecher gesehen, die so Einheits-Vokal-Trakt-
Länge haben, die alle die gleiche Vokal-Trakt-Länge haben.
Und dann bekomme ich Testsprecher, die plötzlich ganz unterschiedliche
Vokal -Trakt-Länge haben, die dann nicht mehr auf diesen einen
Pseudosprecher, den das Modell gesehen hat, passt.
Habe ich also einen deutlichen Mismatch.
Dann bei der inkrementellen Adaption wird man feststellen, dass der
Vokal -Trakt-Längen- Faktor, wenn er mal einmal robust geschätzt
wurde, änderte sich ja nicht mehr.
Das heißt, nach einer gewissen Zeit, wenn ich Pi mal Daumen genügend
Trainingsmaterial gesehen habe, kann ich die Neuschätzung einfach
abschalten und den bisher geschätzten Parameter immer weiterverwenden.
Genau, und das hatten wir schon.
Also es gibt durchaus auch komplexere Warping- Funktionen, um dieses
Warping noch komplexer zu machen, bis hin zu, statt solcher stückweise
stetigen Funktionen, gibt es irgendwelche kontinuierlichen Funktionen
mit einer bestimmten Anzahl an Parameter, die so eine glatte
kontinuierliche Abbildung machen.
Dann ein weiteres Beispiel, das man sich anschauen kann, ist die
sogenannte MAP-Adaption.
Wir hatten schon gesagt, MAP kann ein mögliches Kriterium sein und das
ist auch ein Kriterium, das man unter diesem Namen auch bei der
Adaption des akustischen Modells findet.
Wir maximieren jetzt also nicht nach Maximum Likelihood, die
Wahrscheinlichkeit, dass das Modell die Merkmalsvektoren
hervorgebracht hat, sondern wir maximieren die Wahrscheinlichkeit der
Parameter, gegeben die Merkmalsvektoren.
Das ist natürlich wieder schwierig, wird wieder zerlegt, gemäß Bayes
in Maximum Likelihood-Schätzung mal eine a priori Wahrscheinlichkeit
der Parameter.
Und jetzt müssen wir irgendwie die a priori Wahrscheinlichkeit der
Parameter schätzen.
Schwierig.
Plus, was sind denn überhaupt die Parameter?
Wenn man sich anschaut, was passiert, dann kann man das sehen als eine
Beschreibung dafür, dass wir halt das Problem haben, dass wir nicht
für alle Parameter immer genügend Trainingsdaten haben, sonst könnten
wir ja gleich ein exklusives Modell für den Sprecher trainieren,
sondern bestimmte Parameter haben wir Trainingsdaten gesehen, für
andere nicht.
Bei der Map-Schätzung kann man jetzt also entsprechend die
Trainingsdaten adaptieren, für die wir Trainingsdaten gesehen haben
und für die anderen nicht.
Und die Idee dahinter ist halt, dass man wieder eine Maximum
Likelihood -Schätzung auf seinen Adaptionsdaten durchführt, also
Forward -Backward-Training, Viterbi-Training, ganz normaler AIM
-Algorithmus.
Das Ganze dann gewichtet allerdings mit der a priori
Wahrscheinlichkeit der Parameter und man kann dann auf diese Art und
Weise den Einfluss der Adaptionsdaten schätzen.
Man kann auf die Art und Weise, so wie man Sprachmodelle miteinander
interpoliert, jetzt akustische Modelle miteinander interpolieren.
Einfaches Beispiel, angenommen, wir haben eine große Menge
Trainingsdaten und eine kleine Menge Adaptionsdaten, die jetzt passend
sind auf den Sprecher, auf die Domäne, was auch immer.
Die Trainingsdaten mache ich zur EM-Iteration und angenommen, ich bin
in so einer EM-Iteration, habe die hinreichenden Statistiken geschätzt
mithilfe des Forward-Backward- Algorithmus und will jetzt den Update
machen, den Maximization-Schritt.
Dann werden da ja diese gezählten, statt zählen mit Wahrscheinlichkeit
gewichteten Statistiken zusammenaddiert und geteilt.
Und das Ganze kann ich genauso gut machen auf den Adaptionsdaten.
Kann ich auch mit dem Modell, mit dem ich jetzt diese Iteration, den E
-Schritt gerechnet habe auf den Trainingsdaten, mit diesem Modell kann
ich auch den E-Schritt rechnen auf den Adaptionsdaten.
Und jetzt habe ich Statistiken akkumuliert auf den Trainingsdaten im E
-Schritt und ich habe Statistiken akkumuliert auf den Adaptionsdaten
im E-Schritt und muss jetzt den Maximierungsschritt zu durchführen und
kann jetzt, bevor ich den Maximierungsschritt einmal durchführe, diese
beiden Statistiken im E-Schritt, Trainingsdaten, Adaptionsdaten
zusammenmischen, indem ich sie einfach mit so einer A priori
Wahrscheinlichkeit, zum Beispiel Gewichte, kann dann den
Adaptionsdaten mehr oder weniger starkes Gewicht geben, kann die
Sachen zusammenmischen.
Da, wo ich keine Daten für Parameter, wo ich keine Daten in den
Adaptionsdaten gesehen habe, da wird halt nix drauf addiert auf die
Statistiken aus den Trainingsdaten auf dem E-Schritt.
Die werden also rein auf den Trainingsdaten geschätzt.
Da, wo ich sowohl im Training als auch im Adaptionsdaten gesehen habe
für die Modelle, werden halt die Statistiken gemäß eines Gewichtes
zusammengemischt und dann mache ich den Maximierungsschritt und
bekomme dann einen neuen Parameterset raus, der halt auch von den
Adaptionsdaten her gewichtete Statistiken mit reingemischt hat.
Hat den großen Nachteil, ich muss ja jetzt noch irgendwie dieses
Interpolationsgewicht bestimmen.
Das kann ich zum Beispiel einfach ausprobieren, indem ich Gitter
suche, zehn verschiedene Interpolationsgewichte, 0,1 bis 1,0, 0 bis 1
,0, irgendwas ausprobiere, zusammenmische, bekomme dann zehn
verschiedene Modelle raus, lasse einen Erkennungsdurchlauf auf
Development -Daten durchführen, wenn ich diese habe und kann dann
daraus entsprechend dann mich entscheiden, für welches
Interpolationsgewicht ich haben will.
Von der Beschreibung hört man schon, das kann inkrementell während des
Einsatzes nicht funktionieren, das kann insbesondere unüberwacht nicht
funktionieren, weil ich nämlich mich ja für einen dieser
Interpolationsgewichte entscheiden muss anhand der Wortfehlerrate und
das geht nur, wenn ich eine Wortfehlerrate bestimmen kann auf diesen
Development -Daten, geht also nur, wenn ich da eine Überwachung habe.
Das geht auch nicht für ganz wenige Daten, weil ich brauche ja
Development -Daten, die nichts mit den Adaptionsdaten, die nicht in
den Adaptionsdaten sind, aber genauso sind wie die Adaptionsdaten, um
die Wortfehlerrate zu bestimmen, plus die sollten schon hinreichend
genug sein, dass auch wenigstens eine signifikante Anzahl an
Parametern geändert wird.
Das heißt, so etwas ist was für eine Situation während des Trainings,
wenn ich halt viele Domänen fremde akustische Modelldaten habe und
relativ viele Adaptionsdaten, aber nicht genug Adaptionsdaten, um nur
auf den Adaptionsdaten zu trainieren, genauso wie beim Sprachmodell.
Und ich dann die beiden Sachen entsprechend zusammenmischen möchte.
Dann gibt es eine sehr beliebte Adaptionsmethode, die diese Idee der
linearen Transformation der akustischen Modelle auffasst.
Und diese Adaptionsmethode nennt sich Maximum Likelihood Linear
Regressions, eine Modelladaptionsmethode, wo ich mittels einer
linearen Transformation die Mittelwerte und die Kovarianzmatrizen
anpassen möchte.
Ich habe hier wieder meine Emissionswahrscheinlichkeit,
dass ich einen bestimmten Vektor imitiert habe, mitgegeben, dass ich
mich in einem bestimmten HMM-Zustand i befinde.
Und diese Wahrscheinlichkeit wird jetzt zu einer neuen
Wahrscheinlichkeit, Emissionswahrscheinlichkeit pj, die ist irgendwie
gekoppelt mit irgendwas.
Und jetzt ist die Frage, womit ist die gekoppelt?
Die ist gekoppelt mit einer Adaption einer linearen Adaption j.
Und was da passiert ist, dass hier, man kann sich jetzt hier in
Gedanken da noch überflüssige Klammern drum herum denken, wegen
Assoziativgesetze sind sie überflüssig, aber von der Idee der Adaption
her sind hier Klammern drum, dass der Mittelwert erst mit einer Matrix
multipliziert wird und dann noch ein Offset abgezogen wird.
Und genauso gibt es eine Transformationsmatrix sj, das diese
Kovarianzmatrix entsprechend transformiert.
Dieser Parameter j ist abhängig von dem i.
Das heißt, für welchen Zustand ich mich befinde, der schreibt mir in
irgendeiner geeigneten Art und Weise vor, welche der verschiedenen
Adaptionsmatrizen aj und bj und sj ich denn verwenden soll.
Das sind die verschiedenen Adaptionsklassen.
Jedes Modell wird einer Adaptionsklasse zugeordnet.
Die Anzahl der Adaptionsklassen ist abhängig von der Anzahl der
Adaptionsdaten.
Viele Adaptionsdaten, viele Adaptionsklassen, viele Parameter, wenig
Adaptionsdaten, wenig Adaptionsklassen.
Plus ich muss irgendwie diese Parameter, das heißt die Parameter der
Transformationsmatrix a, der Transformationsmatrix s und dieses
Offsetvektors b irgendwie finden.
Und die kann ich wieder gemäß Maximum-Likelihood-Methode mit dem EM
-Algorithmus finden, indem ich einfach dafür sorge, dass die
Wahrscheinlichkeit, mit der die Modelle die Trainingsdaten, in diesem
Fall die Adaptionsdaten hervorbringen, halt maximiert wird, kann ich
EM -Algorithmus darauf anwenden.
Das heißt, wenn jetzt mal die Klassen definiert sind, wie viele
Klassen ich habe und welches Modell zu welcher Klasse gehört, kann ich
mit dem EM- Algorithmus diese Matrizen finden und kann dann diese
Matrizen und den Vektor entsprechend auf die Modelle anwenden, um neue
Modelle während des Testens zu bekommen.
Frage ist, wo bekomme ich jetzt diese Klassen her?
Einfacher Extremfall, ich habe ganz, ganz, ganz wenig Daten, okay,
habe ich eh nur eine Klasse.
Oder ich habe sehr, sehr, sehr, sehr viele Daten, dann kann ich eine
Klasse pro Modell machen.
Aber ist ja Quatsch, weil die Adaptionsdaten haben ja genauso viele,
die Adaptionsmatrizen haben genauso viele Parameter wie meine
ursprüngliche Gauss-Glocke.
Warum mache ich da nicht gleich eine MAP-Adaption zum Beispiel oder
ein sprecherabhängiges Modell?
Und für die Fälle dazwischen, muss ich mir irgendwas Intelligentes,
Geschicktes überlegen.
Und da ist wieder die gleiche Leier, wie wir sie schon zigmal hatten
in der Vorlesung.
Ich habe die Möglichkeit, das Ganze wissensbasiert zu machen oder ich
habe die Möglichkeit, das Ganze datengetrieben zu machen.
Wenn ich das Ganze wissensbasiert mache, brauche ich irgendwie Wissen
darüber, welche Modelle sollen denn jetzt in der Adaption gekoppelt
werden.
Dass man zum Beispiel sagt, okay, Vokale kriegen eine Adaptionsklasse
und Konsonanten kriegen eine Adaptionsklasse.
Oder das Stille- Modell, das Stille nicht sprachmodelliert, kriegt
eine Adaptionsklasse und Sprache, alles was Sprache modelliert, kriegt
eine Adaptionsklasse.
Geräusch, Sprache und so weiter und so fort.
Das wären so wissensbasierte Methoden.
Schöner und geschickter ist das Ganze natürlich anhand der Struktur
der Adaptionsdaten zu machen, in der Hoffnung, dass ich dadurch die
Adaptionsdaten maximal ausnutze.
Und da ist die Grundidee dahinter, ich fange an, eine Klasse für alles
und dann für jede Klasse, für die ich dann noch genügend
Trainingsdaten habe, diese Klasse spalte ich auf.
Indem ich zum Beispiel gucke, in welcher Richtung ist die größte
Varianz bei den Modellen und dann werden die entsprechend der Richtung
aufgesplittet.
Und das iteriere ich dann so lange, das ist dann so ein divisives
Clustering, solange ich noch Klassen herausbekomme, die genügend
Trainingsdaten haben.
Und wenn ich dann nur noch zu wenig Trainingsdaten habe, dann ist
Schluss mit Clustern.
Und dann kann ich für jede der Klassen, für jedes der Blätter,
entsprechend meiner Adaptionsmatrizen rechnen.
Mit so einer Sprecheradaption, zum Beispiel mit so einer
Modelladaption, kann man auch schöne Tricks machen während des
Trainings.
Im Training arbeite ich häufig mit sogenanntem Labeltraining, wo ich
also erst mal ein Forced Alignment rechne für die einzelnen Äußerungen
und dann nur noch mein EM-Training entlang dieses Forced Alignments
laufen lasse, indem ich sage, das sind die Zustände, die durchlaufen
wurden und alle anderen Zustände wurden nicht durchlaufen.
Von der Qualität dieses Alignments hängt natürlich auch die Qualität
des Trainings ab.
Je besser das Alignment ist, desto besser auch das Training entlang
dieser Labels.
Wenn ich jetzt meine Modelle sprecherabhängig mache, wird vermutlich
logischerweise auch das Alignment besser werden.
Deswegen gibt es eine Technik, die nennt sich dann Label Boosting, die
sieht so aus im Training.
Für jeden Sprecher wird ein abhängiges Modell mittels MLLR gerechnet.
Also ich muss erst einmal ein sprecherunabhängiges Modell machen, dann
für jeden Sprecher ein sprecherabhängiges Modell rechnen gemäß MLLR,
dann mit diesem sprecherabhängigen Modell die Labels schreiben und
dann wird das sprecherunabhängige Modell entlang dieser deutlich
besseren Labels trainiert.
Das heißt, am Ende kommt wieder ein sprecherunabhängiges Modell raus,
aber hoffentlich gemäß Labeltraining mit besseren Forced Alignments,
mit besseren Zuweisungen, Zustand zum Merkmalsvektor.
Halt noch abschließende Bemerkung, welche Adaption unter welchen
Bedingungen.
Klar, wenig Daten, kleine Anzahl linear Transformationen, zum Beispiel
MLLR.
Große Menge an Adaptionsdaten, aber noch nicht ausreichend für ein
eigenes Modell.
So was wie MAP.
Oder man kann halt beides benutzen.
Man macht eine kleine Menge an Klassen für die MLLR und danach die MAP
Adaption nochmal oben drauf, damit dann die Parameter für die genügend
Trainingsdaten gesehen wurden.
Nicht nur diese einfache MLLR One-Size-Fits-All Adaption genutzt wird,
sondern die besser spezifische.
Dann kann man so was wie eine VTLM zusätzlich zur MLLR oder zum MAP
auch dazu kombinieren und unter Umständen verstärken oder verbessern
sich diese Adaptionen gegenseitig oder die Gewinne addieren sich, wenn
auch nicht im vollen Umfang, sondern zum Teil zumindest.
Und je nachdem, was man macht, kann man teilweise, wenn man es
geschickt macht und man die Adaptionen einschränkt, man unter
Umständen das Ganze so umrechnen, dass man nicht die Modelle
adaptiert, sondern den Merkmalsraum und das Ganze dann in der Regel
auch deutlich schneller funktioniert.
Beispiel dafür ist die sogenannte Feature-Space-Constraint MLLR.
So eine MLLR kann man unterteilen in Constraint und Unconstraint.
Die Unconstraint ist so, wie wir sie gesehen haben.
Es gibt eine Adaptionsmatrix A für die Mittelwerte und es gibt eine
Adaptionsmatrix S für die Kovarianzmatrizen.
Bei der Constraint gibt es nur noch eine Matrix A und diese Matrix A
wird verwendet, um die Mittelwerte zu transformieren und sie wird auch
verwendet, um die Kovarianzmatrix zu transformieren.
Hat erstmal den Vorteil, weniger Parameter, brauche ich weniger
Trainingsdaten, um sie zu schätzen.
Ist natürlich nicht so schön wie eine Unconstraint MLLR, die ist
mächtiger.
Aber angenommen, ich hätte nur eine einzige Adaptionsmatrix A für alle
Modelle, ein globales A, dann kann ich dieses Ding umschreiben als
eine Merkmalsraumtransformation.
Dann kann ich schreiben, das ist das Gleiche, wenn ich die
Wahrscheinlichkeit von X berechne, die Emissionswahrscheinlichkeit,
als hätte ich die Normalverteilung auf AX plus B plus Logarithmus der
Terminante von A.
Das heißt, statt hier µ, Sigma zu transformieren, transformiere ich
nur das A mit AX plus B, addiere hier hinten noch den Logarithmus der
Terminante drauf, der ist sowieso konstant, und kann dann mit den
untransformierten Mittelwerten und der untransformierten
Kovarianzmatrix arbeiten.
Und habe dann auf die Art und Weise hier diese Dualität als
Modelltransformation angewandt als Merkmalstransformation.
Und da dieses Ding da hinten eh konstant ist und wir uns wieder nur
für das Maximum entscheiden, brauche ich das auch gar nicht mehr drauf
zu addieren, sondern kann direkt nur mit den transformierten Merkmalen
machen.
Das heißt, in meiner Merkmalsextraktion habe ich einfach noch mal eine
Matrixtransformation plus Addition, die hinten mit draufkommt während
der Merkmalsextraktion.
Gut, und damit war es das für heute.