Deep Learning nei Sistemi di Raccomandazione Una Guida Introduttiva

Introduction to Deep Learning in Recommendation Systems

Un tour dei più importanti progressi tecnologici dietro i moderni sistemi di raccomandazione industriali

Credito immagine: Pixabay

I sistemi di raccomandazione sono tra le applicazioni di Machine Learning industriali in più rapida evoluzione oggi. Dal punto di vista aziendale, questo non è una sorpresa: raccomandazioni migliori portano più utenti. È semplice come questo.

Tuttavia, la tecnologia sottostante è tutt’altro che semplice. Dalla diffusione del deep learning, grazie alla democratizzazione delle GPU, i sistemi di raccomandazione sono diventati sempre più complessi.

In questo post, faremo un tour di una serie di importanti progressi nella modellazione degli ultimi dieci anni, ricostruendo approssimativamente i punti cruciali che segnano la diffusione del deep learning nei sistemi di raccomandazione. È una storia di progressi tecnologici, esplorazione scientifica e una corsa agli armamenti che si estende su continenti e collaborazioni.

Preparatevi. Il nostro tour inizia a Singapore nel 2017.

NCF (Università di Singapore, 2017)

Credito immagine: He et al (2017)

Ogni discussione sul deep learning nei sistemi di raccomandazione sarebbe incompleta senza menzionare uno dei più importanti progressi nel campo, la Collaborative Filtering Neurale (NCF), introdotta in He et al (2017) dell’Università di Singapore.

Prima di NCF, il gold standard nei sistemi di raccomandazione era la fattorizzazione di matrice, in cui apprendiamo vettori latenti (o embedding) per utenti e oggetti, e quindi generiamo raccomandazioni per un utente prendendo il prodotto scalare tra il vettore dell’utente e i vettori dell’oggetto. Più il prodotto scalare è vicino a 1, come sappiamo dall’algebra lineare, migliore è la corrispondenza prevista. Pertanto, la fattorizzazione di matrici può essere semplicemente vista come un modello lineare di fattori latenti.

L’idea chiave in NCF è quella di sostituire il prodotto interno nella fattorizzazione di matrici con una rete neurale. In pratica, ciò viene fatto concatenando prima gli embedding dell’utente e dell’oggetto, e quindi passandoli a un percettrone multi-strato (MLP) con una singola testa di attività che prevede l’interesse dell’utente come un click. Sia i pesi MLP che i pesi di embedding (che mappano gli ID ai rispettivi embedding) vengono poi appresi durante l’addestramento del modello tramite la retropropagazione dei gradienti di perdita.

L’ipotesi alla base di NCF è che le interazioni utente/oggetto non siano lineari, come si presume nella fattorizzazione di matrici, ma invece non lineari. Se ciò è vero, dovremmo vedere migliori prestazioni aggiungendo più strati all’MLP. Ed è esattamente ciò che He et al trovano. Con 4 strati, riescono a battere i migliori algoritmi di fattorizzazione di matrici dell’epoca di circa il 5% di tasso di successo sui dataset di benchmark di Movielens e Pinterest.

He et al hanno dimostrato che c’è un immenso valore del deep learning nei sistemi di raccomandazione, segnando la transizione cruciale dalla fattorizzazione di matrici ai raccomandatori profondi.

Wide & Deep (Google, 2016)

Credito immagine: Cheng et al (2016)

Il nostro tour prosegue da Singapore a Mountain View, in California.

Mentre NCF ha rivoluzionato il dominio dei sistemi di raccomandazione, manca un ingrediente importante che si è rivelato estremamente importante per il successo dei raccomandatori: le feature crociate. L’idea di feature crociate è stata popolarizzata nel paper di Google del 2016 “Wide & Deep Learning for Recommender Systems”.

Cosa sono le feature crociate? Sono feature di secondo ordine che vengono create “incrociando” due delle feature originali. Ad esempio, nel Google Play Store, le feature di primo ordine includono l’app interessata o l’elenco delle app installate dall’utente. Questi due possono essere combinati per creare potenti feature crociate, come ad esempio

AND(user_installed_app='netflix', impression_app='hulu')

che è pari a 1 se l’utente ha Netflix installato e l’applicazione a cui viene mostrato l’annuncio è Hulu.

Le funzionalità incrociate possono anche essere più generali come ad esempio

AND(user_installed_category='video', impression_category='music')

e così via. Gli autori sostengono che l’aggiunta di funzionalità incrociate di diverse granularità consente sia la memorizzazione (dai crociati più granulari) che la generalizzazione (dai crociati meno granulari).

La scelta architetturale chiave in Wide&Deep è quella di avere sia un modulo ampio, che è un livello lineare che prende direttamente in input tutte le funzionalità incrociate, sia un modulo profondo, che è essenzialmente un NCF, e quindi combinare entrambi i moduli in una singola uscita della task head che apprende dall’interazione utente/app.

