WEBVTT

00:10.650 --> 00:14.990
Hallo, dann herzlich willkommen zurück zu Grundlagen der automatischen

00:14.990 --> 00:16.090
Spracherkennung.

00:17.150 --> 00:21.170
Habe ich letztes Mal alle verschreckt oder warum sind so wenige übrig

00:21.170 --> 00:21.970
geblieben?

00:23.610 --> 00:30.670
Also was, sagen wir mal, den Komplexitätsgrad angeht, haben wir den

00:30.670 --> 00:31.970
Scheitelpunkt überschritten.

00:32.250 --> 00:36.870
Also der EM-Algorithmus ist sicherlich mit eines der kompliziertesten

00:36.870 --> 00:37.130
Sachen.

00:37.750 --> 00:41.370
Da erwarte ich auch nicht von Ihnen, dass Sie die ganzen Formeln in

00:41.370 --> 00:44.450
Detail kennen oder auch herleiten können, sondern mir geht es darum,

00:45.030 --> 00:48.410
dass Sie, sagen wir mal, grundsätzlich verstehen, wie funktioniert das

00:48.410 --> 00:51.350
mit diesem EM-Algorithmus, was sind da die beiden Schritte, die ich

00:51.350 --> 00:55.210
mache, dass ich also erst mit dem Erwartungswert die Sachen, die ich

00:55.210 --> 00:57.390
nicht beobachten kann, schätzen muss.

00:57.730 --> 01:00.790
Und damit ich den Erwartungswert ausrechnen kann, brauche ich schon

01:00.790 --> 01:04.810
wieder mal irgendeinen Satz von initialen Parametern und dass ich dann

01:04.810 --> 01:09.950
mithilfe der beobachtbaren Daten und mithilfe der geschätzten Daten,

01:10.750 --> 01:14.430
mithilfe des erwartungswert geschätzten Daten, dann wieder so eine

01:14.430 --> 01:17.930
Maximum -Likelihood-Optimierung durchführen kann, um einen neuen Satz

01:17.930 --> 01:21.970
Parameter zu bekommen, der jetzt nicht das globale Optimum ist,

01:22.570 --> 01:25.770
sondern der suboptimal sein wird, weil ich eben nicht diese

01:25.770 --> 01:28.650
unbeobachtbaren Daten kenne, sondern ich konnte sie nur schätzen

01:28.650 --> 01:32.170
anhand von irgendwelchen Parametern, die selber nicht optimal waren.

01:32.170 --> 01:35.770
Und deswegen ist dieser Iterationsschritt, führt jetzt zwar dazu, dass

01:35.770 --> 01:39.850
man was Besseres bekommt, aber nicht unbedingt das globale Optimum.

01:40.350 --> 01:45.170
Und allgemein konvergiere ich halt nur gegen ein lokales Optimum.

01:47.290 --> 01:51.130
Und das andere, was ich gerne hätte, was Sie so verstehen sollten,

01:51.290 --> 01:54.750
sehen sollten, ist, dass wenn man sich durch die ganze Mathematik

01:54.750 --> 01:58.890
durchwuselt, die man jetzt braucht, um die Formel herzuleiten, also

01:58.890 --> 02:01.770
die ganzen Ableitungen, die ich machen muss und diese trickreichen

02:01.770 --> 02:06.030
Umordnungen, damit ich dann hinterher erstmal eine geschlossene Formel

02:06.030 --> 02:08.870
für den Erwartungswert bekomme und dann halt entsprechend mit der

02:08.870 --> 02:14.410
Ableitung dann die neue Schätzung im Maximization-Schritt, dass das,

02:14.570 --> 02:18.090
was am Ende herauskommt bei den Gauss-Mixtur-Modellen oder auch bei

02:18.090 --> 02:24.990
den Parametern für das HMM, dass das im Prinzip dasselbe ist wie die

02:24.990 --> 02:28.490
Maximum -Likelihood-Schätzung, die ich hätte, wenn ich alles kennen

02:28.490 --> 02:33.290
würde, nur dass ich halt nicht dieses jedes Mal, wenn ich ein Ereignis

02:33.290 --> 02:36.870
sehe, zähle ich eins hoch, dass ich das Ereignis gesehen habe, sondern

02:36.870 --> 02:41.750
dass ich stattdessen um die Wahrscheinlichkeit hochzähle, dass dieses

02:41.750 --> 02:43.430
Ereignis wirklich das Ereignis war.

02:43.530 --> 02:46.430
Und die Wahrscheinlichkeit brauche ich halt, weil ich halt diese

02:46.430 --> 02:50.110
unbeobachteten Daten halt nur schätze anhand des Erwartungswertes,

02:50.450 --> 02:54.150
also letztendlich anhand ihrer Wahrscheinlichkeit, dass sie jetzt

02:54.150 --> 02:57.170
vorgekommen sind mit den alten Parametern und dass ich also mit dieser

02:57.170 --> 02:59.850
Wahrscheinlichkeit das, was ich hochzähle, schätze.

03:01.170 --> 03:03.730
Und dann halt nicht immer um eins hochzähle, sondern jedes Mal da, wo

03:03.730 --> 03:06.490
ich um eins hochzählen würde, zähle ich halt um eins mal

03:06.490 --> 03:09.530
Wahrscheinlichkeit, dass das jetzt wirklich so ist, dass ich in diesem

03:09.530 --> 03:12.470
Zustand bin, dass ich diese Gauss-Glocke ausgewählt habe.

03:13.030 --> 03:14.230
Damit zähle ich dann hoch.

03:15.490 --> 03:17.910
Und nummiere dann auch entsprechend nicht immer über die Anzahl der

03:17.910 --> 03:21.170
Ereignisse, die ich tatsächlich gesehen habe, sondern über die

03:21.170 --> 03:25.590
Wahrscheinlichkeiten aufsummiert, dass ich für jedes Ereignis jetzt

03:25.590 --> 03:30.190
wirklich diesen Satz an unbeobachtbaren Daten hatte, dass ich also in

03:30.190 --> 03:33.270
diesem Zustand war, dass ich diese Gauss-Glocke ausgewählt habe.

03:35.190 --> 03:36.910
Gut, also das nochmal dazu.

03:38.270 --> 03:43.190
Gut, wir hatten letztes Mal also sehr viel Zeit aufgewandt für die

03:43.190 --> 03:47.110
Theorie, hinterhin Markov-Modellen und wie ich sie trainiere und hat

03:47.110 --> 03:50.370
ein bisschen damit angefangen, was mache ich denn jetzt mit den Markov

03:50.370 --> 03:50.590
-Modellen?

03:50.710 --> 03:52.550
Was hat das jetzt mit Spracherkennung zu tun?

03:53.030 --> 03:58.750
Und wie schon angekündigt, wir wollen jetzt das akustische Modell mit

03:58.750 --> 04:00.630
Markov -Modellen realisieren.

04:01.210 --> 04:03.430
Also wir erinnern uns nochmal an die Fundamentalformel der

04:03.430 --> 04:04.810
automatischen Spracherkennung.

04:05.370 --> 04:10.790
Wir suchen halt die Wortfolge, die diesen Ausdruck maximiert und am

04:10.790 --> 04:13.850
Ende müssen wir nur noch den Zähler maximieren und der Zähler besteht

04:13.850 --> 04:14.710
aus zwei Faktoren.

04:14.830 --> 04:17.030
Das eine nennen wir das akustische Modell und das andere das

04:17.030 --> 04:17.890
Sprachmodell.

04:18.310 --> 04:20.510
Wie wir das X bekommen, haben wir uns lange angeschaut.

04:20.610 --> 04:23.690
Das ist eben die Vorverarbeitung, die aus dem Audiosignal so eine

04:23.690 --> 04:25.710
Folge von Merkmalsvektoren X macht.

04:26.350 --> 04:29.770
Und wir müssen jetzt diese einzelnen Komponenten implementieren und

04:29.770 --> 04:32.810
stellen uns zurzeit die Frage, wie implementieren wir dieses

04:32.810 --> 04:33.750
akustische Modell?

04:34.190 --> 04:36.610
Und das implementieren wir gerade mit den Markov-Modellen.

04:37.770 --> 04:41.650
Das hatten wir uns angeschaut, dass wenn wir so eine Wortfolge haben

04:41.650 --> 04:45.250
und wir wollen daraus ein Markov-Modell machen, dann machen wir daraus

04:45.250 --> 04:47.530
erstmal ein Markov-Modell auf Wortebene.

04:48.930 --> 04:54.290
Dann zerlegen wir die Worte in Phoneme und die Phoneme zerlegen wir

04:54.290 --> 04:56.250
nochmal in Untereinheiten.

04:57.450 --> 05:00.850
Hier oben habe ich diese Selbstschleifen weggelassen, aber man muss

05:00.850 --> 05:02.550
die sich immer dazu denken.

05:02.550 --> 05:05.950
Die Idee ist halt immer, Sprache ist linear in der Zeit.

05:06.710 --> 05:08.610
Ich bin für eine gewisse Zeit in einem Wort.

05:08.690 --> 05:09.870
Wie lange das ist, weiß ich nicht.

05:09.950 --> 05:11.790
Aber ich habe dann einen Zustand, der ist ein Wort.

05:12.210 --> 05:15.430
Da kann ich eine Weile drin selber bleiben oder ich mache irgendwann

05:15.430 --> 05:16.850
den Übergang in das nächste Wort.

05:17.090 --> 05:19.590
Dann bleibe ich wieder eine Weile in dem Wort und gehe über in das

05:19.590 --> 05:20.170
nächste Wort.

05:20.710 --> 05:25.030
Und all diese anderen möglichen Übergänge, die in einem normalen HMM

05:25.030 --> 05:29.230
möglich wären, dass man also von dem Zustand in der Mitte auch wieder

05:29.230 --> 05:31.510
an den Anfang kann, das sagen wir, das gibt es alles nicht.

05:31.510 --> 05:34.490
Das hat Wahrscheinlichkeit Null, weil Sprache halt so modelliert ist,

05:34.570 --> 05:35.750
dass sie in der Zeit voraus geht.

05:36.290 --> 05:39.090
Und genauso ist es dann, wenn ich letztendlich hinterher alles zerlegt

05:39.090 --> 05:41.630
habe, hinter diese unterphonetischen Einheiten.

05:42.090 --> 05:44.970
Ich fange an mit dem ersten Phonemen, bleibe eine Weile drin in dem

05:44.970 --> 05:48.230
ersten Phonemen, gehe irgendwann dann in den zweiten Zustand des

05:48.230 --> 05:51.010
Phonemens, bleibe dann eine Weile, dann gehe ich irgendwann in das

05:51.010 --> 05:54.230
nächste Phonem, bleibe eine Weile in dem ersten Zustand, gehe dann

05:54.230 --> 05:57.210
über in den zweiten Zustand, bleibe eine Weile und so weiter und

05:57.210 --> 05:57.530
sofort.

05:57.530 --> 06:00.190
Und so hangele ich mich von links nach rechts durch.

06:01.150 --> 06:04.490
Jetzt kann man da unterschiedliche Spielchen machen, was die Topologie

06:04.490 --> 06:04.990
angeht.

06:05.130 --> 06:08.050
Zum Beispiel kann ich ein Phonemen auch in drei Zustände zerlegen.

06:08.470 --> 06:11.230
Das ist auch das, was man häufig macht.

06:12.490 --> 06:16.550
Dann sage ich halt, Phonemen wird in drei Zustände zerlegt.

06:16.670 --> 06:19.470
Ich kann eine Weile in einem Zustand sein, dann gehe ich in den

06:19.470 --> 06:20.850
nächsten über, bleibe dann eine Weile.

06:21.350 --> 06:23.870
Oder innerhalb eines Phonemens, sagt man, kann ich auch diesen

06:23.870 --> 06:25.750
mittleren Zustand zum Beispiel überspringen.

06:25.750 --> 06:29.270
Das wäre so das Modell, wie der Herr Barkes das vorgeschlagen hat.

06:29.910 --> 06:34.850
Andere sagen, diesen Übergang zum Beispiel, den lasse ich weg.

06:35.090 --> 06:38.490
Ich muss immer von links nach rechts durch alle Unterzustände eines

06:38.490 --> 06:39.450
Phonemens durchgehen.

06:40.730 --> 06:44.370
Jetzt kann man sich da eine interessante Frage dran stellen.

06:44.730 --> 06:50.330
Wir machen da ja gewisse Einschränkungen für das HMM, um die Akustik

06:50.330 --> 06:51.590
von Sprache zu modellieren.

06:52.770 --> 06:55.850
Dass wir, sagen wir mal, von links nach rechts in der Zeit durchgehen,

06:56.390 --> 06:57.390
ist sicherlich sinnvoll.

06:59.350 --> 07:03.370
Was für Annahmen machen wir denn da, wenn wir sowas haben, für die

07:03.370 --> 07:04.910
Länge eines Phonemens?

07:05.910 --> 07:09.510
Wenn ich so eine Topologie habe, was mache ich da für Annahmen über

07:09.510 --> 07:10.550
die Länge eines Phonemens?

07:10.610 --> 07:13.210
Wie beschränke ich die Länge eines Phonemens?

07:14.770 --> 07:16.970
Kann ein Phonem beliebig lang sein?

07:21.080 --> 07:25.220
So, ich glaube ja durch dieselben Schleifen kann ich es sagen.

07:25.860 --> 07:29.160
Kann ein Phonem nur einen Zeitschritt lang sein?

07:29.400 --> 07:31.560
Ich habe eine diskrete Zeit, ich meine, ich habe mein Signal

07:31.560 --> 07:33.800
diskretisiert, ich habe es im Fenster gelegt.

07:33.900 --> 07:35.820
Kann ein Phonem nur einen Zeitschritt lang sein?

07:39.700 --> 07:40.180
Nee.

07:40.180 --> 07:44.600
Ein Phonem muss mindestens zwei Zeitschritte lang sein.

07:44.600 --> 07:52.140
Diese Topologie sagt mir, ich muss da anfangen, dann kann ich in den

07:52.140 --> 07:55.680
da übergehen, dann bin ich immer noch im Phonem und erst dann kann ich

07:55.680 --> 07:56.940
in das nächste Phonem übergehen.

07:57.680 --> 08:01.960
Das heißt, diese Tatsache, dass ich zum Beispiel keinen Pfeil habe,

08:02.460 --> 08:07.520
der von hier nach da geht, legt fest, dass ich mindestens zwei

08:07.520 --> 08:10.240
Zeitschritte in diesem Phonem sein muss.

08:10.240 --> 08:13.920
Und wenn ich diesen Pfeil dann auch noch streiche, wie das häufig

08:13.920 --> 08:17.880
gemacht wird, dann lege ich damit fest, dass ein Phonem mindestens

08:17.880 --> 08:21.840
drei Zustände, drei Zeitschritte lang sein muss.

08:22.200 --> 08:25.780
Das heißt, mit dieser Topologie, wenn ich das so mache, kann ich auch

08:25.780 --> 08:31.000
steuern, dass ich so bestimmte Mindestlängen für Phoneme vorgebe.

08:31.780 --> 08:36.410
Und je nachdem, wenn ich zum Beispiel diese Selbstschleifen wegnehme,

08:36.410 --> 08:40.150
dann könnte ich auch solche Spielchen treiben, wie dass ich eine

08:40.150 --> 08:44.970
Maximallänge für das Phonem festlege, indem ich nämlich halt maximal

08:44.970 --> 08:48.070
so viele wie ich Zustände habe, wenn ich keine Selbstschleife mehr

08:48.070 --> 08:49.590
habe, und dann kann ich so durchüberspringen.

08:50.070 --> 08:52.610
Und da kann man relativ viel rumspielen.

08:52.870 --> 08:56.230
Da kann man zum Beispiel unterscheiden zwischen normalen Phonemen oder

08:56.230 --> 08:59.390
hinterher in der Spracherkennung habe ich ja nicht nur Sprache.

08:59.950 --> 09:04.610
Ich habe dann auch so nichtsprachliche Phänomene drin, wie Räuspern,

09:04.710 --> 09:09.030
Husten, dass ich so Fillerwörter mache, wie R, M und sonst was, so

09:09.030 --> 09:10.870
Boris Becker-Style.

09:11.610 --> 09:14.670
Ich habe Atemgeräusche, ich habe Pausen.

09:15.390 --> 09:21.270
Und so ein HMM muss ja in seinem Signal für jeden Zeitpunkt, für jeden

09:21.270 --> 09:25.670
meiner diskreten Zeitschritte, die ich durch diese Fensterung des

09:25.670 --> 09:29.470
diskreten Zeitsignals bekomme, für jeden dieser Frames, muss das ja

09:29.470 --> 09:34.150
eine Ausgabe machen, wenn so eine Äußerung ausgegeben werden soll.

09:34.210 --> 09:38.230
Das HMM emittiert ja von seinem Modell her solche Äußerungen, die aus

09:38.230 --> 09:39.630
der Vorverarbeitung rauskommen.

09:40.010 --> 09:43.590
Da muss es für alles, für jeden Zeitschritt, muss es eine Ausgabe

09:43.590 --> 09:43.850
machen.

09:44.210 --> 09:47.510
Und wenn in der Aufnahme irgendwo Stille ist, dann brauche ich dafür

09:47.510 --> 09:49.050
auch Zustände, die das modellieren.

09:49.430 --> 09:51.130
Und die müssen dann eine Ausgabe machen.

09:51.570 --> 09:55.370
Und dann kann ich mir so Dinge überlegen, für welche Arten von...

09:55.370 --> 09:59.250
dann sind es ja keine Phoneme mehr, sondern nur so Pseudophoneme, für

09:59.250 --> 10:02.230
welche Art von akustischen Ereignissen nehme ich zum Beispiel welche

10:02.230 --> 10:04.430
Topologie und so weiter und so fort.

10:04.470 --> 10:07.650
Da kann man dann anfangen, diese einfachen Modelle deutlich

10:07.650 --> 10:08.750
verspielter hinzumachen.

10:10.130 --> 10:12.870
Und dann hatte ich Ihnen eine Hausaufgabe mitgegeben.

10:13.590 --> 10:18.570
Die Frage, ist es sinnvoll, eine Gauss Mixtur pro Zustand zu haben.

10:18.570 --> 10:25.230
Also jeder Zustand eines kontinuierlichen HMMs hat halt eine Ausgabe

10:25.230 --> 10:26.770
-Wahrscheinlichkeitsdichte -Funktion.

10:27.590 --> 10:29.310
Das ist eine Gauss Mixtur-Verteilung.

10:29.830 --> 10:34.770
Und wenn man erstmal in die reine Definition des HMMs reinschaut, dann

10:34.770 --> 10:39.090
steht da drin, für jeden Zustand gibt es eine eigene Gauss Mixtur

10:39.090 --> 10:39.630
-Verteilung.

10:39.990 --> 10:42.550
Und jeder Kreis, den man hier sieht, ist ein anderer Zustand und

10:42.550 --> 10:44.090
bekommt seine eigene Gauss Mixtur.

10:44.090 --> 10:47.730
Und die Frage ist, ist das sinnvoll?

10:49.710 --> 10:50.930
Was sind Ihre Antworten?

10:56.680 --> 10:58.700
Was spricht dafür, was spricht dagegen?

