
U našem posljednjem članku o Deep Q učenju s Tensorflowom implementirali smo agenta koji uči igrati jednostavnu verziju Dooma. U video verziji obučili smo DQN agenta koji glumi svemirske osvajače.
Međutim, tijekom treninga vidjeli smo da postoji mnogo varijabilnosti.
Dubinsko Q-učenje uvedeno je 2014. Od tada je napravljeno puno poboljšanja. Dakle, danas ćemo vidjeti četiri strategije koje dramatično poboljšavaju obuku i rezultate naših DQN agenata:
- fiksne Q-mete
- dvostruki DQN-ovi
- dvoboj DQN (aka DDQN)
- Reprodukcija prioritetnog iskustva (aka PER)
Implementirat ćemo agenta koji nauči igrati Dood Deadly koridor. Naš AI mora se kretati prema temeljnom cilju (prsluku) i osigurati da istodobno opstaju ubijajući neprijatelje.
Fiksni Q-ciljevi
Teorija
U članku Deep Q Learning vidjeli smo da, kada želimo izračunati TD pogrešku (odnosno gubitak), izračunavamo razliku između TD cilja (Q_target) i trenutne Q vrijednosti (procjena Q).

Ali mi nemamo pojma o pravom TD cilju. Moramo to procijeniti. Koristeći Bellmanovu jednadžbu, vidjeli smo da je TD cilj samo nagrada za poduzimanje te radnje u tom stanju plus snižena najviša Q vrijednost za sljedeće stanje.

Međutim, problem je što koristimo iste parametre (težine) za procjenu cilja i vrijednosti Q. Kao posljedica toga, postoji velika korelacija između TD cilja i parametara (w) koje mijenjamo.
Stoga to znači da se na svakom koraku treninga naše Q vrijednosti mijenjaju, ali i ciljne vrijednosti. Dakle, približavamo se svom cilju, ali i cilj se kreće. Kao da jurite za pokretnom metom! To dovodi do velikih oscilacija u treningu.
Kao da ste kauboj (Q procjena) i želite uhvatiti kravu (Q-cilj), morate se približiti (smanjite pogrešku).

U svakom vremenskom koraku pokušavate pristupiti kravi koja se također pomiče u svakom vremenskom koraku (jer koristite iste parametre).


To dovodi do vrlo čudnog puta jurnjave (velike oscilacije u treningu).

Umjesto toga, možemo se poslužiti idejom fiksnih Q-ciljeva koje je uveo DeepMind:
- Korištenje zasebne mreže s fiksnim parametrom (nazovimo ga w-) za procjenu TD cilja.
- U svakom Tau koraku kopiramo parametre iz naše DQN mreže kako bismo ažurirali ciljnu mrežu.

Zahvaljujući ovom postupku imat ćemo stabilnije učenje jer ciljana funkcija neko vrijeme ostaje fiksna.
Provedba
Implementacija fiksnih q-ciljeva prilično je jednostavna:
- Prvo stvorimo dvije mreže (
DQNetwork
,TargetNetwork
)
- Zatim kreiramo funkciju koja će uzeti naše
DQNetwork
parametre i kopirati ih u našeTargetNetwork
- Napokon, tijekom treninga izračunavamo TD cilj pomoću naše ciljne mreže. Ažuriramo ciljnu mrežu sa
DQNetwork
svakimtau
korakom (tau
hiperparametar je koji definiramo).
Dvostruki DQN-ovi
Teorija
Dvostruke DQN-ove ili dvostruko učenje uveo je Hado van Hasselt. Ova metoda rješava problem precjenjivanja Q-vrijednosti.
Da biste razumjeli ovaj problem, sjetite se kako izračunavamo TD cilj:

