[PYTHON] Spracherkennung: Phonemvorhersage Teil 2 - Connectionist Temporal Classification RNN

Ziel

Dies ist eine Fortsetzung der phonetischen Vorhersage mit dem Microsoft Cognitive Toolkit (CNTK).

In Teil 2 wird die phonetische Vorhersage unter Verwendung der in Teil 1 erstellten Merkmalsmenge und des phonetischen Etiketts durchgeführt. Es wird davon ausgegangen, dass NVIDIA GPU CUDA installiert ist.

Einführung

In Spracherkennung: Phonemvorhersage Teil1-ATR-Sprachdatensatz finden Sie eine Liste der phonetischen Bezeichnungen und des HTK-Formats aus der ATR-Beispiel-Audiodatenbank [1] Vorbereitete Dateien, Frames und phonetische Beschriftungen.

In Teil 2 werden wir ein phonetisches Vorhersagemodell unter Verwendung eines rekursiven neuronalen Netzwerks (RNN) erstellen und trainieren.

Rekursives neuronales Netzwerk bei der Spracherkennung

Das Gesamtbild der diesmal implementierten phonetischen Vorhersage ist in der folgenden Abbildung dargestellt. Die Komponenten des rekursiven neuronalen Netzwerks sind LSTM [2] und ein bidirektionales Modell [3], das die Vorwärts- und Rückwärtsausgänge verbindet.

ctcr.png

