Forbedringer i Deep Q Learning: Dueling Double DQN, Prioriteret Experience Replay og fast ...

Denne artikel er en del af Deep Reinforcement Learning Course med Tensorflow? ️. Se pensum her.

I vores sidste artikel om Deep Q Learning med Tensorflow implementerede vi en agent, der lærer at spille en simpel version af Doom. I videoversionen uddannede vi en DQN-agent, der spiller Space Invaders.

Under træningen så vi dog, at der var meget variation.

Deep Q-Learning blev introduceret i 2014. Siden da er der foretaget mange forbedringer. Så i dag ser vi fire strategier, der forbedrer - dramatisk - uddannelsen og resultaterne af vores DQN-agenter:

  • faste Q-mål
  • dobbelt DQNs
  • dueller DQN (også kendt som DDQN)
  • Prioriteret oplevelse Genafspilning (aka PER)

Vi implementerer en agent, der lærer at spille Doom Deadly korridor. Vores AI skal navigere mod det grundlæggende mål (vesten) og sørge for, at de overlever på samme tid ved at dræbe fjender.

Faste Q-mål

Teori

Vi så i Deep Q Learning-artiklen, at når vi vil beregne TD-fejlen (aka tabet), beregner vi forskellen mellem TD-målet (Q_target) og den aktuelle Q-værdi (estimering af Q).

Men vi har ingen idé om det virkelige TD-mål. Vi er nødt til at estimere det. Ved hjælp af Bellman-ligningen så vi, at TD-målet kun er belønningen for at tage denne handling i den tilstand plus den nedsatte højeste Q-værdi for den næste tilstand.

Problemet er dog, at vi bruger de samme parametre (vægte) til at estimere målet og Q-værdien. Som en konsekvens er der en stor sammenhæng mellem TD-målet og de parametre (w), vi ændrer.

Derfor betyder det, at Q-værdierne forskydes i hvert trin i træningen, men også målværdien skifter. Så vi nærmer os vores mål, men målet bevæger sig også. Det er som at jagte et bevægeligt mål! Dette førte til en stor svingning i træningen.

Det er som om du var en cowboy (Q-estimeringen), og du vil fange koen (Q-målet), skal du komme tættere på (reducer fejlen).

Ved hvert gangstrin forsøger du at nærme dig koen, som også bevæger sig ved hvert gangstrin (fordi du bruger de samme parametre).

Dette fører til en meget mærkelig vej til jagter (en stor svingning i træning).

I stedet kan vi bruge ideen om faste Q-mål introduceret af DeepMind:

  • Brug af et separat netværk med en fast parameter (lad os kalde det w-) til estimering af TD-målet.
  • Ved hvert Tau-trin kopierer vi parametrene fra vores DQN-netværk for at opdatere målnetværket.

Takket være denne procedure får vi mere stabil læring, fordi målfunktionen forbliver fast i et stykke tid.

Implementering

Implementering af faste q-mål er ret ligetil:

  • Først opretter vi to netværk ( DQNetwork, TargetNetwork)
  • Derefter opretter vi en funktion, der tager vores DQNetworkparametre og kopierer dem til voresTargetNetwork
  • Endelig under træningen beregner vi TD-målet ved hjælp af vores målnetværk. Vi opdaterer målnetværket med DQNetworkhvert tautrin ( tauer en hyperparameter, som vi definerer).

Dobbelt DQN'er

Teori

Dobbelt DQN eller dobbeltindlæring blev introduceret af Hado van Hasselt. Denne metode håndterer problemet med overvurdering af Q-værdier.

For at forstå dette problem skal du huske, hvordan vi beregner TD-målet:

Ved at beregne TD-målet står vi over for et simpelt problem: hvordan er vi sikre på, at den bedste handling for den næste tilstand er handlingen med den højeste Q-værdi?

Vi ved, at nøjagtigheden af ​​q-værdier afhænger af, hvilken handling vi forsøgte, og hvilke nabolande vi undersøgte.

