Sprachsynthese für neuronale Netze unter Verwendung der Tacotron 2-Architektur oder „Get Alignment or Die Tryin '“



Unser Team erhielt die Aufgabe, die Ergebnisse der Arbeit des künstlichen neuronalen Netzwerks für die Sprachsynthese zu wiederholen. Tacotron2- Autorschaft DeepMind. Dies ist eine Geschichte über den dornigen Weg, den wir während der Umsetzung des Projekts gegangen sind.

Die Aufgabe der Computer-Sprachsynthese ist seit langem für Wissenschaftler und technische Experten von Interesse. Klassische Methoden erlauben jedoch keine Synthese von Sprache, die nicht vom Menschen zu unterscheiden ist. Und hier, wie in vielen anderen Bereichen, kam tiefes Lernen zur Rettung.

Schauen wir uns klassische Synthesemethoden an.

Verkettete Sprachsynthese


Diese Methode basiert auf der Voraufzeichnung kurzer Audiofragmente, die dann kombiniert werden, um eine kohärente Sprache zu erzeugen. Es stellt sich als sehr sauber und klar heraus, aber völlig frei von emotionalen und intonationalen Komponenten, das heißt, es klingt unnatürlich. Und das alles, weil es unmöglich ist, eine Audioaufnahme aller möglichen Wörter zu erhalten, die in allen möglichen Kombinationen von Emotionen und Prosodie ausgesprochen werden. Verkettungssysteme erfordern riesige Datenbanken und hartcodierte Kombinationen, um Wörter zu bilden. Die Entwicklung eines zuverlässigen Systems nimmt viel Zeit in Anspruch.

Parametrische Sprachsynthese


Verkettungs-TTS-Anwendungen sind aufgrund des hohen Datenbedarfs und der Entwicklungszeit begrenzt. Daher wurde eine statistische Methode entwickelt, die die Art der Daten untersucht. Es erzeugt Sprache durch Kombinieren von Parametern wie Frequenz, Amplitudenspektrum usw.

Die parametrische Synthese besteht aus zwei Stufen.

  1. Zunächst werden sprachliche Merkmale wie Phoneme, Dauer usw. aus dem Text extrahiert.
  2. Dann werden für den Vocoder (das System, das die Wellenform erzeugt) Zeichen extrahiert, die das entsprechende Sprachsignal darstellen: Cepstrum, Frequenz, lineares Spektrogramm, Kreidespektrogramm.
  3. Diese manuell konfigurierten Parameter werden zusammen mit sprachlichen Merkmalen in das Vocoder-Modell übertragen und es werden viele komplexe Transformationen durchgeführt, um eine Schallwelle zu erzeugen. Gleichzeitig wertet der Vocoder Sprachparameter wie Phase, Prosodie, Intonation und andere aus.

Wenn wir die Parameter approximieren können, die die Sprache für jede ihrer Einheiten definieren, können wir ein parametrisches Modell erstellen. Die parametrische Synthese erfordert erheblich weniger Daten und harte Arbeit als verkettete Systeme.

Theoretisch ist alles einfach, aber in der Praxis gibt es viele Artefakte, die zu gedämpfter Sprache mit einem „summenden“ Klang führen, der überhaupt nicht wie ein natürlicher Klang ist.

Tatsache ist, dass wir in jeder Phase der Synthese einige Funktionen hart codieren und hoffen, eine realistisch klingende Sprache zu erhalten. Die ausgewählten Daten basieren jedoch auf unserem Sprachverständnis, und menschliches Wissen ist nicht absolut. Daher sind die verwendeten Zeichen nicht unbedingt die bestmögliche Lösung.

Und hier betritt Deep Learning die Szene in ihrer ganzen Pracht.

Tiefe neuronale Netze sind ein leistungsfähiges Werkzeug, das theoretisch eine beliebig komplexe Funktion approximieren kann, dh einen Eingabedatenraum X in den Ausgabedatenraum Y bringen kann. Im Kontext unserer Aufgabe sind dies Text und Audio mit Sprache.

