问题定义

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

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前我们有的人刚回国正在倒时差、有的人还在忙暑研收尾、有的人马上要上飞机,因此整体时间比较缺乏。队友们都非常优秀,这样的结果我觉得也能够心满意足了。

最新文章

  1. 有关Javascript的length()函数
  2. MySQL: LEAVE Statement
  3. 动态规划 - 最长递增子序列(LIS)
  4. MyEclipse------PreparedStatement使用方法
  5. Python自然语言工具包(NLTK)入门
  6. mysql三个应用场景
  7. OpenSSL---堆栈
  8. 「设计模式」JavaScript - 设计模式之单例模式与场景实践
  9. JavaScript(第十天)【Function类型】
  10. 【NOIP2012TG】solution
  11. android的消息通知栏
  12. word20170104办签证 Visa application有用的词和句子
  13. java中的 java.util.concurrent.locks.ReentrantLock类的使用方式
  14. Django之Bootstrap使用
  15. 42 【docker】run命令
  16. PLSQL 使用ODBC 数据源导入来自SQLSERVER的数据
  17. Linux 用户管理【UID和GID】
  18. powerdesigner 使用
  19. PhoneGap安装配置
  20. babun安装,整合到cmder

热门文章

  1. 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_9.RabbitMQ研究-工作模式-发布订阅模式-消费者
  2. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_09-freemarker基础-内建函数
  3. java使用新的(nio)遍历文件(支持文件后缀名、文件名正则表达式匹配)
  4. webdriver(chrome无头浏览器)
  5. 同一个ip,不同端口号,cookie会被覆盖
  6. python解析jSON文件
  7. Reactor系列(九)collect集合
  8. [转帖]电源ac和dc有什么区别_dc ac分别代表什么
  9. 请给出一个Scala RDD的HelloWorld例子
  10. [HihoCoder-1424] Asa's Chess Problem