问题定义

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

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. Qt编写自定义控件26-平铺背景控件

    一.前言 平铺背景控件,主要的应用场景是作为画布出现,黑白相间的背景图,然后上面可以放置图片图形等,使得看起来更美观,比如PS软件新建图层以后的背景,FireWorks软件新建画布以后的透明背景,IC ...

  2. windows10下idea快捷键文件

    没详细测试. https://my.oschina.net/superwen/blog/833482 |快捷键|英文说明|说明|冲突 |---|---|--| |Ctrl + Shift + F||根 ...

  3. 关于Python正则表达式findall函数问题详解

    关于Python正则表达式 findall函数问题详解 在写正则表达式的时候总会遇到不少的问题, 特别是在表达式有多个元组的时候.下面看下re模块下的findall()函数和多个表达式元组相遇的时候会 ...

  4. PyTorch载入图片后ToTensor解读(含PIL和OpenCV读取图片对比)

    概述 PyTorch在做一般的深度学习图像处理任务时,先使用dataset类和dataloader类读入图片,在读入的时候需要做transform变换,其中transform一般都需要ToTensor ...

  5. 【ARTS】01_26_左耳听风-201900506~201900512

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  6. BP神经网络算法预测销量高低

    理论以前写过:https://www.cnblogs.com/fangxiaoqi/p/11306545.html,这里根据天气.是否周末.有无促销的情况,来预测销量情况. function [ ma ...

  7. ubuntu下删除带锁文件夹

    1.终端下,cd 到要删带锁文件夹所在目录 2.输入 + 带锁文件夹名称 输入用户密码,解锁成功 3.现在该文件可以进行移动或者删除

  8. Windows 10 下如何彻底关闭 Hyper-V 服务

    以管理员身份运行命令提示符 执行命令 bcdedit /set hypervisorlaunchtype off 重启,运行vm即可. 如果想要恢复hyper启动 bcdedit / set hype ...

  9. Linux 之 awk文本分析工具

    AWK是一种处理文本文件的语言,是一个强大的文本分析工具.Linux环境中自带. awk调用方法 命令行 awk [-F field-separator] 'commands' input-file( ...

  10. 深入理解java:5. Java分布式架构

    什么是分布式架构 分布式系统(distributed system)是建立在网络之上的软件系统. 内聚性是指每一个数据库分布节点高度自治,有本地的数据库管理系统. 透明性是指每一个数据库分布节点对用户 ...