Datenvorverarbeitung


Zunächst bestimmen wir, was wir als Eingabe haben und was wir an der Ausgabe erhalten möchten.

Die Eingabe ist Text und die Ausgabe ist ein Kreidespektrogramm. Dies ist eine Darstellung auf niedriger Ebene, die durch Anwenden der schnellen Fourier-Transformation auf ein diskretes Audiosignal erhalten wird. Es ist sofort zu beachten, dass die auf diese Weise erhaltenen Spektrogramme noch durch Komprimieren des Dynamikbereichs normalisiert werden müssen. Auf diese Weise können Sie die natürliche Beziehung zwischen dem lautesten und dem leisesten Ton in der Aufnahme verringern. In unseren Experimenten erwies sich die Verwendung von auf den Bereich [-4; 4] reduzierten Spektrogrammen als die beste.


Abbildung 1: Kreide-Spektrogramm des auf den Bereich reduzierten Sprach-Audiosignals [-4; 4].

Als Trainingsdatensatz haben wir den LJSpeech-Datensatz ausgewählt , der 13.100 Audiospuren für 2-10 Sekunden enthält. und eine Datei mit Text, der der auf Audio aufgezeichneten englischen Sprache entspricht.

Ton, der die obigen Transformationen verwendet, wird in Kreidespektrogramme codiert. Der Text wird tokenisiert und transformiert.

in eine Folge von ganzen Zahlen. Ich muss sofort betonen, dass die Texte normalisiert sind: Alle Zahlen sind mündlich geschrieben und mögliche Abkürzungen werden entschlüsselt, zum Beispiel: „Frau Robinson “-„ Missis Robinson “.

So erhalten wir nach der Vorverarbeitung Sätze von Numpy-Arrays numerischer Sequenzen und Kreidespektrogrammen, die in npy-Dateien auf der Festplatte aufgezeichnet sind.

Damit in der Trainingsphase alle Dimensionen in den Patch-Tensoren zusammenfallen, werden wir kurze Sequenzen mit Auffüllungen versehen. Für Sequenzen in Form von Texten sind diese für das Auffüllen von 0 und für Spektrogramme für Frames reserviert, deren Werte geringfügig unter den von uns festgelegten Mindestspektrogrammen liegen. Dies wird empfohlen, um diese Polster zu isolieren und sie von Lärm und Stille zu trennen.

Jetzt haben wir Daten, die Text und Audio darstellen und für die Verarbeitung durch ein künstliches neuronales Netzwerk geeignet sind. Schauen wir uns die Architektur des Feature Prediction Net an, das unter dem Namen des zentralen Elements des gesamten Synthesesystems Tacotron2 heißt.

Architektur


Tacotron 2 ist nicht ein Netzwerk, sondern zwei: Feature Prediction Net und NN-Vocoder WaveNet . Der Originalartikel sowie unsere eigene Vision der geleisteten Arbeit ermöglichen es uns, Feature Prediction Net als erste Geige zu betrachten, während der WaveNet-Vocoder die Rolle eines Peripheriesystems spielt.

Tacotron2 ist eine Sequenz-zu-Sequenz- Architektur. Es besteht aus einem Encoder (Encoder), der eine interne Vorstellung vom Eingangssignal (Symbol-Token) erzeugt, und einem Decoder (Decoder), der diese Darstellung in ein Kreidespektrogramm verwandelt. Ein äußerst wichtiges Element des Netzwerks ist auch das sogenannte PostNet , mit dem das vom Decoder erzeugte Spektrogramm verbessert werden soll.


Abbildung 2: Tacotron 2-Netzwerkarchitektur

Lassen Sie uns die Netzwerkblöcke und ihre Module genauer betrachten.

