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
Durante l'addestramento, Contriever opera su batch di testi (tipicamente 1024 o più passaggi) nel seguente modo:
- Prende un passaggio di testo originale: "La Torre Eiffel è stata costruita nel 1889"
- Crea una variante sintetica come query: "Quando è stata costruita la Torre Eiffel?"
- Usa altri passaggi nel batch come esempi negativi: "Il Colosseo si trova a Roma", "La Statua della Libertà è a New York"
Per ogni batch:
| Testo originale | Query sintetica | Negativi |
|---|---|---|
| La Torre Eiffel è stata costruita nel 1889 | Quando è stata costruita la Torre Eiffel? | Il Colosseo si trova a Roma |
| Parigi è la capitale della Francia | Qual è la capitale della Francia? | Tokyo è la città più popolosa del mondo |
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)