[PYTHON] Reconnaissance vocale: Prédiction phonémique Partie 2 - Classification temporelle connectionniste RNN

Cible

Il s'agit d'une continuation de la prédiction phonétique utilisant le Microsoft Cognitive Toolkit (CNTK).

Dans la partie 2, la prédiction phonétique est effectuée en utilisant la quantité de caractéristiques et l'étiquette phonétique préparées dans la partie 1. On suppose que NVIDIA GPU CUDA est installé.

introduction

Dans Speech Recognition: Phoneme Prediction Part1-ATR Speech dataset, une liste d'étiquettes phonétiques et le format HTK de l'exemple de base de données audio ATR [1] Fichiers préparés, cadres et étiquettes phonétiques.

Dans la partie 2, nous allons créer et entraîner un modèle de prédiction phonétique à l'aide d'un réseau de neurones récursif (RNN).

Réseau neuronal récursif en reconnaissance vocale

L'image globale de la prédiction phonétique mise en œuvre cette fois-ci est illustrée dans la figure ci-dessous. Les composants du réseau neuronal récursif sont LSTM [2], et un modèle bidirectionnel [3] qui connecte les sorties avant et arrière.

ctcr.png

Dans chaque couche, appliquez la normalisation de couche [[4]](# référence) à l'avant et à l'arrière respectivement, puis connectez et établissez une connexion résiduelle [[5]](# référence), et créez une étiquette phonétique à la dernière connexion complète. Prédire

Paramètres en formation

Pour la valeur initiale de chaque paramètre, nous avons utilisé la distribution uniforme de Glorot [6].

Nous avons utilisé la classification temporelle connexionniste [7] pour la fonction de perte.

Adam [8] a été utilisé comme algorithme d'optimisation. Les hyperparamètres d'Adam $ \ beta_1 $ sont définis sur 0.9 et $ \ beta_2 $ sont définis sur les valeurs par défaut CNTK.

Le taux d'apprentissage cyclique (CLR) [9] est adopté comme taux d'apprentissage, le taux d'apprentissage maximal est de 1e-3, le taux d'apprentissage de base est de 1e-5, la taille du pas est 10 fois le nombre d'époques, La politique a été définie sur triangulaire2.

Comme mesure contre le surapprentissage, j'ai appliqué Dropout [10] à 0,1 avant la connexion résiduelle.

La formation du modèle a effectué 100 Epoch par mini-formation par lots.

la mise en oeuvre

Environnement d'exécution

Matériel

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

Logiciel

・ Windows 10 Professionnel 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

Programme à exécuter

Le programme de formation est disponible sur GitHub.

ctcr_training.py


Commentaire

Je compléterai le contenu requis pour cette implémentation.

Connectionist Temporal Classification En reconnaissance vocale, le nombre de trames de données vocales et le nombre de phonèmes que vous souhaitez prédire sont souvent différents. Dans un tel cas, il n'y a pas de correspondance biunivoque entre la sortie RNN et les données de réponse correctes.

Par conséquent, en introduisant _ comme un caractère vide, les données de réponse correctes aoi suivent le chemin de la flèche comme indiqué dans la figure ci-dessous, et correspondent à la longueur avec le nombre d'images comme indiqué dans \ _ \ _ a_o_ \ _ i_.

ctc.png

La classification temporelle connexionniste (CTC) entraîne les paramètres selon l'estimation la plus probable et calcule la probabilité d'un itinéraire qui donne une série de données correctes comme indiqué dans la figure ci-dessus. En supposant que la série de données d'entrée est $ x $ et que la série de données correcte est $ l $, la fonction de perte est définie par la formule suivante.

Loss = - \log p(l|x)

Cependant, il existe de nombreuses combinaisons d'itinéraires pour calculer la fonction de perte. Par conséquent, il est efficacement calculé à l'aide d'un algorithme avant-arrière basé sur la méthode de planification dynamique.

Ici, comme le montre la figure ci-dessous, la somme des probabilités de $ \ pi $, qui est un ensemble de routes qui atteignent la série $ s $ au temps $ t $, est appelée probabilité avant et est exprimée par la formule suivante.

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

ctc_forward.png

Cette probabilité positive $ \ alpha_t (s) $ peut être calculée de manière récursive et efficace sur la base du concept de planification dynamique.

\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.

De même, la probabilité de retour $ \ beta_t (i) $ comme indiqué ci-dessous est définie comme suit.

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

ctc_backward.png

Cette probabilité descendante $ \ beta $ peut être calculée récursivement et efficacement de la même manière que la probabilité avant $ \ alpha $.

\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.

Ensuite, la probabilité dans toutes les routes est $ \ alpha_t (s) \ beta_t (s) $, et la fonction de perte est la suivante.

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

Modification de la distance

Cette fois, j'ai utilisé la distance d'édition comme indice d'évaluation des performances du modèle. La distance d'édition, également appelée distance de Levenstein, est le nombre minimal d'opérations d'insertion, de suppression et de remplacement.

A titre d'exemple, la distance d'édition entre la chaîne akai et la chaîne aoi est

・ Supprimer k d'akai -Remplacer a dans aai par o

Est obtenu par l'opération. La distance d'édition peut être calculée à l'aide d'un tableau avec un caractère vide ajouté au début comme indiqué ci-dessous.

edit_distance_0.png

Tout d'abord, recherchez les distances de modification pour la première ligne et la première colonne comme indiqué par la flèche bleue dans la figure ci-dessous. Cela équivaut au caractère vide _ et à la longueur de la chaîne à chaque instant.

Ensuite, entrez la plus petite valeur de l'une des valeurs suivantes dans l'ordre en haut à gauche, comme indiqué par la flèche verte.

・ Une valeur plus un ・ Un à gauche plus un -La valeur en haut à gauche plus 1 (cependant, si les caractères dans les directions de ligne et de colonne sont les mêmes, 1 n'est pas ajouté)

edit_distance_1.png

Et la valeur affichée en rouge en bas à droite est la distance d'édition à calculer.

résultat

Training loss and error La figure ci-dessous est une visualisation de la fonction de perte et des journaux de taux de fausse reconnaissance pendant l'entraînement. Le graphique de gauche montre la fonction de perte, le graphique de droite montre la distance d'édition, l'axe horizontal montre le nombre d'époques et l'axe vertical montre la valeur et la distance d'édition de la fonction de perte, respectivement.

atr503_logging.png

Validation error Lorsque la performance a été évaluée à l'aide des données de vérification séparées lors de la préparation des données de la partie 1, les résultats suivants ont été obtenus.

Validation Error 40.31%

Prédiction des phonèmes pour les données vocales parlées

Le résultat de la prédiction phonétique de la voix enregistrée de sa propre parole est présenté ci-dessous. L'énoncé était un "bonjour".

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

Puisque l'élément phonétique est sorti trame par trame pendant l'inférence, le résultat de la prédiction d'élément phonétique est le résultat de la suppression de la redondance des éléments phonétiques continus et du caractère vide _.

Les voyelles semblent presque correctes, mais les consonnes ne semblent pas fonctionner sauf pour «ch».

référence

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", Actes de la Conférence nationale de la Society of Artificial Intelligence 0 (2002): pp. 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

Reconnaissance vocale: Prédiction phonémique Partie 2 - Classification temporelle connectionniste RNN
Reconnaissance vocale: Prédiction de phonèmes Part1 - Ensemble de données de la parole ATR
Reconnaissance vocale: Classification des genres - Partie 1 - Collections de genres du GTZAN
Reconnaissance vocale: Classification des genres Part2-Classification des genres musicaux CNN