«[Figlio dell'uomo] Porgi l'orecchio e ascolta le parole di KGB
e applica la tua mente alla SUA istruzione
» Pv. 22,17

Qui si straparla di vari argomenti:
1. Il genere dei pezzi è segnalato da varie immagini, vedi Legenda
2. Per contattarmi e istruzioni per i nuovi lettori (occasionali e non) qui
3. L'ultimo corto è questo
4. Molti articoli di questo blog fanno riferimento a definizioni e concetti che ho enunciato nella mia Epitome gratuitamente scaricabile QUI. Tali riferimenti sono identificati da una “E” fra parentesi quadre e uno o più capitoli. Per esempio: ([E] 5.1 e 5.4)

venerdì 30 novembre 2018

Reti smagliate

Oggi scrivo per me! Il lettore assennato non vada avanti nella lettura o resterà deluso!
Il pezzo odierno infatti, nelle mie speranze, dovrebbe aiutarmi a capire un concetto del libro sulle rete neurali che sto leggendo che mi sfugge…
Spesso infatti ripercorrere i vari passaggi, magari semplificarli per riproporli qui sul ghiribizzo, mi aiuta non solo a memorizzarli meglio ma anche a capirli in maggiore profondità: e in questo caso ne ho proprio bisogno!

Prima però è necessaria una premessa: nel corto Warawow e in Scarsa memoria spiegavo che avevo iniziato a leggere i miei libri sulle reti neurali partendo da un testo super teorico (Deep Learning di Josh Patterson e Adam Gibson, Ed. O'Reilly, 2017). Dopo quattro capitoli di pura teoria, con concetti che si ammassavano l’uno sull’altro, senza arrivare a niente di concreto ero passato all’estremo opposto, a un testo puramente pratico con vari esempi concreti e funzionanti (Deep Learning Cookbook di Douwe Osinga, Ed. O’Reilly, 2018).

A causa di problemi tecnici (insufficiente memoria RAM) avevo avuto delle difficoltà col primo esercizio (calcolare le somiglianze del testo sfruttando word embeddings (*1)) ma poi le avevo superate.
In questo primo esercizio di reti neurali non ci sarebbe stato neppure bisogno: così, a scopo didattico, ne era stata inserita una che imparava a riconoscere i nomi degli stati dalle altre parole ma, volendo, se ne sarebbe potuto anche fare completamente a meno visto che per allenarla si usava direttamente una parte dell’elenco di tutte le nazioni! Lo specifico perché in questo caso l’autore non si era preoccupato di entrare troppo nei dettagli della rete neurale usata ma io non me ne ero preoccupato…

Il secondo esercizio (quello su cui mi sono bloccato) sfrutta alcuni concetti visti nel primo capitolo.
L’idea è quella di costruire una rete neurale in grado di suggerire pellicole (o qualsiasi altro soggetto) estraendo i dati su cui addestrare la rete neurale da wikipedia.
La prima parte del codice, che non ho studiato perché non mi interessava, serve infatti a estrarre i dati che servono da wikipedia: per ogni film il codice è in grado di estrarre tutti i marcatori presenti sulla relativa pagina. Alla fine si ottiene un grosso archivio di testo con 10.000 pellicole e, se non erro, sui 60.000 marcatori.
E qui cominciano le difficoltà: l’idea è quella di trasformare ogni pellicola in un vettore multidimensionale in base ai marcatori che lo caratterizzano e, fatto questo, sfruttare gli stessi strumenti matematici che ci permettevano di trovare parole di significato simile nel primo esercizio.

Premetto che il codice funziona benissimo (*2), quello che non capisco è come i film vengono trasformati in vettori. Cioè io mi aspetterei delle operazioni puramente matematiche basate sui marcatori di ogni pellicola ma invece si utilizza una rete neurale che viene addestrata con le associazioni film↔marcatore. I dettagli di questo passaggio sono appena accennati e il mio scopo odierno è quello di capirli almeno a un livello intuitivo.

Un problema di questo secondo libro infatti è che viene presentato del codice per risolvere dei problemi concreti (anche molto interessanti) ma non viene fornito un minimo di accenno teorico (*3) al perché si utilizzi uno specifico tipo di rete neurale invece che un altro.
Oltretutto il codice Python utilizzato è piuttosto complesso nel senso che l’autore usa tutte le astuzie per renderlo il più compatto ed efficiente possibile. Il problema è che più un codice è compatto e più è difficile da capire (vengono fatte più cose insieme). A questo si deve aggiungere che io non conosco il Python e alcuni suoi costrutti non mi sono ancora ben chiari…

Allora proviamo a ripercorrere insieme i vari passaggi.
1. Viene costruita una lista con tutte le associazioni film↔marcatore. [e questo è chiaro!]
2. ?? [qui l’unica parta comprensibile delle spiegazione del testo è “Ora siamo pronti a introdurre il nostro modello [di rete neurale]” il resto è decisamente incomprensibile. Cosa infatti siano gli “strati di embeddings per le pellicole e i marcatori” non mi è assolutamente chiaro! Per non parlare della frase successiva: “Lo strato di embedding allocherà un vettore di dimensione embedding_size per ogni possibile ingresso. Altre due righe e la spiegazione è finita…]
3. ?? [viene poi “spiegato” l’addestramento vero e proprio della rete con 5 linee di testo per 16 linee di codice…]
4. ?? [viene poi eseguito l’addestramento vero e proprio, quello che sul mio calcolatore necessità di 75 minuti circa…]

In realtà il punto chiave è il 2: credo che i punti 3 e 4 sarebbero molto più chiari una volta compreso il secondo. Adesso proverò a (ri)studiarmi il codice…

Innanzi tutto dalle dichiarazioni iniziali si scopre che vengono usati tre oggetti della libreria Keras (quella che si appoggia a un’altra liberira di livello più basso che modella i dettagli della rete neurale) ovvero: Model, Embedding, Input, Reshape e Dot.
Però dalla libreria sklearn viene importato l’oggetto LinearRegression.
E ovviamente c’è la libreria matematica numpy

Queste sono informazioni utili perché così so dove andare a cercare i dettagli delle funzioni usate anche se, da quel poco che ho visto, le spiegazioni delle varie API non sono banali e spesso accennano a della matematica che non conosco…

Qualche dato: le pellicole sono 10.000, i marcatori (usati almeno tre volte) sono 66.913 e le associazioni film↔marcatore 949.544. Ogni marcatore ha quindi associati mediamente 95 marcatori e ogni marcatore è mediamente associato a 14 pellicole.


Un paio di ore…

Cena

Un’altra oretta…


Va bene: adesso ho compreso l’80% del codice. Fondamentale è stato leggere la API di Keras per gli oggetti e i metodi usati. Numpy è usato solo per mescolare casualmente delle matrici mentre la LinearRegression non è ancora stata usata.
Non entro nei dettagli (l’avevo premesso che questo pezzo era per me e non per i lettori!) perché mi richiederebbe troppo tempo.
Il passaggio chiave è l’oggetto Dot che corrisponde a un particolare strato intermedio della rete neurale, l’unico su cui vi siano i pesi da aggiustare. Non mi è chiaro perché ma vi sono 50x10.000 pesi per i film e 50x66.913 pesi per i marcatori (dove 50 è il numero di elementi per blocco di addestramento): in totale oltre 3.800.000 parametri!
In particolare i vettori di ingresso corrispondenti a film e pellicole vengono moltiplicati fra loro: non capisco perché si deve fare proprio questa operazione e non un’altra (tipo sommarli insieme oppure farne la media…).

Comunque adesso ho il seguente piano.
Affinché la lettura di questo libro di esempi pratici sia proficua deve conoscere un po’ di Keras (che qui viene usata ma non spiegata) e devo conoscere il Python in maniera da non rimanere confuso dalla sintassi e non perdere ore per capire poche linee di codice.
Quindi adesso che ne so un po’ di più posso dare un’occhiata rapida a tutti i libri che ho a disposizione sull’argomento e vedere se c’è qualcosa di adatto: ad esempio ricordo che ho un libro su TensorFlow ma adesso so che tratta di una libreria di livello troppo basso per essermi utile… l’ideale sarebbe avere un libro su Keras…

Nel caso peggiore cercherò un minicorso in rete: ho già visto che c’è qualcosa. Non mi servono troppi dettagli, mi basta capire il funzionamento generale.
Lo stesso vale per Python: se trovo un buon minicorso in 2/3 giorni dovrei essere in grado di impararlo sufficientemente, ovvero capire le sintassi complicate e scriverne di semplici…

Conclusione: pezzo inutile? Per me no!

Nota (*1): non sono sicuro della definizione corretta di word embeddings ma, in pratica, si sfruttava un gigantesco dizionario in cui a ogni parola è associato un vettore multidimensionale (nel caso dell’esempio di 300 dimensioni!). Parole simili hanno vettori simili: usando una libreria matematica gratuita è facile fare tutte le operazioni del caso…
Nota (*2): anche se il mio povero calcolatore è stato nuovamente umiliato: l’autore spiega infatti che il tempo di addestramento della rete neurale sarà “piuttosto breve” anche con hardware non potente e senza l’uso GPU. Beh, nel mio caso il calcolatore ci ha messo 1 ora e 20 minuti sfruttando tutte e quattro le CPU al 100%!
Nota (*3): al contrario gli autori dell’altro libro si perdevano nella teoria evitando di compromettersi con esempi concreti. È l’atteggiamento tipico dei professori: di fronte a qualcosa di complesso rimangono nel vago piuttosto che dire delle leggere inesattezze. È il contrario del mio modo di procedere: io preferisco una spiegazione approssimativa a nessuna spiegazione!
Il commento vago non riesco a memorizzarlo perché ha troppe interpretazioni possibili (cioè può significare dieci cose diverse in base a come si interpretano dei singoli dettagli: tutta questa indeterminatezza alla fine mi confonde) mentre l’esempio concreto mi rimane scolpito in mente (e, in genere, non ho problemi poi a generalizzare dal singolo esempio specifico).

Nessun commento:

Posta un commento