11:05.230 --> 11:06.210
Wer ist dafür?

11:06.310 --> 11:07.410
Wer sagt, das ist sinnvoll?

11:11.130 --> 11:13.710
Wie würden Sie argumentieren, warum das sinnvoll ist?

11:18.410 --> 11:22.770
Genau, für Übergänge oder auch das, was emittiert wird.

11:23.370 --> 11:26.310
Also die Übergänge sind ja nicht nur die Gauss Mixtur-Verteilung,

11:26.310 --> 11:29.350
sondern die Gauss Mixtur-Verteilungen bestimmen das, was ausgegeben

11:29.350 --> 11:29.610
wird.

11:30.390 --> 11:33.390
Der Zustand gibt so einen Frame X aus.

11:33.890 --> 11:36.530
Und das klingt von Person zu Person unterschiedlich.

11:37.370 --> 11:42.790
Das kann auch innerhalb eines Wortes unterschiedliche Laute, auch wenn

11:42.790 --> 11:46.310
sie dasselbe Symbol kriegen, unterschiedlich klingen.

11:46.750 --> 11:48.330
Da würde das Sinn machen, das zu machen.

11:48.470 --> 11:50.770
Aber welches Problem haben wir, wenn wir das so machen?

11:50.870 --> 11:53.470
Welches Problem haben wir, wenn wir für jeden Zustand eine Gauss

11:53.470 --> 11:54.190
Mixtur vorsehen?

11:54.950 --> 11:56.010
Was ist blöd daran?

12:00.970 --> 12:02.950
Viel Mathematik, man muss viel rechnen, ja.

12:03.550 --> 12:07.170
Aber gut, Rechenzeit, heute kostet das ja nichts mehr.

12:09.610 --> 12:13.670
Da können wir ja, als ich noch jung war, da kann man heute noch von

12:13.670 --> 12:13.970
träumen.

12:14.110 --> 12:17.030
Da haben wir in der Hosentasche was, was wir damals da unten im Keller

12:17.030 --> 12:17.490
stehen hatten.

12:19.850 --> 12:22.910
Man spart Rechenzeit, klar, aber das ist heutzutage gar nicht mal mehr

12:22.910 --> 12:25.310
so das Problem.

12:26.330 --> 12:29.170
Rechenzeit ist reichlich da, häufig hat man eher Probleme hinterher

12:29.170 --> 12:30.610
aus anderen Gründen mit Hauptspeicher.

12:31.390 --> 12:34.210
Was würde noch außer Rechenzeit dagegen sprechen?

12:35.390 --> 12:39.610
Oder besser gesagt, was würde sinnigerweise dafür sprechen, dass man

12:39.610 --> 12:42.470
eben nicht für jeden einzelnen Zustand eine Gauss Mixtur hat?

12:43.230 --> 12:44.330
Wer kann sich da was vorstellen?

12:48.450 --> 12:52.850
Es hat was damit zu tun, mit dieser Anforderung, die wir hatten, dass

12:52.850 --> 12:57.470
wir ja beliebige Wortsequenzen zusammensetzen wollen aus kleinen

12:57.470 --> 12:58.050
Einheiten.

12:58.670 --> 13:02.870
Im Augenblick habe ich HMMs so theoretisch eingeführt, dass wenn ich

13:02.870 --> 13:08.790
so ein HMM trainieren will für eine Wortfolge, I can, yes we can, dann

13:08.790 --> 13:12.590
muss ich diese Wortfolge, yes we can, im Training sehen, baue daraus

13:12.590 --> 13:19.150
ein HMM und dann wird für dieses HMM komplett die Parameter trainiert.

13:19.150 --> 13:25.430
Und wenn dann der Gegenkandidat kommt und sagt, no, no, we can, not,

13:25.990 --> 13:30.790
der kann kein Englisch, der sagt no, we can, der sagt halt no, we can,

13:31.610 --> 13:35.510
dann habe ich ein HMM, das wird für diese Wortfolge no, we can,

13:35.650 --> 13:38.130
aufgebaut und dann trainiere ich das die ganze Zeit.

13:39.010 --> 13:42.510
Und das ist ein komplett anderes HMM als das erste HMM für yes, we

13:42.510 --> 13:42.690
can.

13:42.870 --> 13:44.930
Das hat seinen komplett eigenen Parametersatz.

13:45.450 --> 13:47.190
Das ist die Theorie hinter HMMs.

13:48.090 --> 13:49.090
Und das ist ja blöd.

13:49.370 --> 13:52.770
Das heißt, ich kann dann nur Wahrscheinlichkeiten für Wortfolgen

13:52.770 --> 13:57.830
ausgeben, die ich auch relativ häufig überhaupt im Training gesehen

13:57.830 --> 14:01.250
habe, damit ich die ganzen Parameter, die so ein HMM für eine

14:01.250 --> 14:02.890
Wortfolge hat, überhaupt schätzen kann.

14:03.270 --> 14:04.430
Und das wollen wir nicht.

14:04.510 --> 14:07.970
Wir hatten ja gesagt, eine unserer Designanforderungen ist, dass wir

14:07.970 --> 14:10.830
aus kleinen Einheiten was zusammenbauen wollen.

14:11.310 --> 14:15.450
Und da ist dann eben die Idee dahinter, dass ich anfange, Parameter zu

14:15.450 --> 14:15.770
koppeln.

14:15.770 --> 14:20.150
Wenn ich jetzt zum Beispiel nur das Wort gag nehme und habe da einen

14:20.150 --> 14:20.590
HMM.

14:21.490 --> 14:25.230
Und das Wort gag fängt halt an mit einem G und hört auf mit einem G.

14:26.050 --> 14:31.870
Und dann wäre die Idee, dass ich die Annahme mache, dass G am Anfang

14:31.870 --> 14:35.790
des Wortes klingt genauso wie das G am Ende des Wortes.

14:35.790 --> 14:45.550
Und dass ich dann sage, die Gaussmixtur, die zu dem ersten Zustand

14:45.550 --> 14:50.830
hier gehört von dem G, das soll genau dieselbe Gaussmixtur sein wie

14:50.830 --> 14:52.910
zum ersten Zustand des zweiten Gs.

14:53.250 --> 14:56.950
Die beiden Zustände teilen sich die gleiche Gaussmixtur.

14:57.390 --> 15:00.330
Und genauso ist das mit dem mittleren Zustand des Gs und genauso ist

15:00.330 --> 15:01.890
das mit dem N-Zustand des Gs.

15:01.890 --> 15:07.230
Die sollen sich alle die gleiche Gaussmixtur teilen.

15:09.510 --> 15:11.990
Das ist jetzt innerhalb eines HMMs.

15:12.750 --> 15:17.630
Jetzt habe ich immer noch das Problem, dass ich ja halt das Wort gag

15:17.630 --> 15:23.150
mehrmals gesehen haben muss, um so ein HMM trainieren zu können.

15:23.430 --> 15:26.070
Und jetzt mache ich das halt über HMMs hinweg.

15:26.070 --> 15:33.050
Wenn ich jetzt das Wort good hätte, dann sage ich, das G des HMMs für

15:33.050 --> 15:37.810
das Wort good teilt sich die gleichen Gaussglocken wie die beiden Gs

15:37.810 --> 15:39.250
im Wort gag.

15:40.050 --> 15:43.110
Das heißt, das, was ich eigentlich von der Theorie her erstmal nicht

15:43.110 --> 15:47.630
vorgesehen habe, nicht darf, erzwinge ich einfach, indem ich sage, die

15:47.630 --> 15:50.330
Zustände, das sind dieselben Zustände, selbst wenn sie in

15:50.330 --> 15:52.930
unterschiedlichen HMMs sind, wenn sie in unterschiedlichen Wortfolgen

15:52.930 --> 15:55.070
sind, die kriegen die gleiche Gaussglocke.

15:55.070 --> 15:59.370
Und wenn ich jetzt ein neues HMM, ein neues Wort, eine neue Wortfolge

15:59.370 --> 16:02.890
zusammensetzen muss, dann suche ich mir halt diese Gaussglocken und

16:02.890 --> 16:06.730
Zustände, die ich davor trainiert habe, zusammen und stöpsel sie

16:06.730 --> 16:07.930
wieder zusammen.

16:08.590 --> 16:10.890
Und das hat halt den Vorteil, die Trainingsdaten werden besser

16:10.890 --> 16:11.210
genutzt.

16:11.310 --> 16:15.330
Ich habe pro Parameter, pro Gaussmixtur deutlich mehr Trainingsdaten.

16:16.870 --> 16:21.010
Ich spare Rechenzeit, weil ich muss halt nicht unbedingt zu jedem

16:21.010 --> 16:23.730
Zeitpunkt, wenn ich zum Beispiel ein Vorwortalgorithmus jetzt

16:23.730 --> 16:28.870
ausrechne, dann muss ich halt nicht unbedingt immer sowohl die GB

16:28.870 --> 16:32.410
vorne als auch die GB hinten Gaussmixtur ausrechnen, sondern es ist

16:32.410 --> 16:33.270
eine Gaussmixtur.

16:33.390 --> 16:35.510
Das heißt, die Ergebnisse sind logischerweise bei gleichem

16:35.510 --> 16:37.670
Merkmalsvektor auch geteilt.

16:38.630 --> 16:41.470
Und das Schöne ist, ich kann jetzt wirklich anfangen aus kleinen

16:41.470 --> 16:45.830
Einheiten beliebige HMMs zusammenzusetzen und insbesondere solche HMMs

16:45.830 --> 16:50.350
zu bauen, die ich während des Trainings nicht gesehen habe.

16:52.530 --> 16:56.110
Und wenn ich jetzt so ein HMM in der Spracherkennung trainieren will,

16:56.830 --> 17:02.370
dann ist das im Prinzip folgende Abfolge von Dingen, die ich machen

17:02.370 --> 17:02.630
muss.

17:03.570 --> 17:06.390
Das erste ist, ich muss ein HMM initialisieren.

17:06.550 --> 17:09.590
Damit ich einen EM-Algorithmus auf Trainingsdaten laufen kann, brauche

17:09.590 --> 17:11.150
ich irgendwelche initialen Parameter.

17:12.050 --> 17:15.830
Die einfachste Methode, was man so immer in der Theorie von

17:15.830 --> 17:19.330
allgemeinen maschinellen Lernbüchern liest, ist halt, Parameter werden

17:19.330 --> 17:20.250
halt zufällig initialisiert.

17:21.470 --> 17:24.310
Jetzt kann man sich vorstellen, dass wenn man relativ komplexe Modelle

17:24.310 --> 17:27.490
hat und das akustische Modell eines Spracherkennungssystems, das ist

17:27.490 --> 17:28.910
halt ein sehr komplexes Modell.

17:29.010 --> 17:32.730
Das ist jetzt nicht mehr Äpfel sortieren nach reife und unreife Äpfel,

17:33.110 --> 17:34.150
sondern das ist was Komplizierteres.

17:35.590 --> 17:39.590
Dann ist diese Oberfläche, in der der EM-Algorithmus nach einem neuen

17:39.590 --> 17:43.510
Satz Parameter sucht, man nennt das manchmal die Decision Surface, die

17:43.510 --> 17:44.730
ist nicht mehr so schön glatt.

17:44.970 --> 17:49.210
Da gibt es nicht irgendwie ein globales Optimum, gegen das dann der EM

17:49.210 --> 17:53.090
-Algorithmus konvergieren würde, weil es das einzige lokale Optimum

17:53.090 --> 18:00.010
ist, sondern da gibt es ganz viele wild verteilte lokale Optima, die

18:00.010 --> 18:03.510
von der absoluten Höhe her sehr unterschiedlich sein können, sodass

18:03.510 --> 18:07.010
wenn ich von schlechten initialen Parametern ausgehe und ich Pech

18:07.010 --> 18:10.910
habe, dann lande ich in einem sehr schlechten lokalen Optimum.

18:12.270 --> 18:15.650
Und da ist es besser, dass man sich irgendwie ein bisschen damit

18:15.650 --> 18:18.190
beschäftigt, wie kann ich die Parameter initialisieren.

18:20.790 --> 18:24.190
Und eine Möglichkeit das zu machen ist, dass man mit sogenannten

18:24.190 --> 18:26.050
etikettierten Daten arbeitet.

18:27.390 --> 18:30.670
Ich mag das Wort etikettierte Daten hier, das ist so richtig schön

18:30.670 --> 18:31.870
komplett deutsch gesprochen.

18:32.770 --> 18:35.630
Etikettiert, auf Englisch würde man sagen gelabelte Daten.

18:36.450 --> 18:40.790
Und gelabelt ist ja kein Deutsch, also braucht man ein anderes Wort

18:40.790 --> 18:43.630
für, nimmt man etikettierte Daten, also nimmt man ein französisches

18:43.630 --> 18:46.110
Wort für, für etwas, wo man auch kein deutsches Wort für hat.

18:46.950 --> 18:51.970
Also ich habe dann etikettierte Daten, etwas was ich ja eigentlich gar

18:51.970 --> 18:52.410
nicht habe.

18:52.490 --> 18:55.070
Was ich normalerweise habe, wenn ich Trainingsdaten habe, ich habe

18:55.070 --> 19:00.450
Wortfolgen und für jede Wortfolge, für jeden Satz, für jede Äußerung

19:00.450 --> 19:01.850
habe ich eine Audioaufnahme.

19:01.850 --> 19:05.370
Aber diese Zuordnung, zu welchem Zeitpunkt befinde ich mich denn in

19:05.370 --> 19:07.490
welchem HMM-Zustand, habe ich nicht.

19:07.830 --> 19:10.750
Ich habe normalerweise nicht mal die Information, zu welchem Zeitpunkt

19:10.750 --> 19:13.610
fängt welches Wort an und wann hört welches Wort auf.

19:14.050 --> 19:14.450
Entschuldigung.

19:15.490 --> 19:17.630
Das Einzige, was ich in der Regel weiß, ist, ich habe hier eine

19:17.630 --> 19:21.210
Wortfolge, da kann links und rechts noch ein bisschen Stille dran sein

19:21.210 --> 19:24.430
oder auch nicht, da kann zwischen den Worten ein bisschen Stille sein

19:24.430 --> 19:27.610
oder auch nicht und das ist halt verschriftet.

19:27.990 --> 19:31.130
Wenn ich Glück habe und ich habe sehr sauber verschriftete Daten, dann

19:31.130 --> 19:35.790
habe ich noch zwischendrin so Huster und Äms und Ös und was weiß ich,

19:35.850 --> 19:38.070
wenn einer mit der Hand aufs Mikrofon kommt und sowas, das ist dann

19:38.070 --> 19:38.750
noch annotiert.

19:39.710 --> 19:42.430
Aber das ist auch für viele Trainingsdaten häufig gar nicht der Fall.

19:43.270 --> 19:49.210
Da muss ich irgendwie mir was Schlaues einfallen lassen, wie ich diese

19:49.210 --> 19:50.510
Daten etikettieren kann.

19:51.170 --> 19:53.030
Wie gesagt, wenn ich sehr viel Geld habe, dann könnte ich halt

19:53.030 --> 19:55.790
Linguisten und Phonetiker hinsetzen, die müssten dann halt genau

19:55.790 --> 19:58.750
hinschreiben, wo fängt welches Phonem an und wo fangen die

19:58.750 --> 20:03.390
Unterzustände, ich zerlege ja so ein Phonem in zwei oder drei

20:03.390 --> 20:05.670
Unterzustände, wo fangen die an, wo hören die auf.

20:07.630 --> 20:12.210
Das ist halt sehr teuer oder ich brauche irgendwie was anderes

20:12.210 --> 20:17.390
Sinnvolles, um mir diese etikettierten Daten irgendwie anders schlau

20:17.390 --> 20:18.230
herzuholen.

20:18.310 --> 20:20.510
Und das ist so eine halbe Wissenschaft für sich, was man da alles

20:20.510 --> 20:21.390
Mögliche machen kann.

20:21.390 --> 20:25.070
Wenn ich jetzt diese etikettierten Daten habe, also wenn ich bei

20:25.070 --> 20:29.450
meinen Trainingsdaten wüsste, dieser Merkmalsvektor, dieser

20:29.450 --> 20:33.970
letztendlich ein Frame, der ausgeschnitten wurde beim Windowing, beim

20:33.970 --> 20:39.170
Fenstern des Signals, gehört jetzt zu dem HMM-Zustand, dann könnte ich

20:39.170 --> 20:43.090
zum Beispiel die Gauss-Mixtur-Modelle dieses HMM-Zustandes mit K

20:43.090 --> 20:46.730
-Mittelwerte -Algorithmus initialisieren, so wie wir das letztes Mal

20:46.730 --> 20:47.430
besprochen haben.

20:47.930 --> 20:52.490
Wenn ich also irgendwie geschickt meine Parameter initialisiert habe,

20:52.710 --> 20:57.150
dann kommt als nächster Schritt die iterative Optimierung.

20:57.370 --> 21:00.670
Also für alle Trainingsdaten führe ich den Forward-Backward

21:00.670 --> 21:04.030
-Algorithmus aus oder wir werden das später noch sehen, wenn ich

21:04.030 --> 21:07.650
Rechenzeit einsparen will, kann ich auch alternativ den Viterbi

21:07.650 --> 21:08.670
-Algorithmus ausführen.

21:09.870 --> 21:14.690
Und dann sammle ich diese, wir hatten die hinreichende Statistiken, im

21:14.690 --> 21:20.610
Englischen sufficient statistics genannt, auf, führe dann, um meinen E

21:20.610 --> 21:24.010
-Schritt durchzuführen, führe dann als nächstes meinen Maximization

21:24.010 --> 21:30.350
-Schritt durch, schätze also meine HMM-Parameter neu und das Ganze

21:30.350 --> 21:35.910
iteriere ich für eine bestimmte Anzahl an Iterationen, bis ich ein

21:35.910 --> 21:37.710
geeignetes Abbruchkriterium habe.

21:38.370 --> 21:41.770
Ein geeignetes Abbruchkriterium ist das, was Sie schon fünfmal gehört

21:41.770 --> 21:42.030
haben.

21:42.130 --> 21:46.230
Entweder ich habe Validierungsdaten, auf denen überprüfe ich die

21:46.230 --> 21:48.690
Leistung meines akustischen Modells, ich lasse Spracherkennung

21:48.690 --> 21:51.290
durchführen und gucke, ob die Wortfehlerrate besser wird oder nicht.

21:51.910 --> 21:55.990
Oder ich überprüfe zumindest das Maximum-Likelihood-Kriterium, ob das

21:55.990 --> 21:59.210
besser wird oder schlechter, also ob ich da Overfitting habe.

21:59.750 --> 22:03.130
Oder ich weiß, ich bin halt ein Fuchs, der schon seit 20 Jahren

22:03.130 --> 22:08.150
Spracherkennung macht und ich weiß, vier Iterationen reichen aus und

22:08.150 --> 22:09.570
habe halt irgendeinen Abbruchkriterium.

22:09.970 --> 22:13.170
Und dann ganz zum Schluss, wenn ich es trainiert habe, kann ich dann

22:13.170 --> 22:16.070
damit Erkennung machen.

22:16.710 --> 22:19.910
Und da wir noch nicht wissen, wie ein Sprachmodell funktioniert, also

