【问题标题】:Approximate the q-function with NN in the FrozenLake exercise在 FrozenLake 练习中使用 NN 逼近 q 函数
【发布时间】:2020-06-30 03:25:11
【问题描述】:
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)

我是 AI 新手,需要一些帮助。我已经用 MVP / Q-learning 完成了FrozenLake exercise。有人告诉我,我可以使用深度神经网络逼近 q 函数。它解释说它被称为深度 Q 学习。如何使用深度 Q 学习和 pytorch 改进该代码?换句话说,在这里使用 NN 时如何逼近 q 函数?

【问题讨论】:

    标签: python-3.x neural-network pytorch reinforcement-learning q-learning


    【解决方案1】:

    这是一个稍微宽泛的问题,但这里有一个细分。

    首先,NN 只是函数逼近器。 给他们一些输入和输出,他们会发现 f(input) = output 仅当这样的函数存在并且可以根据损失/成本进行微分时

    所以 Q 函数是 Q(state,action) = futureReward 用于在该状态下采取的行动

    或者, 我们可以将 Q 函数更改为仅获取 当前状态,并输出每个动作估计的未来奖励的数组。 示例:

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

    所以现在 Q 函数 => Q(state) = futureRewardMatrix[action*]

    现在您只需要一个接收当前状态并输出每个动作的奖励的神经网络。(仅适用于离散动作 [a,b,c,d..])

    如何训练网络。

    • 通过收集状态、动作、奖励、下一个状态来收集训练批次
    • 要获取您使用 nn.predict(state) 的操作,考虑 epsilon 以进行选择 随机动作

    培训:

    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)
    

    然后重复这个过程,为环境的每一步收集批次。

    我建议您查看 mediumtowardsdatascience DQN 文章及其各自的 Github 存储库以获取完整的代码实现

    【讨论】:

    • 您是否愿意通过解释说明我必须在代码中修改什么?我想更改我的代码以使用深度 Q 学习而不是标准 MVP/Q 学习。我非常了解 Q 学习和深度 Q 学习之间的区别。我曾尝试实现 Breakout-v0 和 CartPole-v0,但目前太难了。我知道我的frozenlake练习不值得使用深度Q-learning,因为Q-table太小了,但我认为它只会帮助我更好地理解,因为在我看来它比CartPole-v0简单得多跨度>
    • 遗憾的是,我对 PyTorch 不太熟悉,但请查看这个 Keras-TensorFlow 实现 github.com/tokb23/dqn/blob/master/dqn.py
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 2010-12-25
    • 1970-01-01
    • 2018-09-07
    • 2018-07-23
    • 2013-06-21
    相关资源
    最近更新 更多