Kuinka rakentaa oma AlphaZero AI Pythonin ja Keran avulla

Opettele kone oppimaan Connect4-strategia itsepalvelun ja syvän oppimisen avulla

Tässä artikkelissa yritän kattaa kolme asiaa:

  1. Kaksi syytä, miksi AlphaZero on valtava edistysaskel keinotekoisen älykkyyden kannalta
  2. Kuinka voit rakentaa AlphaZero-metodologian kopion pelataksesi Connect4-peliä
  3. Kuinka voit mukauttaa koodin kytkeäksesi muita pelejä

AlphaGo → AlphaGo Zero → AlphaZero

Maaliskuussa 2016 Deepmindin AlphaGo voitti 18-kertaisen maailmanmestarin Go-pelaajan Lee Sedolin 4–1 sarjassa, jota katseli yli 200 miljoonaa ihmistä. Kone oli oppinut super-inhimillisen strategian Go: n pelaamiseksi, aikaisemmin ajatellun mahdotonta tai ainakin ainakin kymmenen vuoden päässä toteutumisesta.

AlphaGon ja Lee Sedolin ottelu 3

Tämä itsessään oli merkittävä saavutus. Kuitenkin 18. lokakuuta 2017 DeepMind otti valtavan harppauksen eteenpäin.

Artikkelissa 'Mastering the Game of Go ilman ihmisen tietämistä' paljastettiin uusi algoritmin vaihtoehto, AlphaGo Zero, joka oli voittanut AlphaGo 100–0: n. Uskomatonta, se oli tehnyt niin oppimalla pelkästään itsepelaamisen avulla, aloittamalla ”tabula rasa” (tyhjä tila) ja etsimällä vähitellen strategioita, jotka voittaisivat aiemmat inkarnaatiot itsestään. Yli-ihmisen AI: n rakentamiseksi ei enää tarvinnut tietokantaa ihmisten asiantuntijapeleistä.

Kaavio 'Pelin hallitseminen ilman ihmisen tietämistä'

Vain 48 päivää myöhemmin, 5. joulukuuta 2017, DeepMind julkaisi toisen paperin "Shakin ja shogin hallitseminen itse pelaamalla yleisen vahvistusoppimisen algoritmilla", joka osoittaa kuinka AlphaGo Zeroa voitaisiin mukauttaa voittamaan maailmanmestari-ohjelmat StockFish ja Elmo shakissa. ja shogi. Koko oppimisprosessi, pelien ensimmäisestä näyttämisestä maailman parhaaksi tietokoneohjelmaksi, oli kestänyt alle 24 tuntia.

Tämän kanssa syntyi AlphaZero - yleinen algoritmi, jolla saadaan aikaan jotain nopeasti, ilman ennakkotietoa ihmisen asiantuntijastrategiasta.

Tässä saavutuksessa on kaksi hämmästyttävää:

1. AlphaZero vaatii nollaksi ihmisten asiantuntemusta

Ei voida yliarvioida, kuinka tärkeätä tämä on. Tämä tarkoittaa, että AlphaGo Zero -menetelmän taustalla olevaa metodologiaa voidaan soveltaa KAIKKIIN peleihin täydellisillä tiedoilla (pelin tila on molemmille pelaajille täysin tiedossa koko ajan), koska pelisääntöjen ulkopuolelle ei vaadita aiempaa asiantuntemusta.

Näin DeepMind pystyi julkaisemaan shakki- ja shogi-paperit vasta 48 päivän kuluttua alkuperäisestä AlphaGo Zero -paperista. Aivan kirjaimellisesti kaikki, mitä tarvittiin muuttaa, oli sisääntulotiedosto, joka kuvaa pelin mekaniikkaa ja säätää hermoverkkoon ja Monte Carlo -puun hakuun liittyviä hyperparametreja.

2. Algoritmi on naurettavan tyylikäs

Jos AlphaZero käyttäisi erittäin monimutkaisia ​​algoritmeja, joita vain kourallinen ihmisiä ymmärtäisi maailmassa, se olisi silti uskomaton saavutus. Erinomaista on se, että monet artikkelissa esitetyt ideat ovat todella paljon vähemmän monimutkaisia ​​kuin aikaisemmat versiot. Sen ytimessä on seuraava kauniisti yksinkertainen mantra oppimiseen:

