问题定义

具体规则见:讲义。大致规则如下:

N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。

难点分析

  1. 环境未知。“黄金点”游戏作为对战类游戏,游戏规则本身较简单。因此,游戏的局面很大程度上取决于其它选手的策略、可预测性较弱,而不像围棋、象棋等游戏中,游戏的局面和发展很大程度受到规则约束,因此可预测性较强。这导致游戏中“最优策略”也很大程度上取决于其它选手的策略,因而pretrain的模型效果不令人满意,甚至有时比从头开始训练的模型效果更差。
  2. 数据缺乏。由于第一点,我们以及大部分队伍都选择比赛过程中从头开始训练模型。然而,比赛过程中一轮比赛只能获取一个新数据,数据量太少不利于模型收敛。另外,写代码、调参过程中,使用server与他人对战时每个数据需要至少3s,也较难有效调参。
  3. 奖励稀疏。这是许多RL问题的共有问题。在本游戏中,大部分情况下的奖励都是0,不利于模型学习。

另外,个人对游戏本身有一点小小的怀疑:许多RL游戏的规则本身就能让人联想到可能的“最佳策略”,但是这个游戏的规则让我感觉随机性太大,作为人我感到一头雾水。即使我自己是RL agent,可能也难以学到比胡乱猜测更好的策略,或者可能需要对其它选手的策略进行一定程度的分析才能选择较好的策略。虽然比赛结果显示确实有的队伍得分很高,这个游戏本身是否真的存在一个“最佳策略”?我个人不太确定。(当然这并不影响RL学习,只是个人觉得游戏有些古怪。)

方法建模

核心算法

我们使用q-learning。该算法维护一个q表,记录在某个外界状态\(s\)下,执行某动作\(a\)预期得到的奖励\(Q(s, a)\)。一旦有了足够贴近现实的q表,在每个状态\(s\)下,可以选择动作\(a^* = \arg \max_a Q(s, a)\),从而最大化预期的奖励。

实际操作中,由于q表未知,需要从环境中进行学习。具体而言,模型随机初始化一个q表,通过在不同状态下尝试不同动作、观察奖励回馈,模型逐步修正q表的估计,使之更接近现实,更能指导模型动作。流程图如下:

本次作业中,我们增加了一些更合理的action;为了解决难点中的2.,我们构造了更多可供学习的数据。具体细节见 具体实现 部分。

使用动机

由于难点分析中的1. 2.,我们认为需要train from scratch,因而数据量匮乏是一个很严重的问题。因此,我们认为不适合采用参数较多、较难收敛的神经网络模型,而应该是用最简单的q learning。

由于q learning不考虑状态、动作之间的相关性,而是为每个\((s, a)\)单独保存一个q值,因此状态空间或动作空间太大会导致模型难以收敛。因此,我们控制了状态空间和动作空间的大小,只手工设计了一些较为有用的策略作为动作。

具体实现

  1. action改进。对于demo中已有的action,我们更改了action输出的初始值,使之更接近统计数据中常见的初始值;对于需要两个数字输入的情况,原始的很多action输出的两个数字相同,不利于得分,因此我们在第二个数字中引入一些随机性;另外,我们引入了一些新的action,其在黄金点经常出现的特定范围内输出随机数,或输出一个大数扰动。
  2. 构造数据。由于服务器的api提供上一局中所有人的提交数字,因此我们在训练过程中,可以构造“假如上一局中我采纳了另一个策略,得到的reward会是怎样”的数据,从而将数据量扩展\(n_a\)倍,其中\(n_a\)为动作的个数。

结果分析

在第一局中,我们为第6名。在两局中间,我们根据黄金点走向数据对action的取值范围等进行了微调,取得了一定的效果,在第二局中获得第4名。

反思总结

  1. 黄金点比赛的结果符合你们的预期吗?

    第一局游戏结果较差,但我们采取改进之后略有提升。整体而言,我们的bot效果不算突出,主要原因可能在于状态设计过于简单:我们用最后10轮中黄金点下降、上升的次数作为状态,难以完整描绘目前局势状况。另外,我们了解到成绩较好的组采用了DQN,可能说明q-learning的学习能力仍然有限。

  2. 在正式的比赛前,你们采取了怎样的策略来评价模型的好坏?

    我们在room0、room1中运行bot,参与竞赛,评估模型效果。后来,由于room0、room1速度实在太慢,我们加入了一些其他同学建立的房间评估效果。另外,我们记录bot每轮reward,观察bot学习曲线等,评估bot学习能力。

  3. 如果将每轮可提交的数字变成 3个,或者找更多的参赛者来参加比赛,你们的方法还适用吗?

    对于三个数字,q-learning可能适用,但需要分析数据、设计更适合提交三个数字的策略。如果action space太大,可能需要考虑action之间关系的q表建模方法。

    对于更多的参赛者,方法仍然适用。

  4. 请评价合作伙伴的工作,评价方式请参考书中关于三明治方法的论述。并提出结对伙伴可以改进的地方。

    我的合作伙伴是魏天心和吴紫薇和吴雪晴同学,两个同学都很优秀,为我们的项目作出了很多贡献。

    魏天心同学对RL很了解,很快地分析了问题、提出了可行的解决方案,并且积极地写代码、进行调试。

    吴紫薇同学对数据进行了分析和相应的改进,也贡献了很多代码。

    另外,由于我们在国外暑研,不在国内、和国内同学与助教交流有限;而且暑研期间各自有各自的工作,项目的ddl正好在我们暑研结束回国的时间附近,因此ddl前我们有的人刚回国正在倒时差、有的人还在忙暑研收尾、有的人马上要上飞机,因此整体时间比较缺乏。队友们都非常优秀,这样的结果我觉得也能够心满意足了。