Die erste Encoderschicht ist die Einbettungsschicht. Basierend auf einer Folge von natürlichen Zahlen, die Zeichen darstellen, werden mehrdimensionale (512-dimensionale) Vektoren erstellt.

Als nächstes werden Einbettungsvektoren in einen Block von drei eindimensionalen Faltungsschichten eingespeist. Jede Ebene enthält 512 Filter der Länge 5. Dieser Wert ist in diesem Zusammenhang eine gute Filtergröße, da er ein bestimmtes Zeichen sowie seine zwei vorherigen und zwei nachfolgenden Nachbarn erfasst. Auf jede Faltungsschicht folgen eine Mini-Batch-Normalisierung und eine ReLU-Aktivierung.

Die nach dem Faltungsblock erhaltenen Tensoren werden auf bidirektionale LSTM-Schichten mit jeweils 256 Neuronen angewendet. Vorwärts- und Rücklaufergebnisse werden verkettet.

Der Decoder hat eine wiederkehrende Architektur, dh bei jedem nachfolgenden Schritt wird die Ausgabe des vorherigen Schritts verwendet. Hier werden sie ein Bild des Spektrogramms sein. Ein weiteres wichtiges, wenn nicht sogar Schlüsselelement dieses Systems ist der Mechanismus der weichen (trainierten) Aufmerksamkeit - eine relativ neue Technik, die immer beliebter wird. Bei jedem Schritt des Decoders wird die Aufmerksamkeit zum Bilden eines Kontextvektors und zum Aktualisieren des Aufmerksamkeitsgewichts verwendet:

  • die Projektion des vorherigen verborgenen Zustands des RNN-Netzwerks des Decoders auf eine vollständig verbundene Schicht,
  • Projektion des Encoderausgangs auf eine vollständig verbundene Schicht,
  • sowie additive (bei jedem Zeitschritt des Decoders akkumulierte) Aufmerksamkeitsgewichte.

Die Idee der Aufmerksamkeit sollte wie folgt verstanden werden: "Welcher Teil der Codiererdaten sollte beim aktuellen Decodierschritt verwendet werden".


Abbildung 3: Schema des Aufmerksamkeitsmechanismus.

Bei jedem Schritt des Decoders wird der Kontextvektor C i berechnet (in der obigen Abbildung als "besuchte Codiererausgänge" angegeben), der das Produkt aus dem Codiererausgang ( h ) und den Aufmerksamkeitsgewichten ( α ) ist:



wobei α ij die nach der Formel berechneten Aufmerksamkeitsgewichte sind:



Dabei ist e ij die sogenannte „Energie“, deren Berechnungsformel von der Art des von Ihnen verwendeten Aufmerksamkeitsmechanismus abhängt (in unserem Fall handelt es sich um einen Hybridtyp, der sowohl ortsbezogene als auch inhaltsbasierte Aufmerksamkeit verwendet). Die Energie wird nach folgender Formel berechnet:

e ij = v aT tanh (Ws i-1 + Vh j + Uf i, j + b)

wo:
  • s i-1 - vorheriger versteckter Zustand des LSTM-Netzwerks des Decoders,
  • α i-1 - vorherige Aufmerksamkeitsgewichte,
  • h j ist der j-te verborgene Zustand des Encoders,
  • W , V , U , v a und b sind Trainingsparameter,
  • f i, j - Ortszeichen berechnet nach der Formel:

    f i = F * α i-1

    wobei F die Faltungsoperation ist.


Für ein klares Verständnis der Vorgänge fügen wir hinzu, dass einige der unten beschriebenen Module die Verwendung von Informationen aus dem vorherigen Schritt des Decoders voraussetzen. Wenn dies jedoch der erste Schritt ist, sind die Informationen Tensoren mit Nullwerten, was bei der Erstellung von Wiederholungsstrukturen üblich ist.

Betrachten Sie nun den Operationsalgorithmus .

