强化学习七日打卡营终极复现之flappy bird

7天的实战很快就过去了,在调参调到怀疑人生时,“标准答案”却出奇的简单,另外每次训练时间都非常长,要是有加快训练的方法就好了。最后有一个终极复现可以自由发挥,这就来实现曾经想玩的flappy bird。

这里是目录

  • 原理
    • 基本概念
    • Q学习
  • 环境
  • 实现过程
    • 模型选取
    • 图像预处理
    • 调试与优化
  • 总结与展望

原理

基本概念

强化学习是一种在与环境交互过程中学习的方法。

通过动作施加影响
动作的收益
反馈环境的变化
智能主体
环境

比如在日常生活中,

  • 前方有一棵树(环境)
  • 人向前走了一步(动作)
  • 撞到了树(环境变化)
  • 并且觉得痛(收益)
  • 下次碰到树换个方向走(更新策略)

强化学习的问题定义
给定马尔可夫决策过程MDP= { S , A , P r , R , γ } \{S,A,Pr,R,\gamma\} {S,A,Pr,R,γ},寻找一个最优策略 π ∗ \pi^* π,对任意 s ∈ S s\in S sS,使得价值 V π ∗ ( s ) 值 最 大 V_{\pi^*}(s)值最大 Vπ(s)

Q学习

Q学习是基于价值的方法,即对价值函数进行建模和估计,以此为依据制定策略。它使用一个Q表格来记录不同状态下不同动作的价值。决策时根据状态选择价值最高的动作。
Q学习也是基于时序差分的方法 ,即基于时序差分进行价值函数更新。
具体过程如下

强化学习七日打卡营终极复现之flappy bird_第1张图片

当状态数非常多甚至连续分布时,有些状态很难采样到,也不可能用一张表来记录q函数。
这时候可以使用值函数近似(将q函数参数化),用一个非线性模型来拟合它,比如说神经网络,DQN就是这样一种算法。

环境

深度学习框架

  • PaddlePaddle
  • PARL

Flappy Bird GYM环境

  • PyGame Learning Environment (PLE)
  • OpenAI PLE environment (gym-ple)

实现过程

模型选取

根据所学知识,有DQN和PG两个方案,在PARL仓库给的例子中有雅达利游戏DQN的例子,便以它为基础修改和改进。模型为4层卷积池化加输出层。

图像预处理

原始图像是288×512×3的图像:
强化学习七日打卡营终极复现之flappy bird_第2张图片
使用OpenCv库将其变为80×80的灰度图像:
在这里插入图片描述
最后进行归一化,所有像素除以255。

调试与优化

最开始把每次动作后环境返回的1帧图像作为输入,跑了一晚上都没有收敛,猜测是一帧图像不足以表现当前状态,比如说测不出速度和加速度。刚开始图像预处理没有归一化也可能是一个原因。
游戏环境是输入一个动作,运行1帧,为了得到多帧图像,可以将一个动作作用多次,这里用的4次,即一个动作作用4次,得到4帧图像作为状态。
刚开始由于回放经验池设的较大,跑到中途崩溃了,断续跑了总共不到1000个episode,就得到了比较不错的效果,最长一次测试跑了将近4分钟。

奇怪的是,后面的测试小鸟都在同一个地方失利:
这里我觉得模型根据经验做出了正确的动作,但是心有余而力不足,限于“手速”,而飞不上去。于是改小动作作用帧数,改为3之后,仍不能避免这个问题,还出现了一些极限操作:
猜测由于在极限上升上的失利,模型偏向于将状态转移到安全的极限下降。
为了进一步减小动作作用帧数,同时不减少状态帧数,需要分离这两个超参数,前者称为“跳帧”,后者称为“环境长度”,跳帧可以沿用之前写的代码,状态帧数则使用一个数组记录每个episode所有原始状态,每次取最后”环境长度“个原始状态作为状态。
减小跳帧后训练速度和效果都没有达到之前的水平,这里我想到先用跳帧4训练,然后改为跳帧1微调。
20000步左右,跳帧4模型给出了一次4分多钟的测试结果,最后一个障碍前,小鸟选择了直接放弃:
模型大概在说:“我能怎么办?我也很绝望啊。”
跳帧1的微调仍然非常慢,训练了80000多步,模型可以给出稳定30s以上的测试结果,可惜的是,最后仍不能通过这个极限上升障碍。

总结与展望

总的来说DQN在图像输入的flappy bird环境下表现非常不错,在动作间隔和环境长度设为4时表现最好。对于最后一个不能越过的极限上升障碍,在增加训练时间和增大探索概率重新训练后仍然不能通过,大概率是游戏环境问题,查看源码,得到管道间隔100,最大高度差168,x方向速度为4,有大约25帧时间用来上升,每次点击加速度为9,小鸟上升速度个位置,但是每次点击会让速度变为0,所以最多只能以速度8匀速上升,用环境自带的getGameState()函数测得,两个管道内间距为85,这段距离大约能上升170个单位,可谓是极限操作,即只有完美操作才有可能通过。
另外,“你已经是一个成熟的AI了,要学会自己确定超参数了”,让模型自适应步长,输出跳帧数,可以让模型不受“手速”限制,同时加快预测速度,为此需要加上一项速度奖励,即与通过每个障碍用的操作次数负相关的奖励。

预留的github地址:https://github.com/bnpzsx/DRL-FlappyBird

你可能感兴趣的:(人工智能,paddlepaddle,强化学习)