【ASE高级软件工程】第一次结对作业的更多相关文章

  1. ASE高级软件工程 第一次结对作业

    黄金点游戏Bot Bot8前来报道 1.问题定义 a) 问题描述 N个玩家,每人写一个0~100之间的有理数 (不包括0或100),提交给服务器,服务器在当前回合结束时算出所有数字的平均值,然后乘以0 ...

  2. ASE——第一次结对作业

    ASE--第一次结对作业 问题定义 很早就听说了MSRA的黄金点游戏,让大家写Bot来参加比赛看谁的AI比较聪明可以操盘割韭菜.深感ASE课程老师设计的任务太用心了,各种接口都准备好了,大家只用专注于 ...

  3. [BUAA软工]第一次结对作业

    [BUAA软工]结对作业 本次作业所属课程: 2019BUAA软件工程 本次作业要求: 结对项目 我在本课程的目标: 熟悉结对合作,为团队合作打下基础 本次作业的帮助:理解一个c++ 项目的开发历程 ...

  4. 【ASE高级软件工程】第二次结对作业

    重现baseline 我们选择重现CODEnn模型(论文:Deep Code Search),因为它结构简单.端到端可训练,且相比其它方法拥有较高的性能. Baseline原理 为了根据给定的quer ...

  5. ASE高级软件工程 第一周博客作业

    1.自我介绍 我叫姚顺,是来自哈尔滨工业大学计算机学院的一名大四本科生,专业方向计算机科学,目前在KC组实习.平时的业余时间主要用来打篮球,听音乐,跑步,当然还有游戏(划掉).之前的大学三年主要用来做 ...

  6. ASE —— 第一次结对作业

    问题定义 游戏规则: N个玩家,每人写一个或两个0~100之间的有理数 (不包括0或100),提交给服务器,服务器在当前回合结束时算出所有数字的平均值,然后乘以0.618,得到G值. 提交的数字最靠近 ...

  7. 高级软件工程第二次作业:随机生成N个不重复的已解答完毕的数独棋盘

    #include <stdio.h> #include "SuduCheck.h" ][],int i,int j,int k) //判断是否可以将第i行.第j列的数设 ...

  8. 【ASE高级软件工程】Alpha 阶段 backend组 scrum1 记录

    本次会议于11月4日,19:10 在微软北京西二号楼13478召开,持续40分钟. 与会人员:Haifeng Chen, Zhikai Chen, Hao Wang, Jia Ning 请假: Xin ...

  9. 【BUAA软件工程】第一次阅读作业

    BUAA软件工程 第一次阅读作业 项目 内容 这个作业属于哪个课程? 北航软工 这个作业的要求在哪里? 第一次个人作业 我在这个课程的目标是? 学习高效严谨的软件工程开发过程,建立团队意识 这个作业在 ...

随机推荐

  1. Java中遍历Map的四种方式

    Demo如下 Map<String, String> map = new HashMap<>(); map.put("key1","data1&q ...

  2. springmvc 参数解析绑定原理

    handlerMethodArgumentResolver:方法参数解析器接口,这个接口是springmvc参数解析绑定的核心接口.不同的参数类型绑定都是通过实行这个接口来实现.也可以通过实现这个接口 ...

  3. NET中的规范标准注释-- XML注释标签讲解

    一.摘要 .Net允许开发人员在源代码中插入XML注释,这在多人协作开发的时候显得特别有用. C#解析器可以把代码文件中的这些XML标记提取出来,并作进一步的处理为外部文档. 这篇文章将展示如何使用这 ...

  4. spring的控制器如何获取参数

    1.控制器代码 获取参数的注解 @RequestParam(name="name", required=false, defaultValue="World") ...

  5. 你必须知道的495个c语言问题(笔记)

    1.1我该如何决定使用哪种整数类型? 用到较大的数用long:空间很重要(例如有很大的数组或很多的结构)用short:此外用int. win32: int 32bit    4byte char 8b ...

  6. Qt全局坐标和相对坐标

    QMouseEvent中两类坐标系统,一类是窗口坐标,一类是显示器坐标. QPoint QMouseEvent::pos() 返回相对这个widget(重载了QMouseEvent的widget)的位 ...

  7. 冲刺Noip2017模拟赛5 解题报告——五十岚芒果酱

    1. 公约数(gcd) [问题描述] 给定一个正整数,在[,n]的范围内,求出有多少个无序数对(a,b)满足 gcd(a,b)=a xor b. [输入格式] 输入共一行,一个正整数n. [输出格式] ...

  8. ssh速度慢

    原因:DNS解析默认开了 解决方法: vi /etc/ssh/sshd_config, 将#UseDNS yes 改为 : UseDNS no 然后重启ssh服务即可.   PS: 其实不好,因为毕竟 ...

  9. 《你必须知道的495个C语言问题》读书笔记之第8-10章:字符串、布尔类型和预处理器

    一.字符和字符串 1. Q:为什么strcat(string, '!')不行? A:strcat()用于拼接字符串,所以应该写成strcat(string, "!")." ...

  10. Oracle的查询-自连接概念和联系

    查询出员工姓名,员工领导姓名 select e1.ename,e2.ename from emp e1,emp e2 where e1.mgr = e2.empno; 结果 自连接:站在不同角度把一张 ...