Addestramento dei modelli di traduzione automatica

Addestramento dei modelli di traduzione automatica

Condividi con i tuoi amici...

La progettazione di algoritmi di traduzione automatica tra due lingue presenta numerose sfide, dovute principalmente alle complessità e alle differenze intrinseche delle lingue stesse. Ecco una panoramica dei principali problemi da affrontare e delle differenze linguistiche che creano difficoltà:

Ambiguità semantica

Le parole possono avere significati multipli a seconda del contesto. Ad esempio, la parola inglese “bank” può riferirsi sia a una banca che alla riva di un fiume.

Ambiguità sintattica

Le strutture grammaticali possono essere interpretate in modi diversi. Ad esempio, la frase “I saw the man with the telescope” può significare sia che io ho usato un telescopio per vedere l’uomo, sia che ho visto un uomo che aveva un telescopio.

Espressioni idiomatiche

L’espressione idiomatica “kick the bucket” significa “morire“. Questa espressione non ha un equivalente diretto in italiano. Una traduzione letterale (“calciare il secchio“) non ha senso e non trasmette il significato desiderato. In italiano, una traduzione culturalmente appropriata potrebbe essere “tirare le cuoia”.

Variazioni stilistiche e di registro

Le traduzioni devono mantenere il tono, lo stile e il registro del testo originale, che possono variare significativamente tra le lingue.

Riferimenti culturali

Alcuni termini e frasi possono avere riferimenti culturali specifici che non hanno un equivalente diretto nella lingua di destinazione. Per esempio in inglese, “Thanksgiving” è una festa molto specifica e culturalmente significativa negli Stati Uniti e in Canada, ma non ha un equivalente diretto in molte altre culture.

Morfologia complessa

Alcune lingue hanno sistemi morfologici complessi (ad esempio, il finlandese o l’ungherese) che richiedono un’analisi dettagliata delle variazioni delle parole. Il finlandese e l’ungherese sono noti per il loro complesso sistema di declinazione. Le parole cambiano forma a seconda del caso grammaticale e del numero.

Per esempio “talossa” significa “in the house.”

Forme diverse della parola “house” in finlandese:

Nominativo (singolare): talo (“house”)
Genitivo (singolare): talon (“of the house”)
Partitivo (singolare): taloa (“house” as an object)
Inessivo (singolare): talossa (“in the house”)

Forme diverse della parola “house” in ungherese:

Nominativo (singolare): ház (“house”)
Accusativo (singolare): házat (“house” as a direct object)
Dativo (singolare): háznak (“to the house”)
Superessivo (singolare): házon (“on the house”)
Inessivo (singolare): házban (“in the house”)

Concordanza grammaticale

Le regole di concordanza di genere, numero e caso possono variare ampiamente tra le lingue, creando difficoltà nella traduzione accurata delle frasi.

Ordine delle parole

L’ordine delle parole può variare tra le lingue. Ad esempio, l’inglese segue una struttura SVO (Soggetto-Verbo-Oggetto), mentre il giapponese segue una struttura SOV (Soggetto-Oggetto-Verbo).
Per esempio in italiano “Io leggo il libro” (SVO) si traduce in tedesco: “Ich weiß, dass ich das Buch lese.”

Ich (soggetto, “io”)
das Buch (oggetto, “il libro”)
lese (verbo, “leggo”)

In tedesco, nelle frasi principali l’ordine delle parole è SVO, simile all’italiano, ma nelle frasi subordinate, l’ordine diventa SOV. Ad esempio, nella frase subordinata “dass ich das Buch lese” (“che io leggo il libro”), l’ordine è Soggetto-Oggetto-Verbo.

Sistemi di scrittura diversi

Alcune lingue utilizzano alfabeti diversi (ad esempio, il cirillico per il russo, i caratteri cinesi per il cinese) o sistemi di scrittura non alfabetici, il che complica il processo di traduzione.

Lessico e semantica

Il vocabolario può differire notevolmente tra le lingue, con alcune parole che non hanno equivalenti diretti in altre lingue.

Sintassi e struttura della frase

Le regole sintattiche possono variare, e ciò che è una frase grammaticalmente corretta in una lingua potrebbe non esserlo in un’altra.

Pronomi e forme di Ccortesia

L’uso dei pronomi e le forme di cortesia possono differire. Ad esempio, il giapponese ha vari livelli di formalità che influenzano l’uso dei pronomi e dei suffissi.

Modi verbali