E infatti, Wide&Deep funziona notevolmente bene: gli autori trovano un aumento nelle acquisizioni di applicazioni online del 1% passando da solo deep a wide e deep. Considerando che Google fa decine di miliardi di dollari di ricavi ogni anno dal suo Play Store, è facile capire quanto impattante sia stato Wide&Deep.

DCN (Google, 2017)

Image credit: Wang et al (2017)

Wide&Deep ha dimostrato l’importanza delle funzionalità incrociate, tuttavia ha un enorme svantaggio: le funzionalità incrociate devono essere progettate manualmente, il che è un processo noioso che richiede risorse di ingegneria, infrastrutture e competenze di dominio. Le funzionalità incrociate à la Wide & Deep sono costose. Non scalano.

Entra in gioco “Deep and Cross neural networks” (DCN), introdotto in un articolo del 2017, sempre di Google. L’idea chiave di DCN è quella di sostituire la componente ampia in Wide&Deep con una “rete neurale incrociata”, una rete neurale dedicata all’apprendimento di funzionalità incrociate di ordine arbitrariamente elevato.

Cosa rende diversa una rete neurale incrociata da un MLP standard? Come promemoria, in un MLP, ogni neurone nel livello successivo è una combinazione lineare di tutti i livelli nel livello precedente:

Al contrario, nella rete neurale incrociata il livello successivo è costruito formando combinazioni di secondo ordine del primo livello con se stesso:

Quindi, una rete neurale incrociata di profondità L apprende funzionalità incrociate sotto forma di polinomi di grado fino a L. Più profonda è la rete neurale, maggiore è l’ordine delle interazioni apprese.

E infatti, gli esperimenti confermano che DCN funziona. Rispetto a un modello con solo la componente deep, DCN ha un logloss inferiore dello 0,1% (che è considerato statisticamente significativo) sul dataset di benchmark degli annunci pubblicitari Criteo. E questo senza alcuna progettazione manuale delle funzionalità, come in Wide&Deep!

(Sarebbe stato bello vedere un confronto tra DCN e Wide&Deep. Purtroppo, gli autori di DCN non avevano un buon metodo per creare manualmente funzionalità incrociate per il dataset di Criteo e quindi hanno saltato questo confronto.)

DeepFM (Huawei, 2017)

Image credit: Guo et al (2017)

Successivamente, il nostro tour ci porta dal 2017 di Google al 2017 di Huawei.

La soluzione di Huawei per la raccomandazione profonda, “DeepFM”, sostituisce anche la progettazione manuale delle funzionalità nella componente ampia di Wide&Deep con una rete neurale dedicata che apprende le funzionalità incrociate. Tuttavia, a differenza di DCN, la componente ampia non è una rete neurale incrociata, ma invece un cosiddetto livello FM (“factorization machine”).

Cosa fa il livello FM? Semplicemente prende il prodotto scalare di tutte le coppie di embedding. Ad esempio, se un sistema di raccomandazione di film prende 4 caratteristiche di id come input, come id utente, id film, id attore e id regista, allora il modello apprende gli embedding per tutte queste caratteristiche di id e il livello FM calcola 6 prodotti scalari, corrispondenti alle combinazioni utente-film, utente-attore, utente-regista, film-attore, film-regista e attore-regista. È un ritorno dell’idea di fattorizzazione matriciale. L’output del livello FM viene quindi combinato con l’output del componente profondo in un’uscita attivata dal sigmoide, risultando nella previsione del modello.

E infatti, come avrete immaginato, DeepFM ha dimostrato di funzionare. Gli autori mostrano che DeepFM batte una serie di concorrenti (compreso il Wide&Deep di Google) di oltre lo 0,37% e lo 0,42% in termini di AUC e Logloss, rispettivamente, su dati interni dell’azienda.

DLRM (Meta, 2019)

Crediti immagine: Naumov et al (2019)

Lasciamo per ora Google e Huawei. La prossima tappa del nostro tour è il Meta del 2019.

L’architettura DLRM (“deep learning for recommender systems”) di Meta, presentata in Naumov et al (2019), funziona come segue: tutte le caratteristiche categoriche vengono trasformate in embedding utilizzando tabelle di embedding. Tutte le caratteristiche dense vengono passate a un MLP che calcola gli embedding per esse. È importante notare che tutti gli embedding hanno la stessa dimensione. Quindi, semplicemente calcoliamo il prodotto scalare di tutte le coppie di embedding, li concateniamo in un singolo vettore e passiamo quel vettore attraverso un MLP finale con una singola testa di attività attivata dal sigmoide che produce la previsione.

