Sequence-to-Sequence Models
I modelli sequenza-sequenza (seq2seq) trasformano una sequenza di input in una sequenza di output di lunghezza diversa, come nella traduzione, nella sintesi o nel riconoscimento vocale.
I modelli sequenza-a-sequenza (seq2seq) trasformano una sequenza in un'altra di lunghezza potenzialmente diversa, come una frase inglese nella sua traduzione francese, un lungo articolo in un riassunto o una clip audio in una trascrizione. La maggior parte usa un'architettura encoder-decoder: l'encoder legge l'intero input e lo converte in rappresentazioni interne, mentre il decoder genera l'output un token alla volta, basandosi su quelle rappresentazioni e sui token già prodotti. L'approccio ha assunto la sua forma moderna nel 2014, quando Sutskever, Vinyals e Le, di Google, pubblicarono Apprendimento sequenza-sequenza con reti neurali e Cho et al. descrissero un encoder-decoder RNN per la traduzione automatica. Dal 2017, la maggior parte dei modelli seq2seq è basata sui transformer.
Come funzionano i modelli Seq2Seq#
Nei modelli del 2014, un codificatore basato su una rete a memoria a lungo e breve termine (LSTM) leggeva la frase sorgente parola per parola e la comprimeva in un unico vettore di lunghezza fissa, mentre un decodificatore LSTM espandeva quel vettore fino a ottenere la traduzione. Sutskever et al. usarono LSTM a quattro strati, constatarono che invertire l'ordine delle parole della frase sorgente rendeva più semplice l'addestramento e ottennero un punteggio BLEU di 34,8 sul set di test WMT'14 dall'inglese al francese. Comprimere ogni frase in un unico vettore penalizzava gli input lunghi, così Bahdanau, Cho e Bengio aggiunsero un meccanismo di attenzione nell'articolo Traduzione automatica neurale tramite apprendimento congiunto di allineamento e traduzione, consentendo al decodificatore di consultare ogni stato del codificatore a ogni passaggio. Il Transformer mantenne questa struttura codificatore-decodificatore, sostituì la ricorrenza con l'autoattenzione e collegò le due parti con l'attenzione incrociata. In fase di inferenza, il decodificatore viene eseguito in un ciclo:
Il ciclo si interrompe quando il decoder emette un token di fine sequenza, quindi la lunghezza dell’output viene appresa per ogni esempio. La decodifica mantiene di solito diversi output candidati con la ricerca a fascio, la scelta standard per la traduzione e il riconoscimento vocale.
Addestramento con teacher forcing#
Durante l’addestramento, il decoder non deve eseguire un ciclo. Con il teacher forcing, riceve la sequenza target corretta spostata a destra di una posizione e prevede ogni token successivo in un unico passaggio parallelo, con una maschera causale che consente a ogni posizione di vedere solo i target precedenti. La perdita è la entropia incrociata tra queste previsioni e i token successivi reali. nn.Transformer di PyTorch implementa l’architettura encoder-decoder originale:
import torch
from torch import nn
torch.manual_seed(0)
src_vocab, tgt_vocab, d_model = 1000, 800, 64
embed_src, embed_tgt = nn.Embedding(src_vocab, d_model), nn.Embedding(tgt_vocab, d_model)
model = nn.Transformer(d_model, nhead=4, num_encoder_layers=2, num_decoder_layers=2, batch_first=True)
to_logits = nn.Linear(d_model, tgt_vocab)
source = torch.randint(0, src_vocab, (1, 9)) # a 9-token source sentence
target = torch.randint(0, tgt_vocab, (1, 7)) # start token + a 6-token translation
# Teacher forcing: the decoder reads the correct previous tokens and predicts every next token in parallel
decoder_input, labels = target[:, :-1], target[:, 1:]
causal_mask = nn.Transformer.generate_square_subsequent_mask(decoder_input.size(1))
logits = to_logits(model(embed_src(source), embed_tgt(decoder_input), tgt_mask=causal_mask))
loss = nn.functional.cross_entropy(logits.flatten(0, 1), labels.flatten())
print(f"Source tokens: {source.shape[1]} -> decoder logits: {tuple(logits.shape)}")
print(f"Training loss: {loss.item():.2f}")Stampa Source tokens: 9 -> decoder logits: (1, 6, 800), una previsione sul vocabolario target di 800 token per ciascuna delle 6 posizioni target, calcolata in un solo passaggio a partire da una sequenza sorgente di 9 token. La perdita di 6.73 del modello non addestrato è vicina a ln(800) ≈ 6.68, il valore corrispondente a una previsione uniforme. Poiché durante l’addestramento il modello riceve sempre i token precedenti corretti, mentre durante l’inferenza riceve le proprie previsioni, gli errori possono accumularsi: questo effetto si chiama bias di esposizione.
Seq2Seq e architetture correlate#
- Modelli solo encoder come BERT: Questi modelli leggono l’input in entrambe le direzioni e producono una rappresentazione per ogni token, caratteristica adatta alla classificazione e all’etichettatura.
- Modelli linguistici di grandi dimensioni (LLM) solo decoder: Modelli come GPT collocano input e output in un’unica sequenza e gestiscono i compiti seq2seq continuando il prompt; è così che viene generata la maggior parte dei testi oggi.
- Reti neurali ricorrenti (RNN) e GRU: Gli strati ricorrenti degli encoder e decoder originali del 2014. Cho et al. hanno introdotto l’unità ricorrente con gate nello stesso articolo in cui presentavano il loro encoder-decoder.
Applicazioni#
Nel 2016 Google ha trasferito Google Translate al sistema GNMT, un encoder e decoder LSTM a 8 livelli con attenzione; la traduzione resta il task seq2seq per eccellenza. T5 di Google ha formulato ogni task di elaborazione del linguaggio naturale (NLP) come conversione da testo a testo, inclusi il riassunto automatico e la risposta a domande. Whisper di OpenAI è un transformer encoder-decoder addestrato su 680.000 ore di audio per il riconoscimento vocale. I modelli di visione adottano lo stesso schema per la generazione di didascalie per immagini e il riconoscimento ottico dei caratteri (OCR); Florence-2 di Microsoft gestisce generazione di didascalie, grounding e rilevamento producendo testo da un unico modello seq2seq, mentre la versione Large funziona su Ultralytics Platform per l'annotazione automatica. Pix2Seq di Google formula il rilevamento degli oggetti come seq2seq, rappresentando ogni oggetto con cinque token discreti: quattro coordinate quantizzate e una classe. RT-DETR, il rilevatore in tempo reale di Baidu disponibile nel pacchetto Ultralytics, mantiene l'encoder e il decoder con attenzione incrociata, ma fa sì che quest'ultimo perfezioni in parallelo 300 query di oggetti: ogni riquadro viene così restituito in un unico passaggio.










