Contriever
Modello di recupero dell'informazione sviluppato da Meta AI (vedi Unsupervised Dense Information Retrieval with Contrastive Learning) che utilizza l'apprendimento contrastivo per creare rappresentazioni dense di testi senza necessità di supervisione.
È progettato per superare le limitazioni dei precedenti modelli che richiedevano dati annotati manualmente.
Funzionamento
Il funzionamento di Contriever si basa su alcuni principi chiave:
1. Architettura di base
Contriever utilizza un'architettura transformer (simile a BERT) con alcune iportanti modifiche:
- Un encoder che processa sia le query che i documenti
- Un layer di pooling che calcola la media dei token per ottenere un embedding del testo
- Una normalizzazione L2 degli embedding finali
2. Processo di addestramento
L'addestramento di Contriever si articola in diverse fasi chiave:
- Creazione delle coppie: Da ogni documento vengono estratti due frammenti casuali di testo (crops) che fungono da coppia positiva. Questi frammenti possono avere lunghezze variabili, tipicamente tra il 10% e il 50% del testo originale.
- Codifica dei testi: I frammenti vengono processati attraverso un encoder basato su BERT che produce rappresentazioni vettoriali dense. Il modello utilizza due encoder: uno per le query e uno per i documenti (nel caso dell'architettura MoCo).
- Apprendimento contrastivo: Il modello impara confrontando le rappresentazioni delle coppie positive con quelle negative, utilizzando una funzione di perdita che massimizza la similarità tra frammenti dello stesso documento e minimizza quella tra frammenti di documenti diversi.
3. Creazione degli embedding
Per ogni testo, Contriever:
- Tokenizza il testo
- Passa i token attraverso il transformer
- Applica mean pooling sugli output del transformer
- Normalizza il vettore risultante
Esempio di processo:
"La Torre Eiffel è stata costruita nel 1889" → [0.2, -0.3, 0.1, ..., 0.4] (vettore 768-dimensionale)
4. Calcolo della similarità
La similarità tra query e documento viene calcolata usando la similarità del coseno:
5. Funzione di perdita Durante l'addestramento, Contriever ottimizza la funzione InfoNCE:
dove τ è un parametro di temperatura (tipicamente 0.05).
6. Processo di retrieval Durante l'utilizzo:
- La query viene codificata nell'embedding q
- Ogni documento della collezione viene codificato in un embedding d
- Si calcola la similarità tra q e tutti i d
- Si restituiscono i k documenti più simili
Esempio pratico:
Query | Documento più simile | Similarità |
---|---|---|
Quando fu costruita la Torre Eiffel? | La Torre Eiffel è stata costruita nel 1889 | 0.82 |
Chi ha inventato la lampadina? | Thomas Edison inventò la lampadina nel 1879 | 0.75 |
7. Ottimizzazioni Contriever implementa diverse ottimizzazioni:
- Batch di grandi dimensioni per migliore convergenza
- Normalizzazione degli embedding per stabilità numerica
- Cache degli embedding per efficienza computazionale
- Temperature scaling per bilanciare l'apprendimento
Le prestazioni di Contriever sono particolarmente notevoli in scenari zero-shot, dove supera modelli supervisionati tradizionali su vari benchmark di recupero dell'informazione.
Implementazione
Un esempio semplificato di utilizzo con Hugging Face:
from transformers import AutoModel, AutoTokenizer # Caricamento del modello tokenizer = AutoTokenizer.from_pretrained('facebook/contriever') model = AutoModel.from_pretrained('facebook/contriever') # Codifica del testo def encode_text(text): inputs = tokenizer(text, return_tensors='pt', truncation=True) outputs = model(**inputs) embeddings = outputs.last_hidden_state.mean(dim=1) return embeddings # Esempio di utilizzo query = "Quando fu costruita la Torre Eiffel?" doc = "La Torre Eiffel è stata costruita nel 1889" query_emb = encode_text(query) doc_emb = encode_text(doc) # Calcolo similarità similarity = torch.cosine_similarity(query_emb, doc_emb)