Le deep learning est largement utilisé dans diverses tâches quotidiennes, notamment dans les domaines impliquant un certain degré « d'humanité », comme la reconnaissance d'images. Contrairement à d’autres algorithmes d’apprentissage automatique, la caractéristique la plus importante des réseaux profonds est que leurs performances peuvent continuer à s’améliorer à mesure que davantage de données sont obtenues. Par conséquent, si davantage de données sont disponibles, les performances attendues deviennent meilleures.
L'une des tâches pour lesquelles les réseaux profonds sont les meilleurs est la traduction automatique. Actuellement, il s’agit de la technologie la plus avancée capable d’accomplir cette tâche et elle est suffisamment réalisable pour que même Google Translate l’utilise. Dans la traduction automatique, des données parallèles au niveau des phrases sont nécessaires pour entraîner le modèle, c'est-à-dire que pour chaque phrase dans la langue source, il doit s'agir de la langue traduite dans la langue cible. Il n'est pas difficile d'imaginer pourquoi cela poserait un problème. Car, pour certaines paires de langues, il est difficile d’obtenir de grandes quantités de données (d’où la possibilité de recourir au deep learning).
Comment cet article est construit
Cet article est basé sur un article récent publié par Facebook intitulé "Traduction automatique non supervisée utilisant uniquement des corpus monolingues". Cet article ne suit pas complètement la structure de l'article. J'ai ajouté certaines de mes propres interprétations pour rendre l'article plus compréhensible.
La lecture de cet article nécessite quelques connaissances de base sur les réseaux de neurones, comme les fonctions de perte, les auto-encodeurs, etc.
Problèmes liés à la traduction automatique
Comme mentionné ci-dessus, le plus gros problème lié à l'utilisation des réseaux de neurones dans la traduction automatique est qu'ils nécessitent un ensemble de données de paires de phrases dans deux langues. Cela fonctionne pour les langues largement parlées telles que l'anglais et le français, mais pas pour les paires de phrases dans d'autres langues. Si la langue est disponible sur les données, cela devient alors une tâche supervisée.
Solution
Les auteurs de cet article ont compris comment convertir cette tâche en une tâche non supervisée. La seule chose requise dans cette tâche est deux corpus dans chacune des deux langues, comme n'importe quel roman en anglais et n'importe quel roman en espagnol. Une chose à noter est que les deux romans ne sont pas nécessairement identiques.
De la perspective la plus intuitive, l'auteur a découvert comment apprendre un espace latent entre deux langues.
Présentation des auto-encodeurs
Les auto-encodeurs sont une vaste classe de réseaux neuronaux utilisés pour des tâches non supervisées. Cela fonctionne en recréant une entrée identique à l’entrée d’origine. La clé pour y parvenir est une couche réseau au milieu du réseau appelée couche de goulot d’étranglement. Cette couche réseau est utilisée pour capturer toutes les informations utiles sur l'entrée et supprimer les informations inutiles.
Auto-encodeur conceptuel, le module intermédiaire est la couche de goulot d'étranglement qui stocke la représentation compressée
En bref, dans la couche de goulot d'étranglement, l'entrée dans la couche de goulot d'étranglement (L'espace maintenant transformé par l'encodeur) est appelé espace latent.
Débruitage des encodeurs automatiques
Si un encodeur automatique est formé pour reconstruire l'entrée exactement telle qu'elle a été entrée, il se peut qu'il ne puisse rien faire. Dans ce cas, la sortie sera parfaitement reconstruite, mais sans aucune fonctionnalité utile dans la couche de goulot d'étranglement. Pour résoudre ce problème, nous utilisons un auto-encodeur à débruitage. Premièrement, l’entrée réelle est légèrement perturbée par l’ajout d’un peu de bruit. Le réseau est ensuite utilisé pour reconstruire l'image originale (et non la version bruitée). De cette façon, en apprenant ce qu’est le bruit (et quelles sont ses fonctionnalités réellement utiles), le réseau peut apprendre les fonctionnalités utiles de l’image.
Un exemple conceptuel d'un auto-encodeur débruitant. Utilisez un réseau de neurones pour reconstruire l’image de gauche et générer l’image de droite. Dans ce cas, les neurones verts forment ensemble la couche de goulot d'étranglement
Pourquoi apprendre un espace latent commun ?
L'espace latent peut capturer les caractéristiques des données (dans notre exemple, les données sont des phrases). Donc, s'il est possible d'obtenir un espace qui, lorsqu'il est entré dans la langue A, produit les mêmes caractéristiques que l'entrée dans la langue B, alors il nous est possible de traduire entre eux. Puisque le modèle possède déjà les "fonctionnalités" correctes, il est codé par l'encodeur de la langue A et décodé par le décodeur de la langue B, ce qui permettra aux deux d'effectuer un travail de traduction efficace.
Peut-être, comme vous pourriez le penser, l'auteur utilise un auto-encodeur débruitant pour apprendre un espace de fonctionnalités. Ils ont également découvert comment faire en sorte que l'auto-encodeur apprenne un espace latent commun (qu'ils appellent un espace latent aligné) pour effectuer une traduction automatique non supervisée.
Auto-encodeurs de débruitage dans le langage
Les auteurs utilisent des encodeurs de débruitage pour apprendre des fonctionnalités de manière non supervisée. La fonction de perte qu'ils ont définie est :
Équation 1.0 Fonction de perte du codeur à débruitage automatique
Interprétation de l'équation 1.0
I est la langue (pour ce paramètre, il peut y avoir deux langues). X est l'entrée et C(x) est le résultat après avoir ajouté du bruit à x. Nous obtiendrons bientôt la fonction C créée par le bruit. e() est l'encodeur et d() est le décodeur. Le dernier terme Δ(x hat,x) est la somme des valeurs d'erreur d'entropie croisée au niveau du jeton. Puisque nous avons une séquence d’entrée et que nous obtenons une séquence de sortie, nous voulons nous assurer que chaque jeton est dans le bon ordre. C’est pourquoi cette fonction de perte est utilisée. Nous pouvons y voir une classification multi-étiquettes, où l'étiquette de la ième entrée est comparée à la ième étiquette de sortie. Parmi eux, le jeton est une unité de base qui ne peut plus être détruite. Dans notre exemple, le jeton est un mot. L'équation 1.0 est une fonction de perte qui amène le réseau à minimiser la différence entre la sortie (lorsqu'il reçoit une entrée bruyante) et la phrase originale non affectée. La représentation symbolique de
□ avec ~
□ est la représentation que l'on attend, ce qui signifie dans ce cas que la distribution de l'entrée dépend de la langue l, et la moyenne de la perte est pris. Ceci est juste une forme mathématique, la perte réelle pendant l'opération (la somme de l'entropie croisée) sera comme d'habitude.
Ce symbole spécial ~ signifie "à partir d'une distribution de probabilité".
Nous n'aborderons pas ce détail dans cet article. Vous pouvez en apprendre davantage sur ce symbole dans le chapitre 8.1 de l'article Deep Learning Book.
Comment ajouter du bruit
Pour les images, vous pouvez ajouter du bruit en ajoutant simplement des nombres à virgule flottante aux pixels, mais pour les langues, vous devez utiliser d'autres méthodes. Les auteurs ont donc développé leur propre système pour créer du bruit. Ils désignent leur fonction de bruit par C(). Il prend une phrase en entrée et génère une version bruyante de la phrase.
Il existe deux manières différentes d'ajouter du bruit.
Tout d'abord, on peut simplement supprimer un mot de l'entrée avec la probabilité P_wd.
Deuxièmement, chaque mot peut être décalé de sa position d'origine en utilisant la contrainte suivante :
σ représente le i-ième Le position décalée du marqueur. Par conséquent, l'équation 2.0 signifie : "Un jeton peut se déplacer jusqu'à k positions de jeton vers la gauche ou la droite"
L'auteur fixe la valeur K à 3 et la valeur P_wd à 1 .
Formation inter-domaines
Afin d'apprendre la traduction entre deux langues, la phrase d'entrée (langue A) doit être mappée à la phrase de sortie (langue B) via un certain traitement. L'auteur appelle ce processus la formation interdomaine. Tout d’abord, la phrase d’entrée (x) est échantillonnée. Ensuite, le modèle de l'itération précédente (M()) est utilisé pour générer la sortie traduite (y). En les mettant ensemble, nous obtenons y=M(x). Par la suite, la même fonction de bruit C() ci-dessus est utilisée pour interférer avec y, et C(y) est obtenu. L'encodeur du langage A encode cette version perturbée, et le décodeur du langage B décode la sortie de l'encodeur du langage A et reconstruit une version propre de C(y). Le modèle est entraîné en utilisant la même somme de valeurs d'erreur d'entropie croisée que dans l'équation 1.0.
Apprendre un espace latent commun à l'aide d'un entraînement contradictoire
Jusqu'à présent, il n'y a aucune mention de la façon d'apprendre un espace latent commun. La formation inter-domaines mentionnée ci-dessus permet d'apprendre un espace similaire, mais une contrainte plus forte est nécessaire pour pousser le modèle à apprendre un espace latent similaire.
L'auteur utilise une formation contradictoire. Ils ont utilisé un autre modèle (appelé discriminateur) qui prenait la sortie de chaque encodeur et prédisait à quelle langue appartenaient les phrases codées. Ensuite, les gradients sont extraits du discriminateur et l'encodeur est entraîné à tromper le discriminateur. Ce n'est conceptuellement pas différent d'un GAN (Generative Adversarial Network) standard. Le discriminateur reçoit le vecteur de caractéristiques à chaque pas de temps (car un RNN est utilisé) et prédit de quelle langue il provient.
En les combinant
En ajoutant les 3 pertes différentes ci-dessus (perte de l'auto-encodeur, perte de traduction et perte du discriminateur), les poids de tous les modèles sont mis à jour simultanément.
Comme il s'agit d'un problème de séquence à séquence, l'auteur utilise un réseau de mémoire à long terme (LSTM). Il convient de noter qu'il existe deux auto-encodeurs basés sur LSTM, un pour chaque langue. .
À haut niveau, la formation de cette architecture nécessite trois étapes principales. Ils suivent un processus de formation itératif. Le processus de boucle de formation ressemble un peu à ceci :
1. Obtenez la traduction en utilisant l'encodeur pour la langue A et le décodeur pour la langue B.
2. Entraînez chaque auto-encodeur pour qu'il soit capable de régénérer une phrase non corrompue lorsqu'on lui donne une phrase corrompue.
3. Améliorez la traduction et recréez-la en détruisant la traduction obtenue à l'étape 1. Pour cette étape, l'encodeur de la langue A est entraîné avec le décodeur de la langue B (l'encodeur de la langue B est entraîné avec le décodeur de la langue A).
Il est à noter que même si les étapes 2 et 3 sont répertoriées séparément, les poids seront mis à jour ensemble.
Comment démarrer ce framework
Comme mentionné ci-dessus, le modèle utilise ses propres traductions des itérations précédentes pour améliorer ses capacités de traduction. Il est donc important d’avoir quelques compétences en traduction avant de commencer le processus de recyclage. L'auteur utilise FastText pour apprendre des dictionnaires bilingues au niveau des mots. Notez que cette méthode est très simple et nécessite uniquement de donner un point de départ au modèle.
L'ensemble du cadre est donné dans l'organigramme ci-dessous
Le travail de haut niveau de l'ensemble du cadre de traduction
Cet article explique une méthode qui permet de nouvelles techniques pour effectuer des tâches de traduction automatique non supervisées. Il utilise plusieurs pertes différentes pour améliorer une seule tâche tout en utilisant une formation contradictoire pour imposer des contraintes sur le comportement de l'architecture.