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é.
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).
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.
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
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.
・ Processeur Intel (R) Core (TM) i7-7700 3,60 GHz ・ GPU NVIDIA Quadro P4000 8 Go
・ 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
Le programme de formation est disponible sur GitHub.
ctcr_training.py
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_.
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
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
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)
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.
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é)
Et la valeur affichée en rouge en bas à droite est la distance d'édition à calculer.
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.
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%
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».
CNTK 208: Training Acoustic Model with Connectionist Temporal Classification (CTC) Criteria
Speech Recognition : Phoneme Prediction Part1 - ATR503 Speech dataset
Recommended Posts