I videogiochi hanno contribuito a sviluppare numerose tecnologie che hanno poi trovato applicazioni in altri campi. Ad oggi però il contributo più importante è stato quello di consentire lo sviluppo dell’hardware ormai indispensabile per il funzionamento dell’intelligenza artificiale basata sulle reti neurali, che ha rivoluzionato il funzionamento di tutti i sistemi che usiamo.
Alla base delle tecniche usate per realizzare molte delle strabilianti attività che l’apprendimento automatico ha reso possibile troviamo infatti le deep neural networks, ovverosia le reti neurali profonde: si tratta di algoritmi, ispirati dal funzionamento delle reti neurali umane, capaci di astrarre da un numero sempre crescente di esempi le ricorrenze nei dati per poi trovarle in presenza di dati sconosciuti secondo quello che in un certo senso si può definire analogia.
Intelligenza artificiale e videogame: come il deep learning cambierà le regole del gioco
La relazione tra intelligenza artificiale e schede grafiche
Questa rivoluzione che in soli dieci anni ha trasformato radicalmente il modo con cui i sistemi vengono realizzati è stata possibile anche e soprattutto grazie agli acceleratori grafici noti come GPU sviluppati alla fine degli anni ’90 per sostenere la grafica 3D dei videogiochi. Si tratta di uno di quegli esempi che mostrano come la contaminazione tra aree differenti possono portare a grandissime innovazioni, e spesso il mondo dei videogiochi ha contribuito grazie alla costante necessità di spingere al limite le capacità dei dispositivi per realizzare giochi sempre più immersivi e attraenti.
Ci si può però chiedere che relazione intercorre tra l’intelligenza artificiale e le schede grafiche, e in effetti ci sono voluti più di dieci anni perché le strade tra i due mondi si incrociassero per generare l’accelerazione tecnologica che tutti noi oggi conosciamo. Si tratta di una relazione legata un po’ ad operazioni matematiche comuni ai due problemi, e un po’ all’abilità dei ricercatori, soprattutto agli albori, di saper rappresentare un problema non grafico come se fosse un’applicazione grafica. È anche la storia di un grande investimento industriale che ha promosso la ricerca per trovare le applicazioni delle tecnologie sviluppate, e la creatività dei ricercatori ha consentito di dimostrare che non solo l’applicazione tecnologica fosse possibile, ma anche di ottenere un salto di qualità in un’applicazione classica grazie all’impiego di tecniche maturate nell’arco di quasi 50 anni che aspettavano solo un hardware capace di sostenerle.
La genesi delle GPU: da dispositivo specializzato a processore programmabile
Nella seconda metà degli anni ’90 i PC stavano crescendo in capacità di calcolo, rendendo possibile la realizzazione di giochi interattivi che facevano uso di grafica tridimensionale. Il gioco Wolfestein 3D, rilasciato nel 1992, aveva dimostrato come giochi che rappresentano un mondo in cui il giocatore si poteva muovere in prima persona possedevano un grandissimo potenziale. La grafica del gioco non era interamente tridimensionale, solo il labirinto veniva rappresentato con tecniche embrionali di grafica 3D, i personaggi e gli altri elementi del gioco erano delle immagini bidimensionali che venivano sovraimposte al rendering del labirinto tridimensionale.
Negli anni ’90 le schede grafiche stavano implementando in hardware alcune operazioni molto utilizzate nella grafica 2D necessaria per realizzare i sistemi a finestre. Era quindi nell’aria l’idea che fosse possibile usare dei processori dedicati da affiancare all’unità centrale anche per supportare la realizzazione di applicazioni grafiche capaci di creare proiezioni di oggetti tridimensionali sullo schermo.
Il problema del “rastering”
Il problema del “rastering” è infatti quello di accendere i pixel dello schermo corrispondenti a figure geometriche come mostrato in figura. E nel caso di animazioni questa operazione va effettuata almeno 25 volte al secondo per ottenere un risultato accettabile (anche se oggi riteniamo che per meno di 60 volte al secondo non valga la pena scomodarsi) che, anche con gli schermi dell’epoca, richiede di aggiornare circa 750.000 pixel alla volta.
L’evoluzione degli acceleratori grafici
Gli acceleratori grafici in hardware hanno quindi da sempre fornito operazioni allo scopo di svolgere determinate operazioni molto semplici su una grande mole di dati, consentendo di scaricare la CPU da compiti che non saprebbe svolgere con altrettanta efficienza. Il passaggio alla grafica 3D è stato quasi naturale, e tutto ad un tratto la sfida è divenuta quella di poter descrivere superfici tridimensionali approssimandole con serie di triangoli descritte dai vertici e proiettandole sulla superficie di una camera virtuale che corrisponde al fotogramma da mostrare sullo schermo.
Nuovamente gli acceleratori grafici hanno affrontato il problema di elaborare moltissimi vertici simultaneamente, implementando in hardware operazioni specifiche atte ad ottimizzare la matematica usata basata su dati vettoriali e matrici di trasformazione (per la proiezione e la trasformazione di sistemi di coordinate).
L’evoluzione è stata rapida e gli acceleratori grafici (GPU) sono divenuti processori con un’architettura di complessità paragonabile a quella delle CPU ma ottimizzati per svolgere funzioni differenti: la CPU tradizionalmente svolge operazioni complesse accedendo alla memoria potendo anticipare solo approssimativamente le prossime operazioni da eseguire, mentre la GPU consente operazioni relativamente semplici sui dati, ma è capace di svolgerle su molti dati alla volta (si parla di architettura SIMD: Single Instruction Multiple Data, ovverosia in un solo passo la GPU è capace di trasformare molti dati di input).
Al crescere della complessità delle GPU e per consentire la realizzazione di effetti grafici speciali i principali produttori all’inizio del nuovo millennio cercano di capire come rendere “programmabili” le ottimizzazioni effettuate dalle GPU mediante il concetto di vertex e pixel shader. Come spesso succede la programmabilità e i limiti di queste semplici procedure eseguite dalla GPU è cresciuta fino a raggiungere intorno al 2006 la piena programmabilità riconosciuta da CUDA di nVidia, un sistema di programmazione general purpose per mettere a disposizione dei programmatori le capacità degli acceleratori grafici per affrontare problemi che non fossero limitati alla grafica. La capacità della GPU di elaborare grandi moli di dati numerici, e la natura matriciale della grafica 3D le rendevano indicate per essere impiegate in altri ambiti di applicazione, come ad esempio la simulazione fluidodinamica, tecnica utilizzata sia nell’industria automobilistica che nell’oil and gas.
Procedural Generation: cosa aspettarsi dall’intelligenza artificiale nei videogiochi
Per cambiare la percezione di questi dispositivi legati largamente all’intrattenimento nVidia promuove una serie di iniziative volte a stimolarne l’uso da parte dei ricercatori universitari nella speranza di trovare nuove applicazioni per un hardware che era divenuto computazionalmente molto efficiente. Tra i gruppi sponsorizzati troviamo quello di Andrew Ng a Stanford che comincia a studiare come questi acceleratori potessero essere impiegati nell’implementazione e nell’accelerazione delle reti neurali.
Il percettrone e l’evoluzione delle reti neurali
Le reti neurali, oggi alla base di innumerevoli applicazioni, hanno una lunga storia e ci sono voluti oltre cinquant’anni perché trovassero applicazione massiccia nei sistemi. Nel 1958 Frank Rosenblatt propone il percettrone, un algoritmo che per classificare i dati in ingresso in due classi secondo un approccio ispirato al funzionamento dei neuroni impiegati nel nostro cervello. Nonostante la cruda approssimazione l’approccio era sicuramente affascinante al tempo e le ricerche si protrassero fino al 1969 dove Minsky e Papert in un libro mostrarono i limiti dell’algoritmo accantonando, seppur temporaneamente, l’idea.
A metà degli anni 80 l’algoritmo di back propagation restituisce nuova vita alle reti neurali superando i limiti del percettrone e riaccendendo l’attenzione per le reti neurali che trovano impiego nel riconoscimento di grafia e caratteri cominciando a trovare applicazioni sia in ambito civile che militare. La back propagation è un algoritmo che certifica l’uso delle matrici e dell’algebra lineare come la base per la realizzazione di questi algoritmi di apprendimento automatico, mostrando come i limiti del percettrone potessero essere superati introducendo livelli di neuroni nascosti nella rete.
La potenza di calcolo dei processori non è però adeguata ad apprendere modelli complessi e nuovamente l’attenzione, a cavallo del nuovo millennio, si sposta dalle reti neurali ad altre novità tecnologiche come la piena diffusione di Internet. L’arrivo delle GPU per il calcolo general purpose (spesso riferite come GPGPU) e la sfida lanciata ai ricercatori produce nell’arco di un lustro risultati importanti, e nel 2012 una particolare classe di reti neurali (le deep neural network o DNN) vengono usate con successo in una competizione di classificazione automatica di immagini migliorando in modo significativo lo stato dell’arte nel riconoscimento di oggetti presenti nelle immagini. L’anno successivo l’uso delle DNN (in particolare di quelle convolutive) consente di addestrare un programma a giocare a Pacman meglio di qualsiasi uomo senza possedere alcuna conoscenza se non quella delle azioni che si possono compiere e che se si perde una vita è male e, al contrario, se si mangiano tutti i frutti è bene (si tratta di apprendimento con rinforzo, una tecnica che sovrappone esecuzione e apprendimento cercando di imparare nel tempo a non ricevere feedback negativi). Una deliziosa demo dell’algoritmo può essere provata direttamente nel web browser come esempio d’uso della libreria ConvNet.js sviluppata a Stanford. Le DNN non sono state inventate nel 2012, né negli anni subito precedenti, ma sono divenute popolari quando l’uso smart delle GPU ha consentito di accelerare di un fattore 70 la velocità di apprendimento, consentendo l’analisi di molti più dati in questa fase e portando da giorni o settimane a poche ore il tempo di apprendimento su un dataset reale capace di addestrare la rete per svolgere funzioni utili.
Successivamente si è innescato il circolo virtuoso in cui la maggiore attenzione relativa alle tecniche e ai loro impieghi ha attratto più investimenti consentendo sviluppi dedicati dell’hardware fino ad arrivare ai giorni nostri dove la maggior parte delle applicazioni che usiamo fa uso di queste tecniche per funzionare.
Conclusioni
I videogiochi, come abbiamo visto, hanno contribuito a sviluppare numerose tecnologie che hanno poi trovato applicazioni in altri campi. Il fenomeno è in parte legato alla necessità del mercato di innovare per vendere, e in parte dal volume di risorse generato dal mercato mondiale che consente investimenti per la realizzazione di nuove tecnologie che in altri settori sarebbero impensabili. I joystick con force feedback sono stati usati per realizzare sistemi di operazioni chirurgiche, i caschetti di realtà aumentata sono uno dei dispositivi più diffusi in alcune industrie e rappresenteranno uno dei modi per entrare nel metaverso di cui si parla tanto. Il contributo più importante, quello di consentire lo sviluppo dell’hardware ormai indispensabile per il funzionamento dell’intelligenza artificiale è probabilmente di uno dei più grandi monumenti al “think different” nella storia recente, dove solo la passione di ricercatori e la loro creatività ha mostrato al mondo che un nuovo futuro era possibile.