Pelaa henkisesti mahdollisten tulevaisuuden skenaarioiden kautta, asettamalla etusijalle lupaavat polut, samalla kun pohdit myös sitä, kuinka muut todennäköisimmin reagoivat sinun toimintoihisi, ja jatkaa tutkimatta tuntematonta.
Saavuttuaan tuntemattomaan tilaan, arvioi kuinka suotuisaksi uskot asemasi ja kaskadoi pistemäärä takaisin aikaisempien asemien kautta mielenreitillä, joka johti tähän pisteeseen.
Kun olet valmis miettimään tulevaisuuden mahdollisuuksia, suorita toimet, joita olet tutkinut eniten.
Palaa pelin lopussa takaisin ja arvioi missä olet arvioinut tulevien kantojen arvoa väärin ja päivitä ymmärryksesi vastaavasti.

Eikö kuulosta siltä, ​​kuinka oppit pelaamaan pelejä? Kun pelaat huonoa siirtoa, se johtuu joko siitä, että olet arvioinut väärin tuloksena olevien positioiden tulevaisuuden arvoa, tai arvioit väärin todennäköisyyttä, että vastustajasi pelaa tietyn siirron, joten ei ajatellut tutkia tätä mahdollisuutta. Nämä ovat juuri ne kaksi pelin osa-aluetta, jotka AlphaZero on koulutettu oppimaan.

Kuinka rakentaa oma AlphaZero

Ensinnäkin, tarkista AlphaGo Zero -huijauskoodista saadaksesi korkeatasoinen käsitys AlphaGo Zero -sovelluksen toiminnasta. Kannattaa, että viitataan siihen, kun kävelemme koodin jokaista osaa. Täältä löytyy myös hieno artikkeli, joka selittää yksityiskohtaisemmin AlphaZero-toiminnon.

Koodi

Klooni tämä Git-arkisto, joka sisältää koodin, johon viittaan.

Käynnistä oppimisprosessi suorittamalla run.ipynb Jupyter -kannettavan kaksi parasta paneelia. Kun se on rakentanut tarpeeksi pelipaikkoja muistin täyttämiseksi, hermoverkko aloittaa harjoituksen. Lisäompelun ja -harjoituksen avulla se saavuttaa vähitellen paremmin pelin arvon ja seuraavan siirron mistä tahansa kohdasta, mikä johtaa parempaan päätöksentekoon ja viisaampaan yleiseen peliin.

Tarkastellaan nyt koodia yksityiskohtaisemmin ja esitetään joitain tuloksia, jotka osoittavat, että AI vahvistuu ajan myötä.

N.B - Tämä on oma ymmärrykseni siitä, miten AlphaZero toimii yllä olevien viitteiden sisältämien tietojen perusteella. Jos jokin alla olevista on väärä, anteeksi ja yritän korjata sen!

Connect4

Peli, jota algoritmimme oppii pelaamaan, on Connect4 (tai Four In a Row). Ei aivan yhtä monimutkainen kuin Go… mutta pelin sijainteja on silti edelleen 4.531.885.219.092.

Connect4

Pelin säännöt ovat yksinkertaisia. Pelaajat vuorotellen kirjoittavat kappaleen väristä minkä tahansa käytettävissä olevan sarakkeen yläosaan. Ensimmäinen pelaaja, joka saa neljä väriään peräkkäin - kukin pystysuunnassa, vaaka- tai vinossa, voittaa. Jos koko ruudukko täytetään ilman, että luodaan neljä riviä, peli vedetään.

Tässä on yhteenveto kooditietokannan muodostavista avaintiedostoista:

game.py

Tämä tiedosto sisältää Connect4: n pelisäännöt.

Jokaiselle neliölle annetaan luku välillä 0 - 41 seuraavasti:

Connect4: n toimintaruudut

Game.py-tiedosto antaa logiikan siirtymisen pelitilasta toiseen valitun toiminnon perusteella. Esimerkiksi, ottaen huomioon tyhjän pöydän ja toiminnon 38, takeAction-menetelmä palauttaa uuden pelitilan aloittavan pelaajan kappaleen keskisarakkeen alaosassa.

Voit korvata game.py-tiedoston millä tahansa pelitiedostolla, joka vastaa samaa sovellusliittymää, ja algoritmi oppii periaatteessa itse pelaamalla antamasi säännöt.

run.ipynb

Tämä sisältää koodin, joka aloittaa oppimisprosessin. Se lataa pelisäännöt ja iteroi sitten algoritmin pääsilmukan läpi, joka koostuu kolmesta vaiheesta:

  1. Self-play
  2. Neuroverkon uudelleenkouluttaminen
  3. Neuraaliverkon arviointi

Tässä silmukassa on mukana kaksi agenttia, paras_pelaaja ja nykyinen_pelaaja.

