Ontdekken
Bij elke beurt kiest de computer meestal de zet met de hoogste score, maar
soms een willekeurige. Dat heet ontdekken. Nieuw is de vraag waarom een
lerend programma niet altijd zijn beste zet speelt, en hoe random.random()
die keuze maakt.
Je gebruikt hier random.random() uit
de surfer springt soms,
en random.choice uit een klik.
Voorspel
import random
ontdekken = 0.2
keer = 0
for i in range(1000):
if random.random() < ontdekken:
keer = keer + 1
print(keer)
Ongeveer welk getal print dit programma?
Antwoord
Rond de 200. random.random() geeft een kommagetal van 0 tot 1, en in 2 van
de 10 keer is dat kleiner dan 0.2.
Zo werkt het
Zo kiest kies in de verborgen code een zet:
def kies(score, stapel, ontdekken):
if random.random() < ontdekken:
return random.choice(mogelijk(stapel))
return beste_zet(score, stapel)
Met kans ontdekken kiest hij een willekeurige zet uit mogelijk(stapel),
de zetten die bij die stapel mogen. Anders kiest hij de zet met de hoogste
score.
Waarom zou hij ooit iets anders doen dan zijn beste zet? Omdat hij een zet die hij nooit probeert, ook nooit beter leert kennen. Ontdekken geeft elke zet af en toe een kans.
Onderzoek
- Draai de code. Dit is het leren uit leren uit duizend spellen.
- Zet
ontdekkenop 1: nu kiest hij altijd een willekeurige zet. Wat leert hij bij 10 lucifers? - Zet
ontdekkenop 0. Leert hij nu nog iets?
Antwoorden
- Hetzelfde als in de vorige stap: bij 10 lucifers pak 1.
- Dan leert hij bij 10 lucifers pak 3, en dat is fout. Hij leert nu welke zet het vaakst wint als daarna beide spelers willekeurig verder spelen. Dan wint pak 3 net iets vaker: 52 procent, tegen 49 voor pak 1. Maar zo speelt niemand die de truc kent. Pas als hij tijdens het leren zijn eigen beste zetten speelt, leert hij wat werkt tegen een tegenstander die goed speelt, en dat is hijzelf.
- Ja, ook zonder ontdekken leert hij dit spel. Een zet die verliest, krijgt een punt eraf, en dan probeert hij de volgende keer een andere. In een groter spel is dat niet genoeg: een zet die hij nooit probeert, krijgt nooit een kans om te laten zien dat hij goed is. Daarom ontdekt een lerend programma meestal een beetje.
Opdracht: hoe vaak kiest hij wat?
Laat de geleerde computer 1000 keer een zet kiezen bij 10 lucifers, met
kies(score, 10, 0.2), en tel hoe vaak hij elke zet kiest. Ongeveer zo:
{1: 866, 2: 73, 3: 61}
Begin klein, en breid de code stap voor stap uit:
- Draai de code: hij leert, en kiest één keer een zet bij 10 lucifers.
- Laat
kies1000 keer kiezen, en tel in een dictionarykeerhoe vaak elke zet gekozen is. Printkeer. - Doe hetzelfde met ontdekken 0 en met ontdekken 1, in plaats van 0.2.
Tip
Bewaar de zet die kies teruggeeft eerst in een variabele. Dan tel je hem
zoals je woorden telde bij het spamfilter.
Antwoord
Dit komt onder de code van de editor:
keer = {}
for i in range(1000):
pak = kies(score, 10, 0.2)
if pak not in keer:
keer[pak] = 0
keer[pak] = keer[pak] + 1
print(keer)
{1: 866, 2: 73, 3: 61}
Bij ontdekken 0.2 kiest hij niet 200 keer iets anders dan pak 1, maar ongeveer 133 keer: de willekeurige zet is in een derde van de gevallen toch pak 1. Bij ontdekken 0 kiest hij altijd pak 1, en bij ontdekken 1 elke zet ongeveer even vaak.
Door naar speel tegen de geleerde strategie.