玩游戏时如何正确奖励神经网络
How to properly reward neural network when playing a game
我对深度学习和神经网络还很陌生,正在尝试实现一个能够玩我的简单游戏的代理
因此,目标是在可用步数(始终是从玩家到终点单元格的距离)内到达目的地(橙色单元格)时获得尽可能高的分数(访问的单元格总和)。
我的网络模型非常简单(我正在使用 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
- 我要查找的损失值是多少?是否有经验法则告诉我亏损就足够了?
- 我需要多少个 epoch?如何计算出它们的确切数量?
- 如果我的神经网络架构完全错误并且不适合这项任务怎么办?如何发现?
- 最后:调试网络时从哪里开始比较好,我应该首先仔细检查和验证哪些方面。
我知道这是一个稍微开放的问题,在这里 post 它可能不合适,所以我将不胜感激任何类型的指导或一般性评论。
不是上述问题的答案,而是开始为您的特定网络获取有价值信息的好地方 here
好的,所以您应该使用适当的工具来解决问题。如评论中所述,正确的方法是使用强化学习。这是 returns 适合我们环境的最佳策略的算法(基于 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 更详细的解释以及如何实现此结果的简化示例。
传统上,强化学习仅限于解决离散状态离散动作问题,因为连续问题导致了"curse of dimensionality"的问题。例如,假设机器人手臂可以在 0 - 90 度之间移动。这意味着您需要针对 angle = 0, 0.00001, 0.00002, ... 执行操作,这对于传统的基于表格的 RL 来说是不可行的。
为了解决这个问题,我们必须教 RL 0.00001 和 0.00002 大致相同。为此,我们需要使用神经网络等函数逼近。这些近似的目的是在表格 RL 中近似 Q 矩阵并捕获策略(即机器人的选择)。然而,即使到今天,众所周知,非线性函数逼近也极难训练。神经网络第一次在强化学习中取得成功是由 David Silver 和他的确定性策略梯度 (2014) 提出的。他的方法是直接将状态映射到动作,而无需 Q 值。但是神经网络的损失函数会受到奖励的引导。
回答"how to properly reward the NN"的原题:
- 在状态 space 中生成机器人运动的许多轨迹。在您的示例中,一条轨迹在代理达到目标时结束,或者如果他走了超过 50 步(花费的时间太长)。我们将每一步称为一集。
- 在每个成功轨迹(达到目标)后,奖励最后一集1的奖励,之前的每一集都要按你的折扣率进行折扣。示例:如果您的折扣率为 0.95,则倒数第二集将获得 0.95 的奖励,依此类推
- 收集到足够的轨迹后 (~50),将其视为监督学习问题。输入是状态,目标是动作,奖励是交叉熵奖励引导损失:-log(pi)*R,其中 pi 是在该状态下采取该动作的概率。 R 是您当前的奖励。
- 使用梯度下降的变体进行训练,采用交叉熵奖励引导损失的梯度:- (dPi/pi * R)。在这里,您可以看到非常负的 R 将具有高损失,而正 R 将具有低损失。
- 重复直到收敛。这种训练方法称为蒙特卡洛方法,因为我们生成许多轨迹,我们说每个 S、A、R、S 对的平均值很可能。
原文如下:http://proceedings.mlr.press/v32/silver14.pdf
monte carlo 方法的问题在于它们的高方差,因为每个轨迹都可能与其他轨迹有很大不同。因此,现代 RL(2015 年末 - 现在)使用演员-评论家方法,其中演员是上述算法,但还有另一个评论家使用神经网络近似 Q 矩阵。这位评论家试图通过在每一集之后给演员提供信息来稳定演员的学习。因此,减少了演员的方差。
最流行的 2 种算法是:深度确定性策略梯度和近端策略优化。
我建议您在尝试其他策略之前先熟悉确定性策略梯度。
我对深度学习和神经网络还很陌生,正在尝试实现一个能够玩我的简单游戏的代理
因此,目标是在可用步数(始终是从玩家到终点单元格的距离)内到达目的地(橙色单元格)时获得尽可能高的分数(访问的单元格总和)。
我的网络模型非常简单(我正在使用 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
- 我要查找的损失值是多少?是否有经验法则告诉我亏损就足够了?
- 我需要多少个 epoch?如何计算出它们的确切数量?
- 如果我的神经网络架构完全错误并且不适合这项任务怎么办?如何发现?
- 最后:调试网络时从哪里开始比较好,我应该首先仔细检查和验证哪些方面。
我知道这是一个稍微开放的问题,在这里 post 它可能不合适,所以我将不胜感激任何类型的指导或一般性评论。
不是上述问题的答案,而是开始为您的特定网络获取有价值信息的好地方 here
好的,所以您应该使用适当的工具来解决问题。如评论中所述,正确的方法是使用强化学习。这是 returns 适合我们环境的最佳策略的算法(基于 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 更详细的解释以及如何实现此结果的简化示例。
传统上,强化学习仅限于解决离散状态离散动作问题,因为连续问题导致了"curse of dimensionality"的问题。例如,假设机器人手臂可以在 0 - 90 度之间移动。这意味着您需要针对 angle = 0, 0.00001, 0.00002, ... 执行操作,这对于传统的基于表格的 RL 来说是不可行的。
为了解决这个问题,我们必须教 RL 0.00001 和 0.00002 大致相同。为此,我们需要使用神经网络等函数逼近。这些近似的目的是在表格 RL 中近似 Q 矩阵并捕获策略(即机器人的选择)。然而,即使到今天,众所周知,非线性函数逼近也极难训练。神经网络第一次在强化学习中取得成功是由 David Silver 和他的确定性策略梯度 (2014) 提出的。他的方法是直接将状态映射到动作,而无需 Q 值。但是神经网络的损失函数会受到奖励的引导。
回答"how to properly reward the NN"的原题:
- 在状态 space 中生成机器人运动的许多轨迹。在您的示例中,一条轨迹在代理达到目标时结束,或者如果他走了超过 50 步(花费的时间太长)。我们将每一步称为一集。
- 在每个成功轨迹(达到目标)后,奖励最后一集1的奖励,之前的每一集都要按你的折扣率进行折扣。示例:如果您的折扣率为 0.95,则倒数第二集将获得 0.95 的奖励,依此类推
- 收集到足够的轨迹后 (~50),将其视为监督学习问题。输入是状态,目标是动作,奖励是交叉熵奖励引导损失:-log(pi)*R,其中 pi 是在该状态下采取该动作的概率。 R 是您当前的奖励。
- 使用梯度下降的变体进行训练,采用交叉熵奖励引导损失的梯度:- (dPi/pi * R)。在这里,您可以看到非常负的 R 将具有高损失,而正 R 将具有低损失。
- 重复直到收敛。这种训练方法称为蒙特卡洛方法,因为我们生成许多轨迹,我们说每个 S、A、R、S 对的平均值很可能。
原文如下:http://proceedings.mlr.press/v32/silver14.pdf
monte carlo 方法的问题在于它们的高方差,因为每个轨迹都可能与其他轨迹有很大不同。因此,现代 RL(2015 年末 - 现在)使用演员-评论家方法,其中演员是上述算法,但还有另一个评论家使用神经网络近似 Q 矩阵。这位评论家试图通过在每一集之后给演员提供信息来稳定演员的学习。因此,减少了演员的方差。
最流行的 2 种算法是:深度确定性策略梯度和近端策略优化。
我建议您在尝试其他策略之前先熟悉确定性策略梯度。