22:19.910 --> 22:23.910
weil wir P von W noch nicht ausrechnen können, ist das Einzige, was

22:23.910 --> 22:27.450
wir im Augenblick machen können, über alle Referenz-HMMs, die ich

22:27.450 --> 22:32.210
habe, berechne ich halt P von X gegeben W, zum Beispiel mit dem

22:32.210 --> 22:33.170
Forward -Algorithmus.

22:35.110 --> 22:38.010
Sprachmodell ist halt gleich verteilt, ist halt alles 1 durch N, N so

22:38.010 --> 22:41.550
viele Referenz-HMMs, wie ich habe und könnte dann das Wort mit der

22:41.550 --> 22:44.250
höchsten Wahrscheinlichkeit auswählen.

22:45.770 --> 22:49.590
Da mache ich also noch keine Suche jetzt nach der maximalen Wortfolge,

22:49.630 --> 22:50.310
das kommt später.

22:51.410 --> 22:55.210
Aber das wäre jetzt so der erste initiale Trainingszyklus, wenn ich

22:55.210 --> 22:59.530
jetzt halt mit HMMs Einzelworterkennung betreiben wollte, so ähnlich,

22:59.770 --> 23:02.190
wie ich das zum Beispiel mit dem DTW gemacht habe.

23:04.350 --> 23:06.150
Wo bekomme ich die Etikettierung?

23:06.310 --> 23:09.850
So ein Standard-Trick ist, gut, ich mache ein Spracherkennungssystem

23:09.850 --> 23:11.690
für Deutsch, ich habe schon eins für Englisch.

23:13.030 --> 23:16.330
Na ja, dann bilde ich irgendwie die deutschen Phoneme auf die

23:16.330 --> 23:20.670
englischen Phoneme ab, mache einen Viterbi-Algorithmus mit dem

23:20.670 --> 23:22.230
akustischen Modell, das ich schon habe.

23:22.530 --> 23:25.170
Der Viterbi-Algorithmus sagt mir, was ist denn die wahrscheinlichste

23:25.170 --> 23:29.270
Zustandssequenz, zu welchem Zeitpunkt bin ich in welchem Zustand, muss

23:29.270 --> 23:31.870
das dann mappen, dann weiß ich, zu welchem Zeitpunkt war ich in

23:31.870 --> 23:35.730
welchem englischen Phonemen oder Unterphonemenzustand, muss das dann

23:35.730 --> 23:38.890
abbilden und sage, okay, das entspricht ungefähr dem deutschen

23:38.890 --> 23:44.190
Phonemen, dem deutschen Zustand und kann das übertragen.

23:44.950 --> 23:47.390
Oder ich habe halt irgendwie einen Altenerkenner, ich habe ein

23:47.390 --> 23:52.810
akustisches Modell, das war gebaut worden für Fahrkartenreservierung

23:52.810 --> 23:55.430
und jetzt will ich ein akustisches Modell bauen, das sind für

23:55.430 --> 23:59.670
Telefonunterhaltung, Konversationen da, dann bin ich schon relativ nah

23:59.670 --> 23:59.910
dran.

24:00.050 --> 24:03.150
Dann kann ich erstmal, um zu initialisieren, diese Etikettierung mit

24:03.150 --> 24:06.130
dem alten Modell auf den neuen Trainingsdaten durchführen und kann von

24:06.130 --> 24:07.110
dort aus neu schätzen.

24:08.050 --> 24:11.730
Wenn man wirklich viel Geld hat und man hat gute Phonetiker an der

24:11.730 --> 24:17.190
Hand, dann kann man auch versuchen, das Ganze mit Eins zu trainieren.

24:19.310 --> 24:23.830
Und wenn ich sowas habe, wenn ich wirklich sehr, sehr gute manuell

24:23.830 --> 24:29.650
annotierte Daten habe, wenn ich also weiß, die sind so gut, dass sie

24:29.650 --> 24:33.770
der Tatsache entsprechen, dass sie wirklich dem entsprechen, wie das

24:33.770 --> 24:37.210
HMM da durchgehen soll, dann könnte ich sogar dahin gehen, dass ich

24:37.210 --> 24:41.750
meinen Trainingsprozess dahin modifiziere, dass ich diese Gamma T von

24:41.750 --> 24:45.290
J, also die Wahrscheinlichkeit, dass ich im Zeitpunkt T im Zustand J

24:45.290 --> 24:49.050
bin, per Hand auf 1,0 setze und nicht mehr im E-Schritt schätze,

24:49.170 --> 24:51.890
sondern nur noch zum Beispiel die Sachen bei den Gaussglocken.

24:52.330 --> 24:55.070
Das gibt es also keinen menschlichen Annotierer, der mir sagen kann,

24:55.150 --> 24:57.410
wenn ich den Merkmalsvektor sehe, dann weiß ich, welche der

24:57.410 --> 24:59.550
Gaussglocken das war in meiner Gaussmixtur.

24:59.630 --> 25:02.010
Das gibt es nicht, aber es gibt einen Phonetiker, der mir sagen kann,

25:02.110 --> 25:05.470
da fängt der Anfang des Phonems an und da kriegst du die Mitte und da

25:05.470 --> 25:07.810
ist das Ende des Phonems, dann könnte ich zum Beispiel solche Sachen

25:07.810 --> 25:10.390
machen und das auf 0 setzen.

25:11.190 --> 25:15.230
Oder ich kann sowas mit partiell gelabelten Daten arbeiten.

25:17.330 --> 25:20.490
Ich kann zum Beispiel sagen, ich weiß nicht genau innerhalb eines

25:20.490 --> 25:24.270
Phonems, in welchem Zustand ich bin, aber ich weiß immerhin, wann das

25:24.270 --> 25:25.810
Phonem anfängt und wann es aufhört.

25:26.470 --> 25:29.690
Oder ich weiß nicht, in welchem Phonem ich innerhalb eines Wortes bin,

25:29.830 --> 25:33.190
in der Wortfolge, aber ich weiß, wo jedes einzelne Wort anfängt und

25:33.190 --> 25:34.490
jedes einzelne Wort aufhört.

25:34.490 --> 25:40.050
Und kann damit schon mal so teilweise die möglichen Pfade

25:40.050 --> 25:40.610
einschränken.

25:40.730 --> 25:43.630
Ich weiß also, wann ich welchen Übergang machen muss zwischen diesen

25:43.630 --> 25:45.350
größeren Einheiten.

25:46.390 --> 25:50.890
Und kann dann auf den kleineren Segmenten wieder mit zufälligen oder

25:50.890 --> 25:52.910
uniform initialisierten Werten arbeiten.

25:53.610 --> 25:58.130
Wenn ich partout wirklich von 0 anfange, und das gibt es manchmal, ich

25:58.130 --> 26:01.610
habe keinen alten Erkenner, von dem ich weiß, wie ich jetzt die

26:01.610 --> 26:04.250
Phoneme abbilden soll, weil das ist irgendeine Sprache, die kenne ich

26:04.250 --> 26:07.250
nicht und was weiß ich, wo das Zeug herkommt, sondern ich will

26:07.250 --> 26:08.230
wirklich von 0 anfangen.

26:08.310 --> 26:11.450
Ich habe die Daten und sonst nichts.

26:11.910 --> 26:15.810
Dann ist das Mindeste, was ich machen kann, mir mal anzuschauen, in

26:15.810 --> 26:20.210
welchem Bereich könnten denn die Parameter so ungefähr liegen.

26:20.870 --> 26:25.250
Und das bedeutet zum Beispiel für die Gauss-Mixturen, die Mittelwerte,

26:25.310 --> 26:28.930
die sollten ja so ungefähr zumindest in dem Bereich liegen, aus dem

26:28.930 --> 26:31.050
die Vektoren aus der Vorverarbeitung kommen.

26:31.510 --> 26:33.410
Die kommen ja nicht aus dem gesamten R hoch N.

26:33.490 --> 26:36.810
Es gibt keine Vektoren, die von in jeder Dimension Minus und endlich

26:36.810 --> 26:39.570
bis Plus und endlich irgendwie verteilt gehen, sondern die kommen ja

26:39.570 --> 26:43.110
aus irgendeinem Teilraum des R hoch N, dass ich mir angucke, aus

26:43.110 --> 26:46.270
welchem Raum kommen die denn schon, und dann nur aus diesem Raum

26:46.270 --> 26:49.610
zufällig ziehe und nicht aus dem ganzen R hoch N.

26:50.090 --> 26:53.470
Oder ich kann solche Sachen machen wie, ich berechne mir mal den

26:53.470 --> 26:53.950
Mittelwert.

26:54.870 --> 26:57.850
Und dann mache ich noch solche Sachen wie, naja, Stille ist ja eher

26:57.850 --> 27:00.290
leise und Sprache ja eher laut.

27:00.670 --> 27:04.190
Dann mache ich erstmal eine Energiedetektion und sage, die ganz leisen

27:04.190 --> 27:07.770
Segmente, das ist offensichtlich Stille und die etwas lauteren, das

27:07.770 --> 27:09.270
wird wohl menschliche Sprache sein.

27:09.990 --> 27:13.170
Dann wähle ich mir einmal den Mittelwert der Stille aus und das eher

27:13.170 --> 27:18.070
lautere berechne ich den Mittelwert für meine Phoneme aus, für meine

27:18.070 --> 27:18.750
echten Phoneme.

27:19.110 --> 27:20.730
Und dann kann man unterschiedliche Sachen machen.

27:20.810 --> 27:24.130
Man kann auch so Sachen versuchen, Stimmhaft gegen Stimmlos, kann man

27:24.130 --> 27:26.230
ja auch relativ gut detektieren.

27:26.330 --> 27:28.690
Da muss ich nur gucken, ist Grundfrequenz vorhanden oder nicht.

27:29.270 --> 27:34.470
Das etwas kann ich relativ gut automatisch machen und kann meine

27:34.470 --> 27:37.990
Phoneme und die Zustände dann auch unterteilen in Stimmhafte und

27:37.990 --> 27:41.470
Stimmlose Phoneme und kann dann automatisch gucken, welche Daten sind

27:41.470 --> 27:43.470
in Stimmhaft, welche sind Stimmlos, welche sind offensichtlich

27:43.470 --> 27:45.030
Sprache, welche sind nicht Sprache.

27:45.310 --> 27:49.630
Dann habe ich schon drei Unterteilungen und kann dann für jede dieser

27:49.630 --> 27:52.410
drei Unterteilungen zum Beispiel den Mittelwert bestimmen und damit

27:52.410 --> 27:58.070
als initialen Parameter zum Beispiel anfangen.

28:02.510 --> 28:10.050
Diese Idee mit dem Durchschnitt, mit dem Mittelwert über den Dingern,

28:10.090 --> 28:11.190
die kann ich ja noch weiter treiben.

28:11.270 --> 28:16.590
Wenn ich jetzt sage, ich habe für stimmhafte Phoneme einen Mittelwert,

28:17.950 --> 28:20.890
aber ich habe eine Gauss Mixtur, da brauche ich ja mehrere

28:20.890 --> 28:21.410
Mittelwerte.

28:21.870 --> 28:25.170
Dann kann ich sagen, na gut, für den Anfang pfeife ich drauf, dass ich

28:25.170 --> 28:26.190
da eine Gauss Mixtur habe.

28:26.290 --> 28:29.070
Für den Anfang sage ich, ich nehme halt nur eine Gaussglocke als

28:29.070 --> 28:30.130
Emissionswahrscheinlichkeit.

28:30.650 --> 28:33.790
Dann kann ich diese Mittelwerte bestimmen und dann kann ich den ganzen

28:33.790 --> 28:38.770
Zuständen jedem dieselben Mittelwert geben, dieselben Mittelwert zu

28:38.770 --> 28:40.090
der einen Gaussglocke, die er hat.

28:41.350 --> 28:44.410
Die Kovarianzmatrix, kann ich halt die Kovarianz schätzen auf den

28:44.410 --> 28:47.090
Daten und die Kovarianzmatrix entsprechend initialisieren.

28:47.670 --> 28:51.590
Und dann kann ich den EM-Algorithmus drüber laufen lassen und also

28:51.590 --> 28:54.130
kann erst mal etikettieren die Daten damit.

28:54.410 --> 28:57.710
Ich kann Forster Line mit diesem Teil durchlaufen lassen und das wird

28:57.710 --> 29:00.310
mir irgendwas sagen, wird es irgendwie gleich verteilen.

29:00.570 --> 29:03.130
Aber dann kann ich halt den EM-Algorithmus durchlaufen lassen und dann

29:03.130 --> 29:04.730
wird er im Laufe der Zeit besser werden.

29:04.730 --> 29:07.390
Warum wird er im Laufe der Zeit besser werden?

29:08.310 --> 29:12.330
Das würde nicht im Allgemeinen funktionieren, aber das funktioniert

29:12.330 --> 29:15.750
aufgrund dieser Modellierungsannahme, die ich gemacht habe, dass eben

29:15.750 --> 29:17.830
nicht alle Übergänge möglich sind.

29:18.630 --> 29:21.130
Ich schränke ja die Anzahl der möglichen Übergänge ein.

29:22.310 --> 29:25.270
Das heißt, ich habe zumindest die Information, welches Phoneme hinter

29:25.270 --> 29:26.030
welchem anderen kommt.

29:26.450 --> 29:29.970
Das steckt in der Verschriftung drin meiner Aufnahme.

29:29.970 --> 29:31.870
Ich habe die Wortsequenz, die zerlege ich im Phoneme.

29:31.970 --> 29:33.470
Ich weiß, in welcher Reihenfolge die kommen.

29:33.850 --> 29:38.250
Jetzt kriegen die alle die gleiche Gauss-Glocke mit dem Mittelwert

29:38.250 --> 29:41.430
über alle Daten verpasst, mit der Kovarianz über alle Daten verpasst.

29:42.250 --> 29:46.490
Und dann lasse ich das über alle Trainingsdaten halt etikettieren und

29:46.490 --> 29:48.430
EM -Algorithmus laufen.

29:49.210 --> 29:52.110
Und dann wird halt der EM-Algorithmus allein aufgrund der

29:52.110 --> 29:54.690
Einschränkung, welche Zustände kommen hinter welchen anderen

29:54.690 --> 29:57.190
Zuständen, da neue Parameter finden.

29:57.190 --> 30:00.770
Und die Parameter werden sich von Phoneme zu Phoneme, von Zustand zu

30:00.770 --> 30:02.070
Zustand unterscheiden.

30:02.530 --> 30:08.510
Und ich kann dann anfangen, da erstmal meine eine Gauss-Glocke pro

30:08.510 --> 30:10.230
Zustand vernünftig zu trainieren.

30:10.910 --> 30:12.530
Und dann habe ich eine Etikettierung.

30:13.270 --> 30:15.890
Mit diesem Modell, mit einem Gauss-Glocke pro Zustand kann ich

30:15.890 --> 30:16.690
etikettieren.

30:17.210 --> 30:20.370
Und dann in dem nächsten Schritt sagen, okay, mit diesen Labels, die

30:20.370 --> 30:24.130
ich da habe, da trainiere ich jetzt ein Modell, das hat, sagen wir

30:24.130 --> 30:25.490
mal, zwei Gauss-Glocken.

30:25.490 --> 30:27.950
Das hat jetzt echte Gauss-Mixturen mit zwei Gauss-Glocken.

30:28.470 --> 30:31.570
Und dadurch, dass ich da schon etikettierte Daten habe, kann ich für

30:31.570 --> 30:35.330
diese Gauss-Mixturen mithilfe von Chemiens die Parameter

30:35.330 --> 30:40.190
initialisieren und kann dann wieder mein EM-Training anwerfen, bekomme

30:40.190 --> 30:44.150
bessere Gauss-Glocken heraus und sage dann, okay, da mache ich jetzt

30:44.150 --> 30:45.750
als nächstes ein Modell mit vier Gauss-Glocken.

30:45.750 --> 30:48.310
Und dann treibe ich das halt immer so weiter und erhöhe so

30:48.310 --> 30:52.710
schrittweise die Anzahl der Parameter und ziehe mich so an den eigenen

30:52.710 --> 30:54.910
Haaren damit aus dem Sumpf.

30:57.370 --> 31:00.930
Dieses Initialisieren mit dem K-Mittelwerte-Algorithmus, da hatten wir

31:00.930 --> 31:02.150
letztes Mal schon drüber gesprochen.

31:02.150 --> 31:06.750
Wenn ich also weiß, welche Merkmalsvektoren zu welchem Zustand gehören

31:06.750 --> 31:09.970
und wenn ich weiß, ich hätte gerne K-Gauss-Glocken in der

31:09.970 --> 31:14.030
Emissionswahrscheinlichkeit für diesen Zustand, dann mache ich halt K

31:14.030 --> 31:17.230
-Mittelwerte, dann habe ich K-Mittelwerte, kann die Kovarianz noch

31:17.230 --> 31:24.530
schätzen, kann noch die Apriori-Wahrscheinlichkeiten schätzen, um die

31:24.530 --> 31:28.970
Gewichte in meiner Gauss-Mixtur zu bekommen und bekomme dann da

31:28.970 --> 31:30.670
entsprechend ein schönes System raus.

31:31.710 --> 31:34.270
Die Frage ist, das Einzige, was ich jetzt noch wissen muss, ist, wie

31:34.270 --> 31:35.730
viele Gauss-Glocken möchte ich denn haben?

31:36.590 --> 31:39.450
Ich weiß, pro Zustand will ich K-Gauss-Glocken haben, welchen Wert hat

31:39.450 --> 31:40.050
denn jetzt K?

31:42.250 --> 31:44.690
Kann man halt Erfahrungswert sagen, kann man sagen, ja, für

31:44.690 --> 31:49.770
Spracherkennung funktioniert ungefähr 16 ganz gut, wenn ich irgendwie

31:49.770 --> 31:52.530
halbwegs viele Trainingsdaten habe, also kriegen alle Gauss-Glocken

31:52.530 --> 31:52.910
16.

31:52.910 --> 31:58.810
Oder ich kann mir anschauen, wie viele Vektoren habe ich denn jetzt

31:58.810 --> 32:02.670
insgesamt für diesen Zustand und dann frage ich bei den Kollegen von

32:02.670 --> 32:06.550
IBM nach und die Kollegen von IBM sagen, ich brauche mindestens für

32:06.550 --> 32:11.210
jede Gauss-Komponente 100 Training-Samples, das heißt also die Anzahl

32:11.210 --> 32:14.570
der Samples, die ich jetzt habe für so einen Zustand geteilt durch

32:14.570 --> 32:17.930
100, sagt mir, wie viele Gauss-Glocken ich habe.

32:17.930 --> 32:21.410
Dann frage ich den Kollegen, der auf der anderen Seite des Gangs sitzt

32:21.410 --> 32:23.610
und der sagt mir halt, nee, das ist Quatsch, du brauchst mindestens

32:23.610 --> 32:23.990
1000.

32:24.990 --> 32:27.730
Aber irgendwie so hat jeder so seinen Erfahrungswert und dann kann man

32:27.730 --> 32:31.690
das halt entsprechend mal damit initialisieren, wie gehabt.

32:33.130 --> 32:38.310
Nur damit Sie das schon mal gehört haben, K-Mittelwerte, der

