问题重述与分析
问题重述
最终的黄金点比赛会进行10000轮。每轮比赛中共有 $N$ 位玩家参与,每个玩家要在 5s 内提交两个数,系统会将所有数作平均并乘0.618得到一个黄金点。提交数字最接近黄金点的玩家得 N 分,距离最远的 -2 分,其余玩家得分不变。目标是让累计得分尽量高。
问题分析
我们认为策略驱动模型更适合这个任务,而不是数据驱动。即根据历史数据从若干个给定策略中挑选一个作为回答,而不是直接去回归黄金点。比起直接回归策略,策略驱动的方法 action 空间更小,学习起来要简单一些。而至于用于策略选择的模型,我们尝试采用了 DQN(虽然两人都没怎么接触过,但这不失为一次学习的机会)。
Bot 算法设计
算法描述
我们的 Bot 是基于老师给的 RLDemo 修改的。
Action 空间 RLDemo 中给定了 8 个 action,其中前七个都是根据固定策略生成两个相同的数。我们觉得这样做有些“浪费”,因为若可以提交两个数,提交两个不同的数要更保险一些。我们便将前七个策略两两组合,再加上第八个策略,构成了一个大小为 C(7, 2) + 1 = 22
的 Action 空间。
State 我们简单地采用前十个黄金点组成的 10 维向量作为 State。
我们设计了一个简单的三层网络作为 DQN 的模型
class DQN(nn.Module): def __init__(self, state_size, action_size, mid_dim=128): super().__init__() self.net = nn.Sequential( nn.Linear(state_size, mid_dim), nn.ReLU(inplace=True), nn.Linear(mid_dim, mid_dim), nn.ReLU(inplace=True), nn.Linear(mid_dim, action_size) ) def forward(self, x): return self.net(x)
一个 DQN
实例 model
即对应着 Q-learning 中的 Q-Table。model(state)[action_id]
即可得到状态为 state
,策略为 action_id
的 Q 值。
我们采用在线的方式训练模型。在前期数据量不足时,我们使用随机选取 Action 的策略;当数据量丰富后,我们以一定的概率决定应该采用 DQN 还是随机选取策略。若使用 DQN,我们会先从历史数据中选取一个 batch 对 DQN 做一次训练,再 eval DQN 得到预测的策略。
流程图
动机
其实我们并没有特别明确的动机,一方面我们需要一个较大的策略空间,另一方面我们需要一个不算太简单的策略选择机制。以上的模型是我们尝试的结果。