我对深度学习和神经网络非常陌生,并试图实现一个能够玩我的简单游戏的代理
因此,目标是在可行的步长(从玩家到完成单元的总距离)中达到目的地(橙色单元)的同时获得最高的得分(访问的单元总数)。
我的网络模型非常简单(我正在使用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
我知道这是一个稍微开放的问题,可能不适合在此处发布,因此,我将感谢任何形式的指导或一般性意见。
答案 0 :(得分:1)
传统上,强化学习仅限于解决离散状态离散动作问题,因为连续的问题导致了“维数的诅咒”问题。例如,假设机械臂可以在0-90度之间移动。这意味着您需要对角度= 0、0.00001、0.00002,...进行操作,这对于传统的基于表格的RL来说是不可行的。
为解决此问题,我们必须告知RL 0.00001和0.00002大致相同。为此,我们需要使用函数逼近,例如神经网络。这些近似的目的是对表格RL中的Q矩阵进行近似并捕获策略(即机器人的选择)。但是,直到今天,非线性函数逼近仍然非常难以训练。 NN在RL中的首次成功是David Silver及其确定性政策梯度(2014)。他的方法是直接将状态映射到动作,而没有Q值。但是神经网络的损失函数将以奖励为指导。
回答“如何正确奖励NN”的原始问题:
原始文件为: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进行了更详细的说明,并提供了有关如何实现此结果的简化示例。