32:38.310 --> 32:42.230
Algorithmus K-Mittelwerte ist selber wieder der Spezialfall eines

32:42.230 --> 32:44.770
Algorithmuses, der heißt der Neural Gas.

32:45.630 --> 32:49.110
Das ist wieder etwas, das basiert auf künstlichen neuronalen Netzen,

32:49.470 --> 32:52.890
also ähnlich wie wir das schon bei der Learning Vector Quantization

32:52.890 --> 32:53.810
kennengelernt haben.

32:53.810 --> 32:58.630
Allerdings jetzt in einer unüberwachten Art und Weise hat man gemacht,

32:58.790 --> 33:02.750
um eigentlich fehlerfrei Daten kodieren zu können, mit Hilfe von

33:02.750 --> 33:05.910
Quantisierung von Referenzvektoren.

33:08.530 --> 33:11.330
Angenommen, ich habe so eine Wahrscheinlichkeitsverteilung über die

33:11.330 --> 33:14.190
Daten, die ich quantisieren möchte und ich habe halt so K

33:14.190 --> 33:18.330
-Repräsentanten am Anfang irgendwie zufällig ausgewählt, dann ziehe

33:18.330 --> 33:22.190
ich unter dieser Wahrscheinlichkeitsverteilung über den Daten ein X

33:22.190 --> 33:22.590
raus.

33:22.590 --> 33:26.230
Bei K-Mittelwerte gehe ich also davon aus, dass die irgendwie gleich

33:26.230 --> 33:29.690
verteilt sind, gehe die Reihe nach durch, bestimme dann diese

33:29.690 --> 33:34.250
Entfernungsreihenfolge, suche mir die nächsten, erstnächsten,

33:34.350 --> 33:40.050
zweitnächsten und so weiter, drittnächsten Repräsentanten raus und

33:40.050 --> 33:44.810
schiebe dann die Repräsentanten halt entsprechend so hin, dass das

33:44.810 --> 33:48.570
halt der neue Repräsentant wird halt so ein bisschen in die Richtung

33:48.570 --> 33:51.590
des neuen Trainingsdatums geschoben.

33:53.710 --> 33:56.910
Wie viel ich denn schiebe, hängt davon ab, ob es der nächste, der

33:56.910 --> 34:01.970
zweite, nächste und so weiter Repräsentant ist oder der, also wie weit

34:01.970 --> 34:02.670
der entfernt ist.

34:02.710 --> 34:04.850
Je weiter der entfernt ist, desto weniger schiebe ich den

34:04.850 --> 34:06.130
Repräsentanten in die Richtung.

34:06.130 --> 34:11.010
Und dann habe ich hier noch zwei Steuerungsfaktoren.

34:11.710 --> 34:17.490
Dieses Sigma ist, um wie viel ich diesen Repräsentanten verschiebe.

34:18.270 --> 34:23.310
Und dieses Lambda hier, das gibt mir an, wie stark der Einfluss ist,

34:23.430 --> 34:27.070
ob das jetzt der nächste, der zweitnächste, der drittnächste oder der

34:27.070 --> 34:29.510
endnächste Nachbar ist.

34:31.310 --> 34:41.850
Wenn ich das Lambda halt auf immer kleiner werden lasse, dann wird

34:41.850 --> 34:45.950
halt dieses hoch minus K, wird auch immer kleiner werden.

34:46.130 --> 34:52.330
Also je kleiner ich das Lambda werden lasse, desto weniger Einfluss

34:52.330 --> 34:56.670
haben die weit entfernten Repräsentanten darauf, wie weit ich den, die

34:56.670 --> 35:00.550
weiter entfernten Repräsentanten zu diesem Trainingsdatum, wie weit

35:00.550 --> 35:03.050
ich den Repräsentanten jetzt zu diesem Trainingsdatum verschiebe.

35:03.650 --> 35:07.090
Und man macht das so, deswegen heißt das Neural Gas, dass man diese

35:07.090 --> 35:11.930
beiden Faktoren, dieses Sigma, die Schrittweite und das Lambda, die

35:11.930 --> 35:15.690
Reichweite der Nachbarschaft, also wie weit entfernte Trainingsdaten

35:15.690 --> 35:18.930
jetzt noch Einfluss darauf haben, auf die Verschiebung des aktuellen

35:18.930 --> 35:21.730
Repräsentanten, die lässt man mit der Zeit abnehmen.

35:21.730 --> 35:25.750
Das kann man sich so vorstellen wie ein Gasgemisch, dessen Temperatur

35:25.750 --> 35:29.750
im Laufe der Zeit halt immer niedriger wird, wo dann die einzelnen

35:29.750 --> 35:33.150
Moleküle in dem Gasgemisch, wenn es kälter wird, fangen immer weniger

35:33.150 --> 35:35.970
und weniger an zu zittern und hin und her zu springen.

35:39.370 --> 35:42.770
Jetzt haben wir mit K-Mittelwerte eine Initialisierung der Gauss

35:42.770 --> 35:43.630
-Mixtur -Verteilung.

35:43.730 --> 35:45.750
Jetzt müssen wir uns noch überlegen, was wir mit den

35:45.750 --> 35:47.210
Übergangswahrscheinlichkeiten machen.

35:47.910 --> 35:53.830
Wenn ich die Gauss-Verteilungen halbwegs vernünftig initialisiert

35:53.830 --> 35:57.330
habe, dann reicht es aus, wenn ich die Übergangswahrscheinlichkeiten

35:57.330 --> 35:58.410
gleich verteilt lasse.

35:59.210 --> 36:01.410
Weil sie sind ja nicht alle gleich verteilt.

36:01.570 --> 36:04.910
Würde ich in einem HMM alle Übergangswahrscheinlichkeiten gleich

36:04.910 --> 36:07.670
verteilen, dann wird es nichts Vernünftiges lernen.

36:09.050 --> 36:12.170
Aber dadurch, dass ich ja einige Übergangswahrscheinlichkeiten immer

36:12.170 --> 36:15.810
per Hand auf Null gesetzt habe, setze ich jetzt nur noch die übrig

36:15.810 --> 36:18.550
gebliebenen Übergangswahrscheinlichkeiten, die nicht per Hand auf Null

36:18.550 --> 36:23.910
gesetzt sind, auf gleich verteilt, auf Anzahl durch mögliche

36:23.910 --> 36:29.570
Nachbarfolgezustände und kann dann eher im Algorithmus was lernen.

36:30.650 --> 36:33.730
Und dann passiert etwas Besonderes in der automatischen

36:33.730 --> 36:34.710
Spracherkennung.

36:35.690 --> 36:38.730
Zumindest machen wir das so und das ist die Beobachtung, die wir

36:38.730 --> 36:39.030
machen.

36:39.690 --> 36:43.610
Beim akustischen Modell in einem Spracherkennungssystem sind die

36:43.610 --> 36:46.530
Übergangswahrscheinlichkeiten sowieso vollkommen uninteressant.

36:48.090 --> 36:55.530
Die Wahrscheinlichkeit, dass ein HMM so eine Merkmalsvektorenfolge

36:55.530 --> 36:59.170
ausgibt, wird vollständig dominiert durch die

36:59.170 --> 37:00.590
Emissionswahrscheinlichkeit.

37:01.970 --> 37:04.690
Weil diese Gaussglocken, die man da rausbekommt und diese

37:04.690 --> 37:07.670
Gaussmixturen für die unterschiedlichen Zustände, sind in der Regel

37:07.670 --> 37:10.270
von Zustand zu Zustand sehr unterschiedlich.

37:10.270 --> 37:15.570
Und auch innerhalb eines Zustandes werden die Gaussglocken sich nicht

37:15.570 --> 37:16.970
sonderlich stark überlappen.

37:18.110 --> 37:21.890
Also in den Lehrbüchern steht halt immer drin, bei einer Gaussmixtur,

37:23.930 --> 37:29.970
das weiß ich, die besteht aus zwei Gaussglocken, dann sehen Sie immer

37:29.970 --> 37:30.470
diese Bilder.

37:30.470 --> 37:36.710
Die erste Gaussglocke, zweite Gaussglocke und dann ist die Summe halt

37:36.710 --> 37:46.190
irgendwie so ein Ding, ist dann die Summe.

37:47.030 --> 37:49.430
Das ist Quark, so sehen die nicht aus in der Praxis.

37:49.430 --> 37:59.030
In der Praxis sehen die Dinger eher so aus.

38:01.590 --> 38:05.670
Die Mittelwerte von den Gaussglocken liegen in der Regel sehr, sehr,

38:05.790 --> 38:06.790
sehr weit auseinander.

38:07.630 --> 38:10.570
Und deswegen funktionieren diese ganzen Beschleunigungstechniken, über

38:10.570 --> 38:11.590
die wir gesprochen haben.

38:11.930 --> 38:15.770
Dass wir gesagt haben, wir gucken uns nur den nächstgelegenen

38:15.770 --> 38:16.910
Mittelwertsvektor an.

38:16.910 --> 38:20.630
Und den Beitrag, das ist der, den wir nehmen zu dem, was die

38:20.630 --> 38:25.830
Gaussmixtur ausgibt, noch multipliziert mit dem Gewicht, das nehmen

38:25.830 --> 38:26.970
wir als Approximation.

38:27.370 --> 38:29.450
Das ist 100 Prozent gut genug.

38:30.390 --> 38:33.590
Wenn wir bei unserem Spracherkenner und wenn wir mit Gaussmixturen

38:33.590 --> 38:39.550
arbeiten, wenn wir nur den nächstgelegenen Mittelwertsvektor nehmen

38:39.550 --> 38:43.310
und damit alle Emissionswahrscheinlichkeiten rechnen, dann kriegen wir

38:43.310 --> 38:44.850
eine Wortfehlerrate von x.

38:46.430 --> 38:52.590
Und wenn wir die vollständige Gaussmixtur ausrechnen, alle Parameter,

38:53.170 --> 38:55.490
dann bekommen wir eine Wortfehlerrate von genau x.

38:56.270 --> 38:59.630
Und wenn wir Pech haben, dann ist die Wortfehlerrate sogar x plus 0

38:59.630 --> 39:02.370
,01, weil halt irgendwelches Rauschen draufliegt.

39:02.790 --> 39:03.890
Aber es wird dadurch nicht besser.

39:04.690 --> 39:07.550
Das heißt also, diese Lehrbuchdinger, das können Sie vergessen, das

39:07.550 --> 39:09.350
sieht nicht so aus, das sieht so aus.

39:10.390 --> 39:15.030
Und weil das so aussieht und das auch nicht nur innerhalb eines

39:15.030 --> 39:18.110
Zustandes so aussieht, sondern auch über alle Zustände hinweg sieht

39:18.110 --> 39:22.870
das so aus, dass die Gaussglocken in wirklich völlig anderen Bereichen

39:22.870 --> 39:26.910
liegen des Merkmalsraumes, sind diese Übergangswahrscheinlichkeiten so

39:26.910 --> 39:27.810
richtig völlig egal.

39:28.290 --> 39:31.710
Weil ob Sie jetzt einen Überschgang von einem von dem zum nächsten

39:31.710 --> 39:34.310
machen, das bestimmt Ihnen schon, wie das Signal aussieht.

39:34.390 --> 39:38.350
Das ist so dominant im Signal sichtbar, dass dieser Übergang gemacht

39:38.350 --> 39:38.590
wird.

39:39.110 --> 39:43.390
Und am Ende, da mag es zwar so einen Bereich geben, wo das halt, so

39:43.390 --> 39:46.310
das geht von dem einen in das andere Phonem über, da gibt es so eine

39:46.310 --> 39:47.610
graue Stufe.

39:48.470 --> 39:51.210
Aber Sie interessiert das ja gar nicht, wo genau jetzt der Phonem

39:51.210 --> 39:51.990
-Übergang anliegt.

39:52.350 --> 39:54.390
Sie interessiert ja am Ende nur die Wortfolge, die rauskommt.

39:54.530 --> 39:59.290
Ob jetzt der Spracherkenner meint, dass da plus oder minus 20

39:59.290 --> 40:02.530
Millisekunden verschobener Phonem-Übergang hier stattfindet,

40:02.970 --> 40:04.170
geschenkt, das ist egal.

40:08.650 --> 40:12.950
Dann brauchen wir noch die Anfangswahrscheinlichkeiten für ein HMM.

40:13.630 --> 40:16.550
Und da wir ja gesagt haben, Sprache geht von links nach rechts.

40:16.870 --> 40:20.170
Wir fangen links im ersten Zustand an und wir fangen nicht im 15.

40:20.390 --> 40:20.970
Zustand an.

40:21.330 --> 40:24.170
Deswegen brauchen wir keine Anfangswahrscheinlichkeiten, sondern die

40:24.170 --> 40:26.850
Anfangswahrscheinlichkeit vom ersten Zustand, die ist halt 1 und alle

40:26.850 --> 40:29.990
anderen Anfangswahrscheinlichkeiten, die sind halt 0.

40:29.990 --> 40:30.730
Fertig.

40:33.450 --> 40:33.930
Genau.

40:34.090 --> 40:38.310
Wenn ich jetzt keine etikettierten Daten habe, habe ich schon gesagt,

40:38.430 --> 40:40.110
dann nehme ich halt entweder von einem ähnlichen

40:40.110 --> 40:43.010
Spracherkennungssystem die Parameter.

40:43.290 --> 40:46.070
Ich kann teilweise sogar Gaussglocken sozusagen verpflanzen.

40:46.230 --> 40:49.410
Dann nehme ich halt von einem französischen A die Gaussglocke und tue

40:49.410 --> 40:50.530
es in ein deutsches A rein.

40:50.910 --> 40:54.410
Und wenn ich jetzt, sagen wir mal, ein englisches TH initialisieren

40:54.410 --> 40:58.030
will, na gut, das ist so ungefähr, als wenn ein deutscher S spricht.

40:58.130 --> 41:01.210
Dann nehme ich halt von einem deutschen S die Parameter und tue die da

41:01.210 --> 41:04.770
mal rein für den Anfang und damit fange ich dann an zu trainieren.

41:05.630 --> 41:08.310
Oder, wie gesagt, ich kann es zufällig initialisieren, aber dann

41:08.310 --> 41:10.470
sollte ich schon gucken, dass ich in dem Bereich bin, der mir auch die

41:10.470 --> 41:11.630
Vorverarbeitung vorgibt.

41:13.350 --> 41:16.590
Oder mache halt das mit Gleichverteilung und mache so diesen

41:16.590 --> 41:17.730
komplizierten Prozess.

41:17.870 --> 41:20.590
Ich fange mal an mit einer Gaussglocke und ziehe mich dann immer

41:20.590 --> 41:21.170
weiter hoch.

41:24.380 --> 41:27.980
Wenn wir uns nochmal den EM-Algorithmus und auch die Baumwelschregeln

41:27.980 --> 41:31.720
anschauen, dann haben wir da drin immer diese Wahrscheinlichkeit

41:31.720 --> 41:37.320
stehen, wie hoch ist die Wahrscheinlichkeit, dass ich zum Zeitpunkt t

41:37.320 --> 41:38.820
im Zustand j bin.

41:39.020 --> 41:40.780
Das hatten wir die Gamma-Wahrscheinlichkeiten genannt.

41:40.780 --> 41:42.440
Die Gamma-Gt´s von j.

41:42.840 --> 41:45.200
Und die bekomme ich, indem ich den Vorwart- und den Backwart

41:45.200 --> 41:47.660
-Algorithmus ausrechne und die Alphas und Bettas bestimme.

41:47.780 --> 41:50.380
Und mit Hilfe der Alphas und Bettas hatten wir gesehen bei der

41:50.380 --> 41:53.820
Herleitung der Baumwelschregeln, wie ich diese Gammas berechnen kann.

41:56.460 --> 42:02.580
Im Prinzip hatten wir gesehen, diese Gamma-T von K´s, das ist das, mit

42:02.580 --> 42:07.200
dem ich dann zum Beispiel die Merkmalsvektoren, die ich aus der

42:07.200 --> 42:11.600
Vorverarbeitung habe, gewichte, um dann hinterher zum Beispiel den

42:11.600 --> 42:14.420
Durchschnitt zu bilden, um den Mittelwert meiner Gauss-Glocke zu

42:14.420 --> 42:14.720
kriegen.

42:15.960 --> 42:17.380
Damit gewichte ich das.

42:18.080 --> 42:20.760
Und wenn man jetzt sich das anschaut und man ein halbwegs vernünftiges

42:20.760 --> 42:26.360
Modell schon hat, dann ist da nicht sehr viel Unsicherheit mehr, ob

42:26.360 --> 42:28.640
ich jetzt in dem einen oder in dem anderen Zustand bin.

42:29.080 --> 42:33.000
Ich gehe ja eh von links nach rechts durch, durch meine Sprache und

42:33.000 --> 42:36.220
muss jetzt sozusagen nur noch die Zeitpunkte herausfinden, wann ich

42:36.220 --> 42:37.520
diesen Zustandswechsel mache.

42:38.020 --> 42:42.540
Und da haben wir schon gesagt, das wird eh bestimmt dominiert durch

42:42.540 --> 42:45.200
die Emissionswahrscheinlichkeiten, weil das Signal sich so prägnant

42:45.200 --> 42:47.960
ändert, wenn ich den Phonemenübergang mache, da ist die

42:47.960 --> 42:50.420
Übergangswahrscheinlichkeit eigentlich schon völlig uninteressant.

42:51.340 --> 42:54.280
Und wenn die Übergangswahrscheinlichkeit schon völlig uninteressant

42:54.280 --> 42:57.740
ist, dann kann man sich auch überlegen, dass dann diese

42:57.740 --> 43:02.180
Wahrscheinlichkeit dafür, zu einem bestimmten Zeitpunkt, in einem

43:02.180 --> 43:04.840
bestimmten Zustand zu sein, sehr scharf ist.

43:04.840 --> 43:11.220
Für den x-beliebigen Zustand T, da gibt es ein, zwei, drei Zustände,

43:11.460 --> 43:15.200
die haben eine signifikante Wahrscheinlichkeit, die signifikant größer

43:15.200 --> 43:17.460
als 0 ist, dass es überhaupt der Zustand ist.

43:17.840 --> 43:20.520
Und die allermeisten Zustände werden eh so eine Wahrscheinlichkeit von

43:20.520 --> 43:23.720
sehr nah 0 haben, dass ich jetzt gerade in dem Zustand bin.

43:23.940 --> 43:26.800
Ist auch klar, ich meine, wenn ich jetzt am Anfang meiner

43:26.800 --> 43:29.720
Audioaufnahme bin, dann ist die Wahrscheinlichkeit, dass ich im

43:29.720 --> 43:33.200
vorletzten Zustand des HMMs bin, doch eher gering.

43:33.800 --> 43:39.040
Und das leitet sich halt auch aus dem Signal und aus dem Aufbau dieses

43:39.040 --> 43:39.800
HMMs ab.

43:40.380 --> 43:44.580
Also die meiste Zeit sind diese Gamma-Ts sehr, sehr klein und für ein

43:44.580 --> 43:48.740
oder nur ganz wenige Zustände sind sie überhaupt hinreichend groß, als

43:48.740 --> 43:51.440
dass sie irgendwie einen interessanten Einfluss hätten auf die Art und

