【问题标题】:How to properly reward neural network when playing a game玩游戏时如何正确奖励神经网络
【发布时间】:2018-11-20 20:36:13
【问题描述】:

我对深度学习和神经网络还很陌生,我正在尝试实现一个能够玩我的简单游戏的代理

因此,我们的目标是在到达目的地(橙色单元格)的同时,在可用的步数内(总是从玩家到终点单元格的距离)获得尽可能高的分数(访问过的单元格的总和)。

我的网络模型非常简单(我使用的是tflearn

network = input_data(shape=[None, 13, 1], name='input')
network = fully_connected(
    network,
    13**2,
    activation='relu'
)
network = fully_connected(network, 1, activation='linear')
network = regression(
    network,
    optimizer='adam',
    learning_rate=self.lr,
    loss='mean_square',
    name='target',
)
model = tflearn.DNN(network, tensorboard_dir='log')

13 是我能够从游戏状态中提取的一些特征。但是生成的模型在播放时会表现出非常糟糕的行为

[default] INFO:End the game with a score: 36
[default] INFO:Path: up,up,up,up,up,up,up,up,up,up,up,up,up,up,up

所以我想弄清楚我遗漏了哪些重要部分,并有一些悬而未决的问题需要澄清:

Training Step: 3480  | total loss: 0.11609 | time: 4.922s
| Adam | epoch: 001 | loss: 0.11609 -- iter: 222665/222665
  1. 我要查找的损失值是多少?是否有经验法则可以告诉我亏损就足够了?
  2. 我需要多少个 epoch?如何确定它们的确切数量?
  3. 如果我的 NN 架构完全错误且不适合此任务怎么办?如何发现?
  4. 最后:在调试您的网络时,什么是一个好的起点,我应该首先仔细检查和验证哪些方面。

我知道这是一个稍微开放的问题,可能不适合在此处发布,因此我将不胜感激任何形式的指导或一般 cmets。

【问题讨论】:

  • 这是一个强化学习问题。您应该使用强化学习训练算法(而不是回归)。
  • 是的,我正在使用强化学习(查看代码 github.com/bmwant/canvaSokoban/blob/master/app/network.py#L72 了解更多详情)
  • 我也在改编这篇文章中的算法towardsdatascience.com/…
  • 老实说,我对这个问题感到非常困惑。您是在询问奖励结构吗?似乎您已经回答了自己的问题,但您所做的只是粘贴了一个表格 Q 学习代码,它与奖励结构无关,甚至与基于神经网络的 RL 无关……实际上,您的神经网络会由于非线性函数近似的随机性,鉴于您提供的当前代码,永远不会收敛到任何最优策略。
  • @RuiNian 是的,我已经开始使用 NN 架构来解决这个游戏,但最终使用了 Q-learning,正如在此处关于使用 RL 的评论中提到的那样。我发布了一个最小的工作示例来解决游戏,而不是声称它是正确的。如果您有什么要提供的,我将非常感谢任何其他指导或其他信息。谢谢

标签: tensorflow machine-learning neural-network tflearn


【解决方案1】:

传统上,强化学习仅限于解决离散状态离散动作问题,因为连续问题会导致“维度诅咒”问题。例如,假设机器人手臂可以在 0 到 90 度之间移动。这意味着您需要对 angle = 0, 0.00001, 0.00002, ... 进行操作,这对于传统的基于表格的 RL 来说是不可行的。

为了解决这个问题,我们必须让 RL 知道 0.00001 和 0.00002 或多或少是相同的。为此,我们需要使用函数逼近,例如神经网络。这些近似的目的是近似表格 RL 中的 Q 矩阵并捕获策略(即机器人的选择)。然而,直到今天,众所周知,非线性函数逼近是极难训练的。 NN 第一次在 RL 中取得成功是 David Silver 和他的确定性策略梯度(2014 年)。他的方法是直接将状态映射到动作,没有 Q 值。但是神经网络的损失函数会受到奖励的引导。

回答“如何正确奖励NN”的原始问题:

  1. 在状态空间中生成许多机器人运动轨迹。在您的示例中,一个轨迹在代理达到目标时结束,或者如果他走了超过 50 步(耗时太长)。我们将每个步骤称为一个情节。
  2. 在每个成功轨迹(达到目标)之后,奖励最后一集奖励 1,之前的每一集都应按您的折扣率进行折扣。示例:如果您的折扣率为 0.95,则最后第二集将获得 0.95 的奖励,以此类推。
  3. 在收集到足够的轨迹 (~50) 后,将其视为监督学习问题。您的输入是状态,目标是动作,奖励是交叉熵奖励引导损失:-log(pi)*R,其中 pi 是在该状态下采取该动作的概率。 R 是你当前的奖励。
  4. 使用梯度下降的变体进行训练,采用交叉熵奖励引导损失的梯度:- (dPi/pi * R)。在这里,您可以看到非常负的 R 会产生高损失,而正的 R 会产生低损失。
  5. 重复直到收敛。这种训练方法称为蒙特卡洛方法,因为我们生成了许多轨迹,并且我们说每个 S、A、R、S' 对的平均值很可能。

这里是原论文:http://proceedings.mlr.press/v32/silver14.pdf

蒙特卡罗方法的问题在于它们的高方差,因为每个轨迹都可能与其他轨迹大不相同。因此,现代强化学习(2015 年末 - 现在)使用了演员-评论家方法,其中演员是上述算法,但还有另一个评论家使用神经网络来近似 Q 矩阵。这位评论家试图通过在每集之后提供信息来稳定演员的学习。因此,减少了演员的方差。

两种最流行的算法是:深度确定性策略梯度和近端策略优化。

我建议您先熟悉确定性策略梯度,然后再尝试其他策略。

【讨论】:

  • 谢谢!超级有用
【解决方案2】:

不是上述问题的答案,而是开始为您的特定网络获取有价值信息的好地方here

【讨论】:

    【解决方案3】:

    好的,所以您应该使用适当的工具来解决问题。正如 cmets 中提到的,正确的方法是使用强化学习。这是为我们的环境返回最优策略的算法(基于Q-learning

    states_space_size = (game.field.leny - 2)*(game.field.lenx - 2)
    actions_space_size = len(DIRECTIONS)
    QSA = np.zeros(shape=(states_space_size, actions_space_size))
    max_iterations = 80
    gamma = 1  # discount factor
    alpha = 0.9  # learning rate
    eps = 0.99  # exploitation rate
    s = 0  # initial state
    for i in range(max_iterations):
        # explore the world?
        a = choose_an_action(actions_space_size)
        # or not?
        if random.random() > eps:
            a = np.argmax(QSA[s])
    
        r, s_ = perform_action(s, a, game)
        qsa = QSA[s][a]
        qsa_ = np.argmax(QSA[s_])
        QSA[s][a] = qsa + alpha*(r + gamma*qsa_ - qsa)
    
        # change state
        s = s_
    print(QSA)
    

    Here's 更详细的解释以及如何实现此结果的简化示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      • 2017-06-07
      • 2017-03-01
      • 1970-01-01
      • 2017-01-15
      相关资源
      最近更新 更多