Som en konsekvens har vi i begyndelsen af ​​træningen ikke nok information om den bedste handling at tage. At tage den maksimale q-værdi (som er støjende) som den bedste handling at tage, kan derfor føre til falske positive. Hvis ikke-optimale handlinger regelmæssigt får en højere Q-værdi end den optimale bedste handling, vil læringen være kompliceret.

Løsningen er: når vi beregner Q-målet, bruger vi to netværk til at afkoble handlingsvalget fra mål-Q-værdigenerering. Vi:

  • Brug vores DQN-netværk til at vælge, hvad der er den bedste handling at tage for den næste tilstand (handlingen med den højeste Q-værdi).
  • Brug vores målnetværk til at beregne mål-Q-værdien for at udføre denne handling i den næste tilstand.

Derfor hjælper Double DQN os med at reducere overvurderingen af ​​q-værdier og som en konsekvens hjælper os med at træne hurtigere og have mere stabil læring.

Implementering

Duelling DQN (også kendt som DDQN)

Teori

Husk, at Q-værdier svarer til hvor godt det er at være i den tilstand og tage en handling i denne tilstand Q (s, a).

Så vi kan nedbryde Q (s, a) som summen af:

  • V (s) : værdien af ​​at være i denne tilstand
  • A (s, a) : fordelen ved at tage den handling i den tilstand (hvor meget bedre er det at tage denne handling i forhold til alle andre mulige handlinger i den tilstand).

Med DDQN ønsker vi at adskille estimatoren for disse to elementer ved hjælp af to nye streams:

  • en, der estimerer tilstandsværdien V (s)
  • en, der estimerer fordelen for hver handling A (s, a)

Og så kombinerer vi disse to strømme gennem et specielt aggregeringslag for at få et skøn over Q (s, a).

Vente? Men hvorfor skal vi beregne disse to elementer separat, hvis vi kombinerer dem?

Ved at afkoble estimeringen kan vores DDQN intuitivt lære, hvilke tilstande der er (eller ikke er) værdifulde uden at skulle lære effekten af ​​hver handling i hver tilstand (da den også beregner V (s)).

Med vores normale DQN er vi nødt til at beregne værdien af ​​hver handling i den tilstand. Men hvad er pointen, hvis statens værdi er dårlig? Hvad er pointen med at beregne alle handlinger i en tilstand, når alle disse handlinger fører til døden?

Som en konsekvens er vi ved at afkoble vi i stand til at beregne V (er). Dette er især nyttigt for stater, hvor deres handlinger ikke påvirker miljøet på en relevant måde. I dette tilfælde er det unødvendigt at beregne værdien af ​​hver handling. For eksempel betyder det kun at flytte til højre eller venstre, hvis der er risiko for kollision. Og i de fleste stater har handlingen ikke nogen indflydelse på, hvad der sker.

Det bliver tydeligere, hvis vi tager eksemplet i papiret Duelling Network Architectures for Deep Reinforcement Learning.

Vi ser, at værdienetværksstrømmene lægger vægt (den orange sløring) på vejen og især på horisonten, hvor bilerne er skabt. Det er også opmærksom på score.

På den anden side lægger fordelstrømmen i den første ramme til højre ikke meget vægt på vejen, fordi der ikke er nogen biler foran (så handlingsvalget er praktisk talt irrelevant). Men i den anden ramme er det opmærksom, da der er en bil lige foran den, og det er afgørende og meget relevant at træffe et valg af handling.

Hvad angår aggregeringslaget, vil vi generere q-værdierne for hver handling i den pågældende tilstand. Vi kan blive fristet til at kombinere strømme som følger:

Men hvis vi gør det, falder vi ind ispørgsmål om identificerbarhed , det vil sige - givet Q (s, a) vi ikke kan finde A (s, a) og V (s).

