【发布时间】:2018-10-04 22:25:34
【问题描述】:
@编辑:
我正在尝试创建一个代理来玩俄罗斯方块游戏,使用将棋盘状态 + 当前棋子作为输入的卷积网络。根据我的阅读,Deep Q-learning 在这方面不是很擅长,我刚刚证实了这一点。
@end 编辑
假设一个代理正在学习一个策略来玩一个游戏,其中每个游戏步骤都可以表示为
s, a, r, s', 完成
代表
状态、动作、奖励、下一个状态、游戏结束
在Deep Q-learning算法中,代理处于s状态并采取一些动作a(跟随一个epsilon -greedy 策略),观察到奖励 r 并进入下一个状态 s'。
代理的行为如下:
# returns an action index
get_action(state, epsilon)
if random() < epsilon
return random_action_index
else
return argmax(nnet.predict(state))
通过贪婪地观察状态s'中的最大Q值来更新参数,所以我们有
# action taken was 'a' in state 's' leading to 's_'
prediction = nnet.predict(s)
if done
target = reward
else
target = reward + gamma * max(nnet.predict(s_))
prediction[a] = target
[prediction, target] 被馈送到一些 nnet 以进行权重更新。所以这个 nnet 得到一个状态 s 作为输入,并输出一个维度为 n_actions 的 q 值向量。这一点我都清楚。
现在,假设我的状态动作非常嘈杂,以至于这种方法根本行不通。因此,我的 nnet 输出不是输出维度为 n_actions 的向量,而是单个值,表示“状态质量”(该状态有多理想)。
现在我的代理是这样的:
# returns an action based on how good the next state is
get_action(state, epsilon):
actions = []
for each action possible in state:
game.deepcopy().apply(action)
val = nnet.predict(game.get_state())
action.value = val
actions.append(action)
if random() < epsilon
return randomChoice(actions)
else
return action with_max_value from actions
而我的[预测,目标]是这样的:
# action taken was 'a' in state 's' leading to 's_'
prediction = nnet.predict(s)
if done
target = reward
else
target = reward + gamma * nnet.predict(s_)
我对第二种算法有一些疑问:
a) 有时不贪婪是否有意义?
直觉上不是,因为如果我进入一个糟糕的状态,可能是因为一个糟糕的随机动作,而不是因为之前的状态是“糟糕”。 Q-learning 更新会调整坏动作,但是第二个算法会错误地调整之前的状态。
b) 这是什么算法?它适用于强化学习的什么地方?
c) 在俄罗斯方块的情况下,状态几乎从不重复,那么在这种情况下我该怎么办?这就是深度 q 学习在这里失败的原因吗?
这可能看起来令人困惑,但该算法确实有效。如有需要,我可以提供更多详细信息,谢谢!
【问题讨论】:
-
我决定现在在这里写一个问题的答案。为了将来参考,我怀疑这类问题在ai.stackexchange.com 上会比在 * 上更热门。
标签: python machine-learning deep-learning reinforcement-learning