Gli embedding hanno pervaso il toolkit dei data scientist e hanno cambiato radicalmente il modo in cui funziona l'NLP, la visione artificiale e i sistemi di raccomandazione. Tuttavia, molti data scientist li trovano arcaici e confusi. Molti altri li usano alla cieca senza capire cosa siano. In questo articolo approfondiremo cosa sono gli embedding, come funzionano e come vengono spesso resi operativi nei sistemi del mondo reale.
Cos'è un embedding?
Embedding è una tecnica utilizzata nell'ambito dell'apprendimento automatico e dell'elaborazione del linguaggio naturale (NLP) per rappresentare dati complessi, come parole, frasi o oggetti, in uno spazio vettoriale.
Ma per comprendere gli embedding, dobbiamo prima comprendere i requisiti di base di un modello di machine learning. Nello specifico, la maggior parte degli algoritmi di apprendimento automatico può prendere come input solo dati numerici a bassa dimensionalità.
Nella rete neurale sottostante ciascuna delle funzionalità di input deve essere numerica. Ciò significa che in ambiti come i sistemi di raccomandazione, dobbiamo trasformare le variabili non numeriche (ad esempio articoli e utenti) in numeri e vettori. Potremmo provare a rappresentare gli articoli tramite un ID prodotto; tuttavia, le reti neurali trattano gli input numerici come variabili continue. Ciò significa che i numeri più alti sono "maggiori" dei numeri più bassi. Vede anche i numeri simili come elementi simili. Ciò ha perfettamente senso per un campo come "età", ma non ha senso quando i numeri rappresentano una variabile categoriale. Prima degli embedding, uno dei metodi più comuni utilizzati era la codifica one-hot.
Codifica One-Hot
La codifica one-hot era un metodo comune per rappresentare le variabili categoriali. Questa tecnica non supervisionata associa una singola categoria a un vettore e genera una rappresentazione binaria. Il processo vero e proprio è semplice. Creiamo un vettore con una dimensione pari al numero di categorie, con tutti i valori impostati su 0.
Successivamente impostiamo la riga o le righe associate all'ID o agli ID specificati su 1.
Tecnicamente funziona trasformando una categoria in un insieme di variabili continue, ma ci ritroveremo letteralmente con un enorme vettore di 0 con un singolo o una manciata di 1. Questa semplicità presenta degli inconvenienti. Per le variabili con molte categorie univoche, crea un numero ingestibile di dimensioni. Poiché ogni elemento è tecnicamente equidistante nello spazio vettoriale, omette il contesto relativo alla somiglianza. Nello spazio vettoriale, le categorie con poca varianza non sono più vicine tra loro di quelle con alta varianza.
Ciò significa che i termini "Hotdog" e "Hamburger" non sono più vicini di "Hotdog" e "Pepsi". Di conseguenza, non abbiamo modo di valutare la relazione tra due entità. Potremmo generare più mappature uno a uno o tentare di raggrupparle e cercare somiglianze. Ciò richiede un lavoro approfondito e un'etichettatura manuale che in genere è irrealizzabile.
Intuitivamente, vogliamo essere in grado di creare una rappresentazione più densa delle categorie e mantenere alcune informazioni sulle relazioni implicite tra gli elementi. Abbiamo bisogno di un modo per ridurre il numero di variabili categoriali in modo da poter posizionare gli elementi di categorie simili più vicini. Questo è esattamente ciò che è un embedding.
Gli embedding risolvono il problema della codifica
Gli embedding sono rappresentazioni numeriche dense di oggetti e relazioni del mondo reale, espresse come vettori. Lo spazio vettoriale quantifica la somiglianza semantica tra le categorie. I vettori di embedding vicini tra loro sono considerati simili. A volte vengono utilizzati direttamente per la sezione “Articoli simili a questo” in un negozio di e-commerce.
Altre volte, gli embedding vengono passati ad altri modelli. In questi casi, il modello può condividere quanto appreso tra elementi simili anziché trattarli come due categorie completamente uniche, come nel caso delle codifiche one-hot.
Questa caratteristica rende gli embedding estremamente utili per ottimizzare i risultati dei modelli di machine learning.
Una curiosità interessante riguardo agli embedding è che possono rappresentare con precisione dati sparsi, come flussi di clic, testo e acquisti di e-commerce, come caratteristiche dei modelli downstream. Ciò significa che sono essenziali per migliorare la personalizzazione e le raccomandazioni in diversi settori. Tuttavia, è importante notare che gli embedding sono molto più costosi da calcolare rispetto alle codifiche one-hot e sono meno interpretabili. Questo è un trade-off che le aziende spesso considerano quando implementano soluzioni basate su embedding.
Come vengono creati gli embedding?
Un modo comune per creare un embedding richiede di impostare prima un problema di machine learning supervisionato. Come effetto collaterale, l'addestramento di quel modello codifica le categorie in vettori di embedding. Ad esempio, possiamo impostare un modello che preveda il prossimo film che un utente guarderà in base a ciò che sta guardando adesso. Un modello di embedding fattorizzerà l'input in un vettore, e quel vettore verrà utilizzato per prevedere il film successivo. Ciò significa che i vettori simili sono film che vengono comunemente guardati dopo film simili. Questo processo fornisce una rappresentazione dettagliata delle preferenze degli utenti.
Ma la definizione del problema surrogato è un'arte che influenza notevolmente il comportamento degli embedding.
Ad esempio, il team di raccomandazione di YouTube si è reso conto che l'utilizzo della funzione "prevedere il prossimo video su cui un utente farà clic" ha portato a un aumento del clickbait. Hanno quindi adottato l'approccio di “prevedere il prossimo video e per quanto tempo lo guarderanno” come problema surrogato e hanno ottenuto risultati molto migliori.
Questo dimostra quanto sia importante definire il problema iniziale in modo intelligente quando si lavora con gli embedding.
Modelli di embedding comuni
Analisi delle componenti principali (PCA)
Un metodo per generare embedding è chiamato Analisi delle componenti principali (PCA). PCA riduce la dimensionalità di un'entità comprimendo le variabili in un sottoinsieme più piccolo. Ciò consente al modello di comportarsi in modo più efficace ma rende le variabili più difficili da interpretare e generalmente porta a una perdita di informazioni. Un'implementazione popolare della PCA è una tecnica chiamata SVD.
SVD
La decomposizione dei valori singolari, nota anche come SVD, è una tecnica di riduzione della dimensionalità. SVD riduce la quantità di caratteristiche del set di dati dalle dimensioni N alle dimensioni K tramite la fattorizzazione della matrice. Ad esempio, rappresentiamo le valutazioni video di un utente come una matrice di dimensioni (numero di utenti) x (numero di elementi) dove il valore di ciascuna cella è la valutazione assegnata da un utente a quell'elemento. Per prima cosa scegliamo un numero, k, che è la dimensione del nostro vettore di embedding, e utilizziamo SVD per trasformarlo in due matrici. Uno sarà (Numero di utenti) x k e l'altro sarà k x (Numero di elementi).
Nelle matrici risultanti, se moltiplichiamo un vettore utente per un vettore elemento, otteniamo la nostra valutazione utente prevista. Se dovessimo moltiplicare entrambe le matrici, ci ritroveremmo con la matrice originale, ma densamente piena di tutte le nostre valutazioni previste. Ciò significa che due elementi che hanno vettori simili comporterebbero una valutazione simile da parte dello stesso utente. In questo modo, finiamo per creare embedding di utenti ed elementi.
Word2Vec
Word2Vec genera embedding dalle parole. Le parole vengono codificate in vettori one-hot e inserite in uno strato nascosto che genera pesi nascosti. Quei pesi nascosti vengono quindi utilizzati per prevedere altre parole vicine. Sebbene questi pesi nascosti vengano utilizzati per l'addestramento, word2vec non li utilizzerà per l'attività su cui è stato addestrato. Invece, i pesi nascosti vengono restituiti come embedding e il modello viene eliminato.
Le parole che si trovano in contesti simili avranno embedding simili. Oltre a ciò, gli embedding possono essere utilizzati per formare analogie. Ad esempio, il vettore dal re all'uomo è molto simile a quello dalla regina alla donna.
Un problema con Word2Vec è che le singole parole hanno una mappatura vettoriale. Ciò significa che tutti gli usi semantici di una parola sono combinati in un'unica rappresentazione.
BERT
Bidirezionale Encoder Representations of Transformers, noto anche come BERT, è un modello pre-addestrato che risolve i problemi di contesto di Word2Vec. BERT viene addestrato in due fasi. Innanzitutto, viene addestrato su un enorme corpus di dati come Wikipedia per generare embedding simili a Word2Vec.
L'utente finale esegue la seconda fase di formazione. Si addestrano su un corpus di dati che si adatta bene al loro contesto, ad esempio la letteratura medica. BERT sarà ottimizzato per quel caso d'uso specifico. Inoltre, per creare un embedding di parole, BERT tiene conto del contesto della parola. BERT è diventato il modello di trasformatore di riferimento per la generazione di embedding di testo.
Embedding nel mondo reale
L'utilizzo dell'embedding è iniziato nei laboratori di ricerca ed è diventato rapidamente lo stato dell'arte. Da allora, gli embedding si sono ritrovati nei sistemi di machine learning di produzione in una varietà di campi diversi, tra cui la NLP, i sistemi di raccomandazione e la visione artificiale.
Sistemi di raccomandazione
Un sistema di raccomandazione prevede le preferenze e le valutazioni degli utenti per una varietà di entità/prodotti. I due approcci più comuni sono il filtraggio collaborativo e quello basato sui contenuti. Il filtraggio collaborativo utilizza le azioni per addestrare e formulare raccomandazioni. I moderni sistemi di filtraggio collaborativo utilizzano quasi tutti gli embedding.
Ad esempio, possiamo utilizzare il metodo SVD sopra definito per costruire un sistema di raccomandazione. In quel sistema, moltiplicando l'embedding di un utente per l'embedding di un elemento si genera una previsione di valutazione. Questo fornisce una chiara relazione tra utenti e prodotti. Articoli simili generano valutazioni simili da utenti simili.
Questo attributo può essere utilizzato anche nei modelli downstream. Ad esempio, il suggeritore di Youtube utilizza gli embedding come input per una rete neurale che prevede il tempo di visualizzazione.
Ricerca semantica
Gli utenti si aspettano che le barre di ricerca siano più intelligenti di una regex. Che si tratti di una pagina di assistenza clienti, di un blog o di Google, una barra di ricerca dovrebbe comprendere l'intento e il contesto di una query, non solo guardare le parole. I motori di ricerca erano costruiti attorno a TF-IDF, che crea anche un embedding dal testo. Questo tipo di ricerca semantica ha funzionato trovando l'embedding del documento più vicino all'embedding della query utilizzando il vicino più vicino.
Oggi, la ricerca semantica utilizza embedding più sofisticati come BERT e può utilizzarli nei modelli a valle. In effetti, anche Google utilizza BERT su una grande percentuale delle proprie query: Link interessante.
Visione computerizzata
Nella visione artificiale, gli embedding vengono spesso utilizzati come modo per tradurre tra contesti diversi. Ad esempio, se addestramo un'auto a guida autonoma, possiamo trasformare l'immagine dell'auto in un embedding e quindi decidere cosa fare in base a quel contesto incorporato. In questo modo, possiamo eseguire l'apprendimento del trasferimento. Possiamo prendere un'immagine generata da un gioco come Grand Theft Auto, trasformarla in un embedding nello stesso spazio vettoriale e addestrare il modello di guida senza doverlo alimentare con tonnellate di costose immagini del mondo reale. Tesla lo sta facendo in pratica oggi.
Un altro esempio interessante è l'AI Art Machine: Link interessante. Genererà un'immagine in base al testo inserito dall'utente. Ad esempio, se digitiamo "Nostalgia", otterremo la seguente immagine.
Funziona trasformando il testo dell'utente e un'immagine in un embedding nello stesso spazio latente. È composto da quattro trasformatori:
Immagine -> Embedding, Testo -> Embedding, Embedding -> Testo, Immagine -> Testo.
Con tutte queste trasformazioni possiamo tradurre il testo in immagine e viceversa utilizzando un embedding come rappresentazione intermedia.
Implementazioni dell'ANN
Esistono molti algoritmi diversi per trovare in modo efficiente i vicini più vicini approssimativi e molte implementazioni di ciascuno di essi. Di seguito elencheremo alcuni degli algoritmi e delle implementazioni più comuni e analizzeremo il loro funzionamento ad alto livello.
Il Fastidio di Spotify
Nell'implementazione ANN di Spotify (Annoy), gli embedding vengono trasformati in una foresta di alberi. Ogni albero è costruito utilizzando proiezioni casuali. In ogni nodo intermedio dell'albero viene scelto un iperpiano casuale, che divide lo spazio in due sottospazi. Questo iperpiano viene scelto campionando due punti dal sottoinsieme e prendendo l'iperpiano equidistante da essi. Questa operazione viene eseguita k volte per generare una foresta. Le ricerche vengono eseguite tramite l'attraversamento in ordine dell'albero più vicino. L'approccio di Annoy consente di suddividere l'indice in più file statici, di mappare l'indice in memoria e di modificare il numero di alberi per modificare velocità e precisione.
Hashing Sensibile alla Località (LSH)
Un altro approccio comune è il Locality Sensitive Hashing (LSH). LSH utilizza una tabella hash e memorizza i punti vicini nei rispettivi contenitori. Per creare l'indice, LSH esegue molte funzioni di hashing che inseriscono punti simili nello stesso bucket. In tal modo, LSH mantiene i punti con grandi distanze in contenitori separati. Per recuperare il vicino più vicino, viene eseguito l'hashing del punto in questione, viene eseguita una ricerca e viene restituito il punto di query più vicino. Alcuni vantaggi includono un tempo di esecuzione sublineare, la totale dipendenza dalla distribuzione dei dati e la capacità di ottimizzare la precisione con la struttura dei dati esistente.
FAISS di Facebook e Grafici Gerarchici Navigabili (HNSW)
L'implementazione di Facebook, FAISS, utilizza Hierarchical Navigable Small World Graphs (HNSW). HNSW in genere offre buone prestazioni in termini di precisione e richiamo. Utilizza un grafico gerarchico per creare un percorso medio verso determinate aree. Questo grafo ha una struttura gerarchica e transitiva con una piccola distanza media tra i nodi. HNSW attraversa il grafico e trova il nodo adiacente più vicino in ogni iterazione e tiene traccia dei vicini “migliori” visti finora. HNSW ha una complessità temporale polilogaritmica (O (logN)).
Come vengono resi operativi gli embedding oggi
Lo spostamento degli embedding dai laboratori ai sistemi del mondo reale ha fatto emergere lacune reali nelle attuali capacità dell’infrastruttura dati. Ad esempio, i database e le cache tradizionali non supportano operazioni come le ricerche del vicino più vicino. Gli indici specializzati del vicino più vicino approssimativo mancano di spazio di archiviazione durevole e di altre funzionalità richieste per l'utilizzo in piena produzione. I sistemi MLOps non dispongono di metodi dedicati per gestire il controllo delle versioni, l'accesso e la formazione per gli embedding. I moderni sistemi ML necessitano di un archivio di embedding: un database costruito da zero attorno al flusso di lavoro di apprendimento automatico con embedding.
Mettere gli embedding in produzione non è facile. I modi più comuni in cui abbiamo visto gli embedding resi operativi oggi sono tramite Redis, Postgres e S3 + Annoy/FAISS. Tratteremo l'aspetto tipico di ciascuna di queste implementazioni e le sfide legate a ciascuna.
Redis
Redis è un archivio oggetti in memoria superveloce. Rende molto veloce la memorizzazione e l'ottenimento degli embedding per chiave. Tuttavia, non prevede operazioni di embedding native. Non può eseguire ricerche del vicino più vicino e non può aggiungere o calcolare la media dei vettori. Tutto questo deve essere fatto sul servizio modello. Inoltre non si adatta perfettamente a un tipico flusso di lavoro MLOps. Non supporta il controllo delle versioni, il rollback o il mantenimento dell'immutabilità. Durante l'addestramento, il client Redis non memorizza automaticamente nella cache gli embedding e ciò può causare pressioni e costi inutili. Inoltre, non supporta il partizionamento degli embedding e la creazione di sottoindici.
Postgres
Postgres è molto più versatile ma molto più lento di Redis. Tramite plugin è possibile eseguire manualmente alcune operazioni sui vettori. Tuttavia, non dispone di un indice del vicino più vicino performante. Inoltre, avere una ricerca Postgres nel percorso critico di un modello potrebbe aggiungere troppa latenza. Infine, Postgres non dispone di un ottimo modo per memorizzare nella cache gli embedding sul client durante l'addestramento, causando un addestramento molto, molto lento.
File S3 + Annoy/FAISS
Annoy o FAIISS vengono spesso utilizzati per rendere operativi gli embedding quando sono richieste le ricerche del vicino più vicino. Entrambi questi sistemi creano indici di embedding per operazioni approssimate del vicino più vicino, ma non gestiscono l'archiviazione durevole o altre operazioni vettoriali. Da soli, risolvono solo un problema. In genere, le aziende archiviano i propri embedding in S3 o in un servizio di storage di oggetti simile per colmare il resto delle lacune. Caricheranno gli embedding e creeranno l'indice ANN direttamente sul modello quando richiesto. L'aggiornamento degli embedding diventa difficile e il sistema in genere si ritrova con molte regole ad hoc per gestire il controllo delle versioni e i rollback. FAISS e Annoy sono fantastici, ma hanno bisogno di un negozio di embedding completo costruito attorno a loro.
L'Hub di Embedding
I sistemi di machine learning che utilizzano un embedding necessitano di un tipo di infrastruttura dati che:
Memorizza i propri embedding in modo duraturo e con elevata disponibilità
Consente operazioni approssimative del vicino più vicino
Abilita altre operazioni come il partizionamento, i sottoindici e la media
Gestisce il controllo delle versioni, il controllo degli accessi e i rollback senza problemi
L'hub di embedding si trova su uno stack che rappresenta l'infrastruttura
Conclusione su cosa sono gli embedding
Gli embedding sono una parte fondamentale del toolkit di data science e continuano a guadagnare popolarità. Gli embedding hanno consentito ai team di rivoluzionare lo stato dell'arte in molteplici discipline, dalla NLP ai sistemi di raccomandazione. Man mano che crescono in popolarità, molta più attenzione sarà posta nel renderli operativi nei sistemi del mondo reale.
Comments