Приблизительная q-функция с NN в упражнении FrozenLake - PullRequest
1 голос
/ 19 марта 2020
import numpy as np 
import gym
import random
import time
from IPython.display import clear_output

env = gym.make("FrozenLake-v0")

action_space_size = env.action_space.n
state_space_size = env.observation_space.n

q_table = np.zeros((state_space_size, action_space_size))

num_episodes = 10000
max_steps_per_episode = 100

learning_rate = 0.1
discount_rate = 0.99

exploration_rate = 1
max_exploration_rate = 1
min_exploration_rate = 0.01
exploration_decay_rate = 0.01

reward_all_episodes = []

#Q-learning algorithm
for episode in range(num_episodes):
    state = env.reset()

    done = False
    reward_current_episode = 0

    for step in range(max_steps_per_episode):

        exploration_rate_threshold = random.uniform(0, 1)
        if exploration_rate_threshold > exploration_rate: #Exploit
            action = np.argmax(q_table[state, :])
        else:
            action = env.action_space.sample() #Explore

        new_state, reward, done, info = env.step(action)

        q_table[state, action] = (1 - learning_rate) * q_table[state, action] + \
            learning_rate * (reward + discount_rate * np.max(q_table[new_state]))

        state = new_state

        reward_current_episode += reward

        if done == True:
            break

    exploration_rate = min_exploration_rate + \
        (max_exploration_rate - min_exploration_rate) * np.exp(-exploration_decay_rate * episode)

    reward_all_episodes.append(reward_current_episode)

reward_per_thousand_episodes = np.split(np.array(reward_all_episodes), num_episodes/1000)
count = 1000
print("Average Reward per thousand episode \n")
for r in reward_per_thousand_episodes:
    print(count, ":", str(sum(r/1000)))
    count += 1000

print("\n ***************Q-table****************\n\n")
print(q_table)

Я новичок в ИИ, и мне нужно немного помочь. Я выполнил упражнение FrozenLake с MVP / Q-learning. Кто-то сказал мне, что я могу приблизить q-функцию, используя глубокую нейронную сеть. Это объясняет, что это называется глубоким Q-обучением. Как я могу улучшить этот код, используя глубокое Q-обучение и Pytorch? Другими словами, как я могу приблизить q-функцию при использовании NN здесь?

1 Ответ

1 голос
/ 23 марта 2020

Это немного широкий вопрос, но вот разбивка.

Во-первых, NN - это просто функциональные аппроксиматоры. Дайте им некоторый ввод и вывод, и они найдут f (input) = output Только, если такая функция существует и дифференцируема на основе потерь / стоимости

Таким образом, функция Q Q (состояние, действие) = futureReward для этого действия, предпринятого в этом состоянии

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

[7,5,1,8] for action a,b,c,d

Итак, теперь функция Q => Q (состояние) = futureRewardMatrix [action *]

Теперь все, что вам нужно это нейронная сеть, которая принимает текущее состояние и выводит вознаграждения за каждое действие. (работает только для отдельных действий [a, b, c, d ..])

Как обучить сеть.

  • Соберите тренировочную партию, набрав состояний, действий, наград, nextState
  • Для получения действий вы используете nn .predict (состояние) , с учетом эпсилона для выбора случайных действий

Обучение:

x_train = state
y_train[action] = reward + self.gamma * (np.amax(nn.predict(nextState))

далее мы тренируемся на относительно большой партии x_trains и y_trains

nn.train_on_batch(x_train_batch,y_train_batch)

Затем повторите процесс сбора пакетов для каждого шага среды.

Я рекомендую вам ознакомиться с medium и todatascience DQN статей и их соответствующие репозитории Github, чтобы получить полную реализацию кода

...