Professional Documents
Culture Documents
Šta Je Q
Šta Je Q
Q-Learning je politika učenja s pojačavanjem koja će pronaći sljedeću najbolju akciju, s obzirom
na trenutno stanje. Ovu akciju bira nasumično i ima za cilj da maksimizira nagradu.
Q-učenje je učenje s pojačanjem bez modela, izvan politike koje će pronaći najbolji pravac
akcije, s obzirom na trenutno stanje agenta. Ovisno o tome gdje se agent nalazi u okruženju,
odlučit će sljedeću radnju koju treba poduzeti.
Cilj modela je pronaći najbolji pravac akcije s obzirom na njegovo trenutno stanje. Da bi to
učinio, može smisliti vlastita pravila ili može djelovati van politike koja mu je data da slijedi. To
znači da ne postoji stvarna potreba za politikom, stoga je nazivamo van politike.
Bez modela znači da agent koristi predviđanja očekivanog odgovora okoline kako bi krenuo
naprijed. Za učenje ne koristi sistem nagrađivanja, već pokušaje i greške.
Jednačina je data u nastavku. Koristi trenutno stanje i nagradu povezanu s tim stanjem, zajedno
sa maksimalno očekivanom nagradom i diskontom, koji određuje njegovu važnost za trenutno
stanje, da pronađe sljedeće stanje našeg agenta. Brzina učenja određuje koliko brzo ili sporo će
model učiti.
Q-tabela nam pomaže da pronađemo najbolju akciju za svako stanje u okruženju. Koristimo
Bellmanovu jednačinu za svako stanje da dobijemo očekivano buduće stanje i nagradu i
spremimo je u tablicu za usporedbu s drugim stanjima.
Omogućava nam da kreiramo q-tabelu za agenta koji mora naučiti da pokreće, preuzima i sjedi
po komandi. Koraci koji su preduzeti da se napravi q-tabela su:
Ovo je polazna tačka. Do sada nismo izvršili nikakvu drugu radnju. Recimo da želimo da agent u
početku sjedi, što i čini. Tabela će se promijeniti u:
Korak 4: Nastavite isto dok se tabela ne popuni ili dok se epizoda ne završi
Bitni parametri :
Stopa učenja: lr ili stopa učenja, koja se često naziva alfa ili α, može se jednostavno
definirati kao koliko prihvaćate novu vrijednost u odnosu na staru vrijednost. Iznad
uzimamo razliku između novog i starog, a zatim množimo tu vrijednost sa stopom
učenja. Ova vrijednost se zatim dodaje našoj prethodnoj q-vrijednosti koja je u suštini
pomiče u smjeru našeg najnovijeg ažuriranja.
Gama: gama ili γ je faktor popusta. Koristi se za balansiranje trenutne i buduće nagrade.
Iz našeg pravila ažuriranja iznad možete vidjeti da primjenjujemo popust na buduću
nagradu. Obično ova vrijednost može biti u rasponu od 0,8 do 0,99.
Nagrada: nagrada je vrijednost primljena nakon završetka određene radnje u datom
stanju. Nagrada se može dogoditi u bilo kojem vremenskom koraku ili samo u krajnjem
vremenskom koraku.
Max: np.max() koristi biblioteku numpy i uzima maksimum buduće nagrade i primjenjuje
ga na nagradu za trenutno stanje. Ovo utiče na trenutnu akciju mogućom budućom
nagradom. Ovo je ljepota q-učenja. Buduću nagradu dodjeljujemo trenutnim radnjama
kako bismo pomogli agentu da odabere najvišu radnju povrata u bilo kojem stanju.
Najbolji način da vidite kuda vodi ovaj članak je da pogledate sliku jednostavnog lavirinta na
slici 1 i snimak ekrana povezanog demo programa na slici 2. Lavirint 3x5 ima 15 ćelija,
numeriranih od 0 do 14. Cilj je doći od ćelije 0 u gornjem levom uglu, do ćelije 14 u donjem
desnom uglu, u najmanje poteza. Možete se kretati lijevo, desno, gore ili dolje, ali ne
dijagonalno.
Demo program postavlja prikaz lavirinta u memoriji, a zatim koristi algoritam Q-učenja da
pronađe Q matricu. Q označava kvalitet, gdje su veće vrijednosti bolje. Indeksi reda su ćelije
"od", a indeksi stupaca su ćelije "do". Ako je početna ćelija 0, onda skeniranje tog reda pokazuje
da je najveća Q vrijednost 0,02 u ćeliji 5. Zatim u ćeliji 5, najveća vrijednost u redu je 0,05 u
ćeliji 10. Proces se nastavlja sve dok program ne dostigne ciljno stanje u ćeliji 14.
Nije vjerovatno da će vaš šef na poslu tražiti od vas da napišete kod za Q-učenje za rješavanje
lavirinta, ali ovaj problem je "Hello World" za Q-učenje jer je problem lako razumjeti i
vizualizirati.
# maze.py
import numpy as np
# =============================================================
# =============================================================
def main():
np.random.seed(1)
# =============================================================
start = 0; goal = 14
ns = 15 # number of states
gamma = 0.5
lrn_rate = 0.5
max_epochs = 1000
print("Done ")
my_print(Q, 2)
walk(start, goal, Q)
if __name__ == "__main__":
main()
Funkcija main() počinje postavljanjem F matrice koja definira izvodljivost prelaska iz jedne
ćelije/stanja u drugu. Na primjer, F[7][12] = 1 znači da možete preći iz ćelije/stanja 7 u
ćeliju/stanje 12, a F[6][7] = 0 znači da ne možete preći iz ćelije 7 u ćeliju 8 (jer postoji zid na
putu).
R matrica definira nagradu za prelazak iz jedne ćelije u drugu. Većina izvodljivih poteza daje
negativnu nagradu od -0,1, što kažnjava poteze koji ne napreduju i stoga obeshrabruje kruženje.
Jedna velika nagrada je R[9][14] = 10,0, što vas pomera u ciljno stanje.
Većinu posla obavlja funkcija train(), koja izračunava vrijednosti Q matrice. Q-učenje je
iterativno, tako da je postavljen maksimalan broj iteracija, 1000. Q-učenje ima dva parametra,
brzinu učenja i gama. Veće vrijednosti stope učenja povećavaju utjecaj kako trenutnih nagrada,
tako i budućih nagrada (istraživanje) na račun prošlih nagrada (exploit). Vrijednost gama, koja se
naziva i faktor popusta, utiče na važnost budućih nagrada. Ove vrijednosti se moraju odrediti
metodom pokušaja i grešaka, ali korištenje 0,5 je obično dobro polazište.
Nakon što je Q matrica izračunata, funkcija walk() koristi matricu da prikaže najkraći put kroz
labirint: 0->5->10->11->12->7->8->3->4- >9->14->gotovo.
Helper funkcija
Funkcija train() koristi dva pomoćnika, get_poss_next_states() i get_rnd_next_state(). Funkcija
get_poss_next_states() je definirana:
poss_next_states = []
for j in range(ns):
if F[s,j] == 1: poss_next_states.append(j)
return poss_next_states
Za dato stanje ćelije s, funkcija koristi F matricu da odredi koja stanja se mogu postići i vraća ta
stanja kao listu. Na primjer, ako je s = 5, povratna lista je [0, 6, 10].
next_state = \
poss_next_states[np.random.randint(0,\
len(poss_next_states))]
return next_state
Za dato stanje s određuju se sva moguća sljedeća stanja, a zatim se jedno od tih stanja nasumično
bira. Na primjer, ako je s = 5, kandidati su [0, 6, 10]. Poziv np.randomint() vraća slučajnu
vrijednost od 0 do 2, koja djeluje kao indeks na listi kandidata.
Izračunavanje Q matrice
Srce demo programa je funkcija train(), koja izračunava Q matricu. Kod za train() je predstavljen
u Listingu 2. Jednačina ažuriranja Q-učenja, prikazana na dnu slike 1, zasniva se na pametnoj
ideji koja se zove Bellmanova jednačina. Ne morate razumjeti Bellmanovu jednačinu da biste
koristili Q-učenje, ali ako ste zainteresovani, članak na Wikipediji o Bellmanovoj jednačini je
dobro mjesto za početak.
while(True):
poss_next_next_states = \
get_poss_next_states(next_s, F, ns)
max_Q = -9999.99
for j in range(len(poss_next_next_states)):
nn_s = poss_next_next_states[j]
q = Q[next_s,nn_s]
if q > max_Q:
max_Q = q
(gamma * max_Q)))
curr_s = next_s
Riječima, u lavirintu stalno počinjete u nasumičnom stanju. Zatim, na svakoj poziciji ćelije,
birate nasumično sljedeće stanje i također određujete sva moguća stanja nakon sljedećeg stanja -
to se ponekad nazivaju "sljedeća-sljedeća stanja". Ispitujete trenutne Q vrijednosti i pronalazite
najveću vrijednost od sljedećeg stanja do bilo kojeg sljedećeg stanja. Ova najveća vrijednost,
max_Q, koristi se u iskazu koji ažurira Q matricu.
Za svako nasumično početno stanje, ponavljate ovaj proces dok ne dođete do ciljnog stanja. Ovo
pretpostavlja da je ciljno stanje dostižno, tako da u nekim problemima morate primijeniti
maksimalnu kontrolnu varijablu petlje.
Hodanje po Q matrici
Nakon što je Q matrica izračunata, može je koristiti funkcija walk() da pokaže najkraći put od
bilo koje početne ćelije do bilo koje ciljne ćelije u lavirintu. Funkcija walk() je definirana:
curr = start
next = np.argmax(Q[curr])
curr = next
print("done")
Ključ funkcije walk() je funkcija np.argmax(), koja vraća indeks najveće vrijednosti ulaznog
vektora funkcije. Na primjer, ako je vektor v imao vrijednosti (8, 6, 9, 4, 5, 7), tada bi poziv
np.argmax(v) vratio 2. Funkcija walk() pretpostavlja da je ciljno stanje dostupno.
def my_print(Q):
print(" 0 1 2 3 4 5\
6 7 8 9 10 11 12\
13 14")
for i in range(rows):
print("")
print("")
Funkcija my_print() je tvrdo kodirani hak dizajniran da radi samo sa demo labirintom.
Wrapping Up
Ovdje predstavljeni primjer Q-učenja trebao bi vam dati razumno dobro razumijevanje
uključenih općih principa. Glavni problemski scenario je onaj u kojem imate skup diskretnih
stanja, a izazov je izvršiti niz radnji koje pronalaze dugoročnu nagradu, bez eksplicitnog
definiranja pravila. Q-učenje može biti korisno kada možete bezbedno da trenirate fizički sistem
sa mnogo pokušaja, kao što je obučavanje robota za usisivač kako da se kreće kroz prostoriju.
Ali Q-učenje nije primjenjivo u scenarijima kao što je obučavanje automobila bez vozača kako
da se kreće kroz saobraćaj (osim ako nemate dostupan vrlo sofisticiran sistem simulacije).