DQN的第一次尝试 -- 软工结对编程第一次作业
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:
- 使用上一轮的黄金点
- 使用上两轮黄金点的平均
- 使用前三轮黄金点的平均
- 使用周期为2的黄金点的平均
- 使用周期为3的黄金点的平均
- 使用最大的三个黄金点的平均
- 使用最小的三个黄金点的平均
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选择:
回答一下问题
- 我们其实没什么预期。。。第一轮有些失望,第二轮其实是超出了我们的预期的
- 比赛前,我们与其他选手进行了比赛,以及房间的ai进行了比赛,由此衡量模型的好坏
- 人数的多少并不影响我们方法的使用,但是效果是否会变好或者变差应该需要试验评估
- 我的队友真的是一个非常负责的队友,我本人其实在任务期间有mentor布置的工作要做,就很忙。很多时候事件的协调,debug等都是由我的队友负责的,非常感谢,而且最后队友提出的建议也在很大程度上改善了模型的效果!如果非要说什么不足的话,函数可以写短一点hhh, 主要是函数太长了hhh,debug比较麻烦。但是总体来说是非常好的,合作非常愉快~
DQN的第一次尝试 -- 软工结对编程第一次作业的更多相关文章
- 这就是小学生也会用的四则计算练习APP吗?- by软工结对编程项目作业
结对编程项目 软件工程 这就是链接 作业要求 这就是链接 作业目标 熟悉在未结对情况下如何结对开发项目 Github与合作者 合作者(学号): 区德明:318005422 虚左以待 Github链接: ...
- 2020BUAA 软工-结对作业
结对作业 项目 内容 北航2020软工 班级博客 作业要求 具体要求 1.在文章开头给出教学班级和可克隆的 GitHub 项目地址(例子如下).(1') 教学班级 005 项目地址 GitHub 2. ...
- [2017BUAA软工]结对项目
软工结对项目 一. Github项目地址 https://github.com/crvz6182/sudoku_partner 二. PSP表格 Psp personal software progr ...
- 福大软工 · 第十一次作业 - Alpha 事后诸葛亮(团队)
福大软工·第十一次作业-Alpha事后诸葛亮 组长博客链接 本次作业博客链接 项目Postmortem 模板 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描 ...
- 软工 · 第十一次作业 - Alpha 事后诸葛亮(团队)
软工 · 第十一次作业 - Alpha 事后诸葛亮(团队) 组长本次作业链接 现代软件工程 项目Postmortem 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场 ...
- 福大软工·第十一次作业-Alpha事后诸葛亮
福大软工·第十一次作业-Alpha事后诸葛亮 组长博客链接 本次作业博客链接 项目Postmortem 模板 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描 ...
- 软工网络15团队作业4——Alpha阶段敏捷冲刺8.0
软工网络15团队作业4--Alpha阶段敏捷冲刺8.0 1.每天举行站立式会议,提供当天站立式会议照片一张. 2.项目每个成员的昨天进展.存在问题.今天安排. 2.1 任务完成安排: 成员 昨日已完成 ...
- 【软工】个人项目作业——个人软件流程(PSP)
[软工]个人项目作业--个人软件流程(PSP) 项目 内容 班级:北航2020春软件工程 006班(罗杰.任健 周五) 博客园班级博客 作业:设计程序求几何对象的交点集合 个人项目作业 个人课程目标 ...
- 软工网络15团队作业4——Alpha阶段敏捷冲刺2.0
软工网络15团队作业4--Alpha阶段敏捷冲刺2.0 1.提供当天站立式会议照片一张. 2.每个人的工作 成员 昨天已完成 今天计划完成 郭炜埕 熟悉微信web开发者工具 完成新建话题界面的设计 郑 ...
随机推荐
- 查看linux 用户登录信息及ip
查看可疑IP登陆 last -f /var/log/wtmp cat /var/log/secure 寻找可疑ip登陆次数及信息 who 查看当前登陆用户 -h 忽略头文件信息 -u 显示结 ...
- 有趣的taskset命令,使进程再指定CPU上运行
前言 taskset命令,用于进程的CPU调优,可以把某进程,指定再某CPU内工作. 如还不明白,可以参考此文 http://www.361way.com/linux-context-switch/5 ...
- Spring 2.5配置文件详解(转)
http://book.51cto.com/art/201004/193743.htm 6.2.3 Spring 2.5配置文件详解 Spring配置文件是用于指导Spring工厂进行Bean生产. ...
- C语言小笔记(1)
枚举类型的大小是4,和一个int整形大小一样 就是最后一个逗号后面的表达式的值,比如: int a=1,b; b=(a+1,a+2,a+3); 那么b的值就是a+3,也就是4 函数名 :print ...
- 微信JS-SDK接口上传图片以及wx.config的配置
最近做的微信网页要实现一个上传图片的功能,倒腾了半天终于搞好了,具体的步骤可以查看微信官方文档https://developers.weixin.qq.com/doc/offiaccount/OA_W ...
- Python--MySql(主键的创建方式、存储引擎、存储过程、索引、pymsql)
主键的创建方式 1. create table stud( id int not null unique, name ) ); mysql> desc stud; +-------+------ ...
- apue 第10章 信号signal
每种信号都有名字,都是以SIG开头 信号机制最简单的接口是signal函数 #include <signal.h> typedef void (*sighandler_t)(int); s ...
- QT树莓派交叉编译开发环境搭建
QT树莓派交叉编译开发环境搭建 - JerryZone <Cross-compiling Qt Embedded 5.5 for Raspberry Pi 2> <Qt for Em ...
- 自动化测试之CSS定位
之前做自动化测试一直用RF框架来操作,发现了明显与unittest的灵活性相差一点. 重新温习了unittest框架,其中这个框架,元素定位是难点,以前更多的使用JQUERY方式定位, 发现其实与CS ...
- MySQL replace 和 replace into 的用法
mysql replace实例说明: UPDATE tb1 SET f1=REPLACE(f1, 'abc', 'def'); REPLACE(str,from_str,to_str) 在字符串 st ...