Paras_pelaaja sisältää parhaiten suoriutuneen hermoverkon ja sitä käytetään omien toistojen muistojen luomiseen. Sitten nykyinen pelaaja pelaa uudelleen hermoverkkoaan näihin muistoihin ja sijoitetaan sitten best_playeriin. Jos se voittaa, parhaan pelaajan sisällä oleva hermoverkko kytketään nykyisen pelaajan hermoverkkoa varten, ja silmukka alkaa uudelleen.

agent.py

Tämä sisältää Agent-luokan (pelin pelaajan). Jokainen pelaaja alustetaan omalla neuroverkolla ja Monte Carlo -hakupuulla.

Simulaatiomenetelmä suorittaa Monte Carlo -puunhakuprosessin. Erityisesti agentti siirtyy puun lehden solmuun, arvioi solmua hermostoverkollaan ja täyttää sitten solmun arvon puun kautta ylöspäin.

Toimintamenetelmä toistaa simulaation useita kertoja ymmärtääksesi mikä siirto nykyisestä sijainnista on edullisin. Sitten se palauttaa valitun toiminnon peliin, jotta siirto saadaan aikaan.

Uusintamenetelmä kouluttaa hermoverkon uudelleen käyttämällä aiempien pelien muistoja.

model.py

Esimerkki jäljellä olevasta konvoluutioverkon rakennuksesta Keran avulla

Tämä tiedosto sisältää Residual_CNN-luokan, joka määrittelee kuinka rakentaa hermoverkon esiintymät.

Se käyttää AlphaGoZero-lehden neuroverkkoarkkitehtuurin tiivistettyä versiota - ts. Konvoluutiokerrosta, jota seuraa useita jäännöskerroksia, sitten jakamalla arvo- ja käytäntöpääksi.

Konvoluutiosuodattimien syvyys ja lukumäärä voidaan määrittää konfigurointitiedostossa.

Keras-kirjastoa käytetään verkon rakentamiseen Tensorflow-taustalla.

Voit tarkastella hermoverkon yksittäisiä konvoluutiosuodattimia ja tiheästi kytkettyjä kerroksia suorittamalla seuraavat run.ipynb-muistikirjan sisällä:

current_player.model.viewLayers ()
Konvoluutiosuodattimet hermoverkosta

MCTS.py

Tämä sisältää Node-, Edge- ja MCTS-luokat, jotka muodostavat Monte Carlon hakupuun.

MCTS-luokka sisältää aiemmin mainitut moveToLeaf- ja backFill-menetelmät, ja Edge-luokan esiintymät tallentavat tilastot jokaisesta potentiaalisesta siirrosta.

config.py

Tässä asetetaan keskeiset parametrit, jotka vaikuttavat algoritmiin.

Näiden muuttujien säätäminen vaikuttaa kyseiseen ajoaikaan, hermoverkon tarkkuuteen ja algoritmin yleiseen menestykseen. Yllä olevat parametrit tuottavat laadukkaan Connect4-soittimen, mutta sen tekeminen vie kauan. Nopeuttaa algoritmia nopeammin, kokeile seuraavia parametreja.

funcs.py

Sisältää playMatches- ja playMatchesBetweenVersions -toiminnot, jotka pelaavat kahden agentin välisiä otteluita.

Jos haluat pelata luomistasi, suorita seuraava koodi (se on myös run.ipynb-muistikirjassa)

pelin tuonnista Peli
funkeista tuo playMatchesBetweenVersions
Tuo puunkorjurit lg: na
env = Peli ()
playMatchesBetweenVersions (
env
, 1 # suoritetun versionumero, jossa tietokonesoitin sijaitsee
, -1 # ensimmäisen pelaajan versionumero (-1 ihmiselle)
, 12 # toisen pelaajan versionumero (-1 ihmiselle)
, 10 # kuinka monta peliä pelata
, lg.logger_tourney # mihin kirjautua peli
, 0 # mikä pelaaja mennä ensin - 0 satunnaisesti
)

initialise.py

Kun suoritat algoritmia, kaikki malli- ja muistitiedostot tallennetaan suorituskansioon, juurihakemistoon.

Jos haluat käynnistää algoritmin uudelleen tästä tarkistuspisteestä myöhemmin, siirrä ajonkansio run_archive-kansioon liittämällä ajonumero kansion nimeen. Kirjoita sitten ajonumero, malliversion numero ja muistin versionumero Initise.py-tiedostoon, joka vastaa asiaankuuluvien tiedostojen sijaintia run_archive-kansiossa. Algoritmin suorittaminen normaalisti alkaa sitten tästä tarkistuspisteestä.

memory.py