Zunächst wird der Decoderausgang aus dem vorherigen Zeitschritt in ein kleines PreNet-Modul eingespeist, das aus zwei vollständig verbundenen Schichten von 256 Neuronen besteht, die sich mit Dropout-Schichten mit einer Rate von 0,5 abwechseln. Eine Besonderheit dieses Moduls ist, dass Dropout nicht nur in der Modellschulungsphase, sondern auch in der Ausgangsphase verwendet wird.

Die PreNet-Ausgabe in Verkettung mit dem Kontextvektor, der als Ergebnis des Aufmerksamkeitsmechanismus erhalten wird, wird der Eingabe in ein unidirektionales zweischichtiges LSTM-Netzwerk mit 1024 Neuronen in jeder Schicht zugeführt.

Dann wird die Verkettung der Ausgabe von LSTM-Schichten mit demselben (und möglicherweise unterschiedlichen) Kontextvektor in eine vollständig verbundene Schicht mit 80 Neuronen eingespeist, was der Anzahl der Kanäle des Spektrogramms entspricht. Diese letzte Schicht des Decoders bildet das vorhergesagte Spektrogramm Bild für Bild. Und bereits wird sein Ausgang als Eingang für den nächsten Zeitschritt des Decoders in PreNet geliefert.

Warum haben wir im vorherigen Absatz erwähnt, dass der Kontextvektor möglicherweise bereits anders ist? Einer der möglichen Ansätze besteht darin, den Kontextvektor neu zu berechnen, nachdem in diesem Schritt der latente Zustand des LSTM-Netzwerks erhalten wurde. In unseren Experimenten hat sich dieser Ansatz jedoch nicht gerechtfertigt.

Zusätzlich zur Projektion auf eine vollständig verbundene Schicht mit 80 Neuronen wird die Verkettung der Ausgabe von LSTM-Schichten mit einem Kontextvektor in eine vollständig verbundene Schicht mit einem Neuron eingespeist, gefolgt von einer Sigmoidaktivierung - dies ist eine Schicht mit "Stop-Token-Vorhersage". Er sagt die Wahrscheinlichkeit voraus, dass der in diesem Schritt des Decoders erzeugte Rahmen endgültig ist. Diese Schicht soll ein Spektrogramm von nicht fester, sondern beliebiger Länge in der Modellausgangsstufe erzeugen. Das heißt, in der Ausgangsstufe bestimmt dieses Element die Anzahl der Schritte des Decoders. Es kann als binärer Klassifikator betrachtet werden.

Die Ausgabe des Decoders aus allen seinen Schritten ist das vorhergesagte Spektrogramm. Dies ist jedoch nicht alles. Um die Qualität des Spektrogramms zu verbessern, wird es durch das PostNet-Modul geleitet, bei dem es sich um einen Stapel von fünf eindimensionalen Faltungsschichten mit jeweils 512 Filtern und einer Filtergröße von 5 handelt. Auf jede Schicht folgen Chargennormalisierung und Tangentenaktivierung (mit Ausnahme der letzten). Um zur Dimension des Spektrogramms zurückzukehren, leiten wir die Post-Net-Ausgangsdaten durch eine vollständig verbundene Schicht mit 80 Neuronen und addieren die empfangenen Daten mit dem Anfangsergebnis des Decoders. Wir erhalten das aus dem Text erzeugte Kreidespektrogramm. Gewinn

Alle Faltungsmodule werden mit Dropout-Schichten mit einer Rate von 0,5 und Wiederholungsschichten mit der neueren Zoneout- Methode mit einer Rate von 0,1 reguliert . Es ist ganz einfach: Anstatt den im aktuellen Schritt erhaltenen latenten Zustand und Zellenzustand auf den nächsten Zeitschritt des LSTM-Netzwerks anzuwenden, ersetzen wir einen Teil der Daten durch die Werte aus dem vorherigen Schritt. Dies erfolgt sowohl in der Trainingsphase als auch in der Entzugsphase. In diesem Fall wird bei jedem Schritt nur der verborgene Zustand (der an den nächsten LSTM-Schritt übergeben wird) der Zoneout-Methode ausgesetzt, während die Ausgabe der LSTM-Zelle im aktuellen Schritt unverändert bleibt.

