TaatikNet Apprentissage de séquence à séquence pour la translittération de l’hébreu
TaatikNet Sequence-to-Sequence Learning for Hebrew Transliteration.
Une démonstration simple de l’apprentissage seq2seq au niveau des caractères appliqué à une tâche complexe : conversion entre le texte hébreu et la translittération latine

Cet article décrit TaatikNet et comment implémenter facilement des modèles seq2seq. Pour le code et la documentation, consultez le référentiel GitHub de TaatikNet. Pour une démonstration interactive, consultez TaatikNet sur HF Spaces.
Introduction
De nombreuses tâches d’intérêt en NLP impliquent la conversion entre des textes de styles, de langues ou de formats différents :
- Traduction automatique (par exemple, de l’anglais vers l’allemand)
- Résumé de texte et reformulation (par exemple, d’un texte long à un texte court)
- Correction d’orthographe
- Réponse abstraite à une question (entrée : contexte et question, sortie : texte de la réponse)
Ces tâches sont collectivement connues sous le nom d’apprentissage séquence à séquence (Seq2seq). Dans toutes ces tâches, l’entrée et la sortie souhaitée sont des chaînes de caractères, qui peuvent avoir des longueurs différentes et qui ne sont généralement pas en correspondance biunivoque l’une avec l’autre.
Supposons que vous disposez d’un ensemble de données d’exemples associés (par exemple, des listes de phrases et de leurs traductions, de nombreux exemples de textes mal orthographiés et corrigés, etc.). De nos jours, il est assez facile d’entraîner un réseau neuronal sur ces exemples tant qu’il y a suffisamment de données pour que le modèle puisse apprendre à généraliser à de nouvelles entrées. Voyons comment entraîner des modèles seq2seq avec un effort minimal, en utilisant PyTorch et la bibliothèque transformers de Hugging Face.
- Rencontrez ChatGLM2-6B La deuxième version du modèle de discussion open-source bilingue (chinois-anglais) ChatGLM-6B.
- Transformer l’entraînement spécialisé de l’IA – Découvrez LMFlow Une boîte à outils prometteuse pour affiner et personnaliser efficacement de grands modèles fondamentaux afin d’obtenir des performances supérieures.
- Une introduction à l’ingénierie de prompts
Nous nous concentrerons sur un cas d’utilisation particulièrement intéressant : apprendre à convertir entre le texte hébreu et la translittération latine. Nous donnerons un aperçu de cette tâche ci-dessous, mais les idées et le code présentés ici sont utiles au-delà de ce cas particulier – ce tutoriel devrait être utile à toute personne souhaitant effectuer un apprentissage seq2seq à partir d’un ensemble d’exemples.
Notre tâche : la translittération hébraïque
Afin de démontrer l’apprentissage seq2seq avec un cas d’utilisation intéressant et assez nouveau, nous l’appliquons à la translittération. En général, la translittération consiste à convertir entre différents systèmes d’écriture. Alors que l’anglais est écrit avec l’alphabet latin (“ABC…”), les langues du monde utilisent de nombreux systèmes d’écriture différents, comme illustré ci-dessous :

