Utilizzando Unity per aiutare a risolvere l’intelligenza

Utilizzo di Unity per risolvere l'intelligenza.

Un’ampia gamma di ambienti

Nella ricerca dell’intelligenza artificiale generale (AGI), cerchiamo di creare agenti in grado di raggiungere obiettivi in un’ampia gamma di ambienti. Man mano che i nostri agenti padroneggiano gli ambienti che creiamo, dobbiamo continuamente creare nuovi ambienti che mettano alla prova abilità cognitive finora non testate.

I giochi hanno sempre rappresentato una sfida per la ricerca sull’intelligenza artificiale (AI), soprattutto i giochi da tavolo come backgammon, scacchi e Go. Anche i videogiochi come Space Invaders, Quake III Arena, Dota 2 e StarCraft II sono diventati più recentemente popolari per la ricerca sull’AI. I giochi sono ideali perché hanno una chiara misura del successo, consentendo di valutare il progresso in modo empirico e confrontarlo direttamente con gli esseri umani.

Man mano che la ricerca sull’AGI avanza, cresce anche l’interesse della comunità scientifica per giochi più complessi. Allo stesso tempo, gli sforzi di ingegneria necessari per trasformare singoli videogiochi in ambienti di ricerca diventano difficili da gestire. Sempre più spesso, i motori di gioco di uso generale diventano il modo più scalabile per creare un’ampia gamma di ambienti interattivi.

Motori di gioco di uso generale

Molta ricerca sull’AGI è già avvenuta all’interno di motori di gioco come Project Malmo, basato su Minecraft; ViZDoom, basato su Doom; e DeepMind Lab, basato su Quake III Arena. Questi motori possono essere scriptati per creare rapidamente nuovi ambienti – e poiché molti sono stati scritti per hardware più vecchi, sono in grado di funzionare estremamente velocemente sull’hardware moderno, eliminando l’ambiente come collo di bottiglia delle prestazioni.

Tuttavia, questi motori di gioco mancano di alcune importanti caratteristiche. Ad esempio, DeepMind Lab è eccellente per apprendere la navigazione ma poco adatto per apprendere concetti di buon senso come il movimento degli oggetti e la loro interazione reciproca.

Unity

Presso DeepMind utilizziamo Unity, un motore di gioco flessibile e ricco di funzionalità. La simulazione fisica realistica di Unity consente agli agenti di sperimentare un ambiente più strettamente ancorato al mondo reale. La moderna pipeline di rendering fornisce indizi visivi più sottili come l’illuminazione realistica e le ombre. Gli script di Unity sono scritti in C#, che è facile da leggere e, a differenza dei motori su misura, fornisce accesso a tutte le funzionalità del motore di gioco. Il supporto multi-piattaforma ci consente di eseguire gli ambienti sia a casa sui nostri laptop che su larga scala nei data center di Google. Infine, poiché il motore di Unity continua a evolversi, possiamo garantire la compatibilità futura senza dover impiegare una grande quantità di tempo di sviluppo.

Unity include un toolkit di apprendimento automatico pronto all’uso chiamato ML-Agents, che si concentra sulla semplificazione del processo di rendere un gioco esistente disponibile come ambiente di apprendimento. DeepMind si concentra sulla costruzione di una vasta gamma di ambienti eterogenei che vengono eseguiti su larga scala, e quindi utilizziamo dm_env_rpc (vedi sotto).

Screen captures of Unity environments created at DeepMind

Differenze rispetto ai giochi convenzionali

I giochi tradizionali si rendono in tempo reale: un secondo sullo schermo corrisponde a un secondo in una simulazione. Ma per i ricercatori di intelligenza artificiale, un gioco è solo uno stream di dati. I giochi possono spesso essere elaborati molto più velocemente rispetto al tempo reale e non ci sono problemi se la velocità del gioco varia notevolmente da un momento all’altro.

Inoltre, molti algoritmi di apprendimento per rinforzo si scalano con più istanze. Ciò significa che un’intelligenza artificiale può giocare migliaia di giochi contemporaneamente e imparare da tutti loro contemporaneamente.

A causa di ciò, ottimizziamo per la velocità di elaborazione anziché per la latenza. Aggiorniamo i nostri giochi il più possibile e non ci preoccupiamo di generare tali aggiornamenti ad un ritmo costante. Eseguiamo più giochi su un singolo computer, con un gioco per core del processore. I blocchi causati da funzionalità come la garbage collection – un problema comune per i creatori di giochi tradizionali – non ci preoccupano purché il gioco funzioni generalmente in modo rapido.

Containerizzazione e dm_env_rpc

I giochi producono immagini, testo e suoni che il giocatore può vedere e sentire, e accettano anche comandi di input da un controller di gioco di qualche tipo. La struttura di questi dati è importante per i ricercatori di intelligenza artificiale. Ad esempio, il testo viene normalmente presentato separatamente anziché essere disegnato sullo schermo. Poiché la flessibilità di questo formato dati è così importante, abbiamo creato una nuova libreria open source chiamata dm_env_rpc, che funge da interfaccia tra ambienti e agenti.

Utilizzando dm_env_rpc, possiamo containerizzare i nostri ambienti e renderli pubblici. La containerizzazione significa utilizzare tecnologie come Docker per confezionare binari di ambiente precompilati. La containerizzazione consente di verificare in modo indipendente le nostre ricerche. È un modo più affidabile e conveniente per riprodurre gli esperimenti rispetto all’open source, che può essere influenzato da differenze nel compilatore o nel sistema operativo. Per ulteriori dettagli su come containerizzare un ambiente, consultare il nostro lavoro su dm_memorytasks.