Og ikke at være i stand til at finde V (s) og A (s, a) givet Q (s, a) vil være et problem for vores tilbagespredning. For at undgå dette problem kan vi tvinge vores fordelingsfunktionsestimator til at have 0 fordel ved den valgte handling.

For at gøre det trækker vi den gennemsnitlige fordel ved alle mulige handlinger i staten.

Derfor hjælper denne arkitektur os med at fremskynde træningen. Vi kan beregne værdien af ​​en tilstand uden at beregne Q (s, a) for hver handling i den tilstand. Og det kan hjælpe os med at finde meget mere pålidelige Q-værdier for hver handling ved at afkoble estimeringen mellem to strømme.

Implementering

Den eneste ting at gøre er at ændre DQN-arkitekturen ved at tilføje disse nye streams:

Prioriteret oplevelse Genafspilning

Teori

Prioriteret Experience Replay (PER) blev introduceret i 2015 af Tom Schaul. Ideen er, at nogle oplevelser kan være vigtigere end andre for vores træning, men kan forekomme sjældnere.

Fordi vi prøver batchen ensartet (ved at vælge oplevelserne tilfældigt) har disse rige oplevelser, der forekommer sjældent praktisk taget ingen chance for at blive valgt.

Derfor forsøger vi med PER at ændre samplingsfordelingen ved at bruge et kriterium til at definere prioriteten for hver oplevelse.

Vi ønsker at tage prioritetserfaring, hvor der er stor forskel mellem vores forudsigelse og TD-målet, da det betyder, at vi har meget at lære om det.

Vi bruger den absolutte værdi af størrelsen af ​​vores TD-fejl:

Og vi sætter denne prioritet i oplevelsen af ​​hver gentagelsesbuffer.

Men vi kan ikke bare foretage grådig prioritering, fordi det vil føre til altid at træne de samme oplevelser (som har stor prioritet) og dermed overmontering.

Så vi introducerer stokastisk prioritering, hvilket genererer sandsynligheden for at blive valgt til en gentagelse.

Som en konsekvens får vi under hvert tidspunkt etbatch af prøver med denne sandsynlighedsfordeling og træner vores netværk på det.

Men vi har stadig et problem her. Husk, at med normal Experience Replay bruger vi en stokastisk opdateringsregel. Som en konsekvens skal den måde, vi prøver eksempler på, matche den underliggende fordeling, de kom fra.

Når vi har normal erfaring, vælger vi vores oplevelser i en normal fordeling - enkelt sagt, vi vælger vores oplevelser tilfældigt. Der er ingen bias, fordi hver oplevelse har den samme chance for at blive taget, så vi kan opdatere vores vægte normalt.

Men fordi vi bruger prioriteret stikprøve, opgives rent tilfældig prøveudtagning. Som en konsekvens introducerer vi bias mod prøver med høj prioritet (flere chancer for at blive valgt).

Og hvis vi opdaterer vores vægte normalt, tager vi en risiko for overmontering. Prøver, der har høj prioritet, vil sandsynligvis blive brugt til træning mange gange i sammenligning med oplevelser med lav prioritet (= bias). Som en konsekvens opdaterer vi vores vægte med kun en lille del af oplevelser, som vi anser for at være virkelig interessante.

For at rette op på denne bias bruger vi vigtig prøveudtagningsvægt (IS), der justerer opdateringen ved at reducere vægten af ​​de ofte sete prøver.

Vægtene, der svarer til prøver med høj prioritet, har meget lidt justering (fordi netværket vil se disse oplevelser mange gange), mens de, der svarer til prøver med lav prioritet, vil have en fuld opdatering.

Rollen for b er at kontrollere, hvor meget denne vægtprøvevægt påvirker læring. I praksis annelleres b-parameteren op til 1 i løbet af træningens varighed, fordi disse vægte er vigtigere i slutningen af ​​indlæringen, når vores q-værdier begynder at konvergere. Den upartiske karakter af opdateringer er vigtigst nær konvergens, som forklaret i denne artikel.

