【ASE高级软件工程】第一次结对作业
问题定义
具体规则见:讲义。大致规则如下:
N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。
难点分析:
- 环境未知。“黄金点”游戏作为对战类游戏,游戏规则本身较简单。因此,游戏的局面很大程度上取决于其它选手的策略、可预测性较弱,而不像围棋、象棋等游戏中,游戏的局面和发展很大程度受到规则约束,因此可预测性较强。这导致游戏中“最优策略”也很大程度上取决于其它选手的策略,因而pretrain的模型效果不令人满意,甚至有时比从头开始训练的模型效果更差。
- 数据缺乏。由于第一点,我们以及大部分队伍都选择比赛过程中从头开始训练模型。然而,比赛过程中一轮比赛只能获取一个新数据,数据量太少不利于模型收敛。另外,写代码、调参过程中,使用server与他人对战时每个数据需要至少3s,也较难有效调参。
- 奖励稀疏。这是许多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值,因此状态空间或动作空间太大会导致模型难以收敛。因此,我们控制了状态空间和动作空间的大小,只手工设计了一些较为有用的策略作为动作。
具体实现
- action改进。对于demo中已有的action,我们更改了action输出的初始值,使之更接近统计数据中常见的初始值;对于需要两个数字输入的情况,原始的很多action输出的两个数字相同,不利于得分,因此我们在第二个数字中引入一些随机性;另外,我们引入了一些新的action,其在黄金点经常出现的特定范围内输出随机数,或输出一个大数扰动。
- 构造数据。由于服务器的api提供上一局中所有人的提交数字,因此我们在训练过程中,可以构造“假如上一局中我采纳了另一个策略,得到的reward会是怎样”的数据,从而将数据量扩展\(n_a\)倍,其中\(n_a\)为动作的个数。
结果分析
在第一局中,我们为第6名。在两局中间,我们根据黄金点走向数据对action的取值范围等进行了微调,取得了一定的效果,在第二局中获得第4名。
反思总结
黄金点比赛的结果符合你们的预期吗?
第一局游戏结果较差,但我们采取改进之后略有提升。整体而言,我们的bot效果不算突出,主要原因可能在于状态设计过于简单:我们用最后10轮中黄金点下降、上升的次数作为状态,难以完整描绘目前局势状况。另外,我们了解到成绩较好的组采用了DQN,可能说明q-learning的学习能力仍然有限。
在正式的比赛前,你们采取了怎样的策略来评价模型的好坏?
我们在room0、room1中运行bot,参与竞赛,评估模型效果。后来,由于room0、room1速度实在太慢,我们加入了一些其他同学建立的房间评估效果。另外,我们记录bot每轮reward,观察bot学习曲线等,评估bot学习能力。
如果将每轮可提交的数字变成 3个,或者找更多的参赛者来参加比赛,你们的方法还适用吗?
对于三个数字,q-learning可能适用,但需要分析数据、设计更适合提交三个数字的策略。如果action space太大,可能需要考虑action之间关系的q表建模方法。
对于更多的参赛者,方法仍然适用。
请评价合作伙伴的工作,评价方式请参考书中关于三明治方法的论述。并提出结对伙伴可以改进的地方。
我的合作伙伴是魏天心和吴紫薇和吴雪晴同学,两个同学都很优秀,为我们的项目作出了很多贡献。
魏天心同学对RL很了解,很快地分析了问题、提出了可行的解决方案,并且积极地写代码、进行调试。
吴紫薇同学对数据进行了分析和相应的改进,也贡献了很多代码。
另外,由于我们在国外暑研,不在国内、和国内同学与助教交流有限;而且暑研期间各自有各自的工作,项目的ddl正好在我们暑研结束回国的时间附近,因此ddl前我们有的人刚回国正在倒时差、有的人还在忙暑研收尾、有的人马上要上飞机,因此整体时间比较缺乏。队友们都非常优秀,这样的结果我觉得也能够心满意足了。
【ASE高级软件工程】第一次结对作业的更多相关文章
- ASE高级软件工程 第一次结对作业
黄金点游戏Bot Bot8前来报道 1.问题定义 a) 问题描述 N个玩家,每人写一个0~100之间的有理数 (不包括0或100),提交给服务器,服务器在当前回合结束时算出所有数字的平均值,然后乘以0 ...
- ASE——第一次结对作业
ASE--第一次结对作业 问题定义 很早就听说了MSRA的黄金点游戏,让大家写Bot来参加比赛看谁的AI比较聪明可以操盘割韭菜.深感ASE课程老师设计的任务太用心了,各种接口都准备好了,大家只用专注于 ...
- [BUAA软工]第一次结对作业
[BUAA软工]结对作业 本次作业所属课程: 2019BUAA软件工程 本次作业要求: 结对项目 我在本课程的目标: 熟悉结对合作,为团队合作打下基础 本次作业的帮助:理解一个c++ 项目的开发历程 ...
- 【ASE高级软件工程】第二次结对作业
重现baseline 我们选择重现CODEnn模型(论文:Deep Code Search),因为它结构简单.端到端可训练,且相比其它方法拥有较高的性能. Baseline原理 为了根据给定的quer ...
- ASE高级软件工程 第一周博客作业
1.自我介绍 我叫姚顺,是来自哈尔滨工业大学计算机学院的一名大四本科生,专业方向计算机科学,目前在KC组实习.平时的业余时间主要用来打篮球,听音乐,跑步,当然还有游戏(划掉).之前的大学三年主要用来做 ...
- ASE —— 第一次结对作业
问题定义 游戏规则: N个玩家,每人写一个或两个0~100之间的有理数 (不包括0或100),提交给服务器,服务器在当前回合结束时算出所有数字的平均值,然后乘以0.618,得到G值. 提交的数字最靠近 ...
- 高级软件工程第二次作业:随机生成N个不重复的已解答完毕的数独棋盘
#include <stdio.h> #include "SuduCheck.h" ][],int i,int j,int k) //判断是否可以将第i行.第j列的数设 ...
- 【ASE高级软件工程】Alpha 阶段 backend组 scrum1 记录
本次会议于11月4日,19:10 在微软北京西二号楼13478召开,持续40分钟. 与会人员:Haifeng Chen, Zhikai Chen, Hao Wang, Jia Ning 请假: Xin ...
- 【BUAA软件工程】第一次阅读作业
BUAA软件工程 第一次阅读作业 项目 内容 这个作业属于哪个课程? 北航软工 这个作业的要求在哪里? 第一次个人作业 我在这个课程的目标是? 学习高效严谨的软件工程开发过程,建立团队意识 这个作业在 ...
随机推荐
- android ONVIF 组播探测在线摄像机
http://blog.csdn.net/ghostyu/article/details/8182516 Android的Wifi,默认情况下是不接受组播的,见:http://developer.an ...
- ckpt convert to pb
import tensorflow as tf #from create_tf_record import * from tensorflow.python.framework import grap ...
- iptables之精髓(一)
防火墙相关概念 从逻辑上讲.防火墙可以大体分为主机防火墙和网络防火墙. 主机防火墙:针对于单个主机进行防护. 网络防火墙:往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网. ...
- 解决PLSQL Developer中的乱码问题
很多朋友在使用PLSQL Developer的时候出现了乱码的问题,我就是其中的一员,后来通过网上的查找以及自己的探索,终于找到了最快,最可靠的解决办法,接下来我将告诉大家如何操作 1.首先在PLSQ ...
- jenkins容器内修改root密码--ubuntu系统
http://www.voidcn.com/article/p-yvnoogkc-ng.html 由于jenkins官方镜像是ubuntu系统,所有啥的都用 sudo 换到root账号,然后登陆har ...
- Android之View的内容
View的事件体系 本章介绍View的事件分发和滑动冲突问题的解决方案. 3.1 view的基础知识 View的位置参数.MotionEvent和TouchSlop对象.VelocityTracker ...
- stm32第一章cortex-M3处理器概述
处理器特点 哈弗结构3级流水线内核 实现Thumb-2指令集,告别切换32位的arm指令和16位的Thumb指令,优化性能和代码密度 结合可配置的嵌套向量中段控制器Nvic,提供非屏蔽中断NMI和32 ...
- Python学习笔记——pickle 模块
由于从文本文件中读取出来的内容都会变成字符串,且转换成列表.字典等数据类型比较困难,因此采用pickle模块存储它们 import pickle my_list = [123,3.14,'小甲鱼',[ ...
- 浅谈>/dev/null 2>&1
在crond计划任务.nohup中我们经常可以看到>/dev/null 2>&1,但是很多人并不理解其含义,想要真正的理解它,首先我们需要知道文件描述符的三种类型. 类型 文件描述 ...
- 在linux下进行数据备份
一.完全备份 完全备份是指把所有需要备份的数据全部备份.当然,完全备份可以备份整块硬盘.整个分区或某个具体的目录.完全备份的好处是数据恢复方便,因为所有的数据都在同一个备份中,所以只要恢复完全备份,所 ...