Wir haben PyTorch als Deep-Learning-Framework ausgewählt. Zum Zeitpunkt der Implementierung des Netzwerks befand es sich zwar in einem Vorabversionszustand, aber es war bereits ein sehr leistungsfähiges Werkzeug zum Aufbau und Training künstlicher neuronaler Netze. In unserer Arbeit verwenden wir andere Frameworks wie TensorFlow und Keras. Letzteres wurde jedoch verworfen, da nicht standardmäßige benutzerdefinierte Strukturen implementiert werden müssen. Wenn wir TensorFlow und PyTorch vergleichen, besteht bei Verwendung der zweiten kein Gefühl, dass das Modell aus der Python-Sprache herausgerissen wurde. Wir verpflichten uns jedoch nicht zu behaupten, dass einer von ihnen besser und der andere schlechter ist. Die Verwendung eines bestimmten Frameworks kann von verschiedenen Faktoren abhängen.

Das Netzwerk wird durch die Backpropagation-Methode trainiert. ADAM wird als Optimierer verwendet. Der mittlere quadratische Fehler vor und nach PostNet sowie die binäre Kreuzentropie über den tatsächlichen und vorhergesagten Werten der Ebene "Stop Token Prediction" werden als Fehlerfunktionen verwendet. Der resultierende Fehler ist eine einfache Summe dieser drei.

Das Modell wurde auf einer einzelnen GeForce 1080Ti-GPU mit 11 GB Speicher trainiert.

Visualisierung


Bei der Arbeit mit einem so großen Modell ist es wichtig zu sehen, wie der Lernprozess verläuft. Und hier wurde TensorBoard zu einem praktischen Werkzeug. Wir haben den Wert des Fehlers sowohl in Trainings- als auch in Validierungsiterationen verfolgt. Zusätzlich zeigten wir Zielspektrogramme, vorhergesagte Spektrogramme in der Trainingsphase, vorhergesagte Spektrogramme in der Validierungsphase und Ausrichtung an, was ein additiv akkumuliertes Aufmerksamkeitsgewicht aus allen Trainingsschritten ist.

Es ist möglich, dass Ihre Aufmerksamkeit zunächst nicht zu informativ ist:


Abbildung 4: Ein Beispiel für schlecht trainierte Aufmerksamkeitsskalen.

Aber nachdem alle Ihre Module wie eine Schweizer Uhr funktionieren, erhalten Sie endlich so etwas:


Abbildung 5: Beispiel für erfolgreich trainierte Aufmerksamkeitsskalen.

Was bedeutet diese Tabelle? Bei jedem Schritt des Decoders versuchen wir, einen Frame des Spektrogramms zu decodieren. Es ist jedoch nicht klar, welche Informationen der Codierer bei jedem Schritt des Decodierers verwenden muss. Es ist davon auszugehen, dass diese Korrespondenz direkt erfolgt. Wenn wir beispielsweise eine Eingabetextsequenz von 200 Zeichen und ein entsprechendes Spektrogramm von 800 Bildern haben, gibt es 4 Bilder für jedes Zeichen. Sie müssen jedoch zugeben, dass die auf der Grundlage eines solchen Spektrogramms erzeugte Sprache völlig frei von Natürlichkeit wäre. Wir sprechen einige Wörter schneller aus, andere langsamer, irgendwo, wo wir innehalten, aber irgendwo nicht. Und bedenken Sie, dass alle möglichen Kontexte nicht möglich sind. Deshalb ist Aufmerksamkeit ein Schlüsselelement des gesamten Systems: Sie legt die Entsprechung zwischen dem Decoderschritt und den Informationen vom Codierer fest, um die Informationen zu erhalten, die zum Erzeugen eines bestimmten Rahmens erforderlich sind. Und je größer die Aufmerksamkeitsgewichte sind, desto mehr "Aufmerksamkeit" sollte dem entsprechenden Teil der Codiererdaten beim Erzeugen des Spektrogrammrahmens geschenkt werden.