Alcune lingue utilizzano i verbi in modo molto diverso. Ad esempio, l’italiano ha molti modi e tempi verbali che non hanno equivalenti diretti in inglese.

Le soluzioni

Per affrontare le sfide nella traduzione automatica tra lingue, gli sviluppatori di algoritmi implementano vari accorgimenti e tecniche avanzate che abbiamo già conosciuto su HumAI.it.

I modelli come BERT (Bidirectional Encoder Representations from Transformers) permettono di tener conto del contesto delle parole in una frase grazie alla bidirezionalità del modello così da superare l’ambiguità semantica. Inoltre si applicano tecniche di disambiguazione del significato delle parole (Word Sense Disambiguation – WSD) per scegliere il significato corretto in base al contesto.

L’Applicazione di modelli seq2seq (sequence-to-sequence) con meccanismi di attenzione (attention mechanisms) permette di migliorare la comprensione delle relazioni tra le parole in una frase e superare l’ambiguità sintattica.

Le tecnologie più comuni impiegate per la traduzione sono già state approfondite su HumAI.it e sono:

Per la gestione delle espressioni Idiomatiche si creano dei database di espressioni idiomatiche e frasi fisse per identificare e tradurre correttamente tali espressioni senza una traduzione letterale.

Per garantire la concordanza grammaticale vengono integrate delle regole grammaticali all’interno dei modelli per assicurare che le traduzioni rispettino le concordanze di genere, numero e caso.
Durante lo sviluppo, si utilizzano metriche specifiche (come precision, recall, F1-score) per valutare quanto bene il modello rispetti le regole grammaticali. Errori grammaticali identificati vengono utilizzati per migliorare ulteriormente il modello, creando un ciclo di feedback continuo.

L’applicazione di tecniche di segmentazione e tokenizzazione che scompongono le parole nelle loro parti morfologiche per un’analisi più precisa permette di superare alcuni problemi legati alla morfologia complessa.

L’addestramento di un traduttore

Per addestrare un modello traduttore, le fasi principali possono essere ordinate come segue:

  • Raccolta dei dati (corpora paralelli)
  • Pre-elaborazione
  • Tokenizzazione
  • Backtranslation (aggiunta di dati sintetici)
  • Allineamento (miglioramento dei corpora paralelli)
  • Addestramento Encoder-Decoder
  • Valutazione e tuning

Raccolta dei dati

Si raccolgono corpora paralleli (coppie di frasi nelle due lingue) per addestrare il modello.

Pre-elaborazione

Si puliscono i dati, rimuovendo rumore e duplicati.

Tokenizzazione

Questa fase consiste nel suddividere il testo in unità più piccole chiamate token (parole, sottoparole o caratteri). La tokenizzazione è essenziale per trasformare il testo in una forma che il modello possa elaborare.

Ne abbiamo parlato in questo articolo
Normalizzazione, tokenizzazione e lemmatizzazione del testo

Prendiamo in considerazione la tokentizzazione WordPiece

Tokentizzazione WordPiece

WordPiece inizia con un vocabolario di caratteri unici, comprendente ogni singolo carattere presente nei dati di addestramento e un simbolo speciale per caratteri sconosciuti.

Viene avviato un ciclo:

Ad ogni iterazione, WordPiece calcola la frequenza di co-occorrenza di tutte le coppie di token (inizialmente singoli caratteri) nei dati di addestramento.

Seleziona la coppia di token con la frequenza di co-occorrenza più alta e li fonde in un nuovo token. Questo nuovo token viene aggiunto al vocabolario.

Questo processo viene ripetuto fino a raggiungere un vocabolario della dimensione desiderata, predefinita dall’utente (ad esempio, 30.000 token).

Quando un nuovo testo deve essere tokenizzato, viene suddiviso nei token presenti nel vocabolario WordPiece. Se una parola intera non è presente nel vocabolario, viene suddivisa nei token di sottoparole più grandi possibili presenti nel vocabolario.

Supponiamo di avere una parola “unhappiness”. Se il vocabolario di WordPiece contiene i token “un”, “##happy”, e “##ness”, la parola verrebbe suddivisa in:

"un"
"##happy"
"##ness"

Il simbolo “##” indica che il token è una continuazione di una parola precedente.

Backtranslation

Un testo originale in una lingua di partenza (L1) viene tradotto in una lingua di destinazione (L2) utilizzando un modello di traduzione automatica.

Esempio: Un testo in italiano (L1) viene tradotto in inglese (L2).