Izračunavanjem TD cilja suočavamo se s jednostavnim problemom: kako smo sigurni da je najbolje djelovanje za sljedeće stanje ono s najvišom Q-vrijednošću?
Znamo da točnost q vrijednosti ovisi o tome koju smo akciju pokušali i koje smo susjedne države istražili.
Kao posljedica toga, na početku treninga nemamo dovoljno informacija o najboljoj radnji. Stoga uzimanje maksimalne vrijednosti q (koja je bučna) kao najbolje radnje može dovesti do lažnih pozitivnih rezultata. Ako se neoptimalnim radnjama redovito daje veća vrijednost Q od optimalne najbolje akcije, učenje će biti komplicirano.
Rješenje je: kada izračunavamo Q cilj, koristimo dvije mreže za razdvajanje odabira radnje od stvaranja ciljane Q vrijednosti. Mi:
- upotrijebite našu DQN mrežu da odaberete koja je najbolja radnja za sljedeće stanje (radnja s najvišom Q vrijednošću).
- koristite našu ciljanu mrežu za izračun ciljne Q vrijednosti poduzimanja te radnje u sljedećem stanju.

Stoga nam Double DQN pomaže smanjiti precjenjivanje q vrijednosti i, kao posljedicu, pomaže nam brže trenirati i imati stabilnije učenje.
Provedba

Dvoboj DQN (aka DDQN)
Teorija
Zapamtite da Q-vrijednosti odgovaraju koliko je dobro biti u tom stanju i poduzimati radnje u tom stanju Q (s, a).
Dakle, Q (s, a) možemo razložiti kao zbroj:
- V (s) : vrijednost boravka u tom stanju
- A (s, a) : prednost poduzimanja te radnje u tom stanju (koliko je bolje poduzeti ovu radnju u odnosu na sve ostale moguće radnje u tom stanju).

S DDQN-om želimo razdvojiti procjenitelj ova dva elementa, koristeći dva nova toka:
- onaj koji procjenjuje vrijednost stanja V (s)
- onaj koji procjenjuje prednost za svaku radnju A (s, a)

A zatim kombiniramo ove dvije struje kroz poseban sloj agregacije da bismo dobili procjenu Q (s, a).
Čekati? Ali zašto ta dva elementa moramo računati odvojeno ako ih onda kombiniramo?
Odvajanjem procjene, intuitivno naš DDQN može naučiti koja su stanja vrijedna (ili nisu) vrijedna, a da ne mora naučiti učinak svake radnje u svakom stanju (jer također izračunava V (s)).
S našim normalnim DQN-om moramo izračunati vrijednost svake radnje u tom stanju. Ali koja je svrha ako je vrijednost države loša? Koja je svrha izračunati sve radnje u jednom stanju kada sve te radnje dovedu do smrti?
Kao posljedicu, razdvajanjem možemo izračunati V (s). To je osobito korisno za države u kojima njihovo djelovanje na odgovarajući način ne utječe na okoliš. U ovom je slučaju nepotrebno izračunavati vrijednost svake radnje. Na primjer, pomicanje udesno ili ulijevo važno je samo ako postoji rizik od sudara. I, u većini država, odabir radnje nema utjecaja na ono što se događa.
Bit će jasnije ako uzmemo primjer u radu Dueling Network Architectures for Deep Reinforcement Learning.

Vidimo da tokovi vrijednosne mreže obraćaju pažnju (narančasta zamućenost) na cestu, a posebno na horizont na kojem se automobili mrijeste. Pazi i na rezultat.
S druge strane, tok prednosti u prvom kadru s desne strane ne obraća puno pažnje na cestu, jer ispred nema automobila (pa je izbor radnje praktički nebitan). Ali, u drugom kadru obraća pažnju, jer je automobil ispred njega, a odabir radnje je presudan i vrlo relevantan.
Što se tiče sloja agregacije, želimo generirati q vrijednosti za svaku akciju u tom stanju. Možda ćemo doći u napast da kombiniramo tokove na sljedeći način:

Ali ako to učinimo, pasti ćemo upitanje prepoznatljivosti , odnosno - s obzirom na Q (s, a) ne možemo pronaći A (s, a) i V (s).
A nemogućnost pronalaska V (s) i A (s, a) zadanih Q (s, a) bit će problem za naše leđno širenje. Da bismo izbjegli ovaj problem, možemo prisiliti naš procjenitelj funkcije prednosti da ima 0 prednosti u odabranoj radnji.
Da bismo to učinili, oduzimamo prosječnu prednost svih mogućih radnji države.

