Ga naar hoofdinhoud

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.

info

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​

  1. Draai de code. Dit is het leren uit leren uit duizend spellen.
  2. Zet ontdekken op 1: nu kiest hij altijd een willekeurige zet. Wat leert hij bij 10 lucifers?
  3. Zet ontdekken op 0. Leert hij nu nog iets?
Python
Code-omgeving wordt voorbereid…
Antwoorden
  1. Hetzelfde als in de vorige stap: bij 10 lucifers pak 1.
  2. 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.
  3. 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:

  1. Draai de code: hij leert, en kiest één keer een zet bij 10 lucifers.
  2. Laat kies 1000 keer kiezen, en tel in een dictionary keer hoe vaak elke zet gekozen is. Print keer.
  3. Doe hetzelfde met ontdekken 0 en met ontdekken 1, in plaats van 0.2.
Python
Code-omgeving wordt voorbereid…
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.