Contriever: differenze tra le versioni

Da Wiki AI.
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 102: Riga 102:
</syntaxhighlight>
</syntaxhighlight>


[[Categoria:Modello]]
[[Categoria:Modello]]{{#seo:
|title=Contriever
|title_mode=append
|keywords=recupero dell'informazione, apprendimento automatico, intelligenza artificiale, modelli linguistici, elaborazione del linguaggio naturale, embedding, similarità coseno, codifica semantica, zero-shot, Meta AI
|description=Contriever, modello di Meta AI, utilizza l'apprendimento contrastivo per creare rappresentazioni dense di testi, superando i modelli precedenti che necessitavano di dati annotati. Funziona tramite encoder, pooling layer e normalizzazione L2, ottimizzando la funzione InfoNCE per massimizzare la similarità tra query e documento.
}}

Versione delle 13:33, 24 nov 2024

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:

  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)