DQN的第一次尝试

在本篇博客中将为大家形象地介绍一下我对DQN的理解,以及我和我的队友如何利用DQN进行黄金点游戏。最后我会总结一下基于我在游戏中看到的结果,得到的dqn使用的注意事项和这次游戏中我们应该改正的错误和改进的不足之处(可能只对黄金点有用,如果理解有误的话,可以指出,我立马改正)

问题定义

我的描述可能不太准确,这里直接使用参赛网站上对黄金点比赛的规则定义问题:

规则:N个玩家,每人写一个或两个0~100之间的有理数 (不包括0或100),提交给服务器,服务器在当前回合结束时算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的玩家得到N分,离G最远的玩家得到-2分,其他玩家得0分。只有一个玩家参与时不得分。

我们本次比赛允许没人提交两个数,这就给了玩家很大的操作空间(提交一个大数或者小数进行扰动)

问题的难点,我认为主要在于选定合适的action和state,既能保证模型的更新速度,又能保证预测的action能起到得分的作用

方法建模

本次游戏中,每个玩家可拿到的信息有:之前的黄金点、每个玩家给出的数、每个玩家的得分。通过这些信息建模之后给出自己本轮认为可以得分的number1和number2。考虑到rl在游戏上的优异表现,我们本次采用的方法是DQN。下面介绍一下具体的建模方法。

Q Learning

这篇教程说得很好 --> 莫凡教程。 想要详细了解的小伙伴可以点开链接看一下。

提到dqn,必须要先介绍一下它的“前身” -- Q learning。dqn本质上是为了解决q learning的action-value表过大,有的状态更新不到的问题的。那什么是Q learning呢?我们在这里用石头剪刀布来举一下例子。

概念介绍

action

q learnig中的第一个核心是action。action指你未来可以进行的操作。在石头剪刀布中,action的定义就是我出石头、出剪刀或者是出布了。

value and reward

value则是q learning中的第二个核心。定义为你执行某一个action之后,在未来可以获得的收益值。

假设$value_t$为t时刻的value值。而你在t时刻选择了$action_i$,然后获得了$reward_t$(在石头剪刀布中,就是你每轮赢输或者平局)。那么你t时刻到未来可获得的收益值即为:你本轮获得收益加上你你未来获得收益。

$value_t = reward_t + value_{t+1}$

state

state则是q learning中的第三个核心。定义为你在当前的游戏状态,可以影响你下一步决策的游戏环境。在石头剪刀布中,state可以定义为你和你对手在之前的决策等。我们这里将state简化为上一轮你和对手的决策

流程

q learning维护了一张state-action的value表,这是什么意思呢?我们在这里虚构一张剪刀石头布中的q表:

剪刀 石头
对手:布 你:石头 5 1 2
对手:布 你: 剪刀 4 2 -1
对手:布 你:布 2 -1 1
对手:石头 你:剪刀 3 0 4
。。。。

加设上一轮处于“对手:布 你: 剪刀”的状态。那么此时value值最大的action就是出剪刀(第三行),将这个值作为$value_{action}$。然后你下一轮出了剪刀之后,发现输了,因为对手出了石头。此时你需要更新自己的q表。

你拿到第二步的状态(对手:石头 你:剪刀),将这一状态下的max_value * gamma作为你未来的收益 ,再加上 你这一轮的收益(-1)。将这个值设为$value_{real}$, 更新$value_{action}$:

$value_{action_new} = value_{action} - lr * (value_{action} - value_{real})$

在上式中lr和gamma是人为设定的参数。

DQN

在上面石头剪刀布中,action相对较少,state我们也是用了一种简化的方式来模拟。在黄金点游戏中,action数比较多,state也很多。这种情况下是用一个神经网络代替q表,并周期的更新参数可以有效解决这个问题。

同时我们使用了Experience replay 和 Fixed Q-targets策略。

Experience replay:使用过去的状态acition对同时更新网络

Fixed Q-targte:使用两个net,一个(eval net)用于计算当前state下的value值,一个用于(target ney)计算使用action后未来的value。其中经常更新eval net。而target net 固定steps进行更新(与eval net 交换参数)。

由于我们第一轮的模型存在比较多的问题,现在就只给大家介绍一下第二轮的模型设置和流程

state

为了减小模型规模,我们只使用前10轮的黄金点作为状态。

action

有7个action:

  1. 使用上一轮的黄金点
  2. 使用上两轮黄金点的平均
  3. 使用前三轮黄金点的平均
  4. 使用周期为2的黄金点的平均
  5. 使用周期为3的黄金点的平均
  6. 使用最大的三个黄金点的平均
  7. 使用最小的三个黄金点的平均

model

我们的model为了减小参数和规模,只使用了全连接层。模型概念图如下

其他参数

memory size:最大记录前100轮的state1 action state2 reward

lr:0.1;在第50和500个step乘以0.1

batch size:8 ,在 50、100、 500、 1000个step成2

gamma:0.9

e_geedy:0.9

每20个step更新一次target net。

模型从15个step开始学习,从第50个step开始上线。

流程图

结果分析

我们第一轮的时候选择使用gru来选择action,同时state考虑了前20轮的user number、黄金点以及得分。action定义为选择的分数所在的区间。这导致了模型很难收敛,以及参数区间只要一预测错就会被扣分。最后的结果当然是分数惨淡,获得倒数第三名...

第二轮我们改进了策略,主要是改变了action,使每个action都是当前轮次中可能得分的action。简化模型,是的模型收敛速度加快。改变启动策略。

最后模型的效果如下,可以看到有的action还是很少使用的,而且我们目前阶段其实策略比较保守,没有像Bot8一样采用 扰动策略(来不及了)

分数趋势:

action1选择:

action2选择:

回答一下问题

  1. 我们其实没什么预期。。。第一轮有些失望,第二轮其实是超出了我们的预期的
  2. 比赛前,我们与其他选手进行了比赛,以及房间的ai进行了比赛,由此衡量模型的好坏
  3. 人数的多少并不影响我们方法的使用,但是效果是否会变好或者变差应该需要试验评估
  4. 我的队友真的是一个非常负责的队友,我本人其实在任务期间有mentor布置的工作要做,就很忙。很多时候事件的协调,debug等都是由我的队友负责的,非常感谢,而且最后队友提出的建议也在很大程度上改善了模型的效果!如果非要说什么不足的话,函数可以写短一点hhh, 主要是函数太长了hhh,debug比较麻烦。但是总体来说是非常好的,合作非常愉快~

DQN的第一次尝试 -- 软工结对编程第一次作业的更多相关文章

  1. 这就是小学生也会用的四则计算练习APP吗?- by软工结对编程项目作业

    结对编程项目 软件工程 这就是链接 作业要求 这就是链接 作业目标 熟悉在未结对情况下如何结对开发项目 Github与合作者 合作者(学号): 区德明:318005422 虚左以待 Github链接: ...

  2. 2020BUAA 软工-结对作业

    结对作业 项目 内容 北航2020软工 班级博客 作业要求 具体要求 1.在文章开头给出教学班级和可克隆的 GitHub 项目地址(例子如下).(1') 教学班级 005 项目地址 GitHub 2. ...

  3. [2017BUAA软工]结对项目

    软工结对项目 一. Github项目地址 https://github.com/crvz6182/sudoku_partner 二. PSP表格 Psp personal software progr ...

  4. 福大软工 · 第十一次作业 - Alpha 事后诸葛亮(团队)

    福大软工·第十一次作业-Alpha事后诸葛亮 组长博客链接 本次作业博客链接 项目Postmortem 模板 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描 ...

  5. 软工 · 第十一次作业 - Alpha 事后诸葛亮(团队)

    软工 · 第十一次作业 - Alpha 事后诸葛亮(团队) 组长本次作业链接 现代软件工程 项目Postmortem 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场 ...

  6. 福大软工·第十一次作业-Alpha事后诸葛亮

    福大软工·第十一次作业-Alpha事后诸葛亮 组长博客链接 本次作业博客链接 项目Postmortem 模板 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描 ...

  7. 软工网络15团队作业4——Alpha阶段敏捷冲刺8.0

    软工网络15团队作业4--Alpha阶段敏捷冲刺8.0 1.每天举行站立式会议,提供当天站立式会议照片一张. 2.项目每个成员的昨天进展.存在问题.今天安排. 2.1 任务完成安排: 成员 昨日已完成 ...

  8. 【软工】个人项目作业——个人软件流程(PSP)

    [软工]个人项目作业--个人软件流程(PSP) 项目 内容 班级:北航2020春软件工程 006班(罗杰.任健 周五) 博客园班级博客 作业:设计程序求几何对象的交点集合 个人项目作业 个人课程目标 ...

  9. 软工网络15团队作业4——Alpha阶段敏捷冲刺2.0

    软工网络15团队作业4--Alpha阶段敏捷冲刺2.0 1.提供当天站立式会议照片一张. 2.每个人的工作 成员 昨天已完成 今天计划完成 郭炜埕 熟悉微信web开发者工具 完成新建话题界面的设计 郑 ...

随机推荐

  1. python3 requests库学习笔记(MOOC网)

    奏:HTTP协议对资源的操作 方法说明:GET 请求获取URL位置的资源HEAD 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息POST 请求向URL位置的资源后附加新的数据PUT 请求 ...

  2. mysql中关于--login-path使用

    在控制台登陆数据库,快捷登录 在控制台连接数据库,需要每次输入账号密码,感觉很麻烦,偶然发现可以通过login-path保存信息,实现快捷登录,这里记录下. 保存账号信息 mysql_config_e ...

  3. Ansible--06 ansible roles

    Ansible roles roles不管是Ansible还是saltstack,我在写一键部署的时候,都不可能把所有的步骤全部写入到一个'剧本'文件当中,我们肯定需要把不同的工作模块,拆分开来,解耦 ...

  4. element el-table 合计在横拉滚动条的下面,正确展示应该是滚动条在合计下面

    <style lang="less"> .el-table{ overflow: auto; } .el-table .el-table__body-wrapper, ...

  5. Laravel 事务中使用悲观锁

    laravel 提供了方便快捷的数据库事务使用方式,在使用中遇到过几个容易混淆和被误导的地方,这里做个记录,希望哪里写的不对的地方各位大神指点一下 laravel 事务分为手动方式和自动方式. 但如果 ...

  6. JavaSE---IO体系

    1.BIO 1.1 Block IO,同步阻塞IO: 1.2 eg:java.io   包下的      InputStream . OutputStream.  Writer.Reader... j ...

  7. Delphi DBGrid 实现复选框

    1 在数据库对应的表中加入  bit 列验证是否被选中 然后dbgrid第一列的filedname是bit列 在DBgrid的onDrawColumnCell事件中写: procedure DBGri ...

  8. chroot()使用

    好多的程序,都有使用chroot来是程序chroot到一个目录下面,来保护文件系统,今天在看snort代码的时候,看到了实现,就贴出一个测试程序来,实际上是比较简单的.    chroot()在lin ...

  9. jq实现跟随鼠标点击移动的下划线效果

    效果如下: 1.html代码: <div class="center-left-tap"> <a href="javascript:void (0)&q ...

  10. 前端每日实战:73# 视频演示如何用纯 CSS 创作一只卡通狐狸

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/OEKZed 可交互视频 此视频是可 ...