Il testo tradotto in L2 viene poi tradotto nuovamente in L1, utilizzando un altro modello di traduzione automatica o, idealmente, lo stesso modello che ha effettuato la traduzione di andata.

Esempio: Il testo tradotto in inglese (L2) viene tradotto nuovamente in italiano (L1)

Il testo risultante dalla traduzione inversa L1 viene confrontato con il testo originale in L1. Questo processo aiuta a identificare discrepanze e a migliorare i modelli di traduzione, permettendo di raffinare i dati di addestramento e di ottimizzare gli algoritmi.

La backtranslation è spesso utilizzata per creare nuovi esempi di dati sintetici che aiutano a diversificare e aumentare il dataset di addestramento di un modello. Ad esempio, a partire da un corpus in L1, si possono generare nuove coppie di frasi attraverso il processo di backtranslation, migliorando la robustezza del modello.

Supponiamo di avere la frase originale in italiano:

  • Originale (L1): “La tecnica di backtranslation è molto utile nel campo del NLP.”

La traduciamo in inglese:

  • Traduzione in L2: “The backtranslation technique is very useful in the field of NLP.”

Poi traduciamo la frase in inglese nuovamente in italiano:

  • Traduzione Inversa in L1: “La tecnica di traduzione inversa è molto utile nel campo del NLP.”

Confrontando il testo originale con quello tradotto inversamente, possiamo notare alcune differenze. Ad esempio, “backtranslation” è diventato “traduzione inversa”. Questo confronto può essere utilizzato per migliorare la terminologia e la coerenza del modello.

L’Allineamento

è necessario allineare le coppie di frasi nelle lingue di origine e di destinazione. Questo passaggio implica trovare corrispondenze tra le parole o frasi nelle due lingue. L’allineamento è cruciale per apprendere le corrispondenze tra le lingue.

Gli algoritmi di programmazione dinamica, come l’algoritmo di Viterbi o l’algoritmo di allineamento di sequenze l’algoritmo Needleman-Wunsch, vengono utilizzati per trovare il miglior allineamento possibile tra le frasi nelle due lingue. Questi algoritmi aiutano a determinare la sequenza ottimale di traduzioni parziali.

Vediamo come si può realizzare l’allineamento passo dopo passo.

Si impiegano spazi di embedding condivisi tra le lingue, dove frasi simili in lingue diverse sono vicine tra loro.

Ricordiamo che negli spazi di embedding monolingue, le parole di una singola lingua sono rappresentate da vettori in uno spazio multidimensionale. Due parole che sono semantica o sintatticamente simili avranno vettori vicini tra loro. Per esempio, in inglese, “cat” e “dog” potrebbero essere vicini nello spazio di embedding perché sono entrambi animali domestici. Questi spazi di embedding sono creati utilizzando tecniche di modellazione del linguaggio come Word2Vec, GloVe, o più recentemente, modelli basati su Transformer come BERT.

Parole con significati simili tendono ad avere vettori vicini. La struttura dello spazio di embedding consente di risolvere analogie (ad esempio, il vettore di “king” – “man” + “woman” sarà vicino al vettore di “queen”). Modelli avanzati come BERT producono embedding contestuali, dove la rappresentazione di una parola dipende dal contesto in cui appare.

Per ripassare l’argomento del Word embedding leggi l’articolo:
Word embedding e il modello Skip-gram

Che cosa succede in uno spazio di embedding bilingue?

Gli spazi di embedding tra lingue tendono a mantenere le relazioni semantiche all’interno di ciascuna lingua, ma oltre a ciò allineano i concetti equivalenti tra lingue diverse. Questi spazi sono costruiti in modo tale che parole o frasi con significati simili in lingue diverse abbiano rappresentazioni vettoriali molto vicine. Ad esempio, la parola “cat” in inglese e “gatto” in italiano avranno vettori vicini se rappresentano lo stesso concetto.

Se immaginassimo un grafico dove la vicinanza è rappresentata dalla distanza tra i punti:

cat” e “gatto” sarebbero praticamente sovrapposti o molto vicini.
cat” e “dog” sarebbero vicini in ragione del fatto che sono due animali domestici, ma non tanto quanto “cat” e “gatto”.
così anche “gatto” e “dog” avrebbero una relazione simile a “cat” e “dog”, ovvero vicini ma non tanto quanto “cat” “gatto” oppure “dog” e “cane”.

