作者:牛阿
链接:https://www.zhihu.com/question/26408259/answer/123230350
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

问题分析

我们可以通过强化学习(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) 使用动作a进行游戏,获得小鸟的新位置S',与奖励R(S,a)Q[S,A] ← (1-α)*Q[S,A] + α*(R(S,a) + γ* max Q[S',a]) // 更新QS ← S'

其中有些值得注意的地方:

1. 使用策略π,获得动作a=π(S)

最直观易懂的策略π(S)是根据Q表格来选择效用最大的动作(若两个动作效用值一样,如初始时某位置处效用值都为0,那就选第一个动作)。

但这样的选择可能会使Q陷入局部最优:在位置 处,在第一次选择了动作1(飞)并获取了 的奖赏后,算法将永远无法对动作2(不飞)进行更新,即使动作2最终会给出 的奖赏。

改进的策略为ε-greedy方法:每个状态以ε的概率进行探索,此时将随机选取飞或不飞,而剩下的1-ε的概率则进行开发,即按上述方法,选取当前状态下效用值较大的动作。

2.更新Q表格

Q表格将根据以下公式进行更新:

其中α学习速率(learning rate),γ折扣因子(discount factor)。根据公式可以看出,学习速率α越大,保留之前训练的效果就越少。折扣因子γ越大,所起到的作用就越大。但指什么呢?

考虑小鸟在对状态进行更新时,会关心到眼前利益 ),和记忆中的利益)。

记忆中的利益。它是小鸟记忆里,新位置能给出的最大效用值。如果小鸟在过去的游戏中于位置的某个动作上吃过甜头(例如选择了某个动作之后获得了50的奖赏),这个公式就可以让它提早地得知这个消息,以便使下回再通过位置时选择正确的动作继续进入这个吃甜头的位置

可以看出,γ越大,小鸟就会越重视以往经验,越小,小鸟只重视眼前利益(R)。

根据上面的伪代码,便可以写出Q-learning的代码了。

成果

训练后的小鸟一直挂在那里可以飞到几千分。

参考:

如何用简单例子讲解 Q - learning 的具体过程? - 牛阿的回答 - 知乎 https://www.zhihu.com/question/26408259/answer/123230350

Q-learning相关推荐

  1. Q学习(Q learning) 强化学习

    Q学习(Q learning) 强化学习的简单例子 Matlab实现 可视化_Morty 的挖坑记录-CSDN博客 强化学习(MATLAB) - 叮叮当当sunny - 博客园

  2. RL之Q Learning:利用强化学习之Q Learning实现走迷宫—训练智能体走到迷宫(复杂迷宫)的宝藏位置

    RL之Q Learning:利用强化学习之Q Learning实现走迷宫-训练智能体走到迷宫(复杂迷宫)的宝藏位置 目录 输出结果 设计思路 实现代码 测试记录全过程 输出结果 设计思路 实现代码 f ...

  3. RL之Q Learning:利用强化学习之Q Learning实现走迷宫—训练智能体走到迷宫(简单迷宫)的宝藏位置

    RL之Q Learning:利用强化学习之Q Learning实现走迷宫-训练智能体走到迷宫(简单迷宫)的宝藏位置 目录 输出结果 设计思路 实现代码 测试记录全过程 输出结果 设计思路 实现代码 f ...

  4. Q learning

    今天继续写RL的exercise2,发现Q learning一直不收敛.本来就是个很简单的算法,改了好久都不知道fault在哪里,一开始以为是超参数调的不好,结果调了好久的参数都不行.后来发现自己犯了 ...

  5. [强化学习实战]出租车调度-Q learning SARSA

    出租车调度-Q learning & SARSA 案例分析 实验环境使用 同策时序差分学习调度 异策时序差分调度 资格迹学习调度 结论 代码链接 案例分析 本节考虑Gym库里出租车调度问题(T ...

  6. 强化学习(二):Q learning 算法

    强化学习(一):基础知识 强化学习(二):Q learning算法 Q learning 算法是一种value-based的强化学习算法,Q是quality的缩写,Q函数 Q(state,action ...

  7. [PARL强化学习]Sarsa和Q—learning的实现

    [PARL强化学习]Sarsa和Q-learning的实现 Sarsa和Q-learning都是利用表格法再根据MDP四元组<S,A,P,R>:S: state状态,a: action动作 ...

  8. Deep Q learning: DQN及其改进

    Deep Q Learning Generalization Deep Reinforcement Learning 使用深度神经网络来表示 价值函数 策略 模型 使用随机梯度下降(SGD)优化los ...

  9. 【强化学习笔记】从 “酒鬼回家” 认识Q Learning算法

    1.背景 现在笔者来讲一个利用Q-learning 方法帮助酒鬼回家的一个小例子, 例子的环境是一个一维世界, 在世界的右边是酒鬼的家.这个酒鬼因为喝多了,根本不记得回家的路,只是根据自己的直觉一会向 ...

  10. python Q learning玩倒立摆(inverted pendulum)

    今天使用Q learning实现了一下倒立摆哈,我这里把代码分享给大家学习啦: pendulum环境 # a few packages we need to importimport numpy as ...

最新文章

  1. 充电电池科研大突破:可使用十多年且储存容量几乎不发生退化
  2. BZOJ3682 : Phorni
  3. PHP复习第二天-变量
  4. inheritPrototypal.js
  5. 【51nod - 1065】 最小正子段和( 前缀和排序 )
  6. flex gallery / 产品展示
  7. centos6.5+jexus5.6.3+mono 3.10实践,让asp.net在linux上飞一会儿
  8. Nginx常用配置清单
  9. 大厂程序员教你如何学习C++
  10. 一致性算法中的节点下限(转)
  11. python之配置日志的几种方式
  12. Python入门:Dataframe的索引模式
  13. Linux部署启动服务脚本
  14. 吃冬瓜对宝宝有什么好处?
  15. The Apostle's Creed
  16. 丁磊:顶尖技术人才的特质,是热爱与专注!
  17. js 原生cookie封装
  18. remosaic插值算法_手机镜头像素:硬件直出和插值有啥区别?
  19. 如何在自己的所擅长的领域简历优势
  20. 一些人的RHCE的考试经历(值得我们去借鉴)

热门文章

  1. html5 颜色弹窗 位置,HTML5之placeholder属性以及如何更改placeholder属性中文字颜色大小位置...
  2. P - The Shortest Path in Nya Graph HDU - 4725
  3. 吐血推荐:win下如何安装tensorflow?只需两步!!
  4. syslog服务器默认使用协议,什么是syslog协议?
  5. java统计大于0的个数_java中0的问题(依据0统计数量时出错)
  6. 什么是java多线程_什么是java多线程,java多线程的基本原理?
  7. 小森林顺序_英桥镇彩虹幼儿园趣味亲子活动—森林运动会
  8. 未来数据中心的选择:宽带多模光纤
  9. sonarQube安装及本机扫描C#项目
  10. C++ 11 创建和使用 shared_ptr