Implementering

Denne gang bliver implementeringen lidt mere avanceret.

Først og fremmest kan vi ikke bare implementere PER ved at sortere alle Experience Replay-buffere efter deres prioriteter. Dette vil slet ikke være effektivt på grund af O (nlogn) til indsættelse og O (n) til prøveudtagning.

Som forklaret i denne rigtig gode artikel er vi nødt til at bruge en anden datastruktur i stedet for at sortere en matrix - et usorteret sommertræ.

En sumtree er et binært træ, det vil sige et træ med kun maksimalt to børn for hver knude. Bladene (dybeste noder) indeholder prioritetsværdierne, og et dataarray, der peger på blade, indeholder oplevelserne.

Opdatering af træet og prøveudtagning vil være virkelig effektiv (O (log n)).

Derefter opretter vi et hukommelsesobjekt, der indeholder vores sommertræ og data.

For at prøve et minibatch af størrelse k vil området [0, total_prioritet] blive opdelt i k-intervaller. En værdi samples ensartet fra hvert interval.

Endelig hentes de overgange (oplevelser), der svarer til hver af disse samplede værdier, fra sumtræet.

Det bliver meget tydeligere, når vi dykker ned på de komplette detaljer i notesbogen.

Doom Deathmatch agent

Denne agent er en Dueling Double Deep Q Learning med PER og faste q-mål.

Vi lavede en video-tutorial af implementeringen: Notebook'en er her

Det er alt! Du har lige oprettet en smartere agent, der lærer at spille Doom. Fantastisk! Husk, at hvis du vil have en agent med virkelig god ydeevne, har du brug for mange flere GPU-timer (ca. to dages træning)!

Men med kun 2-3 timers træning på CPU (ja CPU) forstod vores agent, at de havde brug for at dræbe fjender, før de kunne komme videre. Hvis de bevæger sig fremad uden at dræbe fjender, bliver de dræbt, før de får vest.

Glem ikke at implementere hver del af koden selv. Det er virkelig vigtigt at prøve at ændre den kode, jeg gav dig. Prøv at tilføje epoker, ændre arkitekturen, tilføje faste Q-værdier, ændre læringshastigheden, brug et hårdere miljø ... og så videre. Eksperiment, have det sjovt!

Husk at dette var en stor artikel, så sørg for virkelig at forstå, hvorfor vi bruger disse nye strategier, hvordan de fungerer, og fordelene ved at bruge dem.

I den næste artikel lærer vi om en fantastisk hybridmetode mellem værdibaseret og politikbaseret forstærkningslæringsalgoritmer. Dette er en basislinie for de nyeste algoritmer : Advantage Actor Critic (A2C). Du implementerer en agent, der lærer at spille Outrun!

Hvis du kunne lide min artikel, skal du klikke på? under så mange gange som du kunne lide artiklen, så andre mennesker kan se dette her på Medium. Og glem ikke at følge mig!

Hvis du har nogen tanker, kommentarer, spørgsmål, er du velkommen til at kommentere nedenfor eller sende mig en e-mail: [email protected], eller tweet mig @ThomasSimonini.

Bliv ved med at lære, bliv fantastisk!

Deep Reinforcement Learning Course med Tensorflow? ️

? Pensum

? Videoversion

Del 1: En introduktion til forstærkningslæring

Del 2: Dykke dybere ned i forstærkningslæring med Q-læring

Del 3: En introduktion til Deep Q-Learning: lad os spille Doom

Del 3+: Forbedringer i Deep Q Learning: Duelling Double DQN, Prioriteret Experience Replay og faste Q-mål

Del 4: En introduktion til Policy Gradients med Doom og Cartpole

Del 5: En introduktion til Advantage Actor Kritiske metoder: lad os spille Sonic the Hedgehog!

Del 6: Proximal politikoptimering (PPO) med Sonic the Hedgehog 2 og 3

Del 7: Nysgerrighedsdrevet læring gjort let del I