In der Trainingsphase ist es auch nützlich, Audio zu generieren und nicht nur die Qualität der Spektrogramme und die Aufmerksamkeit visuell zu bewerten. Diejenigen, die mit WaveNet gearbeitet haben, werden jedoch zustimmen, dass die Verwendung als Vocoder in der Trainingsphase ein inakzeptabler zeitlicher Luxus wäre. Daher wird empfohlen, den Griffin-Lim-Algorithmus zu verwenden , der eine teilweise Rekonstruktion des Signals nach schnellen Fourier-Transformationen ermöglicht. Warum teilweise? Tatsache ist, dass wir bei der Umwandlung des Signals in Spektrogramme Phaseninformationen verlieren. Die Qualität des so erhaltenen Audios reicht jedoch völlig aus, um zu verstehen, in welche Richtung Sie sich bewegen.

Lektionen gelernt


Hier werden wir einige Gedanken zum Aufbau des Entwicklungsprozesses teilen und sie im Format von Tipps einreichen. Einige von ihnen sind ziemlich allgemein, andere sind spezifischer.

Informationen zur Organisation des Workflows :

  • Verwenden Sie das Versionskontrollsystem und beschreiben Sie alle Änderungen klar und deutlich. Dies mag wie eine offensichtliche Empfehlung erscheinen, aber immer noch. Bei der Suche nach der optimalen Architektur treten ständig Änderungen auf. Wenn Sie ein zufriedenstellendes Zwischenergebnis erhalten haben, sollten Sie sich selbst zu einem Kontrollpunkt machen, damit Sie die nachfolgenden Änderungen sicher vornehmen können.
  • Aus unserer Sicht sollte man in solchen Architekturen die Prinzipien der Kapselung einhalten: eine Klasse - ein Python-Modul. Dieser Ansatz ist bei ML-Aufgaben nicht üblich, hilft Ihnen jedoch dabei, Ihren Code zu strukturieren und das Debuggen und Entwickeln zu beschleunigen. Teilen Sie den Code und Ihre Architekturvision in Blöcke, Blöcke in Module und Module in Ebenen ein. Wenn das Modul über Code verfügt, der eine bestimmte Rolle ausführt, kombinieren Sie ihn zu einer Modulklassenmethode. Dies sind gängige Wahrheiten, aber wir waren nicht zu faul, um noch einmal darüber zu sprechen.
  • Stellen Sie Klassen im Numpy-Stil mit Dokumentation zur Verfügung . Dies vereinfacht die Arbeit für Sie und Ihre Kollegen, die Ihren Code lesen, erheblich.
  • Zeichnen Sie immer die Architektur Ihres Modells. Erstens hilft es Ihnen, einen Sinn daraus zu ziehen, und zweitens können Sie anhand einer Seitenansicht der Architektur und der Hyperparameter des Modells Ungenauigkeiten in Ihrem Ansatz schnell erkennen.
  • Besser als Team arbeiten. Wenn Sie alleine arbeiten, sammeln Sie immer noch Kollegen und besprechen Sie Ihre Arbeit. Zumindest können sie Ihnen eine Frage stellen, die Sie zu einigen Gedanken führt, aber höchstens weisen sie auf eine bestimmte Ungenauigkeit hin, die es Ihnen nicht ermöglicht, das Modell erfolgreich zu trainieren.
  • Ein weiterer nützlicher Trick ist bereits mit der Datenvorverarbeitung verbunden. Angenommen, Sie möchten eine Hypothese testen und die entsprechenden Änderungen am Modell vornehmen. Ein Neustart des Trainings, insbesondere vor dem Wochenende, ist jedoch riskant. Der Ansatz kann anfangs falsch sein und Sie werden Zeit verschwenden. Was ist dann zu tun? Erhöhen Sie die Größe des Fensters "Schnelle Fourier-Transformation". Der Standardparameter ist 1024; Erhöhen Sie es um das 4-fache oder sogar das 8-fache. Dadurch werden die Spektrogramme in der richtigen Anzahl „gequetscht“ und das Lernen erheblich beschleunigt. Von ihnen wiederhergestelltes Audio hat eine geringere Qualität, aber das ist jetzt nicht Ihre Aufgabe? In 2-3 Stunden können Sie bereits eine Ausrichtung erhalten („Ausrichtung“ der Aufmerksamkeitsskalen, wie in der obigen Abbildung gezeigt). Dies bestätigt die architektonische Korrektheit des Ansatzes und kann bereits mit Big Data getestet werden.