Per creare spazi di embedding si usano corpora bilingue o multilingue che contengono frasi, paragrafi o interi documenti che sono tradotti in una o più lingue. Un esempio famoso è il Corpus Europarl, che contiene trascrizioni delle sessioni del Parlamento Europeo tradotte in diverse lingue. Le frasi nei corpora paralleli sono allineate, cioè per ogni frase in una lingua c’è una corrispondente traduzione in un’altra lingua. Possono coprire vari domini come legislativo, tecnico, letterario, ecc. Avere dati da diversi domini può migliorare la robustezza degli embedding tralingue. Si utilizzando tecniche di machine learning supervisionato, dove la coppia di frasi allineate (una in lingua A e una in lingua B) è utilizzata come dati di addestramento per mappare vettori tra le due lingue.

In assenza di un corpus parallelo nelle due lingue si possono utilizzare di tecniche come Procrustes Alignment o MUSE per mappare gli spazi di embedding monolingue in uno spazio comune.



Viene poi definita una funzione di costo che misura la somiglianza tra due frasi. Una comune misura è la similarità coseno tra i vettori di embedding delle frasi.

Gli algoritmi di programmazione dinamica permettono di trovare l’allineamento ottimale tra le frasi nei due testi. Uno degli algoritmi più noti è l’algoritmo di Gale e Church.

Per esempio, si crea una matrice che rappresenta i costi di allineamento tra ogni coppia di frasi nei due documenti. Si identifica il percorso di allineamento ottimale attraverso la matrice di similitudine.

Esempio di Allineamento

Supponiamo di avere due testi paralleli, uno in inglese e uno in francese:

Inglese:

The quick brown fox jumps over the lazy dog.
This is a test sentence.
Machine translation is challenging.

Francese:

Le renard brun rapide saute par-dessus le chien paresseux.
C'est une phrase de test.
La traduction automatique est difficile.

Passaggi dell’Allineamento:

  • Ogni frase viene trasformata in un vettore di embedding utilizzando un modello multilingue pre-addestrato.
  • Calcolo della similarità coseno tra ogni coppia di frasi. La similarità coseno tra due vettori A e B è definita come:
  • Creazione di una matrice di similarità che rappresenta la somiglianza tra ogni coppia di frasi.
  • Utilizzo dell’algoritmo di programmazione dinamica per trovare il percorso di costo minimo attraverso la matrice di similarità, che rappresenta l’allineamento ottimale.

Allineamento Finale:
Il risultato dell’allineamento potrebbe essere:

Frase 1 (En) allineata con Frase 1 (Fr)
Frase 2 (En) allineata con Frase 2 (Fr)
Frase 3 (En) allineata con Frase 3 (Fr)

L’algoritmo Needleman-Wunsch

L’algoritmo Needleman-Wunsch viene utilizzato per allineare globalmente due sequenze di elementi, trovando la corrispondenza ottimale tra tutti gli elementi delle due sequenze. L’algoritmo tiene conto delle inserzioni (parole o frasi presenti in una lingua ma non nell’altra) delle delezioni (Parole o frasi assenti in una lingua ma presenti nell’altra)

In breve, a partire da due sequenze di elementi (lettere / parole o frasi) si costruisce una matrice M con dimensioni (n+1) x (m+1), dove n è la lunghezza della prima sequenza e m è la lunghezza della seconda sequenza.

Questo algoritmo viene usato principalmente per allineare sequenze di DNA le cui basi (nucleotidi) sono Adenina, Guanina, Citosina e Timina.

Nell’ambito della traduzione automatica, gli elementi delle sequenze possono essere lettere, parole oppure frasi intere.

Se per esempio

La prima sequenza (verticale) è ACGT
La seconda sequenza (orizzontale) è AGT

La matrice rappresenta i punteggi per tutti i possibili allineamenti tra due sequenze. Ogni cella M[i][j] contiene il punteggio massimo dell’allineamento tra i primi i caratteri della prima sequenza e i primi j caratteri della seconda sequenza.

Si stabilisce convenzionalmente che se si introduce un gap nella seconda sequenza rispetto alla prima o viceversa se si stabilisce un gap nella prima sequenza rispetto alla seconda c’è una penalità di punteggio uguale a -1. Se invece un termine i della sequenza è ben allineato al termine j dell’altra sequenza allora il punteggio sale di +1 viceversa scende di -1.

La matrice viene inizializzata così

Prima riga:

Rappresenta l’allineamento della seconda sequenza con gap iniziali rispetto alla prima sequenza.

1 gap iniziale: M[0][1]=−1
2 gap iniziali: M[0][2]=−2
3 gap iniziali: M[0][3]=−3

