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

标签 tensorflow machine-learning neural-network tflearn

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

game field

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

我的网络模型非常简单(我正在使用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. 如果我的神经网络架构完全错误且不适合此任务怎么办?如何发现这一点?
  4. 最后:调试网络时最好从哪里开始,以及我应该首先仔细检查和验证哪些方面。

我知道这是一个稍微开放的问题,在这里发布可能不合适,因此我将不胜感激任何类型的指导或一般性评论。

最佳答案

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

为了解决这个问题,我们必须告诉 RL 0.00001 和 0.00002 或多或少是相同的。为了实现这一点,我们需要使用函数逼近,例如神经网络。这些近似的目的是近似表格强化学习中的 Q 矩阵并捕获策略(即机器人的选择)。然而,即使到今天,非线性函数逼近仍然非常难以训练。神经网络第一次在强化学习中取得成功是由 David Silver 和他的确定性策略梯度(2014 年)完成的。他的方法是将状态直接映射到 Action ,而不需要 Q 值。但神经网络的损失函数将受到奖励的引导。

回答最初的问题“如何正确奖励神经网络”:

  1. 在状态空间中生成机器人运动的许多轨迹。在您的示例中,当智能体达到目标或走了超过 50 步(花费太长时间)时,一条轨迹就会结束。我们将每个步骤称为一个情节。
  2. 在每次成功轨迹(达到目标)后,对最后一集奖励 1,而在此之前的每一集都应按您的折扣率进行折扣。示例:如果您的折扣率为 0.95,则最后 2 集将获得 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 矩阵。这位评论家试图通过在每集后提供信息来稳定 Actor 的学习。因此,减少了 Actor 的方差。

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

我建议您在尝试其他策略之前先熟悉确定性策略梯度。

关于tensorflow - 玩游戏时如何正确奖励神经网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53401117/

相关文章:

machine-learning - 哪个是对纯输入文本进行分类的最佳 svm 示例?

python - 类型错误 : 'numpy.float64' object is not iterable Keras

neural-network - 使用 TensorFlow 训练 MNIST 后,我们如何识别真实图像上的文本?

python - 创建用于训练的单个感知器

python - Tensorflow 产生 NaN

python - 如何在 Keras 中设置适当的模型输入形状

python - TensorFlow 使用 tf.while_loop() 陷入无限循环

machine-learning - 在小数据集上使用 GridSearch 并将结果应用于大数据集是一个好主意吗?

python - 谷歌云 - 计算引擎 VS 机器学习

python - 使用 "Face Recognition"(lib) 来识别 10 万张现有面孔中的新面孔?