Ga naar de inhoud

Handleidingen

Reinforcement learning

Oloproof evalueert een policy voor reinforcement learning door haar in episodes te draaien, of op basis van de log van de policy die ze zou vervangen. Draai haar wanneer dat kan; gebruik de log wanneer de uitkomst alleen in de echte wereld plaatsvindt. Deze pagina is de referentie voor beide, en de tutorial loopt elk ervan door aan de hand van een uitvoerbaar voorbeeld.

Oloproof host, reset of simuleert geen omgeving, en traint geen policies. Je systeem draait zijn eigen omgeving, zoals elk systeem dat Oloproof evalueert zijn eigen code draait.

Episodes

Een taak is een case. Een episode is één meting ervan: je systeem draait de policy in zijn omgeving en legt de episode vast met current_case().rl_episode(...), als een rl_episode/v1-artefact.

VeldTypeBetekenis
stepslijst van stappen, index vanaf 1De reward van elke stap, de cost van zijn beperking (standaard 0), en optioneel action en observation
successtrue, false of afwezigHet eigen oordeel van de omgeving over de episode
truncatedboolean, standaard falseDe stapgrens beëindigde de episode voordat een eindtoestand werd bereikt
horizongeheel getal, optioneelDe stapgrens; de episode mag niet langer zijn

Het record bevat elke stap van de episode. Een afgekapte episode is er een waarvan het evaluatieprotocol bepaalt dat ze bij haar grens eindigt, dus haar return en kosten zijn volledig, geen ondergrenzen.

Declareer de soort die het systeem vastlegt, zodat een run een evaluator kan weigeren die een record nodig heeft dat het systeem nooit schrijft:

system:
  name: grid-agent
  callable: env:run_baseline
  records: [rl_episode/v1]

Episode-evaluators

TypeMeetVelden
episode_returnDe return, elke beloning per stap gewogen met discount, als scorereturn_range (verplicht), discount (standaard 1)
episode_successGeslaagd wanneer de episode success: true vastlegt; ontbrekend wanneer ze niets vastlegtgeen
episode_cost_withinGeslaagd wanneer de kosten van de stappen samen hoogstens budget zijnbudget (verplicht)

return_range is het bereik waarin elke return ligt, zoals in het slechtste geval 30 stappen van elk -1 en in het beste geval de beloning voor het doel. Het interval op een gemiddelde return geldt alleen binnen dat bereik, dus een return erbuiten stopt de run met exitcode 2. In de SDK zijn de klassen EpisodeReturn, EpisodeSuccess en EpisodeCostWithin in oloproof.evaluators.

Meerdere episodes per taak

Stel replicates: in om meerdere episodes van elke taak te draaien. current_case().replicate zegt welke er draait (0 voor de eerste), en het maakt deel uit van de sleutel van de opgeslagen uitvoering, dus een omgeving die de episode ermee seedt, speelt voor hetzelfde replicaat dezelfde episode opnieuw af, en een tweede run hergebruikt wat hij opsloeg.

De taak blijft de eenheid. Elk criterium wordt het gemiddelde over taken van het eigen gemiddelde van elke taak over haar episodes, en het interval telt taken: vijf episodes van één taak zijn geen vijf onafhankelijke taken.

Een slagingspercentage over gerepliceerde taken leest per taak het aandeel geslaagde episodes. Wil je in plaats daarvan weten of een taak elke keer slaagt, declareer dan een every_replicate-metriek:

metrics:
  - {id: solved_every_time, type: every_replicate, criterion: episode_success}

Een taak telt alleen wanneer al haar episodes slaagden, dus elke taak is één geslaagd of mislukt, en het exacte binomiale interval is van toepassing. Met één episode per taak is het gelijk aan het slagingspercentage. Een taak met een ontbrekende episode is ontbrekend, ook wanneer een andere episode ervan mislukte.

Twee policies vergelijken

oloproof compare koppelt elke taak aan zichzelf, waarbij elke kant zijn gemiddelde over zijn episodes waard is. Het verschil in een return wordt getoond in de eigen eenheid van de return, dat in een slagingspercentage in procentpunten. De twee runs mogen verschillende aantallen episodes per taak draaien, behalve voor een every_replicate-metriek: slagen in elk van vijf episodes en in de enige episode zijn verschillende vragen, dus die vergelijking wordt niet berekend. Kwantiel- en rangschikkingsvergelijkingen worden niet berekend wanneer een van beide runs meerdere episodes per taak heeft.

