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. 60.Median of Two Sorted Arrays(两个排序数组的中位数)

    Level:   Hard 题目描述: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find t ...

  2. elasticsearch 中的Multi Match Query

    在Elasticsearch全文检索中,我们用的比较多的就是Multi Match Query,其支持对多个字段进行匹配.Elasticsearch支持5种类型的Multi Match,我们一起来深入 ...

  3. SET SESSION AUTHORIZATION - 为当前会话设置会话用户标识符和当前用户标识符

    SYNOPSIS SET [ SESSION | LOCAL ] SESSION AUTHORIZATION username SET [ SESSION | LOCAL ] SESSION AUTH ...

  4. 5分钟搞定android混淆(转)

    转自:https://www.jianshu.com/p/f3455ecaa56e 前言 混淆是上线前挺重要的一个环节.android使用的ProGuard,可以起到压缩,混淆,预检,优化的作用.但是 ...

  5. spring boot poi 导出Excel

    public class ExcelData implements Serializable { private static final long serialVersionUID = 444401 ...

  6. firewall&iptables小记

    一.firewall 查看firewall状态 firewall-cmd --state 防火墙开启: 防火墙关闭: 如果firewall为关闭状态,先启动firewall systemctl sta ...

  7. 深度解析双十一背后的阿里云 Redis 服务

    摘要: Redis是一个使用范围很广的NOSQL数据库,阿里云Redis同时在公有云和阿里集团内部进行服务,本文介绍了阿里云Redis双11的一些业务场景:微淘社区之亿级关系链存储.天猫直播之评论商品 ...

  8. OC学习篇之---类的三大特性(封装,继承,多态)

    之前的一片文章介绍了OC中类的初始化方法和点语法的使用:http://blog.csdn.net/jiangwei0910410003/article/details/41683873,今天来继续学习 ...

  9. 【Linux】 Centos7 安装 mysql-8.0

    本文介绍使用rpm包安装mysql, 以 mysql-8.0.17-1.el7.x86_64.rpm-bundle.tar 为例: 1.下载 MySQL下载地址:https://dev.mysql.c ...

  10. git代码提交步骤

    常用的步骤: 1)假如本地想关联git仓库,那么先git  init,git remote add origin [git地址] 2)假如是想直接从git仓库拉下来,那么git clone [git地 ...