Oggi voglio tentare un esperimento anche se sono abbastanza sicuro che fallirà…
Due giorni fa ho finalmente ripreso in mano il libro Deep Learning Cookbook di Douwe Osinga: ero arrivato al capitolo 5, dove si insegna a una rete neurale a generare testi casuali sullo stile di uno specifico autore (Shakespeare, nell’esempio fornito).
La stessa tecnica può poi venire usata per generare nomi casuali o magari ricette, etc…
Curiosamente anch’io in passato mi ero scritto dei programmi per ottenere nomi casuali partendo da dei nomi reali: senza saperlo avevo usato delle tecniche che ricordano le catene markoviane, basate cioè sulla sola statistica. In pratica fornivo al calcolatore i diversi nomi già divisi in fonemi e costruivo una struttura dove, partendo da un fonema, si poteva raggiungere tutti i fonemi che negli esempi lo seguivano. Percorrendo poi questa struttura in maniera casuale (con certe correzioni basate sulle relative frequenze dei diversi fonemi) ottenevo dei nomi completi che, spesso, suonavano piuttosto realistici.
Usando una tecnica analoga avevo anche realizzato un programma in cui inserendo il testo di email (ma avrei potuto usare qualsiasi testo) veniva costruita una struttura in cui per ogni parola (non fonema) era possibile trovare tutti i possibili termini che negli esempi forniti la seguivano.
Anche con poche email (una decina o meno) il risultato era molto divertente: si ottenevano dei testi assurdi ma che ricordavano, spesso abbastanza chiaramente, lo stile dell’autore degli esempi.
Curiosamente Gmail riconosceva e marcava come spazzatura queste creazioni automatiche e così mi ci volle un bel po’ per capire come mai i miei amici non ricevessero le buffe creazioni…
La tecnica di Osinga ricorda fortemente il precedente approccio ma la cosa stupefacente è che fornisce in pasto alla rete neurale carattere per carattere l’intera opera di Shakespeare: la rete neurale viene perciò addestrata a prevedere, dato un carattere, quale sarà il successivo. Reiterando il processo si ottengono testi di lunghezza arbitraria.
Lo trovo stupefacente perché usando ad esempio la “mia” tecnica otterrei solo delle parole casuali che ricordano vagamente l’inglese e frasi conseguentemente senza senso.
Invece la rete neurale fornisce dei testi estremamente realistici SENZA introdurre parole non esistenti…
Comunque la mia lettura è stata decisamente inconcludente: Osinga è sempre più criptico e fornisce solo poche briciole sulla teoria usata. Il suo Python è poi il solito incubo di concisione.
Oltretutto quando ho provato l’esempio fornito non sono riuscito a terminare l’addestramento della rete neurale perché richiedeva troppo tempo (o forse c’era qualcosa che non andava?) e dopo una trentina di minuti in cui non vedevo progressi l’ho bloccato.
Quindi in questo caso ho due problemi: il primo è teorico, ovvero cercare di capire perché ha usato una specifica rete composta proprio da quegli strati, di quella esatta dimensione etc…
Per fare questo dovrò esaminare i vari costrutti di Keras e capire quello che fanno basandomi sulla relativa documentazione. Operazione noiosa dalla quale otterrò probabilmente tanti nuovi dubbi quante risposte trovate.
Il secondo problema è la solita difficoltà a comprendere tecnicamente il linguaggio Python: cioè il codice semplice e lineare lo capisco già ma Osinga in una linea di codice ne comprime 3 o 4 aumentando però esponenzialmente la difficoltà di comprensione per il lettore…
Veramente un libro frustrante da questo punto di vista!
Nel mio ultimo pezzo sulle reti neurali, dove anticipavo questo capitolo, accennavo al fatto che volevo modificare il codice fornito da Osinga per generare frasi basate non su Shakespeare ma sui pezzi del mio ghiribizzo (o forse, visto che non ho ritrovato l'articolo in questione, avevo solo PENSATO di farlo!).
L’esperimento odierno consiste proprio in questo, cioè nella sua prima tappa: estrarre, usando Python, il testo dei miei scritti da Blogger.
L’idea odierna è quella di riportare “in diretta” quello che faccio su questo articolo in maniera poi da ottenere una descrizione realistica dei miei progressi perché, inevitabilmente, conterrà anche molti vicoli ciechi, ovvero farò anche molti tentativi ed esperimenti infruttuosi…
Il problema di questo approccio è che rallenterà moltissimo il mio lavoro sia frammentandolo che distraendomi: credo quindi che proverò oggi, così per curiosità, ma che difficilmente lo ripeterò.
L’obiettivo è triplice: da una parte familiarizzarmi con Python (cosa di cui ho estremo bisogno e per riuscirci devo fare pratica scrivendo codice per mio conto) dall’altra fare un passo nella direzione di ottenere una rete neurale basata sui miei testi e, infine, produrre un pezzo diverso dal solito e forse, incuriosire e divertire i miei lettori con i miei sforzi inani…
Conclusione: già questa sola premessa mi ha preso già un bel po’ di tempo. Ho deciso quindi di pubblicare separatamente questa introduzione e di incominciare il lavoro vero e proprio in un nuovo pezzo: magari se riesco a finirlo oggi lo pubblicherò subito spostando a ieri la data di questo…
giovedì 21 febbraio 2019
Iscriviti a:
Commenti sul post (Atom)
Nessun commento:
Posta un commento