OpenAI: усиление блэкджека в контроле MC по политике превосходит эвристическую политику - PullRequest
0 голосов
/ 20 декабря 2018

Я создал код для реализации в политике контроля Монте-Карло по проблеме БлэкДжек из openAIgym в записной книжке Python.

import gym
import random
from matplotlib import pyplot
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from collections import defaultdict
from functools import partial
import numpy as np
%matplotlib inline
plt.style.use('ggplot')

env = gym.make('Blackjack-v0')

q = defaultdict(lambda:1)

def epsilon_greedy_policy(state, epsilon):
    if random.uniform(0,1) < epsilon:
        return env.action_space.sample()
    else:
        return max(list(range(env.action_space.n)), key = lambda x: q[state,x])

def generate_episode(epsilon): #if we add policy and environment as args: flexible
    states, actions, rewards = [], [], [] #create storages
    observation = env.reset() #initiate environment
    while True:
        states.append(observation)

        action = epsilon_greedy_policy(observation, epsilon)
        actions.append(action)

        observation, reward, done, info = env.step(action)
        rewards.append(reward)

        if done:
            break
    return states, actions, rewards

def mc_control (n_episodes):
    q = defaultdict(lambda:1)
    N = defaultdict(int)

    for episode in range(n_episodes):
        states, actions, rewards = generate_episode(0.2*(n_episodes-episode)/n_episodes) #start exploiting more and more over time
        returns = 0

        for t in range(len(states)-1, -1, -1):
            R = rewards[t] #reward
            S = states[t] #state
            A = actions[t]
            returns += R
            N[S,A] += 1
            q[S,A] = (returns + q[S,A]*(N[S,A]-1)) / N[S,A] 

    return q

q_short = mc_control(50000)
q_medium = mc_control(500000)
q_long = mc_control(5000000)

def value_creation(q):
    value_function = defaultdict(list)
    for s, a in q:
        value_function[s].append(q[s,a])

    for s in value_function:
        value_function[s] = max(value_function[s])

    return value_function

value1 = value_creation(q_short)
value2 = value_creation(q_medium)
value3 = value_creation(q_long)

Код, кажется, работает очень хорошо, однако, если я пытаюсь получить оценкуэффективность политики путем суммирования различных V (s) в пространстве состояний (sum (value.values ​​())), я вижу, что это уменьшается вместе с увеличением количества сгенерированных эпизодов (50 000, 500 000, 5000 000): 18.02691323585902 -2.3781486288952207 -3.541695462098351

Обычно это не должно быть проблемой, и это просто указывает на то, что первый элемент управления MC был чрезмерно оптимистичным в своей оценке функции значения.Однако, когда я вычисляю тот же показатель для программы, которая использует следующую эвристику:

Хит, если сумма игрока меньше 15.

Чем сумма значений -0,2527627229724029.

Есть идеи, как это возможно, учитывая тот факт, что контроль по политике должен возвращать оптимальную политику, которая должна превосходить любую другую модель?Просто мой политический контроль еще не сошелся?Использую ли я неправильную оценку производительности, потому что я не принимаю во внимание частоту возникновения состояний?Мой код неверен?

Заранее спасибо.

...