L'altro giorno ho chiesto al mio Large Language Model (LLM) preferito di aiutarmi a spiegare i vettori al mio bambino di quasi 4 anni. In pochi secondi, ha raccontato una storia piena di creature mitiche, magia e vettori. E voilà! Avevo uno schizzo per un nuovo libro per bambini ed era impressionante perché l'unicorno si chiamava “LuminaVec”.
Quindi, in che modo il modello ha contribuito a tessere questa magia creativa? Bene, la risposta è utilizzando i vettori (nella vita reale) e molto probabilmente i database di vettori. Come mai? Lasciatemi spiegare.
Innanzitutto, il modello non capisce le parole esatte che ho digitato. Ciò che lo aiuta a capire le parole sono le loro rappresentazioni numeriche che sono sotto forma di vettori. Questi vettori aiutano il modello a trovare somiglianze tra le diverse parole concentrandosi su informazioni significative su ciascuna. Lo fa utilizzando incastri che sono vettori a bassa dimensione che cercano di catturare la semantica e il contesto delle informazioni.
In altre parole, i vettori in un incorporamento sono elenchi di numeri che specificano la posizione di un oggetto rispetto ad uno spazio di riferimento. Questi oggetti possono essere caratteristiche che definiscono una variabile in un set di dati. Con l'aiuto di questi valori numerici del vettore, possiamo determinare quanto vicino o quanto lontano è un elemento dall'altro: sono simili (vicini) o non simili (lontani)?
Ora, questi vettori sono piuttosto potenti, ma quando parliamo di LLM, dobbiamo essere molto cauti nei loro confronti a causa della parola “grande”. Come accade con questi modelli “grandi”, questi vettori possono rapidamente diventare lunghi e più complessi, estendendosi su centinaia o addirittura migliaia di dimensioni. Se non gestite con attenzione, la velocità di elaborazione e le spese di montaggio potrebbero diventare ingombranti molto rapidamente!
Per risolvere questo problema, abbiamo il nostro potente guerriero: i database vettoriali.
Banche dati vettoriali sono database speciali che contengono questi incorporamenti di vettori. Oggetti simili hanno vettori più vicini tra loro nel database dei vettori, mentre oggetti dissimili hanno vettori più distanti. Quindi, invece di analizzare i dati ogni volta che arriva una query e generare questi incorporamenti di vettori, che richiedono enormi risorse, è molto più veloce eseguire i dati attraverso il modello una volta, archiviarli nel database dei vettori e recuperarli secondo necessità. Ciò rende i database vettoriali una delle soluzioni più potenti per affrontare il problema della scalabilità e della velocità di questi LLM.
Quindi, tornando alla storia dell'unicorno arcobaleno, della magia scintillante e dei potenti vettori – quando ho posto quella domanda alla modella, potrebbe aver seguito un processo come questo –
- Il modello di incorporamento ha prima trasformato la domanda in un incorporamento vettoriale.
- Questo incorporamento di vettori è stato poi confrontato con gli incorporamenti nei database di vettori relativi a storie divertenti per bambini di 5 anni e vettori.
- Sulla base di questa ricerca e confronto, sono stati restituiti i vettori più simili. Il risultato avrebbe dovuto consistere in un elenco di vettori classificati in ordine di somiglianza con il vettore di query.
Per distillare ulteriormente le cose, che ne dici di fare un giro per risolvere questi passaggi a livello micro? È ora di tornare alle origini! Grazie al Prof. Tom Yeh, abbiamo questo bellissimo manufatto che spiega il funzionamento dietro le quinte dei vettori e dei database vettoriali. (Tutte le immagini seguenti, se non diversamente specificato, sono del Prof. Tom Yeh dal post LinkedIn sopra menzionato, che ho modificato con il suo permesso.)
Quindi, eccoci qua:
Per il nostro esempio, abbiamo un set di dati di tre frasi con 3 parole (o token) ciascuna.
- Come stai
- Chi sei
- Chi sono
E la nostra domanda è la frase “sono io te”.
Nella vita reale, un database può contenere miliardi di frasi (si pensi a Wikipedia, archivi di notizie, articoli di riviste o qualsiasi raccolta di documenti) con decine di migliaia di numero massimo di token. Ora che la scena è pronta, lasciamo che il processo abbia inizio:
(1) Incorporamento : Il primo passo è generare incorporamenti vettoriali per tutto il testo che vogliamo utilizzare. Per fare ciò, cerchiamo le parole corrispondenti in una tabella di 22 vettori, dove 22 è la dimensione del vocabolario del nostro esempio.
Nella vita reale, la dimensione del vocabolario può essere decine di migliaia. Le dimensioni di incorporamento delle parole sono migliaia (ad esempio, 1024, 4096).
Cercando le parole Come stai nel vocabolario, la parola incorporare assomiglia a questa:
(2) Codifica : Il passo successivo è codificare l'incorporamento delle parole per ottenere una sequenza di vettori di caratteristiche, uno per parola. Nel nostro esempio, l'encoder è un semplice percettrone costituito da uno strato lineare con una funzione di attivazione ReLU.
Un breve riepilogo:
Trasformazione lineare : Il vettore di incorporamento dell'input viene moltiplicato per la matrice dei pesi W e quindi sommato con il vettore di polarizzazione B,
z = Wx+BDove W è la matrice dei pesi, x è la nostra parola incorporata e B è il vettore di polarizzazione.
Funzione di attivazione ReLU : Successivamente, applichiamo la ReLU a questo intermedio z.
ReLU restituisce il massimo in termini di elementi dell'input e zero. Matematicamente, H = massimo{0,z}.
Pertanto, per questo esempio l'incorporamento del testo si presenta così:
Per mostrare come funziona, calcoliamo come esempio i valori dell'ultima colonna.
Trasformazione lineare :
(1,0 + 1,1 + 0,0 +0,0) + 0 = 1
(0,0 + 1,1 + 0,0 + 1,0) + 0 = 1
(1,0 + (0).1+ 1,0 + 0,0) + (-1) = -1
(1,0 + (-1).1+ 0,0 + 0,0) + 0 = -1
riprendere
massimo {0,1} =1
massimo {0,1} = 1
massimo {0,-1} = 0
massimo {0,-1} = 0
E così otteniamo l'ultima colonna del nostro vettore di caratteristiche. Possiamo ripetere gli stessi passaggi per le altre colonne.
(3) Raggruppamento medio : In questo passaggio, raggruppiamo i vettori delle caratteristiche eseguendo la media sulle colonne per ottenere un singolo vettore. Questo è spesso chiamato incorporamento di testo o incorporamento di frasi.
È possibile utilizzare altre tecniche di pooling come CLS e SEP, ma il Mean Pooling è quello utilizzato più ampiamente.
(4) Indicizzazione : Il passo successivo prevede la riduzione delle dimensioni del vettore di incorporamento del testo, operazione eseguita con l'aiuto di una matrice di proiezione. Questa matrice di proiezione potrebbe essere casuale. L'idea qui è quella di ottenere una breve rappresentazione che consenta un confronto e un recupero più rapidi.
Questo risultato viene mantenuto nella memoria vettoriale.
(5) Ripetere : I passaggi precedenti (1)-(4) vengono ripetuti per le altre frasi nel set di dati “chi sei” e “chi sono io”.
Ora che abbiamo indicizzato il nostro set di dati nel database vettoriale, passiamo alla query vera e propria e vediamo come funzionano questi indici per darci la soluzione.
Domanda : “Sono io te”.
(6) Per iniziare, ripetiamo gli stessi passaggi di cui sopra: incorporamento, codifica e indicizzazione per ottenere una rappresentazione vettoriale 2D della nostra query.
(7) Prodotto scalare (trovare la somiglianza)
Una volta completati i passaggi precedenti, eseguiamo i prodotti scalari. Questo è importante poiché questi prodotti scalari alimentano l'idea del confronto tra il vettore di query e i vettori del nostro database. Per eseguire questo passaggio, trasponiamo il nostro vettore di query e lo moltiplichiamo con i vettori del database.
(8) Il vicino più prossimo
Il passaggio finale consiste nell'eseguire una scansione lineare per trovare il prodotto scalare più grande, che nel nostro esempio è 60/9. Questa è la rappresentazione vettoriale di “chi sono io”. Nella vita reale, una scansione lineare potrebbe essere incredibilmente lenta in quanto potrebbe coinvolgere miliardi di valori, l'alternativa è utilizzare un algoritmo Approssimate Nearest Neighbor (ANN) come Hierarchical Navigable Small Worlds (HNSW).
E questo ci porta alla fine di questo metodo elegante.
Pertanto, utilizzando gli incorporamenti vettoriali dei set di dati nel database vettoriale ed eseguendo i passaggi precedenti, siamo stati in grado di trovare la frase più vicina alla nostra query. L'incorporamento, la codifica, il mean pooling, l'indicizzazione e quindi i prodotti scalari costituiscono il nucleo di questo processo.
Tuttavia, per introdurre ancora una volta la prospettiva “ampia” –
- Un set di dati può contenere milioni o miliardi di frasi.
- Il numero di token per ciascuno di essi può essere decine di migliaia.
- Le dimensioni di incorporamento delle parole possono essere migliaia.
Mettendo insieme tutti questi dati e passaggi, stiamo parlando di eseguire operazioni su dimensioni di dimensioni gigantesche. E così, per supportare questa magnifica scala, i database vettoriali vengono in soccorso. Dato che abbiamo iniziato questo articolo parlando dei LLM, sarebbe un buon punto per dire che, a causa della capacità di gestione della scala dei database vettoriali, sono arrivati a svolgere un ruolo significativo nella Retrieval Augmented Generation (RAG). La scalabilità e la velocità offerte dai database vettoriali consentono un recupero efficiente dei modelli RAG, aprendo così la strada a un modello generativo efficiente.
Tutto sommato è giusto dire che i database vettoriali sono potenti. Non c'è da stupirsi che siano qui da un po': iniziando il loro viaggio per aiutare i sistemi di raccomandazione per alimentare ora i LLM, il loro dominio continua. E con il ritmo con cui crescono gli incorporamenti di vettori per diverse modalità di intelligenza artificiale, sembra che i database vettoriali continueranno a governare per un bel po' di tempo in futuro!
PS Se desideri svolgere questo esercizio da solo, ecco un collegamento a un modello vuoto da utilizzare.
Modello vuoto per l'esercizio manuale
Adesso divertiti e creane qualcuno 'vettoriale luminoso' Magia!
Fonte: towardsdatascience.com