Contriever
Modello di recupero dell'informazione sviluppato da Meta AI 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 modifiche cruciali:
- 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)