17.2 Reikšmių iteracija
Šiame skyrelyje aptarsime, kaip kiekvienoje būsenoje parinkti geriausią roboto veiksmą, kad būtų maksimizuota trajektorijos grąža. Aprašysime algoritmą, vadinamą reikšmių iteracija, ir įgyvendinsime jį imituojamam robotui, keliaujančiam per užšalusį ežerą.
17.2.1 Stochastinė strategija
Stochastinė strategija, žymima (trumpiau – strategija), yra sąlyginis veiksmų skirstinys, esant būsenai , . Pavyzdžiui, jei robotas turi keturis veiksmus {eiti į kairę, eiti žemyn, eiti į dešinę, eiti aukštyn}. Strategija būsenoje tokiai veiksmų aibei yra kategorinis skirstinys, kuriame keturių veiksmų tikimybės galėtų būti ; kitoje būsenoje tų pačių keturių veiksmų tikimybės galėtų būti . Atkreipkite dėmesį, kad bet kuriai būsenai turime . Deterministinė strategija yra ypatingas stochastinės strategijos atvejis, kai skirstinys nenulinę tikimybę suteikia tik vienam konkrečiam veiksmui, pvz., mūsų pavyzdyje su keturiais veiksmais.
Kad žymėjimas būtų mažiau sudėtingas, dažnai rašysime kaip sąlyginį skirstinį vietoj .
17.2.2 Reikšmės funkcija
Įsivaizduokite, kad robotas pradeda nuo būsenos ir kiekvienu laiko momentu pirmiausia atrenka veiksmą iš strategijos ir jį atlieka, taip patekdamas į kitą būseną . Trajektorija gali skirtis priklausomai nuo to, kuris konkretus veiksmas atrenkamas tarpiniais momentais. Apibrėžiame visų tokių trajektorijų vidutinę grąžą
kur yra kita roboto būsena, o yra betarpiškas atlygis, gaunamas atlikus veiksmą būsenoje laiko momentu . Tai vadinama strategijos „reikšmės funkcija“. Paprastais žodžiais, būsenos reikšmė strategijai , žymima , yra tikėtina diskontuota grąža, kurią robotas gauna, jei pradeda būsenoje ir kiekvienu laiko momentu atlieka veiksmus pagal strategiją .
Toliau suskaidome trajektoriją į du etapus: (i) pirmąjį etapą, atitinkantį atlikus veiksmą , ir (ii) antrąjį etapą, kuris yra vėlesnė trajektorija . Pagrindinė visų skatinamojo mokymosi algoritmų idėja yra ta, kad būsenos reikšmę galima užrašyti kaip vidutinį atlygį, gautą pirmajame etape, ir reikšmės funkciją, suvidurkintą per visas galimas kitas būsenas . Tai gana intuityvu ir kyla iš mūsų Markovo prielaidos: vidutinė grąža iš dabartinės būsenos yra vidutinės grąžos iš kitos būsenos ir vidutinio atlygio už perėjimą į kitą būseną suma. Matematiškai du etapus užrašome kaip
Šis skaidymas yra labai galingas: tai dinaminio programavimo principo pagrindas, kuriuo remiasi visi skatinamojo mokymosi algoritmai. Atkreipkite dėmesį, kad antrasis etapas turi du vidurkius: vieną pagal pirmajame etape atlikto veiksmo pasirinkimus naudojant stochastinę strategiją, o kitą pagal galimas būsenas , gautas atlikus pasirinktą veiksmą. Lygtį (17.2.1) galime užrašyti naudodami Markovo sprendimų proceso (MDP) perėjimo tikimybes kaip
Svarbu pastebėti, kad aukščiau pateikta tapatybė galioja visoms būsenoms , nes galime apsvarstyti bet kurią trajektoriją, prasidedančią toje būsenoje, ir suskaidyti ją į du etapus.
17.2.3 Veiksmo ir reikšmės funkcija
Įgyvendinimuose dažnai naudinga palaikyti dydį, vadinamą „veiksmo reikšmės“ funkcija, kuri yra glaudžiai susijęs su reikšmės funkcija dydis. Ji apibrėžiama kaip vidutinė trajektorijos, prasidedančios , grąža, kai pirmojo etapo veiksmas fiksuojamas kaip
atkreipkite dėmesį, kad suma po vidurkio ženklu eina nuo , nes šiuo atveju pirmojo etapo atlygis yra fiksuotas. Galime vėl suskaidyti trajektoriją į dvi dalis ir užrašyti
Ši versija yra (17.2.2) analogas veiksmo reikšmės funkcijai.
17.2.4 Optimali stochastinė strategija
Tiek reikšmės funkcija, tiek veiksmo reikšmės funkcija priklauso nuo strategijos, kurią pasirenka robotas. Toliau pagalvosime apie „optimalią strategiją“, kuri pasiekia didžiausią vidutinę grąžą
Iš visų galimų stochastinių strategijų, kurias galėjo pasirinkti robotas, optimali strategija pasiekia didžiausią vidutinę diskontuotą grąžą trajektorijoms, prasidedančioms būsenoje . Optimalios strategijos reikšmės funkciją ir veiksmo reikšmės funkciją žymėkime ir .
Panagrinėkime deterministinę strategiją, kai bet kurioje būsenoje pagal strategiją galimas tik vienas veiksmas. Tai mums duoda
Gera mnemonika šiam prisiminti yra tokia: optimalus veiksmas būsenoje (deterministinei strategijai) yra tas, kuris maksimizuoja pirmojo etapo atlygio ir trajektorijų, prasidedančių kita būsena , vidutinės grąžos sumą, suvidurkintą per visas galimas kitas būsenas iš antrojo etapo.
17.2.5 Dinaminio programavimo principas
Mūsų ankstesnio skyrelio išvedžiojimą (17.2.1) arba (17.2.3) galima paversti algoritmu, skirtu apskaičiuoti atitinkamai optimalią reikšmės funkciją arba veiksmo reikšmės funkciją . Pastebėkite, kad
Deterministinei optimaliai strategijai , kadangi būsenoje galima atlikti tik vieną veiksmą, taip pat galime rašyti
visoms būsenoms . Ši tapatybė vadinama „dinaminio programavimo principu“ (Richard Bellman, 1952; Richard Bellman, ). Jį 1950-aisiais suformulavo Richardas Bellmanas, ir galime jį prisiminti kaip „likusi optimalios trajektorijos dalis taip pat yra optimali“.
17.2.6 Reikšmių iteracija
Dinaminio programavimo principą galime paversti algoritmu, skirtu optimaliai reikšmės funkcijai rasti, vadinamu reikšmių iteracija. Pagrindinė reikšmių iteracijos idėja yra šią tapatybę laikyti ribojimų aibe, siejančia skirtingose būsenose . Reikšmės funkciją inicializuojame tam tikromis savavališkomis reikšmėmis visoms būsenoms . -ojoje iteracijoje reikšmių iteracijos algoritmas atnaujina reikšmės funkciją taip
Pasirodo, kad kai , reikšmių iteracijos algoritmo įvertinta reikšmės funkcija konverguoja į optimalią reikšmės funkciją nepriklausomai nuo inicializacijos ,
Tą patį reikšmių iteracijos algoritmą galima ekvivalenčiai užrašyti naudojant veiksmo reikšmės funkciją
Šiuo atveju inicializuojame tam tikromis savavališkomis reikšmėmis visiems ir . Vėl turime visiems ir .
17.2.7 Strategijos įvertinimas
Reikšmių iteracija leidžia apskaičiuoti optimalią reikšmės funkciją, t. y. optimalios deterministinės strategijos funkciją . Panašius iteracinius atnaujinimus taip pat galime naudoti reikšmės funkcijai, susijusiai su bet kuria kita, galbūt stochastine, strategija , apskaičiuoti. Vėl inicializuojame tam tikromis savavališkomis reikšmėmis visoms būsenoms , o -ojoje iteracijoje atliekame atnaujinimus
Šis algoritmas žinomas kaip strategijos įvertinimas ir yra naudingas reikšmės funkcijai pagal strategiją apskaičiuoti. Vėl pasirodo, kad kai , šie atnaujinimai konverguoja į teisingą reikšmės funkciją nepriklausomai nuo inicializacijos ,
Strategijos veiksmo reikšmės funkcijos skaičiavimo algoritmas yra analogiškas.
17.2.8 Reikšmių iteracijos įgyvendinimas
Toliau parodome, kaip įgyvendinti reikšmių iteraciją navigacijos uždaviniui, vadinamam FrozenLake iš Open AI Gym. Pirmiausia turime nustatyti aplinką, kaip parodyta šiame kode.
%matplotlib inline
import numpy as np
import random
from d2l import torch as d2l
seed = 0 # Random number generator seed
gamma = 0.95 # Discount factor
num_iters = 10 # Number of iterations
random.seed(seed) # Set the random seed to ensure results can be reproduced
np.random.seed(seed)
# Now set up the environment
env_info = d2l.make_env('FrozenLake-v1', seed=seed)
FrozenLake aplinkoje robotas juda tinkleliu (tai yra būsenos) su veiksmais „aukštyn“ (), „žemyn“ (), „į kairę“ () ir „į dešinę“ (). Aplinkoje yra keletas duobių (H) langelių ir užšalusių (F) langelių, taip pat tikslo langelis (G), ir visi jie robotui nežinomi. Kad uždavinys būtų paprastas, darome prielaidą, kad robotas turi patikimus veiksmus, t. y. visiems . Jei robotas pasiekia tikslą, bandymas baigiasi ir robotas gauna atlygį nepriklausomai nuo veiksmo; atlygis bet kurioje kitoje būsenoje yra visiems veiksmams. Roboto tikslas yra išmokti strategiją, kuri iš nurodytos pradinės vietos (S) (tai yra ) pasiekia tikslo vietą (G), kad būtų maksimizuota grąža.
Ši funkcija įgyvendina reikšmių iteraciją, kur env_info turi su MDP ir aplinka susijusią informaciją, o gamma yra diskonto koeficientas:
def value_iteration(env_info, gamma, num_iters):
env_desc = env_info['desc'] # 2D array shows what each item means
prob_idx = env_info['trans_prob_idx']
nextstate_idx = env_info['nextstate_idx']
reward_idx = env_info['reward_idx']
num_states = env_info['num_states']
num_actions = env_info['num_actions']
mdp = env_info['mdp']
V = np.zeros((num_iters + 1, num_states))
Q = np.zeros((num_iters + 1, num_states, num_actions))
pi = np.zeros((num_iters + 1, num_states))
for k in range(1, num_iters + 1):
for s in range(num_states):
for a in range(num_actions):
# Calculate \sum_{s'} p(s'\mid s,a) [r + \gamma v_k(s')]
for pxrds in mdp[(s,a)]:
# mdp(s,a): [(p1,next1,r1,d1),(p2,next2,r2,d2),..]
pr = pxrds[prob_idx] # p(s'\mid s,a)
nextstate = pxrds[nextstate_idx] # Next state
reward = pxrds[reward_idx] # Reward
Q[k,s,a] += pr * (reward + gamma * V[k - 1, nextstate])
# Record max value and max action
V[k,s] = np.max(Q[k,s,:])
pi[k,s] = np.argmax(Q[k,s,:])
d2l.show_value_function_progress(env_desc, V[:-1], pi[:-1])
value_iteration(env_info=env_info, gamma=gamma, num_iters=num_iters)
Aukščiau pateiktuose paveiksluose parodyta strategija (rodyklė nurodo veiksmą) ir reikšmės funkcija (spalvos kitimas rodo, kaip reikšmės funkcija kinta laikui bėgant nuo pradinės reikšmės, rodomos tamsia spalva, iki optimalios reikšmės, rodomos šviesiomis spalvomis). Kaip matome, reikšmių iteracija optimalią reikšmės funkciją randa po 10 iteracijų, o tikslo būsenos (G) galima pasiekti iš bet kurios būsenos, jei tai nėra H langelis. Kitas įdomus įgyvendinimo aspektas yra tas, kad, be optimalios reikšmės funkcijos radimo, mes taip pat automatiškai radome ir šią reikšmės funkciją atitinkančią optimalią strategiją .
17.2.9 Santrauka
Pagrindinė reikšmių iteracijos algoritmo idėja yra naudoti dinaminio programavimo principą optimaliai vidutinei grąžai, gaunamai iš tam tikros būsenos, rasti. Atkreipkite dėmesį, kad reikšmių iteracijos algoritmui įgyvendinti reikia, kad mes visiškai žinotume Markovo sprendimų procesą (MDP), pavyzdžiui, perėjimo ir atlygio funkcijas.
17.2.10 Pratimai
- Pabandykite padidinti tinklelio dydį iki . Kiek iteracijų prireikia optimaliai reikšmės funkcijai rasti, palyginti su tinkleliu?
- Koks yra reikšmių iteracijos algoritmo skaičiavimo sudėtingumas?
- Dar kartą paleiskite reikšmių iteracijos algoritmą su (t. y. „gamma“ aukščiau pateiktame kode), kai jis lygus , ir , ir išanalizuokite rezultatus.
- Kaip reikšmė veikia iteracijų, per kurias reikšmių iteracija konverguoja, skaičių? Kas atsitinka, kai ?
