Najprostszym rozwiązaniem jest po prostu uczynienie każdej czynności „legalną”, ale wdrożenie spójnego, deterministycznego mapowania od potencjalnie nielegalnych działań do różnych działań prawnych. Ilekroć implementacja PPO, z której korzystasz, wybiera nielegalne działanie, po prostu zastępujesz je działaniem prawnym, na które jest mapowane. Twój algorytm PPO może następnie aktualizować się tak, jakby wybrano nielegalne działanie (nielegalne działanie po prostu staje się ... zamiast tego „pseudonimem” dla czynności prawnej).
Na przykład w opisanej sytuacji:
- 2 akcje (0 i 1) są zawsze dostępne
- 2 akcje (2 i 3) są dostępne tylko wtedy, gdy stan_zewnętrzny == 0
- 1 akcja (4) jest dostępna tylko wtedy, gdy stan_zewnętrzny == 1
W przypadkach internal_state == 0
, gdy 4
wybrano akcję (akcję nielegalną), zawsze możesz ją zamienić na jedną z innych akcji i zamiast tego zagrać. Teoretycznie nie ma znaczenia (teoretycznie), który wybierzesz, pod warunkiem, że będziesz konsekwentny. Algorytm nie musi wiedzieć, że wybrał nielegalną akcję, ilekroć ponownie wybierze tę samą nielegalną akcję w przyszłości w podobnych stanach, konsekwentnie zostanie zamapowany na tę samą akcję prawną, więc po prostu wzmocnij ją zgodnie z tym zachowaniem.
Rozwiązanie opisane powyżej jest bardzo proste, prawdopodobnie najłatwiejsze do wdrożenia, ale oczywiście to… „pachnie” nieco „hacky”. Czystsze rozwiązanie wymagałoby pewnego kroku w sieci, który określa prawdopodobieństwo wyników nielegalnych działań0i ponownie normalizuje resztę do sumowania 1jeszcze raz. Wymaga to znacznie więcej starań, aby upewnić się, że aktualizacje edukacyjne są nadal wykonywane poprawnie, i prawdopodobnie jest o wiele bardziej skomplikowane do wdrożenia na istniejącym frameworku, takim jak Tensorforce (jeśli nie jest już w jakiś sposób obsługiwany po wyjęciu z pudełka).
W przypadku pierwszego „rozwiązania” napisałem powyżej, że „teoretycznie” nie ma znaczenia, w jaki sposób wybierzesz mapowanie. Absolutnie oczekuję, że twoje wybory tutaj będą miały wpływ na szybkość uczenia się w praktyce. Wynika to z faktu, że na początkowych etapach procesu uczenia się prawdopodobnie wybierzesz działania zbliżone do losowych. Jeśli niektóre akcje „pojawią się wielokrotnie” na wyjściach, będą miały większe prawdopodobieństwo, że zostaną wybrane przy początkowym wyborze akcji close-tor-andom. Będzie to miało wpływ na twoje początkowe zachowanie, co wpłynie na gromadzone doświadczenie, co z kolei będzie miało wpływ na to, czego się nauczysz.
Z pewnością spodziewam się, że będzie to korzystne dla wydajności, jeśli możesz dołączyć funkcje wejściowe dla internal_state
zmiennej.
Jeśli można zidentyfikować pewne działania prawne, które są w jakiś sposób „semantycznie bliskie” niektórym nielegalnym działaniom, może być również korzystne dla wydajności powiązanie tych „podobnych” działań w „mapowaniu” z działań nielegalnych do prawnych, jeśli zdecydujesz się na to rozwiązanie. Na przykład, jeśli masz akcję „przeskocz do przodu”, która staje się nielegalna w stanach, w których pułap jest bardzo niski (ponieważ uderzysz się głową), może być lepiej odwzorować tę akcję na akcję „przesuń do przodu” (która nadal jest podobny, oboje idą do przodu), niż byłoby to odwzorowaniem na działanie „cofnij się”. Ta idea „podobnych” działań będzie miała zastosowanie tylko do niektórych domen, w niektórych domenach mogą nie występować takie podobieństwa między działaniami.
Zwykle zestaw akcji, które agent może wykonać, nie zmienia się z czasem, ale niektóre akcje mogą stać się niemożliwe w różnych stanach (na przykład nie każdy ruch jest możliwy w dowolnej pozycji gry w kółko i krzyżyk).
Weź przykład jako fragment kodu https://github.com/haje01/gym-tictactoe/blob/master/examples/base_agent.py :
źródło