43:51.440 --> 43:53.260
Weise, wie der EM-Algorithmus funktioniert.

43:54.120 --> 43:58.640
Und um jetzt Zeit zu sparen, kann man zum Beispiel sagen, okay, statt

43:58.640 --> 44:01.840
mit diesen vielen verschiedenen Gamma-Ts, wo die meisten sowieso sehr

44:01.840 --> 44:05.100
nah an 0 sind, sage ich einfach das höchste Gamma-T, das ich bisher

44:05.100 --> 44:08.740
hatte, das mir zum Beispiel der Viterbi-Algorithmus hergibt.

44:09.400 --> 44:11.500
Das kriegt halt eine Wahrscheinlichkeit von 1.

44:11.940 --> 44:14.920
Wenn der Viterbi-Algorithmus sagt, zum Zeitpunkt T bin ich im Zustand

44:14.920 --> 44:18.620
J, dann kriegt er das Gamma-T von J eine 1 und alle anderen Zustände

44:18.620 --> 44:19.200
kriegen eine 0.

44:21.480 --> 44:29.820
Und dann haben wir sozusagen diese unbekannte Zustandssequenz sichtbar

44:29.820 --> 44:33.440
gemacht, in dem wir jetzt gesagt haben, okay, wir schätzen nicht nur

44:33.440 --> 44:35.680
Wahrscheinlichkeiten, sondern wir legen uns fest, welche

44:35.680 --> 44:39.720
Zustandssequenz war es und dann sind diese vorher unbeobachtbaren

44:39.720 --> 44:43.460
Zustände plötzlich beobachtbar und die ganzen Schätzungen der

44:43.460 --> 44:47.800
Übergangswahrscheinlichkeiten werden damit deterministisch.

44:47.920 --> 44:50.380
Also ich mache dann eine echte Maximum-Likelihood-Schätzung für die

44:50.380 --> 44:51.440
Übergangswahrscheinlichkeiten.

44:52.020 --> 44:53.240
Aber die interessieren mich eh nicht.

44:53.500 --> 44:56.440
Die haben eh keinen signifikanten Anteil, bleiben also noch die

44:56.440 --> 44:57.940
Emissionswahrscheinlichkeiten übrig.

44:58.480 --> 45:01.200
Und bei den Emissionswahrscheinlichkeiten habe ich halt Gauss-Mixturen

45:01.200 --> 45:05.660
und da brauche ich wieder einen EM-Algorithmus, um halt auszuwählen,

45:05.740 --> 45:07.180
welche Gauss-Glocke war es denn.

45:07.420 --> 45:09.820
Und das kann ich nicht sichtbar machen, so ohne weiteres.

45:09.820 --> 45:13.200
Da lege ich mich nicht fest, sondern da muss ich tatsächlich noch

45:13.200 --> 45:15.280
einen EM-Algorithmus durchführen.

45:15.680 --> 45:17.960
Aber wenn man sich nochmal daran erinnert, man hatte dann diese

45:17.960 --> 45:19.860
Dreifach -Summe, die man da hatte.

45:19.960 --> 45:24.200
Wenn man jetzt HMM plus Gauss-Mixturen macht, dann fällt eine Summe

45:24.200 --> 45:24.360
weg.

45:24.460 --> 45:27.180
Ich muss nicht mehr über alle möglichen Zustände summieren.

45:27.340 --> 45:29.780
Ich muss jetzt, ich weiß in welchem Zustand ich bin, ich muss nur noch

45:29.780 --> 45:33.300
über alle möglichen Gauss-Glocken sozusagen summieren.

45:33.300 --> 45:35.860
Und damit spare ich halt relativ viel Rechenzeit.

45:37.860 --> 45:43.560
Wenn man sich das mal anschaut, das ist so eine typische Gamma-Matrix

45:43.560 --> 45:45.260
von einem Training.

45:45.480 --> 45:47.760
Schwarz sind sehr hohe Werte, weiß ist null.

45:48.480 --> 45:52.420
Und dann sieht man schon, selbst bei einem relativ untrainierten

45:52.420 --> 45:57.060
Modell, da gibt es immer so zwei, drei Zustände, die es sein könnten.

45:57.060 --> 46:00.620
Und zu jedem Zeitpunkt, da einmal sind es vielleicht fünf Zustände,

46:00.740 --> 46:04.000
die es sein könnten und alle anderen Zustände haben Wert von null, die

46:04.000 --> 46:04.660
sind es überhaupt nicht.

46:04.960 --> 46:07.940
Und dann lege ich mich halt einmal fest und dann sagt man, man

46:07.940 --> 46:11.080
trainiert nur noch entlang dieses Viterbi-Pfades.

46:11.880 --> 46:15.140
Und das nennt man dann manchmal halt auch Label-Training.

46:15.600 --> 46:19.940
Und die Daumenregel ist so, wenn ich viel Trainingsdaten habe und

46:19.940 --> 46:23.100
schon ein halbwegs vernünftig initialisiertes Modell, ich habe schon

46:23.100 --> 46:26.060
ein paar Iterationen Forward-Backward-Algorithmus trainiert, ich habe

46:26.060 --> 46:29.180
diesen Initialisierungsprozess mit, ich lasse die Gauss-Glocken

46:29.180 --> 46:33.480
wachsen, schon eine Weile durchgeführt, dann ist das Viterbi-Training

46:33.480 --> 46:36.100
deutlich schneller und nicht schlechter, als wenn ich ein volles

46:36.100 --> 46:37.340
Forward -Backward-Training mache.

46:37.980 --> 46:41.260
Erst wenn ich sehr, sehr wenig Trainingsmaterial habe oder noch ein

46:41.260 --> 46:44.760
sehr schlecht initialisiertes Modell, dann lohnt es sich überhaupt,

46:45.240 --> 46:49.340
tatsächlich den reinen Forward-Backward-Training durchführen zu

46:49.340 --> 46:49.520
lassen.

46:49.520 --> 46:54.260
Und jetzt kann ich das Ganze noch auf eine Spitze weiter treiben, dass

46:54.260 --> 46:58.000
ich nicht jedes Mal in jeder Iteration den Viterbi-Pfad neu berechne,

46:58.660 --> 47:05.040
sondern ich berechne einmal den Viterbi-Pfad und den halte ich jetzt

47:05.040 --> 47:07.740
für eine bestimmte Anzahl an EM-Iterationen fest.

47:08.280 --> 47:12.140
Ich führe also den EM-Algorithmus entlang dieses Viterbi-Pfades

47:12.140 --> 47:16.220
mehrere Iterationen lang durch und erst wenn ich fünf Iterationen

47:16.220 --> 47:20.940
gerechnet habe, dann lasse ich nochmal von neuem diesen Viterbi-Pfad

47:20.940 --> 47:23.660
berechnen, in der Hoffnung, dass sich jetzt vielleicht ein bisschen

47:23.660 --> 47:26.660
was geändert hat, sodass der Viterbi-Pfad wirklich signifikant anders

47:26.660 --> 47:27.340
aussehen wird.

47:28.420 --> 47:33.440
Und das Ganze spart halt deutlich Zeit, setzt aber wie gesagt voraus,

47:33.520 --> 47:36.800
dass ich irgendwie ein halbwegs vernünftiges Modell schon habe, um

47:36.800 --> 47:40.660
einen vernünftigen Viterbi-Pfad ausrechnen zu können.

47:40.660 --> 47:42.340
Wenn ich natürlich ein schlechtes Modell habe, kriege ich einen

47:42.340 --> 47:45.060
schlechten Viterbi-Pfad, dann kann mir das wirklich wehtun.

47:46.840 --> 47:49.800
Wenn man jetzt das Ganze sich nochmal anschaut und man nur den HMM

47:49.800 --> 47:53.300
-Teil eines Spracherkenners aussieht, anschaut und da sich nochmal

47:53.300 --> 47:57.700
alle Komponenten anschauen will, dann sieht das so aus.

47:57.740 --> 48:00.260
Ich habe halt meine Trainingsdatenbank, das sind halt die Äußerungen

48:00.260 --> 48:04.800
mit zugehöriger Wortfolge, mache dann die Signalverarbeitung, stecke

48:04.800 --> 48:07.980
das Ganze dann rein in ein Forward-Backward-Training, dass ich

48:07.980 --> 48:12.280
mithilfe des HMMs, für jede Advents baue ich halt das HMM auf,

48:12.980 --> 48:15.360
akkumuliere die Statistiken mithilfe des Forward-Backward

48:15.360 --> 48:18.100
-Algorithmuses, bekomme dann meine Alpha, Beta, Gamma, Xis.

48:18.800 --> 48:22.700
Die gehen rein, die werden gesammelt über alle Trainingsdaten.

48:22.800 --> 48:25.280
Wenn ich einmal über die Trainingsdatenbank drüber bin, dann wird halt

48:25.280 --> 48:29.500
dieser Maximization-Schritt vom EM-Algorithmus gemacht.

48:29.620 --> 48:32.040
Dann kriege ich halt neue Möglichkeiten,

48:32.200 --> 48:33.720
Investionswahrscheinlichkeiten zu schätzen.

48:33.720 --> 48:37.920
Das kann ich dann eine Weile iterieren oder ich kann halt mir Labels

48:37.920 --> 48:41.140
schreiben lassen und anhand der Labels nur noch iterieren.

48:41.280 --> 48:45.160
Das heißt, ich muss keine Gammas mehr aufsammeln, sondern ich kann nur

48:45.160 --> 48:48.580
noch innerhalb der Gauss-Mixturen gucken, dass ich da mit den

48:48.580 --> 48:50.120
notwendigen Statistiken arbeite.

48:50.520 --> 48:53.300
Und irgendwann, wenn ich mal fertig bin und mein HMM voll

48:53.300 --> 48:56.100
parametrisiert ist, dann kann ich mir mithilfe des Forward

48:56.100 --> 49:00.680
-Algorithmuses und mithilfe der Alphas dann entsprechend für jedes HMM

49:00.680 --> 49:03.960
ausrechnen lassen, wie wahrscheinlich war es denn, dass es die

49:03.960 --> 49:06.340
aktuelle Aufnahme hervorgebracht hat.

49:06.440 --> 49:08.860
Und dann kann ich mich für die Wahrscheinlichste entscheiden.

49:11.420 --> 49:14.260
Kommen wir zurück zum Thema der Parameterkopplung.

49:14.960 --> 49:20.180
Und dieses Thema der Parameterkopplung ist mit eines der wichtigsten

49:20.180 --> 49:24.460
Themen, die ja also grundlegend über die Leistung, über das Gut- oder

49:24.460 --> 49:27.260
Schlechtfunktionieren eines Spracherkenners und eines akustischen

49:27.260 --> 49:28.220
Modells entscheiden.

49:29.420 --> 49:32.420
Wir hatten vorhin gesagt, wir wollen ja aus kleineren Einheiten

49:32.420 --> 49:35.800
beliebige Sachen, zu beliebige Wortsequenzen zusammenstecken.

49:36.200 --> 49:38.660
Wir hatten gesagt, okay, die Einheiten, das sind halt Phoneme

49:38.660 --> 49:39.980
beziehungsweise Subphoneme.

49:42.220 --> 49:46.640
Und egal, wo der erste Zustand eines A's vorkommt in den HMMs über

49:46.640 --> 49:50.720
meine Trainingsdaten, die teilen sich alle die gleiche Gauss-Glocke.

49:50.820 --> 49:53.500
Und wenn ich ein neues Wort zusammenbauen muss, das ich noch nicht

49:53.500 --> 49:56.260
kenne und da kommt ein A drin vor, dann wird da immer dieselbe Gauss

49:56.260 --> 49:57.140
-Glocke verwendet.

49:57.140 --> 50:01.780
Das ist eine sehr radikale Vorgehensweise, das ist eine sehr strikte

50:01.780 --> 50:02.840
Parameterkopplung.

50:04.540 --> 50:09.280
Die Idee dahinter ist, dass wir da zwar so ein Symbol haben, das steht

50:09.280 --> 50:10.060
für ein Phonem.

50:11.060 --> 50:14.640
Und dieses Phonem, wenn wir uns erinnern an die Grundlagen der

50:14.640 --> 50:20.440
Phonetik, das Phonem stand im Prinzip dafür, was sind die Ziele meiner

50:20.440 --> 50:21.300
Artikulatoren.

50:21.960 --> 50:25.160
Also wohin bewegen sich die Artikulatoren?

50:25.880 --> 50:27.280
Wo ist die Verengung?

50:27.660 --> 50:30.600
Wohin soll der höchste Punkt der Zunge kommen?

50:30.780 --> 50:31.900
Wie ist die Lippeneinstellung?

50:32.880 --> 50:35.400
Die Artikulatoren bewegen sich aber nicht ruckartig.

50:35.520 --> 50:39.920
Also die bewegen sich nicht von Stellung 1 in Nullzeit zu Stellung 2,

50:40.060 --> 50:41.960
sondern die sind im kontinuierlichen Übergang.

50:42.360 --> 50:45.980
Die Zunge bewegt sich vor und zurück und hoch und runter, die Lippen

50:45.980 --> 50:48.800
gehen auf und zu, der Kiefer hoch und runter, das Velum auf und

50:48.800 --> 50:49.080
runter.

50:49.400 --> 50:52.780
Das ist halt ein organisches System, das ist eine rein fließende

50:52.780 --> 50:53.360
Bewegung.

50:53.360 --> 50:57.720
Das heißt, wie so ein Phonem, das ja nur dadurch definiert ist, wo ist

50:57.720 --> 51:02.000
das Ende der Bewegung meiner Artikulatoren, wird letztendlich auch

51:02.000 --> 51:05.360
dadurch bestimmt, von woher komme ich, wie lange dauert es, bis ich

51:05.360 --> 51:08.900
dahin komme und wohin gehe ich als nächstes, wohin geht es als

51:08.900 --> 51:09.680
nächstes weiter.

51:10.680 --> 51:13.720
Und je nachdem, von wo ich komme und wohin ich gehe, das heißt also,

51:13.800 --> 51:16.500
welches Phonem ich vorher gesprochen habe, welches Phonem ich danach

51:16.500 --> 51:19.360
sprechen werde, sieht dieser Weg halt anders aus.

51:19.360 --> 51:23.220
Und dementsprechend sieht halt das Signal auch bei den Phonemen anders

51:23.220 --> 51:25.680
aus, je nachdem, in welchem Kontext sie stehen.

51:26.360 --> 51:29.680
Und auch, wenn ich jetzt das Wort tragen und das Wort wagen habe, wenn

51:29.680 --> 51:33.200
ich da jedes Mal so schreiben würde, so ein Phonem A in diesen

51:33.200 --> 51:36.780
schrägen Strichen, wie man das schreibt und sagt, das ist dasselbe

51:36.780 --> 51:40.420
Phonem, so wird das Signal doch jeweils leicht anders aussehen.

51:40.900 --> 51:43.900
Weil das eine Mal komme ich halt von so einem TR und das andere Mal

51:43.900 --> 51:48.040
komme ich von einem W und dann gehe ich erst zu demselben hin.

51:48.040 --> 51:52.060
Also insbesondere der Anfang wird sicherlich anders aussehen als das

51:52.060 --> 51:53.020
Ende von diesem A.

51:54.660 --> 51:59.880
Und das kann man sich jetzt zunutze machen, indem man da mit

51:59.880 --> 52:02.800
sogenannter Parameterkopplung arbeitet.

52:05.820 --> 52:11.120
Also dass alle Phoneme, die das gleiche Symbol haben, alle Zustände,

52:11.220 --> 52:15.240
die für das gleiche Phonem-Symbol stehen, kriegen die gleiche

52:15.240 --> 52:19.020
Satzparameter, ist sehr strikt, obwohl das nicht unbedingt sinnvoll

52:19.020 --> 52:19.300
ist.

52:20.240 --> 52:23.480
Manchmal macht man sogar noch eine noch striktere Parameterkopplung

52:23.480 --> 52:27.680
und kommt dann zu den sogenannten semi-kontinuierlichen HMMs.

52:29.300 --> 52:37.660
Diese semi-kontinuierlichen HMMs haben die Idee, jeder Zustand, das GB

52:37.660 --> 52:41.620
und das GB vorher, die hatten ja sich dieselbe Gaussmixtur geteilt und

52:41.620 --> 52:44.440
eine Gaussmixtur besteht aus Mixturgewichten und Gaussglocken.

52:45.180 --> 52:49.020
Bei den semi-kontinuierlichen HMMs geht man jetzt so weit und sagt,

52:49.220 --> 52:53.980
naja, ich habe nicht mehr für alle Gaussmixturen jeweils

52:53.980 --> 52:57.720
unterschiedliche Satz an Gaussglocken, sondern ich habe für alle

52:57.720 --> 53:03.400
Gaussmixturen einen globalen Pool an Gaussglocken und die

53:03.400 --> 53:06.900
Gaussmixturen unterscheiden sich jetzt nur noch anhand der Gewichte,

53:07.380 --> 53:11.440
mit denen sie diesen einheitlichen Satz an Gaussglocken

53:11.440 --> 53:12.540
zusammenmischen.

53:13.860 --> 53:19.080
Da würde sozusagen jeder Zustand sich auch noch die Gaussglocken als

53:19.080 --> 53:22.820
Parameter teilen und würde sich nur noch unterscheiden in diesen

53:22.820 --> 53:23.620
einzelnen Mixturgewichten.

53:25.160 --> 53:26.280
Warum macht man sowas?

53:27.060 --> 53:37.240
Das macht man halt deshalb, weil man Trainingsdaten besser ausnutzen

53:37.240 --> 53:37.600
möchte.

53:38.440 --> 53:41.800
Man hat meistens immer das Problem, dass man mehr Parameter hat als

53:41.800 --> 53:46.000
man Trainingsdaten oder dass man immer so viele Parameter schätzen

53:46.000 --> 53:48.840
möchte wie Trainingsdaten und jetzt ist die grundlegende Idee

53:48.840 --> 53:56.720
dahinter, vielleicht klingt ja mal ein Phonem A so ähnlich wie ein

53:56.720 --> 54:02.180
Phonem E, wenn beide in solchen Kontexten stehen, dass sie sich beide

54:02.180 --> 54:04.960
von der Aussprache her ungefähr annähern.

54:04.960 --> 54:10.620
Manchmal klingt vielleicht halt ein T wie ein P, je nachdem wie stark

54:10.620 --> 54:14.760
ich das angenähert habe und kann ich also sozusagen mir immer wieder

54:14.760 --> 54:16.760
dieselben Gaussglocken zusammenmischen.

54:16.920 --> 54:20.880
Ich muss sie nur vielleicht leicht unterschiedlich zusammenmischen, um

54:20.880 --> 54:26.140
die Wahrscheinlichkeitsdichtefunktion für die Emissionen zu bekommen.

54:28.500 --> 54:33.000
Wichtig ist, dass man sich realisieren muss, so ein semi

54:33.000 --> 54:39.300
-kontinuierliches HMM und so ein anderes strikt gekoppeltes HMM, das

54:39.300 --> 54:42.720
nennt man manchmal auch ein vollkontinuierliches HMM, die sind

54:42.720 --> 54:43.620
gleichmächtig.

