关于
其实我早在6月份时就试着训练一个能够游玩学习游戏《恶魔轮盘赌》(Buckshot Roulette)的策略的AI模型。但是当时并不是很懂机器学习,模型大到几十MB也不懂一点策略,反而现在在精心调整后,实现了仅仅不到200kb的模型就可以在先手对人类胜率达到70%,后手下维持在50%左右的能力。
这篇文章也只是记录一下此次强化学习训练过程的心得。
环境准备
Conda:Python 3.12.9 Pytorch+Cu13.0
框架:Gymnasium+SD3
算法:Dueling DQN
具体实现
状态设计
鉴于恶魔轮盘赌是一个离散化状态的,且游戏存在未知信息的一个决策型游戏。
所以选择了DQN算法来实现。
存储的state包括了所有游戏的透明信息(道具,血量等等)以及默认需要掌握的计算剩余实弹空弹的能力(直接提供)
同是,为了稳定性和收敛,我选择了对state进行归一化处理。
神经网络设计
- Shared Layers (共享层):2 层全连接 (Linear)。
- Input (21) -> 128 (ReLU)
- 128 -> 128 (ReLU)
- Dueling Split (分流层):
- Value Stream: 128 -> 64 (ReLU) -> 1
- Advantage Stream: 128 -> 64 (ReLU) -> 7 (Action Dim)
奖励函数设计
采用了基于当前实弹空弹的概率的期望奖励设计(避免刷分,并且学会概率状态的意义)
以及一些常规的操作奖惩,也添加了一些操作Combo的奖励
训练方案
编写好游戏进行的env后,我采取了自我对抗的训练方式,
这种方式可以很好的从头开始学习游戏策略,不需要设计初期的决策树对手,节省时间。
当然也存在缺点,初期策略不可控,可能点歪策略树
再就是自我对抗的奖励值很难收敛到一个正的值,而是上下乱跳(去除胜负导致的大增幅跌幅也许能解决),因为对手网络会同步迭代更新,不能做到必胜,而是逐渐变强。
再就是提到的,此游戏存在严重的先后手胜率差异,尽管随机的道具会尽可能弥补这一缺点,但是还是会存在差异。
于是,我们在训练时随机决定训练网络的先后手,成功地解决了这个问题,不仅提升了后手的胜率,也相应提升了先手的胜率。
结果
经过群友的测试,先手胜率达到了惊人的**65%**左右,但是在我进行游戏更新后,加入了更多的道具和操作,我发现AI的能力反而下降了
思考一番,我发现其实对于这种回合制的附加道具的决策性游戏,反而不太适合纯神经网络,更适合的应该是博弈树,甚至蒙特卡洛树
但是,在复杂情况下能和人类最后收敛到50%的平手胜率,我觉得已经很不错了。
那么最后训练和使用的代码我也会上传到我的Git仓库下。
部分信息可能已经过时








