Molti di noi, da piccoli, sono stati appassionati di costruzioni Lego: chi ha abbastanza primavere sulle spalle ricorderà che un tempo i famosi mattoncini non erano differenziati e specializzati come oggi, ma più primitivi, dalle forme semplici ed essenziali: parallelepipedi e cubi, di vari spessori, con qualche pezzo di raccordo dalle forme curve o triangolari. Sebbene sulle scatole fosse illustrato il risultato costruibile, con i mattoncini si finiva sempre per assemblare qualcos’altro. Magari prima si provava con la costruzione illustrata sulla copertina, ma poi la si smontava, rimontava, e così via fino a ottenere qualcosa di nuovo, originale e unico.
Il valore pedagogico di questi pomeriggi passati a costruire e smontare mattoncini è indubbio. Questa sorta di metodo “decostruttivista-costruttivista” è, in effetti, una strategia di apprendimento per creare cose nuove ma simili a cose già esistenti: non sorprende quindi che, in tempi recenti, c’è chi l’abbia implementata in sistemi di Machine Learning.
Dedurre dati da altri dati
Le reti neurali sono ormai pervasive non soltanto nel campo dell’Intelligenza Artificiale ma anche in tutta la tecnologia informatica, dove vengono impiegate le applicazioni più disparate, che si possono tutte ricondurre a un’idea molto semplice: dedurre dati da altri dati. Per esempio, una rete che classifica un testo per deciderne il “sentiment” deduce da un dato testuale (una stringa) un dato di tipo booleano (positivo/negativo). La rete in realtà accetta numeri e produce numeri: in questo caso i numeri in input codificano il testo, quello in output, in base a un valore di soglia, dà luogo a due classi: i numeri inferiori alla soglia (negativo) e quelli superiori alla soglia (positivo).
Quando si addestra la rete, si confronta il suo output su un input X il cui sentiment S sia noto: se la rete all’input X associa un sentiment uguale a S, ha risposto correttamente, altrimenti ha sbagliato e i parametri interni alla rete (i pesi) vengono aggiustati per migliorarne in futuro la risposta.
Dunque una rete neurale risponde a dei numeri con altri numeri, avendo costruito al proprio interno un modello per la risposta basato su un insieme preconfezionato di risposte date: se le mostriamo un milione di tweet il cui sentiment è noto e codificato, la rete impara a riconoscere i tweet positivi da quelli negativi e, dopo il periodo di addestramento su questi dati di test, potrà essere usata su dati che non ha mai visto prima usando, per classificarli, il proprio modello interno. Questo meccanismo è un po’ comune a tutte le reti neurali, indipendentemente dalla loro struttura e dall’ambito applicativo.
Nell’addestramento si usa un “training set” di dati che è un insieme di coppie (X,Y) dove X è un input e Y l’output atteso per esso: si dà X in pasto alla rete, si ottiene un Y da essa e lo si confronta col corretto Y per correggere eventualmente il comportamento della rete stessa. In questo modo la rete, dopo varie “epoche” di apprendimento, sarà in grado di associare correttamente le X alle Y corrispondenti.
Per questo diciamo che una rete “classifica” o “predice” dati. Questa è tuttavia una nostra suggestione linguistica: quello che la rete fa è, dati dei numeri in input, produrre dei numeri in output in modo che l’associazione fra input e output sia coerente con un insieme di dati di test.
Reti neurali e immagini
Solitamente l’input X e l’output Y sono abbastanza diversi: per esempio X è una immagine e Y un’etichetta (potremmo volere una rete che distingue cani da gatti, o papere da ornitorinchi, etc.). Tuttavia nulla vieta che X e Y siano dello stesso tipo, per esempio due immagini. In questo caso la rete produce immagini a partire da immagini, e vorremmo addestrarla in modo che all’immagine X corrisponda qualcosa di simile all’immagine Y.
Un caso “semplice” è quando X = Y: allora la rete viene addestrata a riprodurre il dato che le viene passato in input. Per farlo in modo non banale e codificando internamente la struttura di questo dato, la rete prima associa all’immagine X una codifica interna, solitamente più compressa, e poi dalla codifica interna deduce una nuova immagine. Quindi questo tipo di rete contiene in realtà due reti: un encoder che “comprime” l’informazione di input in un formato interno (encoding) e un decoder che “decomprime” l’encoding in una immagine di output. Lo scopo è creare immagini simili a quelle di input.
(Fonte: towardsdatascience.com)
Queste reti hanno due caratteristiche interessanti: sono non supervisionate, cioè i dati del training set non devono essere etichettati o comunque associati a un output atteso (infatti l’output atteso è l’input stesso); non sono usate per predire o classificare ma piuttosto per fare l’inverso, cioè fornire esempi di classi date.
Per esempio, una “rete generativa” (questo è il nome che solitamente si dà a questi modelli) dato l’input “positivo”, potrebbe produrre un testo con sentiment positivo e, dato un input “negativo”, produrre un testo con sentiment negativo. Oppure potrebbe produrre immagini di cani, gatti, papere, ornitorinchi e quant’altro su richiesta: nessuna di queste immagini corrisponderebbe a una foto mai “vista” dalla rete, ma sarebbe una sintesi di una foto simile alle foto che essa ha avuto modo di analizzare.
Le applicazioni di business sono interessanti: per esempio dato un disegno molto schematico, come un’ipotesi per un nuovo modello di borsetta, la rete potrebbe rifinirlo aggiungendo colori, contorni, o anche stili su richiesta. L’immagine seguente mostra come applicare a una foto lo stile di un quadro di van Gogh per ottenere il luogo della foto come l’avrebbe dipinto lui (più o meno!):
(Fonte: www.boredpanda.com)
Altri esempi impressionanti della potenza di queste reti sono date nelle seguenti illustrazioni (tratte da un articolo scientifico del 2016): nella prima di esse si vede una riga di camere da letto immaginate da una rete generativa; nella seconda riga si vede il risultato quando alla rete è stato chiesto di non inserire finestre, che sono state eliminate o trasformate in qualcosa di diverso.
Nella seguente illustrazione si vede invece una sorta di “aritmetica delle espressioni” in cui alla rete si chiede, partendo da alcuni volti, di sottrarre una caratteristica e aggiungerne un’altra per creare un nuovo volto con la caratteristica desiderata: in questo caso da una donna sorridente e un uomo di espressione neutra vogliamo un uomo sorridente, quindi sottraiamo una donna con espressione neutra:
La figura mostra tre diversi risultati prodotti dalla rete a questa richiesta.
Questi risultati veramente sorprendenti si ottengono combinando in modo molto interessante tecniche di reti neurali convolutive (particolari reti “profonde”) secondo alcuni schemi che negli ultimi anni sono stati proposti in letteratura, e che magari esploreremo in un prossimo articolo.
Paolo Caressa