Off-policy-evaluatie

Gebruik dit wanneer de uitkomst die je belangrijk vindt alleen in de echte wereld plaatsvindt (een opgelost ticket, een gebruiker die terugkwam) en je de nieuwe policy nog niet op echt verkeer kunt uitproberen. Het bewijs is een log van beslissingen die een oudere policy nam.

Elke case is één gelogde beslissing:

{"id":"t001","input":{"topic":"technical","length":"short"},"expected":{"action":"small","logging_probabilities":{"small":0.7,"large":0.3},"reward":1}}
VeldBetekenis
inputWat de policy zag toen ze besliste
expected.actionDe actie die de loggingpolicy (logging policy) nam
expected.logging_probabilitiesDe kans die de loggingpolicy op dat moment aan elke actie gaf, samen 1
expected.rewardWat volgde, binnen reward_range; afwezig als het nooit aankwam

Het systeem is de policy die je wilt evalueren. Het ontvangt input en geeft zijn eigen kans op elke actie terug onder probabilities, of onder het veld dat je noemt in probabilities_field. Het draait nooit een model en raakt de echte wereld nooit aan. input bevat alleen wat de loggingpolicy zag toen ze besliste: nooit de gelogde actie of de beloning, die de geteste policy niet mag zien. Een policy die haar keuze trekt, geeft de kansen terug waaruit ze trekt, niet de actie die ze trok; elke beslissing wordt opnieuw geëvalueerd, ook wanneer haar input zich herhaalt. Acties heten precies zoals de log ze noemt: een actie die anders gespeld is, telt als een actie die de loggingpolicy nooit nam.

TypeSchat
off_policy_valueDe gemiddelde beloning van de policy op beslissingen zoals de gelogde
off_policy_improvementDat gemiddelde min dat van de loggingpolicy zelf

Beide nemen reward_range en propensity_floor, de kleinste kans die de loggingpolicy gaf aan een actie die de nieuwe policy kan nemen. Stel die in op basis van hoe de loggingpolicy ontworpen is (een exploratiepercentage, een minimaal aandeel), nooit door waarden op de log uit te proberen. Elke gelogde beslissing wordt herwogen met de kans van de nieuwe policy op haar actie gedeeld door die van de loggingpolicy, en de ondergrens begrenst dat gewicht: zonder haar geldt geen enkel interval. In de SDK zijn de klassen OffPolicyValue en OffPolicyImprovement.

Wat de engine doet met een beslissing die hij niet kan lezen zoals ze gegeven is:

SituatieResultaat
Kansen die samen geen 1 zijn, een gelogde actie met kans 0, een beloning buiten reward_rangeDe run stopt met exitcode 2: een verkeerde kans zou het interval verkeerd maken zonder dat te tonen
De nieuwe policy kan een actie nemen die gelogd is met een kans onder de ondergrensDe beslissing is ontbrekend en wordt in het slechtste geval begrensd
De beloning is afwezigDe beslissing is ontbrekend en wordt in het slechtste geval begrensd

Wat het antwoord veronderstelt:

  • De kansen werden vastgelegd toen de loggingpolicy besliste, en het zijn de kansen die ze gebruikte. Oloproof schat ze nooit.
  • De beloning van elke beslissing hangt af van haar eigen input en actie, niet van andere beslissingen.
  • De loggingpolicy hield dezelfde kansen aan gedurende de periode van de log.
  • Het antwoord beschrijft beslissingen zoals de gelogde, over de periode die de log beslaat.

Het interval is breed wanneer de ondergrens klein is: de beslissingen die iets zeggen over een zelden gekozen actie zijn er weinig, en elk telt vele malen. Een langere log, en een loggingpolicy die meer verkent, maken het smaller.

Wat niet gebouwd is

  • Off-policy-evaluatie van een reeks beslissingen, waarbij elke keuze verandert wat er daarna komt.
  • Een log waarvan de policy haar kansen veranderde terwijl ze leerde tijdens de periode.
  • Kansen die achteraf geschat zijn.
  • Het hosten of resetten van omgevingen en simulators.

Verder lezen