在玩游戏时如何正确奖励神经网络

时间:2018-11-20 20:36:14

标签: tensorflow machine-learning neural-network tflearn

我对深度学习和神经网络非常陌生,并试图实现一个能够玩我的简单游戏的代理

game field

因此,目标是在可行的步长(从玩家到完成单元的总距离)中达到目的地(橙色单元)的同时获得最高的得分(访问的单元总数)。

我的网络模型非常简单(我正在使用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. 我需要几个纪元?如何找出它们的确切数量?
  3. 如果我的NN架构完全错误并且不适合该任务怎么办?如何发现呢?
  4. 最后:在调试网络时,什么是开始的好地方?首先应该仔细检查和验证哪些方面。

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

3 个答案:

答案 0 :(得分:1)

传统上,强化学习仅限于解决离散状态离散动作问题,因为连续的问题导致了“维数的诅咒”问题。例如,假设机械臂可以在0-90度之间移动。这意味着您需要对角度= 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

蒙特卡洛方法的问题在于它们的高方差,因为每种轨迹可能彼此差异很大。因此,随后的现代RL(2015年末至今)使用了一种actor-critic方法,其中actor是上述算法,但是还有另一个批评者使用神经网络来近似Q矩阵。这位评论家试图通过在每集节目后向演员提供信息来稳定演员的学习。因此,减少了参与者的差异。

两种最受欢迎​​的算法是:深度确定性策略梯度和近端策略优化。

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

答案 1 :(得分:0)

不是以上问题的答案,而是开始为您的特定网络here

获取有价值的信息的好地方

答案 2 :(得分:0)

好的,所以您应该使用适当的工具解决问题。如评论中所述,正确的方法是使用强化学习。这是针对我们的环境返回最佳策略的算法(基于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进行了更详细的说明,并提供了有关如何实现此结果的简化示例。