Contriever

Da Wiki AI.
Versione del 25 nov 2024 alle 17:46 di Alesaccoia (discussione | contributi)
(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

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:

  1. Tokenizza il testo
  2. Passa i token attraverso il transformer
  3. Applica mean pooling sugli output del transformer
  4. 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:

  1. La query viene codificata nell'embedding q
  2. Ogni documento della collezione viene codificato in un embedding d
  3. Si calcola la similarità tra q e tutti i d
  4. 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)