- Chiunque sia interessato ai consigli sul fai da te
- Ingegneri interessati ai modelli di classificazione PyTorch di base
- Nerd del caffè
- Qualcuno che vuole copiare e incollare il codice nel proprio sistema di produzione
- Gente che voleva un modello TensorFlow
Immagina di essere seduto sul tuo divano, con gli amici o la famiglia presente. Hai aperto la tua console di gioco/servizio di streaming/app musicale preferita e ogni articolo è uno scintillante gioiello di possibilità, su misura per te. Ma questi risultati personalizzati potrebbero riguardare la versione solista di te stesso e non riflettere la versione di te stesso quando sei circondato da questo particolare mix di altri.
Questo progetto è davvero iniziato con il caffè. Adoro tostare il mio caffè verde proveniente da Sweet Maria's (nessuna affiliazione), poiché offre una tale varietà di deliziose possibilità. Colombiano? Fagioli di Giava? Mirtillo del Kenya? Ogni descrizione è più allettante della precedente. È così difficile scegliere anche per me stesso come individuo. Cosa succede se acquisti caffè verde per la tua famiglia o i tuoi ospiti?
Volevo creare un modello Learning to Rank (LTR) che potesse potenzialmente risolvere questo enigma del caffè. Per questo progetto, ho iniziato costruendo un semplice Classifica TensorFlow progetto per prevedere le classifiche delle coppie di utenti di diversi caffè. Avevo una certa esperienza con TFR e quindi mi è sembrata una scelta naturale.
Tuttavia, mi sono reso conto di non aver mai creato un modello di classificazione da zero prima! Ho iniziato a costruire un modello di classificazione PyTorch molto complicato per vedere se potevo metterne insieme uno e imparare qualcosa nel processo. Ovviamente questo non è pensato per un sistema di produzione e ho creato molte scorciatoie lungo il percorso, ma è stata un'esperienza pedagogica straordinaria.
Il nostro obiettivo supremo è il seguente:
- sviluppare un modello di ranking che apprende le preferenze a coppie degli utenti
- applicalo per prevedere la classifica listwise degli elementi “k”.
Quale segnale potrebbe trovarsi nelle combinazioni di funzionalità dell'utente e dell'elemento per produrre una serie di consigli per quella coppia di utenti?
Per raccogliere questi dati, ho dovuto svolgere insieme a mia moglie una dolorosa ricerca per testare il gusto di caffè straordinari. Ognuno di noi li ha poi valutati su una scala di 10 punti. Il valore target è semplicemente la somma dei nostri due punteggi (massimo 20 punti). Lo scopo del modello è imparare a classificare i caffè che piaceranno a entrambi e non solo a un membro di una coppia. I dati contestuali che utilizzeremo sono i seguenti:
- età di entrambi gli utenti nella coppia
- ID utente che verranno trasformati in incorporamenti
SweetMarias.com fornisce molti dati sugli articoli:
- l'origine del caffè
- Note di lavorazione e coltivazione
- descrizioni di degustazione
- punteggi di valutazione professionale (scala di 100 punti)
Pertanto, per ogni esempio di formazione, avremo i dati dell'utente come informazioni contestuali e il set di funzionalità di ciascun elemento verrà concatenato.
I modelli TensorFlow Ranking vengono generalmente addestrati sui dati in ELWC formato: EsempioListaConContesto. Puoi pensarlo come un dizionario con 2 chiavi: CONTESTO ed ESEMPI (elenco). All'interno di ogni ESEMPIO c'è un dizionario delle caratteristiche per articolo che desideri classificare.
Ad esempio, supponiamo che stavo cercando un nuovo caffè da provare e che mi fosse stato presentato un pool di candidati composto da k = 10 varietà di caffè. Un ELWC consisterebbe nelle informazioni sul contesto/utente, nonché in un elenco di 10 elementi, ciascuno con il proprio set di funzionalità.
Dato che non utilizzavo più TensorFlow Ranking, ho creato il mio aspetto di creazione di classifiche/liste di questo progetto. Ho preso campioni casuali di k elementi da cui abbiamo punteggi e li ho aggiunti a un elenco. Ho suddiviso i primi caffè che ho provato in un set di training e gli esempi successivi sono diventati un piccolo set di validazione per valutare il modello.
In questo esempio di giocattolo, abbiamo un set di dati abbastanza ricco. Dal punto di vista del contesto, conosciamo apparentemente l'età degli utenti e possiamo apprendere le rispettive preferenze incorporate. Attraverso strati successivi all'interno della LTR, queste caratteristiche contestuali possono essere confrontate e contrastate. A un utente della coppia piacciono i sapori scuri e fruttati, mentre all'altro piacciono le tonificanti note agrumate e fruttate nella tazza?
Per le caratteristiche degli articoli, abbiamo una generosa porzione di testo ricco e descrittivo delle note di degustazione, dell'origine, ecc. di ogni caffè. Ne parleremo più avanti, ma l'idea generale è che possiamo catturare il significato di queste descrizioni e abbinare le descrizioni con i dati del contesto (coppia di utenti). Infine, abbiamo alcune caratteristiche numeriche come il punteggio di degustazione degli esperti di prodotto per articolo che (dovrebbe) avere una certa somiglianza con la realtà.
È in corso un cambiamento straordinario negli incorporamenti di testo rispetto a quando stavo iniziando nel settore ML. Sono ormai lontani i modelli GLOVE e Word2Vec che usavo per cercare di catturare un significato semantico da una parola o una frase. Se vai a https://huggingface.co/blog/mtebpuoi facilmente confrontare quali sono i modelli di incorporamento più recenti e migliori per una varietà di scopi.
Per motivi di semplicità e familiarità, utilizzeremo https://huggingface.co/BAAI/bge-base-en-v1.5 incorporamenti per aiutarci a proiettare le nostre caratteristiche di testo in qualcosa di comprensibile da un modello LTR. Nello specifico lo utilizzeremo per le descrizioni dei prodotti e i nomi dei prodotti forniti da Sweet Marias.
Dovremo anche convertire tutti i nostri valori user- e item-id in uno spazio di incorporamento. PyTorch lo gestisce magnificamente con il Incorporamento Strati.
Infine eseguiamo un po' di ridimensionamento delle nostre funzionalità float con un semplice RobustScaler. Tutto questo può accadere all'interno della nostra classe Torch Dataset che viene poi scaricata in un DataLoader per l'addestramento. Il trucco qui è separare i diversi identificatori che passeranno nel file forward()
chiama PyTorch. Questo articolo di Offir Inbar mi ha davvero fatto risparmiare tempo facendo proprio questo!
L'unica cosa interessante della formazione Torch è stata garantire che i 2 incorporamenti degli utenti (uno per ciascun valutatore) e il k
i caffè nell'elenco per l'addestramento avevano gli incorporamenti e le dimensioni corretti per passare attraverso la nostra rete neurale. Con qualche modifica sono riuscito a ottenere qualcosa:
Questo inoltro inserisce ogni esempio di formazione in un singolo elenco concatenato con tutte le funzionalità.
Con così pochi punti dati (sono stati valutati solo 16 caffè), può essere difficile addestrare un modello NN robusto. Spesso costruisco un semplice sklearn
modello fianco a fianco in modo da poter confrontare i risultati. Stiamo davvero imparando qualcosa?
Utilizzando le stesse tecniche di preparazione dei dati, ho creato un modello di classificatore multiclasse LogisticRegression e quindi ho scaricato il file .predict_proba()
punteggi da utilizzare come classifica. Cosa potrebbero dire i nostri parametri sulle prestazioni di questi due modelli?
Per le metriche, ho scelto di monitorarne due:
- Precisione massima (`k=1`).
- NDCG
L’obiettivo, ovviamente, è ottenere la classifica corretta per questi caffè. NDCG si adatterà perfettamente al conto qui. Tuttavia, sospettavo che il modello LogReg potesse avere problemi con l'aspetto della classificazione, quindi ho pensato di inserire anche una semplice precisione. A volte vuoi solo una tazza di caffè davvero buono e non hai bisogno di una classifica!
Senza alcun investimento significativo nella regolazione dei parametri da parte mia, ho ottenuto risultati molto simili tra i due modelli. SKLearn aveva un NDCG leggermente peggiore sul (piccolo) set di validazione (0,9581 contro 0,950), ma un'accuratezza simile. Credo che con qualche ottimizzazione degli iperparametri sia sul modello PyTorch che sul modello LogReg, i risultati potrebbero essere molto simili con così pochi dati. Ma almeno sono ampiamente d'accordo!
Ho un nuovo lotto di 16 libbre di caffè da iniziare a classificare da aggiungere al modello e ho deliberatamente aggiunto alcune varietà meno conosciute al mix. Spero di ripulire un po' il repository e renderlo meno un lavoro di hacking. Inoltre devo aggiungere una funzione di previsione per i caffè invisibili in modo da poter capire cosa acquistare nel prossimo ordine!
Una cosa da notare è che se stai creando un strumento di raccomandazione per la produzione, spesso è una buona idea utilizzare una vera libreria creata per il ranking. TensorFlow Ranking, XGBoost, LambdaRank, ecc. sono accettati nel settore e hanno risolto molti punti critici.
Si prega di controllare il repository Qui e fammi sapere se trovi qualche bug! Spero che tu sia ispirato ad addestrare il tuo modello di coppia di utenti per il posizionamento.
Fonte: towardsdatascience.com