Stoga nam ova arhitektura pomaže ubrzati trening. Vrijednost stanja možemo izračunati bez izračunavanja Q (s, a) za svaku akciju u tom stanju. I može nam pomoći da pronađemo puno pouzdanije Q vrijednosti za svaku akciju razdvajanjem procjene između dvije struje.
Provedba
Jedino što treba učiniti je modificirati DQN arhitekturu dodavanjem ovih novih streamova:
Ponovno određivanje prioriteta iskustva
Teorija
Prioritetno ponavljanje iskustva (PER) 2015. godine uveo je Tom Schaul. Ideja je da su neka iskustva možda važnija od drugih za naš trening, ali mogu se dogoditi rjeđe.
Budući da uzorkujemo uzorke serije (slučajnim odabirom iskustava), ta bogata iskustva koja se rijetko događaju nemaju praktički nikakve šanse za odabir.
Zbog toga s PER-om pokušavamo promijeniti raspodjelu uzorkovanja pomoću kriterija za definiranje prioriteta svake skupine iskustva.
Želimo preuzeti prioritetno iskustvo tamo gdje postoji velika razlika između našeg predviđanja i TD cilja, jer to znači da o tome moramo puno naučiti.
Koristimo apsolutnu vrijednost veličine naše TD pogreške:

I taj smo prioritet stavili u iskustvo svakog međuspremnika reprodukcije.

Ali ne možemo samo pohlepno odrediti prioritete, jer će to dovesti do uvježbavanja uvijek istih iskustava (koja imaju velik prioritet), a time i prekomjernog uklapanja.
Dakle, uvodimo stohastičko određivanje prioriteta, koje generira vjerojatnost da ćemo biti izabrani za ponovnu reprodukciju.

Kao posljedica, tijekom svakog vremenskog koraka dobit ćemo ašaržu uzoraka s ovom raspodjelom vjerojatnosti i na njoj obučavamo našu mrežu.
Ali, ovdje još uvijek imamo problem. Imajte na umu da uz uobičajenu reprodukciju iskustva koristimo pravilo stohastičkog ažuriranja. Kao posljedica toga, način na koji uzorkujemo iskustva mora se podudarati s osnovnom distribucijom iz koje su došla.
Kad imamo normalno iskustvo, svoja iskustva odabiremo u normalnoj distribuciji - jednostavno rečeno, svoja iskustva odabiremo slučajnim odabirom. Nema pristranosti, jer svako iskustvo ima istu šansu da ga iskoristimo, tako da možemo normalno ažurirati težinu.
Ali , budući da koristimo prioritetno uzorkovanje, napušta se isključivo slučajno uzorkovanje. Kao posljedicu, uvodimo pristranost prema uzorcima visokog prioriteta (više šansi za odabir).
A ako normalno ažuriramo težinu, riskiramo od prekomjerne prilagodbe. Uzorci koji imaju visoki prioritet vjerojatno će se često koristiti za trening u usporedbi s iskustvima s niskim prioritetom (= pristranost). Kao posljedicu, ažurirat ćemo svoje težine samo s malim dijelom iskustava koja smatramo doista zanimljivima.
Da bismo ispravili ovu pristranost, koristimo ponderi za uzorkovanje važnosti (IS) koji će prilagoditi ažuriranje smanjenjem pondera često viđenih uzoraka.

Ponderi koji odgovaraju uzorcima visokog prioriteta imaju vrlo malo prilagodbi (jer će mreža ta iskustva vidjeti puno puta), dok će oni koji odgovaraju uzorcima niskog prioriteta imati potpuno ažuriranje.
Uloga b je kontrolirati koliko ove težine uzorkovanja utega utječu na učenje. U praksi se parametar b žari do 1 tijekom trajanja treninga, jer su ove težine važnije na kraju učenja kad nam se vrijednosti q počnu približavati. Nepristrana priroda ažuriranja najvažnija je blizu konvergencije, kako je objašnjeno u ovom članku.
Provedba
Ovaj put, provedba će biti malo ljepša.
Prije svega, ne možemo samo implementirati PER sortiranjem svih Experience Replay odbojnika prema njihovim prioritetima. To uopće neće biti učinkovito zbog O (nlogn) za umetanje i O (n) za uzorkovanje.
Kao što je objašnjeno u ovom stvarno dobrom članku, umjesto sortiranja niza trebamo koristiti drugu strukturu podataka - nesortirano sumtree.
Sumtree je binarno stablo, odnosno stablo sa samo dvoje djece za svaki čvor. Listovi (najdublji čvorovi) sadrže vrijednosti prioriteta, a niz podataka koji upućuje na lišće sadrži iskustva.
Ažuriranje stabla i uzorkovanje bit će zaista učinkovito (O (log n)).

