Iti0210lab14: erinevus redaktsioonide vahel

Allikas: Lambda
Mine navigeerimisribale Mine otsikasti
PriitJ (arutelu | kaastöö)
PriitJ (arutelu | kaastöö)
78. rida: 78. rida:
== Lisaülesanne ==
== Lisaülesanne ==


Selle osa tegemine ei ole kohustuslik.
Ideid katsetamiseks (seda osa pole kohustuslik teha):
# Treeni algoritm <code>dummy_ai</code> vastu, mis on väga riskiv või väga konservatiivne (muuda konstanti 21 kas suuremaks või oluliselt väiksemaks).
# Tee graafik, kuidas võiduprotsent <code>dummy_ai</code> vastu muutub. Selleks vaheldumisi treeni, siis tee testmänge. Parem kui testmängude ajal on õppimine välja lülitatud.
# Muuda <code>dummy_ai</code> tagasi "optimaalseks" (üle 21 punkti otsus PASS)
# Kuidas see graafik muutub parameetrite <code>alpha</code>, <code>gamma</code>, <code>epsilon</code> muutmisel?
# Mängita oma algoritmi <code>dummy_ai</code> vastu ja proovi jälgida võiduprotsenti ajas. Kas sinu algoritm suudab vastase muutunud strateegiale reageerida?
# Võib proovida treenida ka <code>dummy_ai</code> või minimax algoritmi vastu.

Redaktsioon: 24. aprill 2019, kell 13:19

Hüvitisega õppimine

Sissejuhatus

Rakendame hüvitisega õppimist (reinforcement learning) seamängule, millega puutusime kokku 4. praktikumis. Reeglid uuesti:

  • mängitakse selleni, kes saab enne 100 punkti. Alguses on mõlemal mängijal 0 punkti.
  • mängija võib veeretada ühte täringut mitu korda järjest, senikaua kuni ta ei veereta 1. Tulemused liidetakse kokku.
  • kui mängija otsustab, et soovib veeretatud punktid alles hoida, liidetakse need tema kogusummale ja kord läheb vastasele.
  • kui mängija veeretab 1, siis läheb kord vastasele ja mängija kaotab kõik selle korra jooksul veeretatud punktid.

Rakendame Q-Learning algoritmi. Lihtne selgitus Q-Learning algoritmi kohta.

Treeni oma algoritm, lastes tal mängida iseenda vastu ja niiviisi seamängu strateegia täiesti iseseisvalt avastada. Seejärel katseta dummy_ai vastu, mitu korda näiteks 100 mängust sinu algoritm võidab. Et võrdlus aus oleks, pane 50% mängudest alustajaks oma algoritm ja 50% dummy_ai. Et mõista, kuidas Q-learning töötab, vaatame ka õpitud Q-tabelit.

Q-Learning seamängu jaoks

Kõigepealt, mis on olek ja mis on tegevus?

Lihtne soovitus oleks võtta olekuks praegused punktid (AI-l 0-100 ja vastasel 0-100) ning "käes" olevad punktid. Tegevus on loomulikult ROLL ja PASS, muid valikuid pole.

Juhuslikkus seamängus

Kuigi seamäng on lihtne, siis juhuslikkus teeb iseseisva õppimise raskeks. Näiteks, AI võib teha 3 korda järjest samas seisus õige käigu, aga iga kord ebaõnne tõttu kaotada. Seega õpib ta hoopis, et käik oli halb.

Juhuslikkuse vastu võitlemine:

  1. Õpime aeglaselt. Paneme learning rate parameetri, ehk alpha, üsna väikese.
  2. Üldistame. Paneme sarnased olekud kokku üheks olekuks. Kui AI satub samasse olekusse palju kordi, siis erandlikud juhused ei mängi enam nii suurt rolli.

Näidis, kuidas punktidest olekuid saada. Selle koodiga tekib 11x11x11 olekut.

def state_idx(ai_points, opp_points, rolled):
    ap = min(ai_points//10, 10)    # ai points: 0-9, 10-19, ..., 90-99, 100
    op = min(opp_points//10, 10)
    r = min(rolled//5, 10)         # rolled: 0-4, 5-9, ..., 45-49, 50+
    return (ap, op, r)

Edasi on juba maitse asi, kas kasutada lihtsalt kogu kolmikut indeksina, või teha mitmemõõtmeline massiiv. Kuna õpitakse Q[s, a] tabelit, siis juurde tuleb veel üks dimensioon - tegevus, ROLL või PASS.

Käigu valimine

Primitiivne meetod (greedy): oletame, et seis on 30 punkti AI-l, 90 punkti vastasel. Käes on 0 punkti. Vaatan tabelist, kumb tegevus on suurema skooriga, Q[state_idx(30,90,0)][PASS] või Q[state_idx(30,90,0)][ROLL].

Erinevaid võimalusi katsetav meetod (epsilon-greedy): väike tõenäosus epsilon, et valitakse juhuslik käik.

Õppimine

Oletame, et tegevus on tehtud ja teada uus_olek ning ka parim võimalik skoor, mida uuest olekust võimalik saavutada max_Q = max(Q[uus_olek][PASS], Q[uus_olek][ROLL]) . Lisaks tasu R mis on 0, v.a. juhul kui keegi just võitis või kaotas.

Seamängu puhul peame kindlasti kasutama alpha parameetrit, mis ütleb, kui palju me iga uue kogemusega vana teadmist unustame ja uut juurde võtame:

Q[vana olek][tegevus] = alpha * (R + gamma * max_Q - Q[vana olek][tegevus])

Testimine ja treenimine

Kasuta testraamistikku, mille kirjutasid 4. praktikumi jaoks. Kui võtsid üle praktikumijuhendis oleva, siis funktsioon, mis mängib.

def minimax_ai(turn, rolled, my_points, opp_points):
    # this is the top level of search
    # we search all possible moves
    # (PASS and ROLL in case of the Pig game)
    # and pick the one that returns the highest minimax estimate


def dummy_ai(turn, rolled, my_points, opp_points):
    if rolled < 21:
        return ROLL
    else:
        return PASS


Lisaülesanne

Ideid katsetamiseks (seda osa pole kohustuslik teha):

  1. Tee graafik, kuidas võiduprotsent dummy_ai vastu muutub. Selleks vaheldumisi treeni, siis tee testmänge. Parem kui testmängude ajal on õppimine välja lülitatud.
  2. Kuidas see graafik muutub parameetrite alpha, gamma, epsilon muutmisel?
  3. Võib proovida treenida ka dummy_ai või minimax algoritmi vastu.