54:44.960 --> 54:50.380
Ich habe zwar hier eine strengere Version in der Form, dass ich halt

54:50.380 --> 54:54.800
stärker meine Parameter kopple, aber letztendlich kann ich mit einem

54:54.800 --> 54:59.100
semi -kontinuierlichen HMM auch alles das ausdrücken, was ich mit

54:59.100 --> 55:01.380
einem kontinuierlichen HMM ausdrücken kann.

55:02.280 --> 55:05.620
Wie kann ich, wenn ich schon ein kontinuierliches HMM habe, ganz

55:05.620 --> 55:08.280
leicht daraus ein semi-kontinuierliches HMM bauen?

55:08.360 --> 55:09.120
Wie würde ich das machen?

55:12.730 --> 55:16.490
Zwei Minuten, drei Leute immer miteinander zusammen, kurz diskutieren,

55:17.090 --> 55:21.350
eine Bauvorschrift, ein Rezept, eine Anleitung.

55:21.910 --> 55:25.710
Wie kann ich aus einem vollkontinuierlichen HMM ein gleichmächtiges

55:25.710 --> 55:27.550
semi -kontinuierliches HMM bauen?

55:29.670 --> 55:30.150
Genau.

55:30.610 --> 55:32.610
Ich nehme also alle Gauss-Glocken, die ich in meinem

55:32.610 --> 55:36.090
vollkontinuierlichen HMM habe und schmeiße sie zusammen in einen

55:36.090 --> 55:36.850
großen Pool.

55:37.650 --> 55:40.150
Und wie sehen dann die Gewichtsvektoren aus in dem semi

55:40.150 --> 55:40.970
-kontinuierlichen HMM?

55:45.390 --> 55:50.470
Naja, die haben ganz viele Nullen, nämlich die Gauss-Glocken, die

55:50.470 --> 55:53.550
bisher nicht dazugehört haben, die setze ich halt auf null und die

55:53.550 --> 55:55.750
anderen, die bisher dazugehört haben, die kriegen halt ihr

55:55.750 --> 55:56.610
ursprüngliches Gewicht.

55:57.430 --> 56:02.190
Und damit kommt rein rechnerisch 100% genau dasselbe raus.

56:02.510 --> 56:05.290
Habe ich ein semi-kontinuierliches HMM, das produziert genau die

56:05.290 --> 56:08.150
gleichen Werte wie ein vollkontinuierliches, habe ich dadurch

56:08.150 --> 56:09.250
Parameter eingespart?

56:09.770 --> 56:10.290
Nö.

56:11.210 --> 56:12.770
Aber war ja auch erst einmal nicht gefragt.

56:13.450 --> 56:16.510
Sondern interessant wird es erst dann, wenn ich jetzt anfange, diese

56:16.510 --> 56:19.570
Anzahl der Parameter sozusagen zu verringern, dann fange ich an,

56:19.830 --> 56:23.570
Parameter gegenüber dem vollkontinuierlichen einzusparen und dann kann

56:23.570 --> 56:27.270
ich hoffen, dass, wenn meine Daten wirklich der Gestalt sind, dass es

56:27.270 --> 56:30.250
Sinn macht, da so Gauss-Glocken zu teilen, weil die halt da so in

56:30.250 --> 56:33.330
bestimmten Unterräumen halt ähnlich klingen, dann kann ich was raus,

56:33.370 --> 56:36.790
unter Umständen was rausbekommen, das hat weniger Parameter, kann

56:36.790 --> 56:43.750
robuster geschätzt werden, aber führt zu einer gleichen oder manchmal

56:43.750 --> 56:45.730
sogar besseren Erkennungsleistung.

56:46.610 --> 56:49.030
Es führt dann zu einer besseren Erkennungsleistung, wenn ich wirklich

56:49.030 --> 56:53.130
echte Effekte habe, dass man sich da Parameter schön teilen kann,

56:53.190 --> 56:56.610
Gauss -Glocken teilen kann, dann habe ich nämlich plötzlich mehr Daten

56:56.610 --> 56:59.110
pro Parameter und bekomme dann halt entsprechend eine bessere

56:59.110 --> 56:59.810
Schätzung raus.

57:00.350 --> 57:03.710
Oder umgekehrt, wenn vorher die Schätzung schon gut war, kann ich

57:03.710 --> 57:12.270
jetzt mehr Parameter mir leisten, mir ein flexibleres HMM

57:12.270 --> 57:18.630
zusammenstecken, das bei gleicher Anzahl Trainingsdaten besser was

57:18.630 --> 57:19.950
bauen kann.

57:22.770 --> 57:26.370
Das andere Extrem ist das ursprüngliche HMM.

57:26.590 --> 57:30.770
So wie das HMM definiert wurde, findet keinerlei Parameterkopplung

57:30.770 --> 57:31.050
statt.

57:31.690 --> 57:36.950
Jeder Zustand des HMMs bekommt sein eigenes Modell, seinen eigenen

57:36.950 --> 57:39.530
Satz Gauss-Glocken, Übergangswahrscheinlichkeiten etc.

57:39.530 --> 57:46.170
und hat wie gesagt das Problem, dass man hinterher nur das erkennen

57:46.170 --> 57:47.750
kann, was man im Training gesehen hat.

57:48.770 --> 57:52.510
Und das, was man letztendlich haben möchte, liegt irgendwo zwischen

57:52.510 --> 57:54.530
diesen beiden Extremen.

57:56.610 --> 58:00.410
Weil manchmal klingen Laute mit gleichem Phonem und dann mit gleichem

58:00.410 --> 58:03.170
Zustand halt unterschiedlich, dann möchte ich die auseinanderhalten.

58:04.090 --> 58:07.270
Und manchmal klingen sie halt gleich, dann möchte ich sie

58:07.270 --> 58:11.910
zusammennehmen, damit ich dann mehr Trainingsdaten für die Parameter,

58:11.990 --> 58:13.170
die hier geteilt werden, habe.

58:13.930 --> 58:18.270
Und das ist die große Kunst jetzt herauszufinden, was ist denn das

58:18.270 --> 58:23.610
Gute zwischen, was ist eine gute Parameterkopplung, was ist ein guter

58:23.610 --> 58:28.670
Wert zwischen diesen beiden Extremen, ganz strikte Parameterkopplung

58:28.670 --> 58:31.850
im Semikontinuierlichen und gar keine Parameterkopplung im

58:31.850 --> 58:34.150
ursprünglichen reinen leeren HMM.

58:35.030 --> 58:37.570
Das hier ist jetzt so ein Beispiel, wie das aussehen kann.

58:39.030 --> 58:41.370
Ich habe Zustände.

58:42.030 --> 58:46.670
Einige Zustände teilen sich zum Beispiel das gleiche Mixturgewicht,

58:46.950 --> 58:49.890
die gleiche Mixtur, die beiden Zustände hier gleiche Mixtur, die

58:49.890 --> 58:52.010
beiden Zustände die gleiche Mixtur.

58:52.870 --> 58:57.870
Außerdem habe ich noch mehrere Pools an Gaussglocken und manche

58:57.870 --> 59:02.350
Mixturen teilen sich dieselben Gaussglocken und manche Mixturen teilen

59:02.350 --> 59:04.590
sich halt die andere Menge an Gaussglocken.

59:04.590 --> 59:11.150
Jetzt gucke ich mal gerade, das ganz Verrückte, zum Beispiel, ist da

59:11.150 --> 59:11.670
noch nicht bei.

59:11.730 --> 59:15.290
Ich könnte mir auch solche Sachen vorstellen, dass die beiden Zustände

59:15.290 --> 59:20.270
teilen sich die gleiche Mixturgewichte, aber unterschiedliche

59:20.270 --> 59:20.770
Gaussglocken.

59:20.850 --> 59:21.930
Also sowas kann ich auch machen.

59:22.030 --> 59:26.010
Ich bin da völlig frei, welche Parameter ich miteinander koppeln

59:26.010 --> 59:26.310
möchte.

59:28.510 --> 59:34.230
Das Beispiel ist also zwei Codebücher, dann fünf verschiedene Mixturen

59:34.230 --> 59:37.990
und das Ganze für insgesamt acht verschiedene Zustände.

59:38.870 --> 59:41.710
Das hier sind so ein paar Beispiele mal aus der Geschichte, als man

59:41.710 --> 59:44.590
noch mit wirklich GMMs bis zum Ende gearbeitet hat.

59:45.530 --> 59:49.050
Und da sieht man halt 1996 hat man für dieses Wall Street Journal

59:49.050 --> 59:52.450
Task, also Vorlesen von Wall Street Journal Artikeln, zum Beispiel

59:52.450 --> 59:56.750
sowas gemacht wie, es gab 1000 Codebücher und insgesamt 50.000

59:56.750 --> 59:57.650
Mixturen.

59:58.510 --> 01:00:03.270
Das heißt, so im Schnitt 50 Mixturen haben sich ein Codebook geteilt,

01:00:03.270 --> 01:00:04.970
aber natürlich nur im Schnitt.

01:00:05.130 --> 01:00:07.070
Das kann sehr unterschiedlich gewesen sein.

01:00:08.130 --> 01:00:12.710
2006, für Erkennung von Reden im Europäischen Parlament, gab es dann

01:00:12.710 --> 01:00:16.870
zum Beispiel Systeme, die hatten 4000 Codebücher und 16.000 Mixturen.

01:00:17.410 --> 01:00:21.330
Und gleichzeitig gab es ein System für die Erkennung von

01:00:21.330 --> 01:00:23.350
Telefonkonversationen.

01:00:23.390 --> 01:00:26.570
Das hatte zum Beispiel 5000 Codebücher und 300.000 Mixturen.

01:00:28.490 --> 01:00:32.330
Was kann ich, und das sind dann die Systeme, die nach, wir probieren

01:00:32.330 --> 01:00:35.490
alle möglichen, unterschiedlichen Dinge aus, am besten funktioniert

01:00:35.490 --> 01:00:35.850
haben.

01:00:36.630 --> 01:00:40.230
Was kann ich so jetzt im Allgemeinen grob über die Trainingsdaten

01:00:40.230 --> 01:00:44.390
dieser drei Tasks, Wall Street Journal, Europäische Parlamentsdebatten

01:00:44.390 --> 01:00:47.890
und Telefonkonversationen, was kann ich über die zur Verfügung

01:00:47.890 --> 01:00:49.850
stehenden Trainingsdaten so ungefähr sagen?

01:00:50.610 --> 01:00:51.890
Was wird da wohl der Fall sein?

01:00:54.510 --> 01:00:59.330
Naja, hier habe ich die geringste Anzahl an Parametern, das weiß ich

01:00:59.330 --> 01:01:02.690
deshalb, weil so ein Codebook, das hat halt sehr viele Parameter und

01:01:02.690 --> 01:01:07.190
ist 42-dimensional und es gibt nur so was wie 16 Gaussglocken drin in

01:01:07.190 --> 01:01:07.890
den Mixturen.

01:01:08.590 --> 01:01:11.470
Das heißt, also dafür hatte ich deutlich weniger Trainingsdaten als

01:01:11.470 --> 01:01:11.870
hierfür.

01:01:13.010 --> 01:01:15.490
Ungefähr Faktor 10 ist das ungefähr.

01:01:15.910 --> 01:01:20.370
Also, keine Ahnung, Wall Street Journal hat so was wie, naja, nicht

01:01:20.370 --> 01:01:23.150
ganz, mehr als Faktor 5, ich glaube, so was wie 10-50 Stunden.

01:01:23.550 --> 01:01:27.230
Das hier waren so was wie 100-150 Stunden Trainingsdaten.

01:01:27.330 --> 01:01:30.210
Und das hier, das hat offensichtlich die meisten Parameter.

01:01:30.670 --> 01:01:33.230
Von hier nach da ist nochmal ungefähr ein Faktor 10.

01:01:33.850 --> 01:01:37.010
Da hatte ich also bei ePPS 100-300 Stunden und bei diesen

01:01:37.010 --> 01:01:39.910
Telefonkonversationen hatte ich so was wie 1000 Stunden

01:01:39.910 --> 01:01:40.650
Trainingsdaten.

01:01:41.150 --> 01:01:43.590
Und man sieht halt, der Trend ist, je mehr Trainingsdaten ich habe,

01:01:43.590 --> 01:01:48.790
desto mehr Parameter habe ich und versuche trotzdem mit diesen Teilen

01:01:48.790 --> 01:01:52.810
von Pools von Gaussglocken auf die unterschiedlichen Mixturen da

01:01:52.810 --> 01:01:56.090
möglichst irgendwelche Synergieeffekte auszunutzen.

01:01:57.470 --> 01:02:04.170
Und das Finden so einer Parameterkopplung ist mit einer der

01:02:04.170 --> 01:02:10.050
wichtigsten Künste bei der akustischen Modellierung.

01:02:10.050 --> 01:02:15.590
Und auch wenn wir heutzutage mit neuronalen Netzen statt Gaussglocken

01:02:15.590 --> 01:02:21.870
arbeiten, brauchen wir die Gaussglocken, um diese Parameterkopplung zu

01:02:21.870 --> 01:02:22.190
finden.

01:02:23.030 --> 01:02:28.110
Und auch die neuronalen Netze arbeiten mit der Parameterkopplung, weil

01:02:28.110 --> 01:02:34.170
sie nämlich hinterher HMM-Zustände vorhersagen und zwar gekoppelte HMM

01:02:34.170 --> 01:02:34.710
-Zustände.

01:02:34.710 --> 01:02:39.350
Und deswegen muss ich erstmal Gaussglocken-Modell, Gaussmixturen

01:02:39.350 --> 01:02:39.830
-Modell trainieren.

01:02:40.750 --> 01:02:43.910
Mit diesem Gaussmixtur-Modell muss ich dann eine vernünftige

01:02:43.910 --> 01:02:47.770
Parameterkopplung herausfinden und erst wenn ich das habe, kann ich

01:02:47.770 --> 01:02:51.490
dazu übergehen, dann meine neuronalen Netzmodelle zu trainieren, wie

01:02:51.490 --> 01:02:53.870
Sie das dann zum Beispiel in der neuronalen Netzevorlesung sehen.

01:02:55.530 --> 01:02:58.530
Okay, also die Frage ist, wie finde ich die richtige Anzahl an

01:02:58.530 --> 01:03:01.050
Modellen und Parametern und wie kopple ich das aus?

01:03:02.390 --> 01:03:06.290
Wie gesagt, egal ob GMM oder nicht, so sieht die Parameterkopplung

01:03:06.290 --> 01:03:06.610
aus.

01:03:07.070 --> 01:03:10.090
Ich habe eine bestimmte Anzahl an Modellen und bestimmte Zustände

01:03:10.090 --> 01:03:12.110
teilen sich halt diese Modelle.

01:03:13.390 --> 01:03:17.290
Je weniger Modelle ich habe, desto robuster wird die Schätzung, weil

01:03:17.290 --> 01:03:20.170
ich mehr Trainingsdaten pro Modell und damit pro Parameter habe.

01:03:20.730 --> 01:03:23.890
Aber wenn ich genügend Trainingsdaten habe, will ich natürlich auch

01:03:23.890 --> 01:03:28.250
leicht unterschiedliche Phänomene mit unterschiedlichen Modellen

01:03:28.250 --> 01:03:28.770
trainieren.

01:03:29.450 --> 01:03:32.210
Und alles, was man jetzt nur noch machen muss, ist halt

01:03:32.210 --> 01:03:35.810
herauszufinden, okay, welche Sachen will ich denn miteinander koppeln

01:03:35.810 --> 01:03:38.330
und welche will ich nicht koppeln.

01:03:39.190 --> 01:03:42.570
Und da gibt es wie immer in der Informatik und im maschinellen Lernen

01:03:42.570 --> 01:03:45.830
gibt es immer zwei gegensätzliche Ansätze.

01:03:46.670 --> 01:03:49.930
Die erste Möglichkeit, es zu machen, ist wissensbasiert.

01:03:50.290 --> 01:03:54.490
Ich habe halt irgendeinen Phonetiker, der sagt mir halt, ein A in dem

01:03:54.490 --> 01:03:59.290
phonetischen Kontext klingt halt genauso wie ein E in einem anderen

01:03:59.290 --> 01:04:02.190
phonetischen Kontext, also müssen die Parameter gekoppelt werden.

01:04:02.910 --> 01:04:05.490
Da denkt man immer als Informatiker, das kann es ja nicht sein, weil

01:04:05.490 --> 01:04:07.430
sobald eine neue Sprache kommt, funktioniert das nicht.

01:04:07.510 --> 01:04:09.390
Und außerdem, woher will der Phonetiker das wissen?

01:04:10.310 --> 01:04:13.010
Sondern wir würden das gerne lieber datengetrieben machen.

01:04:13.110 --> 01:04:15.930
Das heißt, wir würden gerne diese Parameterkopplung direkt aus den

01:04:15.930 --> 01:04:17.070
Daten ableiten können.

01:04:18.530 --> 01:04:21.050
Frage ist, was kann also an Parametern gekoppelt werden?

01:04:21.370 --> 01:04:23.930
Wenn wir mit GMMs arbeiten, zum Beispiel die Menge der Gaussglocken.

01:04:26.090 --> 01:04:29.670
Wenn wir diskrete HMMs haben, kann man auch die Ausgabe

01:04:29.670 --> 01:04:32.210
-Wahrscheinlichkeitsverteilung halt koppeln.

01:04:32.930 --> 01:04:35.990
Innerhalb einer Mixtur könnte man zum Beispiel die Gaussglocken auch

01:04:35.990 --> 01:04:38.850
noch sich teilen lassen.

01:04:39.030 --> 01:04:42.910
Also ich könnte zum Beispiel unterschiedliche Gaussglocken haben, die

01:04:42.910 --> 01:04:44.790
die gleiche Kovarianzmatrix haben.

01:04:45.730 --> 01:04:48.990
Das ist natürlich nicht sinnvoll für die Mittelwerte.

01:04:49.890 --> 01:04:53.810
Weil wenn das noch geteilt wird, dann ist es ja ein und dieselbe

01:04:53.810 --> 01:04:54.430
Gaussglocke.

01:04:54.550 --> 01:04:58.030
Also da hat man dann keine Parameterkopplung mehr, sondern dann wird

01:04:58.030 --> 01:04:59.810
eine Gaussglocke sozusagen weggeworfen.

01:05:01.970 --> 01:05:04.350
Ich kann das bei den Übergangswahrscheinlichkeiten machen.

01:05:05.110 --> 01:05:07.990
Und ich kann das halt auch bei den gesamten Zustandsmodellen machen.

01:05:08.170 --> 01:05:10.790
Also für verschiedene Zustände teilen sich halt die gleichen Parameter

01:05:10.790 --> 01:05:11.190
oder nicht.

01:05:12.550 --> 01:05:16.830
Und wichtig, diese Parameterkopplung, egal wie strikt oder nicht

01:05:16.830 --> 01:05:20.970
strikt, die ich jetzt mache, diese Kopplung, dieselbe Kopplung, wird

01:05:20.970 --> 01:05:24.230
immer über alle verschiedenen HMMs hinweg beibehalten.

01:05:24.610 --> 01:05:29.010
Damit ich dann auf verschiedenen Äußerungen, indem ich über alle