Que faire si nous voulons utiliser l’alphabet latin pour écrire un mot d’une langue initialement écrite dans un autre système d’écriture ? Ce défi est illustré par les nombreuses façons d’écrire le nom de la fête juive de Hanoucca. L’introduction actuelle de l’article Wikipédia la concernant se lit comme suit :
Hanoucca ( /ˈhɑːnəkə/ ; hébreu : חֲנֻכָּה, moderne : Ḥanukka, tibérien : Ḥănukkā) est une fête juive commémorant la récupération de Jérusalem et la réinauguration subséquente du Second Temple au début de la révolte des Maccabées contre l’Empire séleucide au IIe siècle avant notre ère.
Le mot hébreu חֲנֻכָּה peut être translittéré en alphabet latin comme Hanoucca, Hanouka, Hanoukkah, Ḥanukka ou beaucoup d’autres variantes. En hébreu ainsi que dans de nombreux autres systèmes d’écriture, il existe différentes conventions et ambiguïtés qui rendent la translittération complexe et non une simple correspondance biunivoque entre les caractères.
Dans le cas de l’hébreu, il est largement possible de translittérer le texte avec des nikkud (signes de voyelles) en caractères latins en utilisant un ensemble complexe de règles, bien qu’il existe plusieurs cas particuliers qui rendent cela de manière trompeusement complexe. De plus, essayer de translittérer du texte sans signes de voyelles ou d’effectuer la correspondance inverse (par exemple, Chanukah → חֲנֻכָּה) est beaucoup plus difficile car il existe de nombreuses sorties valides possibles.
Heureusement, grâce à l’apprentissage profond appliqué à des données existantes, nous pouvons faire de grands progrès pour résoudre ce problème avec seulement une quantité minimale de code. Voyons comment nous pouvons former un modèle seq2seq – TaatikNet – pour apprendre à convertir entre du texte hébreu et de la translittération latine de manière autonome. Nous notons que c’est une tâche au niveau des caractères car cela implique de raisonner sur les corrélations entre différents caractères dans le texte hébreu et les translittérations. Nous discuterons de la signification de cela plus en détail ci-dessous.
À titre d’information, vous avez peut-être entendu parler de UNIKUD, notre modèle pour ajouter des points de voyelles à du texte hébreu non vocalisé. Il y a quelques similitudes entre ces tâches, mais la différence clé est que UNIKUD effectuait une classification au niveau des caractères, où pour chaque caractère, nous apprenions s’il fallait insérer un ou plusieurs symboles de voyelles adjacents. En revanche, dans notre cas, les textes d’entrée et de sortie peuvent ne pas correspondre exactement en termes de longueur ou d’ordre en raison de la nature complexe de la translittération, c’est pourquoi nous utilisons ici l’apprentissage seq2seq (et non seulement une classification par caractère).
Collecte de données
Comme pour la plupart des tâches d’apprentissage automatique, nous avons de la chance si nous pouvons collecter de nombreux exemples d’entrées et de sorties souhaitées de notre modèle, afin de pouvoir l’entraîner en utilisant l’apprentissage supervisé.
Pour de nombreuses tâches concernant des mots et des phrases, une excellente ressource est le Wiktionnaire et ses homologues multilingues – pensez à Wikipedia rencontre dictionnaire. En particulier, le Wiktionnaire hébreu (ויקימילון) contient des entrées avec des informations grammaticales structurées comme indiqué ci-dessous:

En particulier, cela inclut la translittération latine ( agvani ya , où le gras indique le stress). Avec les titres de section contenant des nikkud (caractères de voyelles), cela nous donne les données (librement autorisées) dont nous avons besoin pour former notre modèle.
Pour créer un ensemble de données, nous extrayons ces éléments à l’aide de l’API REST de Wikimedia (exemple ici). Veuillez noter que les textes d’origine dans les entrées Wiktionnaire ont des licences permissives pour les travaux dérivés (licences CC et GNU, détails ici) et nécessitent une licence de partage équitable (licence TaatikNet ici); en général, si vous effectuez une extraction de données, assurez-vous d’utiliser des données sous licence de manière permissive, de les extraire correctement et d’utiliser la licence correcte pour votre travail dérivé.
Nous effectuons diverses étapes de prétraitement sur ces données, notamment:
- Suppression des balises Wiki et des métadonnées
- Remplacement de la mise en gras pour représenter le stress par des accents aigus (par exemple, agvani ya → agvaniyá)
- Normalisation Unicode NFC pour unifier les glyphes apparaissant de manière identique, tels que בּ (U+05D1 Letter Bet hébreu + U+05BC Mapiq ou Dagesh hébreu) et בּ (U+FB31 Letter Bet hébreu avec Dagesh). Vous pouvez les comparer vous-même en les copiant-collant dans l’outil Show Unicode Character . Nous unifions également les signes de ponctuation apparaissant de manière similaire, tels que le geresh hébreu (׳) et l’apostrophe (’).
- Division des expressions de plusieurs mots en mots individuels.
Après l’extraction de données et le prétraitement, il nous reste près de 15 000 paires de mots-translittérations (fichier csv disponible ici). Quelques exemples sont présentés ci-dessous:

Les translittérations ne sont en aucun cas cohérentes ou exemptes d’erreurs ; par exemple, le stress est marqué de manière incohérente et souvent incorrecte, et différentes conventions orthographiques sont utilisées (par exemple, ח peut correspondre à h, kh ou ch). Au lieu d’essayer de les nettoyer, nous les soumettrons directement au modèle et le laisserons les interpréter par lui-même.
Entraînement
Maintenant que nous avons notre ensemble de données, passons à l’essentiel de notre projet – l’entraînement d’un modèle seq2seq sur nos données. Nous appelons le modèle final TaatikNet d’après le mot hébreu תעתיק taatik qui signifie “translittération”. Nous décrirons ici l’entraînement de TaatikNet de manière générale, mais nous vous recommandons vivement de consulter le notebook d’entraînement annoté. Le code d’entraînement lui-même est assez court et instructif.
Pour obtenir des résultats de pointe sur les tâches de TAL, un paradigme courant consiste à prendre un réseau neural transformer pré-entraîné et à appliquer l’apprentissage par transfert en continuant à le fine-tuner sur un ensemble de données spécifique à la tâche. Pour les tâches seq2seq, le choix le plus naturel de modèle de base est un modèle encodeur-décodeur (enc-dec). Les modèles enc-dec courants tels que T5 et BART sont excellents pour les tâches seq2seq courantes telles que la synthèse de texte, mais parce qu’ils tokenisent le texte (le divisent en sous-tokens, approximativement des mots ou des groupes de mots), ils sont moins appropriés pour notre tâche qui nécessite un raisonnement au niveau des caractères individuels. Pour cette raison, nous utilisons le modèle enc-dec ByT5 sans tokenizer (article, page du modèle HF), qui effectue des calculs au niveau des octets individuels (approximativement des caractères, mais reportez-vous à l’excellent article de Joel Spolsky sur Unicode et les jeux de caractères pour une meilleure compréhension de la manière dont les glyphes Unicode sont mappés sur des octets).
Nous créons d’abord un objet Dataset PyTorch pour encapsuler nos données d’entraînement. Nous pourrions simplement envelopper les données de notre fichier csv de jeu de données sans les modifier, mais nous ajoutons quelques augmentations aléatoires pour rendre la procédure d’entraînement du modèle plus intéressante :
def __getitem__(self, idx): row = self.df.iloc[idx] out = {} if np.random.random() < 0.5: out['input'] = row.word if np.random.random() < 0.2 else row.nikkud out['target'] = row.transliteration else: out['input'] = randomly_remove_accent(row.transliteration, 0.5) out['target'] = row.nikkud return out
Cette augmentation apprend à TaatikNet à accepter soit l’écriture hébraïque soit l’écriture latine en tant qu’entrée et à calculer la sortie correspondante. Nous supprimons également de manière aléatoire des signes de voyelle ou des accents pour entraîner le modèle à être robuste à leur absence. En général, l’augmentation aléatoire est une astuce intéressante lorsque vous souhaitez que votre réseau apprenne à gérer différents types d’entrées sans calculer toutes les entrées et sorties possibles à partir de votre jeu de données à l’avance.
Nous chargeons le modèle de base avec l’API de pipeline de Hugging Face en utilisant une seule ligne de code :
pipe = pipeline("text2text-generation", model='google/byt5-small', device_map='auto')
Après avoir géré la mise en correspondance des données et défini les hyperparamètres (nombre d’époques, taille du lot, taux d’apprentissage), nous entraînons notre modèle sur notre ensemble de données et affichons certains résultats sélectionnés après chaque époque. La boucle d’entraînement est standard PyTorch, à l’exception de la fonction evaluate(…)
que nous définissons ailleurs et qui affiche les prédictions actuelles du modèle sur différentes entrées :
for i in trange(epochs): pipe.model.train() for B in tqdm(dl): optimizer.zero_grad() loss = pipe.model(**B).loss losses.append(loss.item()) loss.backward() optimizer.step() evaluate(i + 1)
Comparez certains résultats des premières époques et à la fin de l’entraînement :
Époque 0 avant l'entraînement : kokoro => okoroo-oroa-oroa-oroa-oroa-oroa-oroa-oroa-oroa-oroa-oroa-oroa-oroa-oroa-oroa-oroa-oroa-oroa-oÉpoque 0 avant l'entraînement : יִשְׂרָאֵל => אלאלאלאלאלאלאלאלאלאלאלאלאלאלאלאלאלאלאלאלאלאלאלאלאÉpoque 0 avant l'entraînement : ajiliti => ajabiliti siti siti siti siti siti siti siti siti siti siti siti siti siti siti siti siti siti sitÉpoque 1 : kokoro => מְשִׁיתÉpoque 1 : יִשְׂרָאֵל => maráÉpoque 1 : ajiliti => מְשִׁיתÉpoque 2 : kokoro => כּוֹקוֹרְבּוֹרוֹרÉpoque 2 : יִשְׂרָאֵל => yishishálÉpoque 2 : ajiliti => אַדִּיטִיÉpoque 5 : kokoro => קוֹקוֹרוֹÉpoque 5 : יִשְׂרָאֵל => yisraélÉpoque 5 : ajiliti => אֲגִילִיטִיÉpoque 10 après l'entraînement : kokoro => קוֹקוֹרוֹÉpoque 10 après l'entraînement : יִשְׂרָאֵל => yisraélÉpoque 10 après l'entraînement : ajiliti => אָגִ'ילִיטִי
Avant l’apprentissage, le modèle produit des absurdités, comme prévu. Pendant l’apprentissage, nous constatons que le modèle apprend d’abord comment construire des textes hébreux et des translittérations qui semblent valides, mais met plus de temps à apprendre la connexion entre eux. Il met également plus de temps à apprendre des éléments rares tels que ג׳ (gimel + geresh) correspondant à j.
Un avertissement : nous n’avons pas essayé d’optimiser la procédure d’apprentissage ; les hyperparamètres ont été choisis de manière plutôt arbitraire, et nous n’avons pas réservé de jeux de validation ou de tests pour une évaluation rigoureuse. Le but était seulement de fournir un exemple simple d’apprentissage seq2seq et une preuve de concept pour l’apprentissage des translittérations ; cependant, l’ajustement des hyperparamètres et l’évaluation rigoureuse seraient une direction prometteuse pour les travaux futurs, ainsi que les points mentionnés dans la section des limitations ci-dessous.
Résultats
Quelques exemples sont présentés ci-dessous, démontrant la conversion entre du texte hébreu (avec ou sans voyelles) et une translittération latine, dans les deux sens. Vous pouvez essayer de jouer avec TaatikNet vous-même dans la démonstration interactive sur HF Spaces. Notez qu’il utilise une recherche par faisceau (5 faisceaux) pour le décodage et l’inférence est exécutée sur chaque mot séparément.