Prima colonna:

Rappresenta l’allineamento della prima sequenza con gap iniziali rispetto alla seconda sequenza.

1 gap iniziale: M[1][0]=−1
2 gap iniziali: M[2][0]=−2
3 gap iniziali: M[3][0]=−3

La regola di formazione dei termini dei restanti termini della matrice è la seguente:

Il termine M[i][j] sarà il valore massimo tra i seguenti termini:

M[i-1][j-1] +1 oppure -1 a seconda se i due caratteri i e j sono identici o no
M[i-1][j] – 1 (-1 è la penalità di gap)
M[i][j-1] – 1 (-1 è la penalità di gap)

Confronto Diretto:

Match/Mismatch:

  • Se il carattere i della prima sequenza corrisponde al carattere j della seconda sequenza, si aggiunge il punteggio di match (+1).
  • Se non corrispondono, si aggiunge il punteggio di mismatch (-1).

Gap:

  • Se si introduce un gap nella prima sequenza, si considera M[i−1][j]+gap
  • Se si introduce un gap nella seconda sequenza, si considera M[i][j−1]+gap

Una volta trovati tutti i termini della matrice si esegue il tracciamento all’indietro (Backtracking) per determinare l’allineamento corretto della seconda sequenza rispetto alla prima

Modello encoder-decoder

Infine, viene addestrato un modello di traduzione basato sull’architettura encoder-decoder. L’encoder trasforma la frase di origine in una rappresentazione intermedia (spazio latente), mentre il decoder trasforma questa rappresentazione nella frase di destinazione.

Ricordiamo come funziona il modello encoder-decoder con e senza attenzione
Architettura del sistema encoder-decoder con reti RNN

Più precisamente, L’encoder riceve una sequenza di token nella lingua di origine e la trasforma in una rappresentazione vettoriale intermedia. Ogni token viene convertito in un embedding, una rappresentazione numerica che cattura il significato del token nel contesto.

Il decoder prende la rappresentazione vettoriale intermedia prodotta dall’encoder e genera la sequenza di token nella lingua di destinazione. Anche in questa fase, i token sono fondamentali, poiché il decoder produce un token alla volta fino a completare la traduzione.

Ogni frase nella lingua di origine viene tokenizzata. La corrispondente traduzione nella lingua di destinazione viene anch’essa tokenizzata. Ad esempio, se il corpus parallelo contiene una frase in inglese (“The cat sits on the mat.“) e la sua traduzione in italiano (“Il gatto si siede sul tappeto.“), entrambe le frasi vengono tokenizzate.

La sequenza di token della frase nella lingua di origine viene passata all’encoder. Ad esempio, la sequenza di token per “The cat sits on the mat.” potrebbe essere [the, cat, sits, on, the, mat].
L’encoder trasforma questa sequenza in una rappresentazione vettoriale intermedia che cattura il significato dell’intera frase.

Il decoder prende questa rappresentazione intermedia e inizia a generare la traduzione token per token. Utilizza un meccanismo chiamato “teacher forcing” durante l’addestramento, dove il token corretto della lingua di destinazione viene fornito come input al decoder per generare il token successivo.

Ad esempio, il decoder riceve la rappresentazione intermedia dall’encoder e il primo token “Il” per generare il secondo token “gatto”, e così via.

Durante l’addestramento, il modello calcola la probabilità di ogni token nella sequenza di destinazione data la rappresentazione intermedia e i token precedenti.

Utilizza la funzione di perdita (ad esempio, cross-entropy loss) per calcolare l’errore tra la sequenza generata dal decoder e la sequenza di destinazione corretta.

Gli algoritmi di ottimizzazione (ad esempio, Adam) aggiornano i pesi del modello per minimizzare questo errore.

Una delle innovazioni chiave nei modelli encoder-decoder moderni è l’uso del meccanismo di attenzione. Questo permette al decoder di “attenzionare” diverse parti della sequenza di input mentre genera ogni token di output, migliorando significativamente le prestazioni del modello.

Il teacher forcing

Il teacher forcing implica l‘utilizzo della sequenza di output desiderata (la sequenza target: ô1, ô2,…ôm, le etichette) durante l’addestramento del modello, anziché utilizzare i valori generati dal modello stesso (o1, o2,..om) come input per il passo successivo. Questo approccio è particolarmente utile quando si addestrano modelli che generano sequenze, come quelli utilizzati per la traduzione automatica, la generazione di testo, e il riconoscimento del parlato.