DLRM, quindi, è quasi una versione semplificata di DeepFM: se si prende DeepFM e si elimina il componente profondo (mantenendo solo il componente FM), si ottiene qualcosa di simile a DLRM, ma senza il MLP denso di DLRM.

Negli esperimenti, Naumov et al mostrano che DLRM batte DCN in termini di accuratezza di training e di validazione sul dataset di benchmark degli annunci display di Criteo. Questo risultato indica che il componente profondo in DCN potrebbe essere effettivamente ridondante e tutto ciò di cui abbiamo veramente bisogno per fare le migliori raccomandazioni possibili sono solo le interazioni delle caratteristiche, che in DLRM vengono catturate con i prodotti scalari.

DHEN (Meta, 2022)

Crediti immagine: Zhang et al (2022)

A differenza di DCN, le interazioni delle caratteristiche in DLRM sono limitate a essere solo di secondo ordine: sono solo prodotti scalari di tutte le coppie di embedding. Tornando all’esempio del film (con le caratteristiche utente, film, attori, regista), le interazioni di secondo ordine sarebbero utente-film, utente-attore, utente-regista, film-attore, film-regista e attore-regista. Un’interazione di terzo ordine sarebbe qualcosa come utente-film-regista, attore-attore-utente, regista-attore-utente e così via. Certi utenti potrebbero essere fan dei film di Steven Spielberg con Tom Hanks e dovrebbe esserci una funzione incrociata per quello! Purtroppo, in DLRM standard, non c’è. Questa è una limitazione importante.

Entra DHEN, l’ultimo lavoro fondamentale nel nostro tour dei moderni sistemi di raccomandazione. DHEN sta per “Deep Hierarchical Ensemble Network” e l’idea chiave è quella di creare una “gerarchia” di funzioni incrociate che diventa sempre più profonda con il numero di livelli DHEN.

È più facile capire DHEN con un semplice esempio. Supponiamo che ci siano due caratteristiche di input inserite in DHEN, e le indichiamo con A e B (che potrebbero rappresentare gli id utente e gli id video, ad esempio). Un modulo DHEN a 2 strati creerebbe quindi l’intera gerarchia di funzioni incrociate fino al secondo ordine, ovvero:

A, AxA, AxB, B, BxB,

dove “x” è uno o una combinazione delle seguenti 5 interazioni:

  • prodotto scalare,
  • auto-attenzione,
  • convoluzione,
  • lineare: y = Wx, o
  • il modulo incrociato di DCN.

DHEN è una bestia, e la sua complessità computazionale (a causa della sua natura ricorsiva) è un incubo. Per farla funzionare, gli autori della carta DHEN hanno dovuto inventare un nuovo paradigma di formazione distribuita chiamato “Hybrid Sharded Data Parallel”, che raggiunge un throughput più alto del 1,2X rispetto allo stato dell’arte (all’epoca).

Ma soprattutto, la bestia funziona: nei loro esperimenti sui dati interni del tasso di clic, gli autori misurano un miglioramento del 0,27% in NE rispetto a DLRM, utilizzando uno stack di 8 (!) strati DHEN.

Sommario

Evoluzione della classifica della competizione di display ads di Criteo. Screenshot da paperswithcode.com.

E questo conclude il nostro tour. Permettimi di riassumere ogni punto di riferimento con un solo titolo:

  • NCF: tutto ciò di cui abbiamo bisogno sono le immagini per gli utenti e gli elementi. L’MLP si occuperà del resto.
  • Wide&Deep: le funzionalità incrociate contano. In effetti, sono così importanti che le alimentiamo direttamente nella testa del compito.
  • DCN: le funzionalità incrociate contano, ma non dovrebbero essere ingegnerizzate a mano. Lascia che la rete neurale incrociata se ne occupi.
  • DeepFM: generiamo le funzionalità incrociate nel livello FM e manteniamo comunque il componente profondo di Wide&Deep.
  • DRLM: FM è tutto ciò di cui abbiamo bisogno, e anche un altro MLP dedicato per le funzionalità dense.
  • DHEN: FM non è sufficiente. Abbiamo bisogno di una gerarchia di interazioni di funzionalità di ordine superiore (oltre il secondo ordine), gerarchico. E anche un mucchio di ottimizzazioni per farlo funzionare nella pratica.

E il viaggio è solo all’inizio. Al momento della stesura di questo articolo, DCN si è evoluto in DCN-M, DeepFM è diventato xDeepFM, e la classifica della competizione di Criteo è stata rivendicata dall’ultima invenzione di Huawei, FinalMLP.

Dato l’enorme incentivo economico per raccomandazioni migliori, è garantito che continueremo a vedere nuovi progressi in questo campo per il futuro prevedibile. Continuate a seguire questo spazio.