2018年12月1日修改:@Rahn的答案中提出了一种剪枝方法,可以加快模型的收敛。2017年06月05日修改:最近重写了一遍代码,Flappy Bird Q-learning。你可以在这里试着训练,想最大帧数下,一两分钟内就可以达到10+的分数。
问题分析
我们可以通过强化学习(reinforcement learning)来解决小鸟怎么飞这个问题。强化学习中有状态(state)、动作(action)、奖赏(reward)这三个要素。智能体(Agent,指小鸟)会根据当前状态来采取动作,并记录被反馈的奖赏,以便下次再到相同状态时能采取更优的动作。
状态的选择
在这个问题中,最直观的状态提取方法就是以游戏每一帧的画面为状态。但为了简化问题,这里我将选用SarvagyaVaish项目中提出的状态表达:取小鸟到下一组管子的水平距离和垂直距离差作为小鸟的状态。更准确地说,
与
的定义如下图所示:
(图片来自Flappy Bird RL by SarvagyaVaish)
对于每一个状态
,
为水平距离,
为垂直距离。
动作的选择
每一帧,小鸟只有两种动作可选:1.向上飞一下。2.什么都不做。
奖赏的选择
小鸟活着时,每一帧给予1的奖赏;若死亡,则给予-1000的奖赏。
关于Q
提到Q-learning,我们需要先了解Q的含义。
Q为动作效用函数(action-utility function),用于评价在特定状态下采取某个动作的优劣。它是智能体的记忆。
在这个问题中, 状态和动作的组合是有限的。所以我们可以把Q当做是一张表格。表中的每一行记录了状态
,选择不同动作(飞或不飞)时的奖赏:
这张表一共
行,表示
个状态,每个状态所对应的动作都有一个效用值。
理想状态下,在完成训练后,我们会获得一张完美的Q表格。我们希望只要小鸟根据当前位置查找到对应的行,选择效用值较大的动作作为当前帧的动作,就可以无限地存活。
训练
下面的伪代码说明了我们如何训练,来得到一个尽量完美的Q表格。
初始化 Q = {};while Q 未收敛:初始化小鸟的位置S,开始新一轮游戏while S != 死亡状态:使用策略π,获得动作a=π(S