Wenden Sie in jeder Ebene die Ebenennormalisierung [[4]](# Referenz) auf Vorwärts bzw. Rückwärts an, verbinden Sie sich und stellen Sie eine Restverbindung her [[5]](# Referenz) und erstellen Sie bei der letzten vollständigen Verbindung eine phonetische Bezeichnung. Vorhersagen

Einstellungen im Training

Für den Anfangswert jedes Parameters verwendeten wir die gleichmäßige Verteilung von Glorot [6].

Wir haben die Connectionist Temporal Classification [7] für die Verlustfunktion verwendet.

Adam [8] wurde als Optimierungsalgorithmus verwendet. Adams Hyperparameter $ \ beta_1 $ werden auf 0,9 und $ \ beta_2 $ auf die CNTK-Standardwerte gesetzt.

Die zyklische Lernrate (CLR) [9] wird als Lernrate verwendet, die maximale Lernrate beträgt 1e-3, die Basislernrate beträgt 1e-5, die Schrittgröße beträgt das 10-fache der Anzahl der Epochen. Die Richtlinie wurde auf triangular2 festgelegt.

Als Maßnahme gegen Überlernen habe ich Dropout [10] bei 0,1 vor der Restverbindung angewendet.

Das Modelltraining führte 100 Epochen durch Mini-Batch-Training durch.

Implementierung

Ausführungsumgebung

Hardware-

・ CPU Intel (R) Core (TM) i7-7700 3,60 GHz ・ GPU NVIDIA Quadro P4000 8 GB

Software

・ Windows 10 Pro 1909 ・ CUDA 10.0 ・ CuDNN 7.6 ・ Python 3.6.6 ・ Cntk-gpu 2.7 ・ Cntkx 0.1.53 ・ Librosa 0.8.0 ・ Numpy 1.19.2 ・ Pandas 1.1.2 ・ PyAudio 0.2.11 ・ Scipy 1.5.2

Programm zum Ausführen

Das Schulungsprogramm ist auf [GitHub] verfügbar (https://github.com/sho-watari/SpeechRecognition/tree/master/CTCR).

ctcr_training.py


Kommentar

Ich werde die für diese Implementierung erforderlichen Inhalte ergänzen.

Connectionist Temporal Classification Bei der Spracherkennung unterscheiden sich die Anzahl der Frames von Sprachdaten und die Anzahl der Phoneme, die Sie vorhersagen möchten, häufig. In einem solchen Fall gibt es keine Eins-zu-Eins-Entsprechung zwischen dem RNN-Ausgang und den richtigen Antwortdaten.

Daher folgen durch Einfügen von _ als Leerzeichen die korrekten Antwortdaten aoi dem Pfeilpfad, wie in der folgenden Abbildung gezeigt, und passen die Länge an die Anzahl der Frames an, wie in \ _ \ _ a_o_ \ _ i_ gezeigt.

ctc.png

Die Connectionist Temporal Classification (CTC) trainiert Parameter nach der wahrscheinlichsten Schätzung und berechnet die Wahrscheinlichkeit einer Route, die eine Reihe korrekter Daten liefert, wie in der obigen Abbildung gezeigt. Unter der Annahme, dass die Eingabedatenreihe $ x $ und die korrekte Datenreihe $ l $ ist, wird die Verlustfunktion durch die folgende Formel definiert.

Loss = - \log p(l|x)

Es gibt jedoch zahlreiche Kombinationen von Routen zur Berechnung der Verlustfunktion. Daher wird es effizient unter Verwendung eines Vorwärts-Rückwärts-Algorithmus berechnet, der auf der dynamischen Planungsmethode basiert.

Wie in der folgenden Abbildung gezeigt, wird hier die Summe der Wahrscheinlichkeiten von $ \ pi $, einer Menge von Routen, die zum Zeitpunkt $ t $ die Reihe $ s $ erreichen, als Vorwärtswahrscheinlichkeit bezeichnet und durch die folgende Formel ausgedrückt.

\alpha_t (s) = \sum_{s \in \pi} \prod^t_{i=1} y^i_s

ctc_forward.png

Diese positive Wahrscheinlichkeit $ \ alpha_t (s) $ kann basierend auf dem Konzept der dynamischen Planung rekursiv und effizient berechnet werden.

\left\{
\begin{array}{ll}
\alpha_1(1) = y^1_1 \\
\alpha_t(s) = (\alpha_{t-1} (s-1) + \alpha_{t-1} (s)) y^t_s
\end{array}
\right.

In ähnlicher Weise ist die Rückwärtswahrscheinlichkeit $ \ beta_t (i) $, wie unten gezeigt, wie folgt definiert.

\beta_t(s) = \sum_{s \in \pi} \prod^T_{i=s} y^i_s

ctc_backward.png

Diese Rückwärtswahrscheinlichkeit $ \ beta $ kann auf dieselbe Weise wie die Vorwärtswahrscheinlichkeit $ \ alpha $ rekursiv und effizient berechnet werden.

\left\{
\begin{array}{ll}
\beta_T(S) = 1 \\
\beta_t(s) = (\beta_{t+1} (s+1) + \beta_{t+1} (s)) y^{t+1}_s
\end{array}
\right.

Dann ist die Wahrscheinlichkeit auf allen Routen $ \ alpha_t (s) \ beta_t (s) $, und die Verlustfunktion ist wie folgt.

Loss = - \log \sum^S_{s=1} \alpha_t(s)\beta_t(s)

Entfernung bearbeiten

Dieses Mal habe ich den Bearbeitungsabstand als Leistungsbewertungsindex des Modells verwendet. Die Bearbeitungsentfernung, auch als Levenstein-Entfernung bezeichnet, ist die Mindestanzahl von Einfüge-, Lösch- und Ersetzungsvorgängen.

Beispielsweise beträgt der Bearbeitungsabstand zwischen der Zeichenfolge akai und der Zeichenfolge aoi

・ Lösche k von akai -Ersetzen Sie a in aai durch o

Wird durch die Operation erhalten. Der Bearbeitungsabstand kann mithilfe einer Tabelle berechnet werden, zu deren Beginn ein Leerzeichen hinzugefügt wird (siehe Abbildung unten).

edit_distance_0.png

Suchen Sie zunächst die Bearbeitungsabstände für die erste Zeile und die erste Spalte, wie durch den blauen Pfeil in der folgenden Abbildung dargestellt. Dies entspricht dem Leerzeichen _ und der Länge der Zeichenfolge zu jedem Zeitpunkt.

Geben Sie als Nächstes den kleinsten der folgenden Werte in der Reihenfolge von oben links ein, wie durch den grünen Pfeil dargestellt.

・ Ein Wert plus eins ・ Eins links plus eins -Der Wert oben links plus 1 (wenn jedoch die Zeichen in Zeilen- und Spaltenrichtung identisch sind, wird 1 nicht hinzugefügt)

edit_distance_1.png

Der unten rechts rot dargestellte Wert ist der zu berechnende Bearbeitungsabstand.

Ergebnis

Training loss and error Die folgende Abbildung zeigt die Verlustfunktion und die Protokolle der falschen Erkennungsrate während des Trainings. Das Diagramm links zeigt die Verlustfunktion, das Diagramm rechts zeigt den Bearbeitungsabstand, die horizontale Achse zeigt die Anzahl der Epochen und die vertikale Achse zeigt den Wert bzw. den Bearbeitungsabstand der Verlustfunktion.

atr503_logging.png

Validation error Wenn die Leistung unter Verwendung der Verifizierungsdaten bewertet wurde, die bei der Erstellung der Daten in Teil 1 getrennt wurden, wurden die folgenden Ergebnisse erhalten.

Validation Error 40.31%

Vorhersage von Phonemen für gesprochene Sprachdaten

Das Ergebnis der phonetischen Vorhersage für die aufgezeichnete Stimme der eigenen Sprache ist unten gezeigt. Äußerung war ein "Hallo".

Say...
Record.
['sil', 'h', 'o', 'h', 'i', 'cl', 'ch', 'i', 'e', 'o', 'a', 'sil']

Da das phonetische Element während der Inferenz für jeden Rahmen ausgegeben wird, ist das Ergebnis der Vorhersage des phonetischen Elements das Ergebnis des Entfernens der Redundanz kontinuierlicher phonetischer Elemente und des Leerzeichens _.

Die Vokale scheinen fast korrekt zu sein, aber die Konsonanten scheinen nur mit 'ch' zu funktionieren.

Referenz

CNTK 208: Training Acoustic Model with Connectionist Temporal Classification (CTC) Criteria

Speech Recognition : Phoneme Prediction Part1 - ATR503 Speech dataset

  1. Yoshiro Yoshida, Takeo Fukurotani, Toshiyuki Takezawa. "ATR Voice Database", Proceedings der Nationalen Konferenz der Gesellschaft für Künstliche Intelligenz 0 (2002): S. 189-189.
  2. Sepp Hochreiter, and Jürgen Schmidhuber. "Long Short-Term Memory", Neural Computation. 1997, p. 1735-1780.
  3. Mike Schuster and Luldip K. Paliwal. "Bidirectional Recurrent Neural Networks", IEEE transactions on Signal Processing, 45(11), 1997, p. 2673-2681.
  4. Jimmy Lei Ba, Jamie Ryan Kiros, and Geoffrey E. Hinton. "Layer Normalization", arXiv preprint arXiv:1607.06450 (2016).
  5. Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. "Deep Residual Learning for Image Recognition", the IEEE conference on computer vision and pattern recognition. 2016. p. 770-778.
  6. Xaiver Glorot and Yoshua Bengio. "Understanding the difficulty of training deep feedforward neural networks", Proceedings of the Thirteenth International Conference on Artificial Intelligence and Statistics. 2010, p. 249-256.
  7. Alex Graves, Santiago Fernandez, Faustino Gomez, and Jurgen Schmidhuber. "Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks", In: Proceedings of the 23rd international conference on Machine learning. 2006. pp. 369-376.
  8. Diederik P. Kingma and Jimmy Lei Ba. "Adam: A method for stochastic optimization", arXiv preprint arXiv:1412.6980 (2014).
  9. Leslie N. Smith. "Cyclical Learning Rates for Training Neural Networks", 2017 IEEE Winter Conference on Applications of Computer Vision. 2017, p. 464-472.
  10. Nitish Srivastava, Geoffrey Hinton, Alex Krizhevshky, Ilya Sutskever, and Ruslan Salakhutdinov. "Dropout: A Simple Way to Prevent Neural Networks from Overfitting", The Journal of Machine Learning Research 15.1 (2014) p. 1929-1958.

Recommended Posts

Spracherkennung: Phonemvorhersage Teil 2 - Connectionist Temporal Classification RNN
Spracherkennung: Phoneme Prediction Part1 --ATR Sprachdatensatz
Spracherkennung: Genreklassifizierung Teil1 - GTZAN-Genresammlungen
Spracherkennung: Genreklassifizierung Part2-Musikgenreklassifizierung CNN