【问题标题】:Q-learning, what is the effect of test episodes count on convergence?Q-learning,测试集数对收敛有什么影响?
【发布时间】:2019-01-16 06:03:05
【问题描述】:

下面的代码是通过Q-learning解决FrozenLake 4x4的代码。在训练部分,为什么我们在每个循环中播放 20 集测试环境而不是 1 集? 我尝试了两种迭代次数:

当测试环境进行 20 次迭代时,代理会在超过 16000 次尝试中收敛。

在玩 1 次测试环境迭代时,代理在不到 1000 次尝试中收敛。

import gym
import collections
from tensorboardX import SummaryWriter

ENV_NAME = "FrozenLake-v0"
GAMMA = 0.9
ALPHA = 0.2
TEST_EPISODES = 20


class Agent:
    def __init__(self):
        self.env = gym.make(ENV_NAME)
        self.state = self.env.reset()
        self.values = collections.defaultdict(float)

    def sample_env(self):
        action = self.env.action_space.sample()
        old_state = self.state
        new_state, reward, is_done, _ = self.env.step(action)
        self.state = self.env.reset() if is_done else new_state
        return (old_state, action, reward, new_state)

    def best_value_and_action(self, state):
        best_value, best_action = None, None
        for action in range(self.env.action_space.n):
            action_value = self.values[(state, action)]
            if best_value is None or best_value < action_value:
                best_value = action_value
                best_action = action
        return best_value, best_action

    def value_update(self, s, a, r, next_s):
        best_v, _ = self.best_value_and_action(next_s)
        new_val = r + GAMMA * best_v
        old_val = self.values[(s, a)]
        self.values[(s, a)] = old_val * (1-ALPHA) + new_val * ALPHA

    def play_episode(self, env):
        total_reward = 0.0
        state = env.reset()
        while True:
            _, action = self.best_value_and_action(state)
            new_state, reward, is_done, _ = env.step(action)
            total_reward += reward
            if is_done:
                break
            state = new_state
        return total_reward


if __name__ == "__main__":
    test_env = gym.make(ENV_NAME)
    agent = Agent()
    writer = SummaryWriter(comment="-q-learning")

    iter_no = 0
    best_reward = 0.0
    while True:
        iter_no += 1
        s, a, r, next_s = agent.sample_env()
        agent.value_update(s, a, r, next_s)

        reward = 0.0
        for _ in range(TEST_EPISODES):
            reward += agent.play_episode(test_env)
        reward /= TEST_EPISODES
        writer.add_scalar("reward", reward, iter_no)
        if reward > best_reward:
            print("Best reward updated %.3f -> %.3f" % (best_reward, reward))
            best_reward = reward
        if reward > 0.80:
            print("Solved in %d iterations!" % iter_no)
            break
    writer.close()

【问题讨论】:

    标签: python artificial-intelligence q-learning


    【解决方案1】:

    在此示例中,TEST_EPISODES 用于更改求解标准。使用TEST_EPISODES = 1,只要最近一场比赛的得分达到 > 0.80,就认为游戏已解决,而使用TEST_EPISODES = 20,过去 20 轮的平均得分必须 > 0.80 才能认为游戏已解决。

    由于该游戏具有随机动作,即您每次在相同状态下执行相同动作都不会得到相同的结果,那么您开得越高TEST_EPISODES,解决方案可能越稳健.使用TEST_EPISODES = 1,如果在第一次尝试时碰巧随机找到目标,此脚本将认为游戏已解决,但在模型不佳的情况下连续执行 20 次的可能性要小得多。

    对于这类问题,相比第一次达到目标的速度,更多剧集的平均值通常是更好的衡量标准。想象一下,如果您必须在这种环境中操作,并且您的生活依赖于安全地达到目标,您可能希望它学习直到分数阈值更接近 1。

    【讨论】:

    • 亲爱的尼克,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2020-04-29
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多