Zatim stvaramo memorijski objekt koji će sadržavati naše sumtree i podatke.
Dalje, za uzorkovanje mini serije veličine k, raspon [0, ukupni_prioritet] podijelit će se u k raspona. Vrijednost se jednoliko uzorkuje iz svakog raspona.
Konačno, prijelazi (iskustva) koji odgovaraju svakoj od ovih uzorkovanih vrijednosti dohvaćaju se iz sumtreea.
Bit će mnogo jasnije kad zaronimo sve detalje u bilježnici.
Doom Deathmatch agent
Ovaj agent je dvostruko dubinsko Q učenje s PER-om i fiksnim q-ciljevima.
Napravili smo video tutorial o implementaciji: Bilježnica je ovdjeTo je sve! Upravo ste stvorili pametnijeg agenta koji uči igrati Doom. Super! Imajte na umu da ako želite imati agenta sa stvarno dobrim performansama, trebate još puno GPU sati (oko dva dana treninga)!

Međutim, sa samo 2-3 sata treninga na CPU (da CPU), naš je agent shvatio da trebaju ubiti neprijatelje prije nego što krenu naprijed. Ako krenu naprijed bez ubijanja neprijatelja, bit će ubijeni prije nego što uzmu prsluk.
Ne zaboravite sami implementirati svaki dio koda. Zaista je važno pokušati izmijeniti kod koji sam vam dao. Pokušajte dodati epohe, promijeniti arhitekturu, dodati fiksne Q-vrijednosti, promijeniti brzinu učenja, koristiti teže okruženje ... i tako dalje. Eksperimentirajte, zabavite se!
Imajte na umu da je ovo bio velik članak, pa budite sigurni da stvarno razumijete zašto koristimo te nove strategije, kako funkcioniraju i prednosti njihove upotrebe.
U sljedećem ćemo članku naučiti o nevjerojatnoj hibridnoj metodi između algoritama učenja potkrepljenja temeljenih na vrijednosti i politikama. Ovo je osnovno stanje za najsuvremenije algoritme : Kritičar glumačke prednosti (A2C). Implementirat ćete agenta koji nauči igrati Outrun!

Ako vam se svidio moj članak, kliknite na? ispod onoliko vremena koliko vam se članak svidio, tako da će ga drugi ljudi vidjeti ovdje na Medijumu. I ne zaboravite me slijediti!
Ako imate bilo kakvih misli, komentara, pitanja, slobodno komentirajte u nastavku ili mi pošaljite e-mail: [email protected] ili mi tweetnite @ThomasSimonini.



Nastavite učiti, ostanite super!
Tečaj učenja dubokog pojačanja s Tensorflowom? ️
? Nastavni plan
? Video verzija
Dio 1: Uvod u učenje o ojačanju
Dio 2: Uronite dublje u ojačano učenje pomoću Q-učenja
Dio 3: Uvod u duboko Q-učenje: igrajmo se Doom
Dio 3+: Poboljšanja dubinskog Q učenja: dvoboj dvostrukog DQN-a, prioritetno ponavljanje iskustva i fiksni Q-ciljevi
Dio 4: Uvod u gradijente politika s Doom i Cartpole
Dio 5: Uvod u metode kritičara glumačkih prednosti: igrajmo se Sonic the Hedgehog!
Dio 6: Proksimalna optimizacija politike (PPO) s Sonic the Hedgehog 2 i 3
Dio 7: Olakšano učenje vođeno znatiželjom I. dio