01:05:29.010 --> 01:05:32.610
Äußerungen durchgehe, auch wirklich möglichst viel Trainingsdaten

01:05:32.610 --> 01:05:34.530
habe, um die Parameter koppeln zu können.

01:05:35.150 --> 01:05:38.910
Die Kopplung über die HMMs hinweg findet immer, immer statt.

01:05:41.190 --> 01:05:44.390
Jetzt kann man versuchen, das Ganze mal ein bisschen zu formalisieren.

01:05:44.390 --> 01:05:47.750
Wenn man jetzt zum Beispiel sich die Parameterkopplung anschaut in so

01:05:47.750 --> 01:05:50.450
einer Gaussmixtur, dann rechne ich ja immer aus, die

01:05:50.450 --> 01:05:56.330
Wahrscheinlichkeit, dass ein Merkmalsvektor O emittiert wurde,

01:05:56.930 --> 01:05:59.450
gegeben, dass ich mich in einem Zustand SJ befinde.

01:05:59.990 --> 01:06:03.450
Und das ist halt die gewichtete Summe der Normalverteilung.

01:06:03.570 --> 01:06:06.190
Jetzt kann ich versuchen, die Parameter durchzunummerieren.

01:06:06.350 --> 01:06:08.490
Ich kann die Gewichte durchnummerieren.

01:06:08.910 --> 01:06:12.190
Ich kann die Mittelwerte durchnummerieren und die Kovarianzmatrizen

01:06:12.190 --> 01:06:12.970
durchnummerieren.

01:06:12.970 --> 01:06:17.730
Und dann kann ich da so eine Funktion g und eine Funktion f mir

01:06:17.730 --> 01:06:18.210
hernehmen.

01:06:18.310 --> 01:06:20.590
Das ist sozusagen die Parameterauswahlfunktion.

01:06:21.210 --> 01:06:26.010
Das heißt also, für den Zustand SJ kann ich mir also auswählen lassen,

01:06:26.110 --> 01:06:29.090
welche Gewichte nehme ich denn durch diese Funktion gj.

01:06:29.910 --> 01:06:35.110
Und ich kann mir durch diese Funktion f dann auswählen lassen, welchen

01:06:35.110 --> 01:06:38.730
Satz an Mittelwerten und welchen Satz an Kovarianzmatrizen nehme ich

01:06:38.730 --> 01:06:39.070
denn dann.

01:06:39.850 --> 01:06:44.610
Wenn das Ganze nicht gekoppelt ist, dann sind halt die f von i immer

01:06:44.610 --> 01:06:49.850
ungleich den f von j für unterschiedliche Zustände.

01:06:50.070 --> 01:06:54.910
Genauso wie die g von i immer ungleich sind den g von j für

01:06:54.910 --> 01:06:56.870
unterschiedliche Zustände.

01:06:58.090 --> 01:07:03.070
Wenn ich das Ganze vollkontinuierlich mache, dann heißt das, dass das

01:07:03.070 --> 01:07:09.010
f von i gleich dem f von j ist, genau dann, wenn si und sj zueinander

01:07:09.010 --> 01:07:09.810
Konkurrent sind.

01:07:09.910 --> 01:07:13.290
Also wenn sie immer die gleiche Wahrscheinlichkeit p von k ausgeben

01:07:13.290 --> 01:07:13.590
sollen.

01:07:14.410 --> 01:07:17.250
Und wenn ich das Ganze zum Beispiel semikontinuierlich habe, dann

01:07:17.250 --> 01:07:20.330
heißt das, dass ich nur einen großen Pool an Gaussglocken habe.

01:07:20.430 --> 01:07:23.890
Der habe den Index 0 und dann ist das f von i immer 0 für alle

01:07:23.890 --> 01:07:26.270
Zustände si.

01:07:26.270 --> 01:07:30.450
Wenn ich dieses phonetische Koppeln mache, das wir als striktes

01:07:30.450 --> 01:07:34.010
Koppeln genannt haben, dann ist halt f von i immer gleich f von j,

01:07:34.170 --> 01:07:38.070
wenn si und sj immer für das gleiche Phonem stehen.

01:07:38.590 --> 01:07:41.590
Wenn ich subphonetisch kopple, dann müssen die Zustände immer für das

01:07:41.590 --> 01:07:42.690
gleiche Subphonem stehen.

01:07:43.370 --> 01:07:47.770
Und wir müssen jetzt mathematisch gesehen solche guten Funktionen g

01:07:47.770 --> 01:07:52.830
und f finden, die mir aus einer Menge an zur Verfügung stehenden

01:07:52.830 --> 01:07:58.470
Gaussglocken, Pools, sogenannten Codebüchern und Gewichten halt die

01:07:58.470 --> 01:07:59.510
korrekte raussuchen.

01:08:00.330 --> 01:08:02.730
Wer von Ihnen macht das Praktikum?

01:08:04.530 --> 01:08:05.430
Spracherkennung?

01:08:06.130 --> 01:08:06.430
Keiner.

01:08:07.730 --> 01:08:08.370
Schade.

01:08:09.770 --> 01:08:16.050
Wichtig ist halt, dass Sie diese Terminologie Codebook behalten.

01:08:16.190 --> 01:08:20.170
Ein Codebook nennt man halt diese Menge von Gaussglocken, die man dann

01:08:20.170 --> 01:08:21.310
unterschiedlich zusammen mischt.

01:08:21.310 --> 01:08:24.290
Und das ist halt dann für diejenigen, die im Praktikum sind,

01:08:24.410 --> 01:08:26.870
erhellend, weil dann gibt es dann irgendwann später mal sowas, das

01:08:26.870 --> 01:08:27.890
nennt sich ein Codebook.

01:08:28.470 --> 01:08:30.370
Und dann fragt man sich immer, was soll das heißen?

01:08:30.450 --> 01:08:35.350
Das steht eben nicht genau für eine Menge an Gaussglocken.

01:08:35.430 --> 01:08:37.710
Deswegen heißt die Klasse, die man da verwendet halt Codebook.

01:08:38.470 --> 01:08:40.710
Es wird einem häufig nicht klar, wenn man es einfach nur anwendet.

01:08:42.670 --> 01:08:45.790
Und was man in der Regel macht ist, dass man dann in der

01:08:45.790 --> 01:08:49.830
Spracherkennung eine sogenannte kontextabhängige akustische

01:08:49.830 --> 01:08:50.770
Modellierung betreibt.

01:08:50.770 --> 01:08:55.550
Und das ist eben eine bestimmte Art und Weise der Parameterkopplung.

01:08:56.770 --> 01:08:59.950
Angenommen, wir haben jetzt hier eine ganz kleine Wortliste, ein ganz

01:08:59.950 --> 01:09:00.770
kleines Vokabular.

01:09:01.670 --> 01:09:04.070
Da sind die Wörter und, gibt, muss und das drin.

01:09:04.650 --> 01:09:07.670
Wir wissen, wie die in die Phoneme zerlegt werden.

01:09:08.830 --> 01:09:12.510
Häufig ist es aber so, dass die nicht so ausgesprochen werden, sondern

01:09:12.510 --> 01:09:16.370
relativ häufig durch Koartikulationseffekte, wenn wir einfach so

01:09:16.370 --> 01:09:20.030
kontinuierlich sprechen, klingt das und, das eigentlich ein die haben

01:09:20.030 --> 01:09:21.350
sollte, eher so wie ein und.

01:09:21.830 --> 01:09:23.470
Aus dem gib wird ein gib.

01:09:24.390 --> 01:09:27.370
Der bus klingt wie ein bus und das das klingt wie ein das.

01:09:30.860 --> 01:09:37.760
Und was man jetzt halt hergeht ist, man sagt, diese Phoneme die und be

01:09:37.760 --> 01:09:43.880
von bus und das und bis, die hören sich unterschiedlich an in

01:09:43.880 --> 01:09:46.980
Abhängigkeit davon, in welchem phonetischen Kontext sie stehen.

01:09:48.320 --> 01:09:52.660
Erste Idee wäre halt, dass man das t am Ende von und und das p am Ende

01:09:52.660 --> 01:09:56.400
von gib verwendet.

01:09:59.000 --> 01:10:04.260
Aber das t in und klingt halt anders als das t in Thomas.

01:10:06.080 --> 01:10:11.280
Das heißt, dann funktioniert das Ganze wieder nicht, wenn ich also

01:10:11.280 --> 01:10:16.140
dieses dafür verwenden würde.

01:10:16.140 --> 01:10:22.100
Also wenn ich also sage beim und, das d am Ende, das klingt eher wie

01:10:22.100 --> 01:10:25.800
ein t, dann nehme ich halt ein t dafür und das b am Ende von gib

01:10:25.800 --> 01:10:27.740
klingt eher wie ein t, dann nehme ich ein t dafür.

01:10:28.060 --> 01:10:31.820
Aber diese t's klingen dann wieder anders als diese t's in anderen

01:10:31.820 --> 01:10:34.020
Wörtern, die zum Beispiel am Anfang des Wortes stehen.

01:10:35.540 --> 01:10:39.680
Ich kann ins ganz große Extrem gehen und sagen, okay, hier habt es ein

01:10:39.680 --> 01:10:45.600
Phonem t, das soll eben gerade das letzte Phonem sein des Wortes und.

01:10:45.980 --> 01:10:50.340
Und es gibt ein Phonem p, das soll eben gerade das letzte Phonem des

01:10:50.340 --> 01:10:51.180
Wortes gib sein.

01:10:51.380 --> 01:10:54.200
Und dann gibt es ein Phonem t, das soll halt das erste Phonem des

01:10:54.200 --> 01:10:55.160
Wortes Thomas sein.

01:10:55.220 --> 01:10:58.700
Und es gibt halt Papa, das hat einmal ein p, das ist das erste p im

01:10:58.700 --> 01:10:59.160
Wort Papa.

01:10:59.300 --> 01:11:01.700
Und dann gibt es das p, das ist das zweite Wort im Wort Papa.

01:11:02.060 --> 01:11:04.460
Und hier gibt es ein a, das ist das erste a im Wort Papa.

01:11:04.520 --> 01:11:10.040
Und da gibt es das a, das ist das zweite a im Wort Papa.

01:11:10.040 --> 01:11:14.060
Und das sind dann sogenannte kontextabhängige Einheiten.

01:11:14.820 --> 01:11:18.500
Und wenn ich das mache, dann bin ich ja wieder zurück bei meinem

01:11:18.500 --> 01:11:23.620
ursprünglichen HMM, so wie ich die reine leere HMM ohne irgendwelche

01:11:23.620 --> 01:11:24.760
Parameterkopplung habe.

01:11:25.440 --> 01:11:30.460
Das heißt, wenn ich das so strikt mache, bin ich wieder zu strikt.

01:11:31.040 --> 01:11:35.060
Das heißt, ich muss diese diese Kopplung irgendwie ein bisschen

01:11:35.060 --> 01:11:37.200
flexibler gestalten.

01:11:39.520 --> 01:11:42.780
Hier noch ein Bild dafür, das mir auch ein bisschen einen Eindruck

01:11:42.780 --> 01:11:46.980
gibt, was ich mir so für andere Schwierigkeiten einhandle, wenn ich

01:11:46.980 --> 01:11:49.640
kontextabhängig akustisch modelliere.

01:11:51.000 --> 01:11:54.220
Angenommen, wir hätten jetzt diese Wortsequenz hello world.

01:11:55.700 --> 01:11:58.480
Bisher haben wir das gesehen, dass wir halt ja die Phoneme der Reihe

01:11:58.480 --> 01:11:59.280
nach hinschreiben.

01:12:01.040 --> 01:12:04.800
Und wir gehen von links nach rechts durch die Phonemesequenz durch.

01:12:05.500 --> 01:12:08.780
Jetzt macht man es aber häufig so, das Wort hello, je nachdem, wer es

01:12:08.780 --> 01:12:12.340
spricht, kann es mal mit einem einen, was weiß ich, ob ein Brite oder

01:12:12.340 --> 01:12:15.400
ein Amerikaner das spricht, kann es mal hello oder hello sein oder ob

01:12:15.400 --> 01:12:17.020
es ein Deutscher mit einem deutschen Akzent spricht.

01:12:18.620 --> 01:12:22.680
Vor dem Wort, da kann zum Beispiel ein bisschen Stille sein, da kann

01:12:22.680 --> 01:12:25.960
auch nichts sein oder da kann irgendwie was anderes Geräusch

01:12:25.960 --> 01:12:26.840
behaftetes sein.

01:12:27.540 --> 01:12:30.740
Und wenn ich dann zwischen den beiden Wörtern mich befinde, zwischen

01:12:30.740 --> 01:12:33.660
hello und world, da kann auch irgendwie Stille sein oder es kann

01:12:33.660 --> 01:12:37.400
irgendwie Geräusch sein, wenn einer draufklopft auf das Mikrofon und

01:12:37.400 --> 01:12:40.120
dann bin ich irgendwann am Ende und manchmal wird das stimmhafte D

01:12:40.120 --> 01:12:44.120
gesprochen, manchmal das T und danach kann zum Beispiel noch irgendwas

01:12:44.120 --> 01:12:47.280
kommen, das ist entweder Stille oder das ist irgendwie ein anderes

01:12:47.280 --> 01:12:49.100
Geräusch, bevor die Äußerung zu Ende ist.

01:12:49.500 --> 01:12:51.820
Und das kann man mit HMMs schön darstellen.

01:12:52.660 --> 01:12:54.400
Der Unterschied ist jetzt halt, dass ich nicht mal einen

01:12:54.400 --> 01:12:57.400
Anfangszustand habe, sondern ich habe mehrere unterschiedliche

01:12:57.400 --> 01:13:00.380
Zustände, in denen ich am Anfang anfangen kann.

01:13:00.500 --> 01:13:03.200
Ich kann also mit dem H anfangen von hello, wenn überhaupt keine

01:13:03.200 --> 01:13:06.560
Stille vor dem Wort ist oder ich kann mit einem Zustand anfangen, der

01:13:06.560 --> 01:13:08.940
Stille repräsentiert oder ich kann irgendwie mit einem Zustand

01:13:08.940 --> 01:13:12.780
anfangen, der irgendwie Geräusche repräsentiert.

01:13:12.920 --> 01:13:17.100
Zwischen den beiden Wörtern, wenn ich da rauskomme, kann ich entweder

01:13:17.100 --> 01:13:19.800
mal über Stille gehen oder die können direkt hintereinander kommen

01:13:19.800 --> 01:13:22.800
oder es kann irgendwie ein anderes Geräusch dazwischen stehen.

01:13:23.520 --> 01:13:25.740
Und je nachdem, wenn ich da andere Möglichkeiten habe,

01:13:25.840 --> 01:13:28.440
unterschiedliche Möglichkeiten habe, das auszusprechen, kann ich also

01:13:28.440 --> 01:13:30.940
entweder durch die eine Aussprache oder durch die andere Aussprache

01:13:30.940 --> 01:13:31.420
durchgehen.

01:13:31.960 --> 01:13:35.640
So kann ich halt ein bisschen komplizierteres HMM aufbauen, aber kann

01:13:35.640 --> 01:13:38.580
nach wie vor genau die gleichen Trainings und sonstigen Algorithmen

01:13:38.580 --> 01:13:39.440
anwenden.

01:13:40.480 --> 01:13:47.060
Und wenn ich jetzt hingehe und diese Phoneme kontextabhängig mache,

01:13:47.140 --> 01:13:50.120
wenn ich also sage, ich habe hier nicht mehr einen H, das klingt wie

01:13:50.120 --> 01:13:54.120
jedes andere H auch, sondern ich habe hier einen H, das klingt anders,

01:13:54.200 --> 01:13:59.440
je nachdem, ob danach ein A-E kommt oder ob danach ein E kommt, dann

01:13:59.440 --> 01:14:03.200
wird das Ganze hier ein bisschen komplizierter.

01:14:04.340 --> 01:14:08.780
Weil hier kann halt ein anderes H kommen, je nachdem, ob ich jetzt mit

01:14:08.780 --> 01:14:12.680
A -E weitermache oder ob ich mit E weitermache, mal ein H1, mal ein

01:14:12.680 --> 01:14:13.160
H2.

01:14:13.620 --> 01:14:17.420
Und das muss ich da rein splicen und kann trotzdem immer noch von

01:14:17.420 --> 01:14:18.380
vorher von Stille kommen.

01:14:18.460 --> 01:14:20.960
Ich kann direkt damit anfangen, ich kann direkt damit anfangen, ich

01:14:20.960 --> 01:14:21.880
kann über Geräusch gehen.

01:14:22.800 --> 01:14:27.160
Das heißt, hier dieser Anfang, da wo ich sozusagen drei Pfeile hatte,

01:14:27.480 --> 01:14:31.520
die jetzt in das H als erstes reingehen, so diese drei Pfade, habe ich

01:14:31.520 --> 01:14:39.140
jetzt plötzlich 1, 2, 3, 4, 5, also 1, 2, 3, 4, 5, 6 Pfeile.

01:14:39.480 --> 01:14:43.340
Das heißt, da werden halt die Anzahl der unterschiedlichen Pfade halt

01:14:43.340 --> 01:14:47.140
mehr und dann wird es halt aufwendiger, wieder Dinge zu berechnen.

01:14:49.040 --> 01:14:51.940
Aber das ist so die Idee der kontextabhängigen akustischen

01:14:51.940 --> 01:14:57.520
Modellierung, dass man eben genau sowas macht.

01:14:58.300 --> 01:15:02.680
Und dann kann man anfangen, sich zu überlegen, was sind denn diese

01:15:02.680 --> 01:15:07.360
kontextabhängigen Einheiten, die ich da habe für Spracheinheiten.

01:15:07.900 --> 01:15:09.680
Wir hatten ja schon gesagt, wir haben Wörter.

01:15:09.800 --> 01:15:12.260
Wörter werden zerlegt in Phoneme.

01:15:12.820 --> 01:15:15.020
Das ist ja schon eine Zerlegung.

01:15:15.340 --> 01:15:18.960
Ich könnte ja theoretisch auch ein ganzes Wort als einen HMM-Zustand

01:15:18.960 --> 01:15:20.600
modellieren.

01:15:20.860 --> 01:15:23.340
Jetzt sage ich, okay, ich weiß, sie besteht aus Phonemen, also zerlege

01:15:23.340 --> 01:15:24.540
ich das in Phonemen-Zustände.

01:15:25.540 --> 01:15:28.000
Ich weiß aus der Linguistik auch, es gibt so andere Dinge.

01:15:28.140 --> 01:15:29.340
Es gibt zum Beispiel Silben.

01:15:29.480 --> 01:15:32.140
Ich kann Wörter auch erstmal in Silben zerlegen und könnte dann die

01:15:32.140 --> 01:15:33.720
Silben als Modellierungseinheiten haben.

01:15:34.240 --> 01:15:39.720
Die Silben zerlege ich wieder in Phone oder Phoneme, kann die als

01:15:39.720 --> 01:15:44.020
Modellierungseinheiten haben und dann kann ich mir anschauen, in

01:15:44.020 --> 01:15:46.540
welchem Kontext stehen denn diese Phone.

01:15:47.360 --> 01:15:51.720
Und das führt einen dann zu dem Begriff des sogenannten Polyphons.