Muistiluokan esimerkki tallentaa aiempien pelien muistot, joita algoritmi käyttää nykyisen pelaajan hermoverkon uudelleenkoulutukseen.

loss.py

Tämä tiedosto sisältää mukautetun häviötoiminnon, joka peittää ennusteet laittomista siirroista ennen siirtymistä ristin entropian menetystoimintoon.

settings.py

Run and run_archive -kansioiden sijainnit.

loggers.py

Lokitiedostot tallennetaan lokikansioon ajon kansion sisällä.

Voit ottaa lokitiedot käyttöön asettamalla logger_disabled-muuttujien arvoksi False tämän tiedoston sisällä.

Lokitiedostojen tarkasteleminen auttaa sinua ymmärtämään algoritmin toimintaa ja näkemään sen mielessä. Tässä on esimerkiksi esimerkki logger.mcts-tiedostosta.

Tulos logger.mcts-tiedostosta

Samoin logger.tourney-tiedostosta näet jokaiseen liikkeeseen liittyvät todennäköisyydet arviointivaiheen aikana:

Tulos logger.tourney-tiedostosta

tulokset

Muutaman päivän harjoittelu tuottaa seuraavan häviotaulukon mineräketoiston lukumäärään nähden:

Tappio minerätoistokertoitusta vastaan

Ylin rivi on virhe politiikan päässä (MCTS: n ristin entroopia liikkeen todennäköisyydet hermoverkon lähtöä vastaan). Alin rivi on arvo arvopäässä (pelin todellisen arvon ja arvon hermoverkon ennusteen välinen keskimääräinen neliövirhe). Keskiviiva on näiden kahden keskiarvo.

On selvää, että hermoverkko parantaa entisestään kunkin pelitilan ja todennäköisten seuraavien siirtojen arvoa. Osoittaakseni kuinka tämä johtaa vahvempiin peleihin, juoksin 17 pelaajan välinen liiga, joka ulottui hermoverkon ensimmäisestä iteraatiosta 49. päivään. Kukin pari pelasi kahdesti, molemmilla pelaajilla on mahdollisuus pelata ensin.

Tässä on viimeinen sijoitus:

On selvää, että hermoverkon myöhemmät versiot ovat parempia kuin aikaisemmat versiot, voittaen suurimman osan peleistään. Näyttää myös siltä, ​​että oppiminen ei ole vielä kyllästynyt - jatkoharjoitteluajalla pelaajat vahvistuisivat jatkuvasti, oppien yhä monimutkaisempia strategioita.

Esimerkiksi yksi selkeä strategia, jota hermoverkko on ajan myötä suosinut, on keskipylvään tarttuminen varhain. Tarkkaile algoritmin ensimmäisen version välistä eroa ja sano, että 30. versio:

1. hermoverkkoversio

30. hermoverkkoversio

Tämä on hyvä strategia, koska monet rivit vaativat keskisarakkeen - väittämällä tämän aikaisin varmistaa, että vastustajasi ei voi hyödyntää tätä. Neuraaliverkko on oppinut tämän, ilman inhimillistä panosta.

Oppia erilaista peliä

Pelikansiossa on game.py-tiedosto nimeltä 'Metasquares'. Tähän sisältyy X- ja O-merkitsimien sijoittaminen ruudukkoon erikokoisten neliöiden muodostamiseksi. Suuremmat neliöt saavat enemmän pisteitä kuin pienemmät neliöt ja pelaaja, jolla on eniten pisteitä, kun ruudukko on täynnä, voittaa.

Jos vaihdat Connect4 game.py-tiedoston Metasquares game.py-tiedostolle, sama algoritmi oppii pelaamaan Metasquares sen sijaan.

Yhteenveto

Toivottavasti löydät tästä artikkelista hyödyllistä - ilmoita minulle alla olevissa kommenteissa, jos löydät kirjoitusvirheitä tai sinulla on kysyttävää mistä tahansa kooditietokannasta tai artikkelista ja otan sinuun yhteyttä mahdollisimman pian.

Jos haluat lisätietoja yrityksestämme, Applied Data Science, joka kehittää innovatiivisia tietotekniikkaratkaisuja yrityksille, ota rohkeasti yhteyttä verkkosivustomme kautta tai suoraan LinkedIn-sivuston kautta.

... ja jos pidät tästä, jätä vapaasti muutama sydämellinen klamme :)

Applied Data Science on Lontoossa toimiva konsulttiyritys, joka toteuttaa kokonaisvaltaisen datatieteen ratkaisuja yrityksille ja tuottaa mitattavissa olevan arvon. Puhutaan, jos haluat tehdä enemmän tietosi kanssa.