Bau- und Trainingsmodelle :

  • Wir stellten die Hypothese auf, dass Chargen, die nicht zufällig, sondern basierend auf ihrer Länge gebildet würden, den Prozess des Modelltrainings beschleunigen und die generierten Spektrogramme verbessern würden. Die logische Annahme, die auf der Hypothese basiert, dass je mehr ein nützliches Signal (und kein Padding) in das Trainingsnetzwerk eingespeist wird, desto besser. Dieser Ansatz hat sich jedoch nicht gerechtfertigt, da wir in unseren Experimenten das Netzwerk nicht auf diese Weise trainieren konnten. Dies ist wahrscheinlich auf den Verlust der Zufälligkeit bei der Auswahl der Instanzen für das Training zurückzuführen.
  • Verwenden Sie moderne Algorithmen zur Initialisierung von Netzwerkparametern mit einigen optimierten Anfangszuständen. In unseren Experimenten haben wir beispielsweise die Xavier Uniform Weight Initialization verwendet. Wenn Sie in Ihrem Modul die Normalisierung durch Mini-Batch und einige Aktivierungsfunktionen verwenden müssen, sollten sie sich in dieser Reihenfolge abwechseln. Wenn wir beispielsweise die ReLU-Aktivierung anwenden, verlieren wir sofort das gesamte negative Signal, das an der Normalisierung der Daten einer bestimmten Charge beteiligt sein sollte.
  • Verwenden Sie ab einem bestimmten Lernschritt eine dynamische Lernrate. Dies hilft wirklich, den Fehlerwert zu reduzieren und die Qualität der erzeugten Spektrogramme zu erhöhen.
  • Nach dem Erstellen des Modells und erfolglosen Versuchen, es auf Stapeln aus dem gesamten Datensatz zu trainieren, ist es hilfreich, zu versuchen, es auf einem Stapel neu zu trainieren. , alignment, ( ). , , .

    . . , – . , . , .
  • RNN- . . , . ? LSTM- -.
  • , LSTM-, « »: « , LSTM-. «» bf. , , , LSTM- ft 1/2. , : , «» 1/2, . bf , 1 2: ft ».
  • seq2seq- . — , . ? , ( ).
  • Nun eine spezielle Empfehlung für das PyTorch-Framework. Obwohl die LSTM-Schicht im Decoder im Wesentlichen eine eigene LSTM-Zelle ist, die bei jedem Schritt des Decoders nur Informationen für ein Element der Sequenz empfängt, wird empfohlen, die Klasse torch.nn.LSTM anstelle von torch.nn.LSTMCell . Der Grund dafür ist, dass das LSTM-Backend in der CUDNN-Bibliothek in C und in der LSTMCell in Python implementiert ist. Mit diesem Trick können Sie die Geschwindigkeit des Systems erheblich erhöhen.

Am Ende des Artikels werden Beispiele für die Sprachgenerierung aus Texten vorgestellt, die nicht im Trainingssatz enthalten waren.

Source: https://habr.com/ru/post/de436312/


All Articles