01:15:52.380 --> 01:15:56.200
Man definiert dann eine Art erweiterten Phonembegriff und man

01:15:56.200 --> 01:16:01.640
definiert dort das Polyphon als ein Phonem oder Phon in einem Kontext

01:16:01.640 --> 01:16:03.260
bestimmter Länge.

01:16:04.160 --> 01:16:08.320
Das heißt, ich schaue mir das Phonem an und ich schaue mir an, was

01:16:08.320 --> 01:16:11.040
steht denn links vom Phonem und was steht denn rechts vom Phonem.

01:16:11.460 --> 01:16:14.240
Ich schaue aber nicht unendlich weit nach links oder unendlich weit

01:16:14.240 --> 01:16:17.440
nach rechts, sondern ich lege fest, ich schaue nur eine bestimmte

01:16:17.440 --> 01:16:20.500
Anzahl an Phonemen nach links und eine bestimmte Anzahl nach Phonemen

01:16:20.500 --> 01:16:21.000
nach rechts.

01:16:21.760 --> 01:16:24.860
Wenn ich nur ein Phonem nach links und ein Phonem nach rechts schaue,

01:16:25.060 --> 01:16:26.920
dann nenne ich das Ganze ein Triphon.

01:16:27.180 --> 01:16:29.840
Schaue ich halt zwei nach links, zwei nach rechts nen Quintphon.

01:16:30.580 --> 01:16:33.840
Schaue ich nur eins nach links, aber nicht nach rechts, dann nenne ich

01:16:33.840 --> 01:16:37.100
es ein Biphon oder alternativ ich schaue nur eins nach rechts, aber

01:16:37.100 --> 01:16:39.420
ich schaue nicht nach links, dann ist es auch ein Biphon.

01:16:41.660 --> 01:16:44.100
Das eine nennt man manchmal, damit man es unterscheiden kann,

01:16:44.240 --> 01:16:46.180
Linksbiphon, das andere dann Rechtsbiphon.

01:16:47.420 --> 01:16:50.500
Aber ganz wichtig ist, dass wenn man sich überlegt, was ist ein

01:16:50.500 --> 01:16:53.960
Polyphon, dann steht ein Polyphon immer für ein Phonem.

01:16:54.680 --> 01:16:59.420
Es steht nicht für die gesamte Sequenz oder Kette an Phonemen, sondern

01:16:59.420 --> 01:17:04.200
es steht immer nur für das eine Phonem, aber für Phoneme in

01:17:04.200 --> 01:17:08.660
unterschiedlichen Kontexten setze ich andere Symbole, andere Polyphone

01:17:08.660 --> 01:17:08.940
ein.

01:17:09.080 --> 01:17:10.320
Das ist ganz wichtig zu verstehen.

01:17:10.400 --> 01:17:13.580
Das hört man häufig in der Prüfung falsch, dass ein Polyphon eine

01:17:13.580 --> 01:17:15.820
Sequenz, eine Folge von Phonemen modelliert.

01:17:15.980 --> 01:17:19.760
Nein, es modelliert nur ein einziges Phonem, aber ich setze halt

01:17:19.760 --> 01:17:23.200
unterschiedliche Polyphone ein, je nachdem in welchem phonetischen

01:17:23.200 --> 01:17:24.040
Kontext sie stehen.

01:17:24.560 --> 01:17:27.680
Und dann kommt man eben dahin, dass man halt hier hinkommt zu diesem

01:17:27.680 --> 01:17:30.900
Biphon, manchmal Linksbiphone, Rechtsbiphone und dann Triphone.

01:17:31.240 --> 01:17:33.960
Und das ist so eine typische Notation, dass man sagt, man hat hier ein

01:17:33.960 --> 01:17:37.760
H, da steht links Stille und rechts das E.

01:17:38.740 --> 01:17:42.360
Oder ich habe hier ein EH, da steht links ein H und steht links dann

01:17:42.360 --> 01:17:43.840
rechts davon ein L.

01:17:44.100 --> 01:17:44.960
Das wäre dieses E.

01:17:45.040 --> 01:17:46.380
Links ein H, rechts davon ein L.

01:17:47.080 --> 01:17:49.460
Oder ich mache es bei Quintphonen, wenn ich mir halt schon was

01:17:49.460 --> 01:17:58.160
anschaue, wie das EH hier, das da, dann steht eins links davon das H,

01:17:58.700 --> 01:18:03.100
zwei links davon, muss ich mir irgendwas annehmen, ich gehe davon aus,

01:18:03.140 --> 01:18:07.140
da ist einfach Stille und rechts von dem EH kommt als erstes das L und

01:18:07.140 --> 01:18:07.960
kann das OW.

01:18:08.540 --> 01:18:11.480
Macht man halt so einen senkrechten Strich, macht man die Trennung auf

01:18:11.480 --> 01:18:15.040
nach links und rechts und dann schneide ich einfach aus, was kam

01:18:15.040 --> 01:18:16.620
links, was kam rechts.

01:18:17.000 --> 01:18:25.420
Das ist so die Notation, um so ein Polyphon entsprechend hinschreiben

01:18:25.420 --> 01:18:25.860
zu können.

01:18:26.420 --> 01:18:29.720
Wenn ich unendlich lang nach links und unendlich lang nach rechts

01:18:29.720 --> 01:18:32.980
gucke, nennt man es allgemein auch ein Polyphon.

01:18:33.400 --> 01:18:36.060
Das Ganze kann ich nicht nur auf Phonemenebene machen, sondern auch

01:18:36.060 --> 01:18:37.140
auf Subphonemenebene.

01:18:37.560 --> 01:18:41.260
Dann nennt man das Ganze halt ein Sub-Polyphon, ein Subtriphon, so ein

01:18:41.260 --> 01:18:44.500
Quintphon, so ein Biphon, so ein Sepphon, etc.

01:18:45.880 --> 01:18:50.740
Und dann hatten wir gesagt, bei der Parameterkopplung kann man dann

01:18:50.740 --> 01:18:53.920
beliebige Sachen zusammenwerfen und ich könnte zum Beispiel auch

01:18:53.920 --> 01:18:57.040
anfangen, beliebige Polyphone zusammen zu klastern.

01:18:57.720 --> 01:19:02.400
Das heißt, ich habe nicht mehr so eine Trennung, die sagt, wenn genau

01:19:02.400 --> 01:19:05.480
links diese Phonemensequenz kommt und wenn genau rechts diese

01:19:05.480 --> 01:19:09.720
Phonemensequenz kommt, dann ist es dieses Polyphon, sondern ich sage,

01:19:10.120 --> 01:19:14.960
wenn links entweder ein E kommt und davor noch ein L oder wenn

01:19:14.960 --> 01:19:18.940
vielleicht links ein A war und davor irgendein Konsonant oder wenn

01:19:18.940 --> 01:19:23.720
links ein F war und davor irgendein Vokal, dann soll das alles durch

01:19:23.720 --> 01:19:29.460
dasselbe Modell, durch dieselbe Einheit modelliert werden, die

01:19:29.460 --> 01:19:32.320
abhängig ist von dem Kontext, in dem das Phonem steht, aber ich kann

01:19:32.320 --> 01:19:34.820
das nicht mehr nur so hinschreiben, was ist genau der links und was

01:19:34.820 --> 01:19:37.520
ist genau der rechte Kontext, sondern das ist dann irgendwas

01:19:37.980 --> 01:19:38.300
generisches.

01:19:38.740 --> 01:19:42.480
Das nennt man dann ein generalisiertes Polyphon und da man dann halt

01:19:42.480 --> 01:19:45.300
nicht mehr so schön hinschreiben kann, wie muss denn der Kontext jetzt

01:19:45.300 --> 01:19:48.480
genau aussehen, das kann relativ komplex sein, die Regeln, die mir

01:19:48.480 --> 01:19:51.360
beschreiben, wie muss der Kontext aussehen, damit es dieses Polyphon

01:19:51.360 --> 01:19:55.040
wird, dann gebe ich dem halt eine Nummer, kriege da halt einfach eine

01:19:55.040 --> 01:19:55.340
Zahl.

01:19:59.310 --> 01:20:04.650
Und dann kann ich mir auch noch überlegen, was mache ich an

01:20:04.650 --> 01:20:05.270
Wortgrenzen.

01:20:05.330 --> 01:20:09.290
Und wenn man jetzt vorhin dieses HMM gesehen hat, dann kann man sich

01:20:09.290 --> 01:20:16.630
vorstellen, wenn man jetzt solche Wortübergänge hat, da wird es immer

01:20:16.630 --> 01:20:17.610
stark verzweigt.

01:20:18.030 --> 01:20:20.770
Da kann immer irgendwelche optionalen Wörter dazwischen den Wörtern

01:20:20.770 --> 01:20:24.550
kommen, unter Umständen sind da Aussprachevarianten, wie es anfängt.

01:20:24.950 --> 01:20:32.870
Und wenn ich da jetzt auch noch anfange, zu gucken, kontextabhängige

01:20:32.870 --> 01:20:36.290
Einheiten in Abhängigkeit von davon, wie es weitergeht, da gibt es

01:20:36.290 --> 01:20:38.370
eine relative kombinatorische Explosion.

01:20:38.990 --> 01:20:42.110
Aber wir hatten ja vorhin schon jetzt bei diesem Wort Hello die Sache,

01:20:42.230 --> 01:20:45.190
wenn ich mir da irgendwie das Trifon anschaue, von dem H ganz am

01:20:45.190 --> 01:20:48.530
Anfang, dann weiß ich, rechts kommt ein EH, aber links ist nix.

01:20:49.470 --> 01:20:51.990
Haben wir jetzt erstmal der Einfachheit halber angenommen, da sei

01:20:51.990 --> 01:20:52.370
Stille.

01:20:53.470 --> 01:20:57.130
Aber häufig kommt mir das Wort Hello irgendwo in einem Satz vor und

01:20:57.130 --> 01:21:02.550
dann wäre es halt sinnvoller zu gucken, was kommt denn vor dem H für

01:21:02.550 --> 01:21:07.270
ein Phonem und dann gucke ich also auch mit diesem Trifon-Kontext über

01:21:07.270 --> 01:21:09.570
Wortgrenzen idealerweise hinweg an.

01:21:11.910 --> 01:21:14.930
Das wäre so, wie man sagen würde, ja, das ist ja logisch, dass man so

01:21:14.930 --> 01:21:19.310
macht, nur das kann halt unangenehm werden.

01:21:20.150 --> 01:21:23.810
Nehmen wir die einfache Wortsequenz for a walk.

01:21:24.330 --> 01:21:27.650
Und angenommen für das Wort for hätte ich zwei Aussprachevarianten,

01:21:27.790 --> 01:21:31.690
für das Wort a hätte ich zwei Aussprachevarianten und für das Wort

01:21:31.690 --> 01:21:33.930
walk hätte ich zwei Aussprachevarianten.

01:21:34.370 --> 01:21:38.470
Wenn ich das erst mal nur mit Monophonen modelliere, dann sieht das so

01:21:38.470 --> 01:21:43.570
aus, dass ich da halt mit dem F anfange, dann kommt entweder for oder

01:21:43.570 --> 01:21:47.890
er, dann kann da eine Stille zwischen sein, das andere mit diesem

01:21:47.890 --> 01:21:51.270
Geräusch lassen wir mal weg, dann habe ich die Möglichkeit zwischen

01:21:51.270 --> 01:21:54.550
einem er und einem ey, dann kann wieder optional eine Stille kommen

01:21:54.550 --> 01:22:00.750
und dann kann halt das Wort walk entweder mal noch mit so einer

01:22:00.750 --> 01:22:04.490
Aspiration davor gestellt anfangen oder das normale Wort walk.

01:22:04.870 --> 01:22:06.810
So sieht das aus im Monophon.

01:22:07.690 --> 01:22:11.010
Das ist noch ganz übersichtlich, aber jetzt schaue ich mir mal nur

01:22:11.010 --> 01:22:12.110
diesen Teil hier an.

01:22:12.570 --> 01:22:15.810
Da an der Stelle, wo ich ein Wort habe, das nur aus einem Phonem

01:22:15.810 --> 01:22:20.270
besteht und komme halt von irgendeinem Wort optional über Stille, gehe

01:22:20.270 --> 01:22:24.270
durch dieses eine Wort aus, das nur aus einem Phonem besteht und gehe

01:22:24.270 --> 01:22:27.930
wieder über optional Stille zu einem Wort, das mit zwei

01:22:27.930 --> 01:22:30.970
unterschiedlichen Anfangsphonemen ausgestattet sein kann.

01:22:31.510 --> 01:22:36.330
Und wenn ich das jetzt, diese Dinger und alle anderen nur mit Trifonen

01:22:36.330 --> 01:22:42.630
modelliere, dann wird aus diesen zwei möglichen Zuständen, die ich

01:22:42.630 --> 01:22:44.990
habe, diesen zwei Monophonen, wird das Ding hier.

01:22:45.650 --> 01:22:49.690
Das ist, wenn ich alle Möglichkeiten mal durchprobiere, die ich halt

01:22:49.690 --> 01:22:52.550
durch die unterschiedlichen Aussprachvarianten, diese optionalen

01:22:52.550 --> 01:22:57.090
Wörter und dann die Trifone, dafür die Trifone aufspanne, dann habe

01:22:57.090 --> 01:23:03.090
ich insgesamt diese 18 möglichen Trifone, die ich da, wo ich vorher

01:23:03.090 --> 01:23:04.950
zwei Monophone hatte, hinschreiben muss.

01:23:05.410 --> 01:23:07.850
Dann kann man sich vorstellen, dass wenn man das konsequent

01:23:07.850 --> 01:23:12.110
durchzieht, dass einen das eventuell auch hinterher in Schwierigkeiten

01:23:12.110 --> 01:23:16.050
bringen kann, sowohl bei der Rechenzeit, aber auch wenn man das Ganze

01:23:16.050 --> 01:23:19.190
hinterher im Quellcode implementieren muss, kann das Ganze auch

01:23:19.190 --> 01:23:21.470
unübersichtlich und ekelhaft werden.

01:23:23.710 --> 01:23:27.610
Und dann gibt es noch die dritte Möglichkeit.

01:23:27.890 --> 01:23:31.710
Ich kann auch nicht nur abhängig davon machen, welches Polyphon wähle

01:23:31.710 --> 01:23:35.970
ich aus, in Abhängigkeit davon, was steht links und rechts an Phonemen

01:23:35.970 --> 01:23:39.950
von dem Polyphon, sondern ich kann zum Beispiel auch noch hinzunehmen

01:23:39.950 --> 01:23:43.830
die Information, an welcher Stelle im Wort befinde ich mich denn

01:23:43.830 --> 01:23:44.110
gerade.

01:23:44.450 --> 01:23:47.890
Ist das zum Beispiel ein Phonem, das am Anfang des Wortes steht, ein

01:23:47.890 --> 01:23:50.570
Phonem, das am Ende des Wortes steht oder ein Phonem, das irgendwo

01:23:50.570 --> 01:23:51.350
mittendrin ist.

01:23:52.010 --> 01:23:55.870
Und dann kann man diese zusätzliche Information dem Phonem, dem

01:23:55.870 --> 01:23:57.150
Polyphon mit hinzunehmen.

01:23:57.290 --> 01:24:00.170
Also, wenn ich mir das Trifon von M anschaue, dann kann ich sagen,

01:24:00.250 --> 01:24:04.530
okay, links mag Stille sein, rechts kommt ein A und außerdem ist das

01:24:04.530 --> 01:24:07.270
das M, das am Anfang eines Wortes steht.

01:24:08.070 --> 01:24:13.690
Und dieses A, da kommt links das M und rechts kommt ein D von Dead und

01:24:13.690 --> 01:24:15.150
es steht am Ende eines Wortes.

01:24:15.810 --> 01:24:17.290
Und so weiter und so fort.

01:24:17.350 --> 01:24:20.110
Da kann ich dann halt entsprechend immer diese Informationen

01:24:20.110 --> 01:24:20.850
mitschleifen.

01:24:21.170 --> 01:24:24.390
Bin ich am Anfang eines Wortes, am Ende eines Wortes oder in der Mitte

01:24:24.390 --> 01:24:25.150
eines Wortes?

01:24:25.590 --> 01:24:27.510
Und das kann ich dann noch feiner aufgelöster machen.

01:24:27.650 --> 01:24:29.650
Also im schlimmsten Fall könnte ich immer einen Index hinschreiben,

01:24:29.770 --> 01:24:33.150
wie viel Phonemposition innerhalb des Wortes ist es denn.

01:24:33.610 --> 01:24:37.530
Und das Ganze nennt man dann entsprechend positionsabhängige

01:24:37.530 --> 01:24:38.170
Polyphone.

01:24:38.710 --> 01:24:41.910
Man macht das insbesondere gerne mit Anfang und Ende eines Wortes,

01:24:41.990 --> 01:24:48.310
weil erfahrungsgemäß da die Aussprache sich am stärksten ändert des

01:24:48.310 --> 01:24:50.790
Phonem, je nachdem, ob es am Anfang und am Ende steht.

01:24:51.170 --> 01:24:54.630
Während wenn es irgendwo im Inneren des Wortes steht, ist es nicht so

01:24:54.630 --> 01:24:57.910
wichtig, ob es jetzt an dritter, fünfter oder siebter Position steht.

01:24:58.010 --> 01:25:00.510
Da bleibt die Aussprache von der Art und Weise, wie wir sprechen

01:25:00.510 --> 01:25:04.090
werden, eher stabiler und nur abhängig von der eigentlichen

01:25:04.090 --> 01:25:07.090
Phonemsequenz, aber nicht von der Tatsache, dass jetzt ein Wort

01:25:07.090 --> 01:25:08.190
anfängt oder aufhört.

01:25:10.490 --> 01:25:11.530
So viel dazu.

01:25:11.990 --> 01:25:14.510
Nächstes Mal müssen wir uns jetzt überlegen, wenn ich jetzt mit so

01:25:14.510 --> 01:25:18.430
vielen Trifonen und Quinfonen und positionsabhängigen Subtrifonen und

01:25:18.430 --> 01:25:22.090
Subquinfonen arbeite, dann habe ich ja nur eine begrenzte Anzahl an

01:25:22.090 --> 01:25:22.530
Modellen.

01:25:22.710 --> 01:25:26.430
Aber wir werden sehen, dass das zu viele Modelle sind, als dass ich

01:25:26.430 --> 01:25:27.850
sie vernünftig modellieren kann.

01:25:28.150 --> 01:25:31.430
Und wir müssen uns dann wieder was überlegen, wie man diese viele

01:25:31.430 --> 01:25:34.970
große Anzahl an Polyphonen wieder kleinklopft auf eine Anzahl, die

01:25:34.970 --> 01:25:38.190
erträglich ist, aber trotzdem größer ist als das, was ich

01:25:38.190 --> 01:25:40.090
normalerweise mit Monophonen machen würde.

01:25:40.710 --> 01:25:43.130
Aber das schauen wir uns dann, und das ist mir auch fast ein Montag,

01:25:43.250 --> 01:25:43.290
an.

01:25:44.230 --> 01:25:44.770
Alles klar.

01:25:45.010 --> 01:25:45.770
Dann noch ein schönen Tag.