Limitations et Perspectives futures
Pour simplifier, nous avons implémenté TaatikNet en tant que modèle seq2seq minimal sans réglage approfondi. Cependant, si vous souhaitez améliorer les résultats de la conversion entre du texte hébreu et une translittération, il existe de nombreuses perspectives prometteuses pour les travaux futurs :
- TaatikNet essaie seulement de deviner l’orthographe appropriée (en hébreu ou en translittération latine) en se basant sur des correspondances de lettres ou de sons. Cependant, vous pourriez vouloir convertir de la translittération à un texte hébreu valide en fonction du contexte (par exemple, zot dugma → זאת דוגמא plutôt que l’orthographe incorrecte *זות דוגמע). Des moyens possibles pour y parvenir pourraient inclure une génération augmentée par récupération (accès à un dictionnaire) ou l’apprentissage sur des paires de phrases hébraïques et de leurs translittérations latines afin d’apprendre des indices contextuels.
- Des entrées d’une forme inhabituelle peuvent entraîner une boucle infinie dans le décodage de TaatikNet, par exemple, drapapap → דְּרַפָּפָּאפָּאפָּאפָּאפָּאפָּאפָּאפָּאפָּאפָּאפָּאפָּאפָּאפָּאפָּאפָּאפָּאפָּאפָּאפָּאפָּאפָּאפָּאפָּאפָּאפָּאפָּאפָּ. Cela pourrait être résolu par l’augmentation pendant l’apprentissage, des données d’apprentissage plus diversifiées, ou en utilisant la cohérence cyclique dans l’apprentissage ou le décodage.
- TaatikNet peut ne pas gérer certaines conventions assez rares dans ses données d’apprentissage. Par exemple, il ne gère souvent pas correctement ז׳ (zayin+geresh), qui indique le son étranger rare zh. Cela peut indiquer un sous-apprentissage ou que l’utilisation de poids d’échantillon pendant l’apprentissage serait utile pour mettre l’accent sur les exemples difficiles.
- La simplicité de l’apprentissage seq2seq se fait au détriment de l’interprétabilité et de la robustesse – nous aimerions savoir exactement comment TaatikNet prend ses décisions et nous assurer qu’elles sont appliquées de manière cohérente. Une extension possible intéressante consisterait à distiller ses connaissances dans un ensemble de conditions basées sur des règles (par exemple, si le caractère X est vu dans le contexte Y, alors écrire Z). Les LLM pré-entraînés récemment pourraient être utiles à cet égard.
- Nous ne gérons pas l’« orthographe complète » et l’« orthographe défective » (כתיב מלא / חסר), où les mots hébreux sont légèrement orthographiés différemment lorsqu’ils sont écrits avec ou sans signes de voyelles. Idéalement, le modèle devrait être entraîné sur des orthographes « complètes » sans voyelles et des orthographes « défectives » avec voyelles. Voir UNIKUD pour une approche de gestion de ces orthographes dans les modèles entraînés sur du texte hébreu.
Si vous essayez ces idées ou d’autres et que vous constatez qu’elles conduisent à une amélioration, je serais très intéressé d’en entendre parler et de vous donner crédit ici – n’hésitez pas à me contacter via mes coordonnées ci-dessous cet article.
Conclusion
Nous avons vu qu’il est assez facile de former un modèle seq2seq avec l’apprentissage supervisé – en lui enseignant à généraliser à partir d’un grand ensemble d’exemples appariés. Dans notre cas, nous avons utilisé un modèle au niveau des caractères (TaatikNet, affiné à partir du modèle de base ByT5), mais presque la même procédure et le même code pourraient être utilisés pour une tâche seq2seq plus standard telle que la traduction automatique.
J’espère que vous avez autant appris de ce tutoriel que moi en le réalisant ! N’hésitez pas à me contacter pour toute question, commentaire ou suggestion ; mes coordonnées se trouvent sur mon site web, lié ci-dessous.
Morris Alper, MSc est un doctorant à l’Université de Tel Aviv qui effectue des recherches sur l’apprentissage multimodal (traitement du langage naturel, vision par ordinateur et autres modalités). Veuillez consulter sa page web pour plus d’informations et ses coordonnées : https://morrisalp.github.io/
We will continue to update IPGirl; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- MosaicML vient de publier leur MPT-30B sous la licence Apache 2.0.
- Apprentissage des préférences avec rétroaction automatisée pour l’éviction du cache
- Types de fonctions d’activation dans les réseaux neuronaux
- Qu’est-ce que le Machine Learning en tant que Service ? Avantages et principales plateformes MLaaS
- Les GPU NVIDIA H100 établissent la norme pour l’IA générative dans le premier test de référence MLPerf.
- Des remèdes plus rapides Comment Insilico Medicine utilise l’IA générative pour accélérer la découverte de médicaments.
- La course pour éviter « le pire scénario pour l’apprentissage automatique »