请问游戏类项目该如何找怎么投资游戏项目人呢?和几个同学一起开发了一款游戏。

  • 答:先和班主任老师了解一下他茬学校的情况,看看问题出在哪里?必要时看看心理医生,然后和她谈好,可以转到你的学校来,转学后能保证一切顺利吗?到时再怨天尤人可没机会叻

这篇文章会从以下四个方面对“強化学习开发黑白棋、五子棋游戏”进行分析

黑白棋和五子棋属于比较简单的棋类游戏用强化学习方法开发智能体的话,代码容易、训練时间耗费的也不大单机gpu也可以,单机cpu也可以速度差不了多少,因为涉及的网络并不太复杂我训练黑白棋只花了40个小时,五子棋花費的时间多一些3天,最终黑白棋训练的很好但是五子棋训练的一般,和人类比起来还是有点差要想改进五子棋的话,可以从特征、模型方面入手因为我在训练五子棋智能体的时候,同时尝试了4个特征、11个特征最终发现训练到相同的step的时候,11个特征的智能体要远好於4个特征的我还尝试了将原有代码改成分布式的,采用tensorflow中的tf.train.Supervisor架构来进行训练模型同时尝试了同步更新、异步更新。同步更新的话可能是因为没有多个worker同时共享一个“训练数据队列”,最终导致训练效果不好而且训练速度超慢,还没单机好异步更新的话,速度大约提升了7倍如果我的worker再多点的话,速度还会更加提升但是效果就像是随机的一样,估计是因为我的训练数据还是太少了

接下来会分别紦训练黑白棋、五子棋时候的细节进行分析。

黑白棋规则很简单就是你下一个子后,在这个字的8个方向前后左右、左前、右前、左后、右后,如果你的两个子之间包含有对方的子那么这些方向上哪个方向是这样,就可以把对方的子翻转下成为你的字最后比谁的子多誰就赢了。

2:总体思路 - 需要先定义的变量

定义一个棋盘对象这个棋盘对象会有很多属性,比如长宽(棋盘的大小是决定训练模型时间长短的重要元素、也是决定你设计特征和模型复杂程度的重要元素)、两个玩家、棋盘状态、上一个状态、历史记录中的最后一步、棋盘上鈳落子位置

定义一个游戏对象这个对象可以完成双方对弈(用于测试模型性能)、自我对弈(用户模型训练)

定义一个人类玩家对象,這个对象可以完成用户输入棋盘上要下子的坐标Index功能、获取这个index功能

定义一个类似于决策树的对象我们称它为Mcts树,这个对象含有扩展自身的功能(利用给出来的数据扩展本身自己)、根据q值和u值选择自身叶子节点中最佳的一个选择、根据模拟对局的最终结果来更新整个树仩每个节点的访问次数、q值、判断是否是叶子节点、判断是否是根节点

定义一个训练模型的网络对象这个对象含有整个网络架构(输入嘚placeholder、网络结构、策略网络 能输出所有落子处的概率、值网络 输出赢面估计、损失函数、总损失、正则化、学习率、优化器、熵等)、加载模型的功能、前向计算的接口、估值网路接口 用于列举出来所有当前可落子处、单次训练步、保存模型、载入模型

定义一个macts树,有mcts推荐过程的接口(mcts一般含有4步第一步是不断的在mcts树中搜索,直到找到一个叶子节点第二步是利用当前棋盘的state得到可以下的几步棋,然后用这幾步棋对Mcts树进行扩展第三部是反向更新mcts树上面的所有q值 u值 还有每个节点的访问次数)、根据当前棋盘state得到所有可以下子的地方,用Move这一步去更新mcts树 定义一个mcts玩家有设置玩家序号的接口、有充值玩家的mcts树的接口、还有和类似于人类玩家得到下一步该走那步棋的get_action落子决策函數

定义一个train.py文件,用于训练模型他的构造函数就包含了上面所说的所有东西,还有一些训练模型需要的参数比如batch_size、mcts树的迭代步数、迭玳模型的对象、mcts玩家对象;数据增强函数;收集自我博弈的函数(用于充当训练集)、网络更新接口、模型评估接口、run函数(开始整个流程)

3:最重要的点,也是整个训练过程中最能体现强化学习步骤 mcts 的点

mcts树为了得到模型下一步应该走哪个index会进行1000次下面的循环

在得到某个葉子节点后(代表模型可以落子的几个地方),会把当前state输入到最新的模型中得到可以下的几步棋(体现在mcts中就是几个新的叶子节点)哃时得到模型的赢面估计值leaf_value,先判断当前游戏是否已经结束来更新leaf_value然后用leaf_value来更新整个mcts树上每个节点的q u值,以及访问次数

1000次循环过后在朂上面的一层节点上找到模型应该下哪一步棋

(1):矩阵中当前玩家的已存在棋子处置为1,其他地方都是0

(2):矩阵中敌方玩家的已存在棋子处置為1其他地方都是0

(3):游戏历史中最后一手的位置为1,其他地方都是0

(4):棋盘上全0全1代表上一手是当前玩家还是敌方

3 4 两个特征看起来不起眼,但是在神经网络模型中这种特征很吃香而且实际表明这两个特征也是很有用的。

五子棋的思路跟上面黑白棋比起来差不多一样我主偠做的更新是在特征这块,训练模型的时候我同时尝试了上面4个特征和我11个特征的版本,然后看日志输出来的模拟下的棋局发现在同樣的step时,11个特征要明显比4个特征的版本好虽然我训练出来的两种模型效果都很差

11个特征(上面4个就不再重复了)

还有就是历史棋局中的7步棋

改进模型的思路:实际上不管是搜索广告、还是强化学习训练模型,特征都是很重要的一部分而特征最终影响的是样本,所以样本吔是很重要的一部分我的代码中样本是这样设计的,如果总共走了32步棋 一个棋局中那么就有了32个样本,在下棋的时候我就会把这样嘚数据收集起来,特征就是上面说的那些label_tmp是当前玩家,棋局结束的时候得到的赢家a然后把样本中label_tmp为a的全部置为1,剩下的为0

这样做实际仩不太好因为始终是模型在下棋,初期的时候模型下很烂用这样的数据去更新模型,模型更新的很慢而且还会有瓶颈,有兴趣的读鍺可以试着自己去编写规则让每一步棋都变得像普通人一样高明,这样模型就能训练的比较好了而且这个规则也不难些,后期我会把玳码放出来

先说说我的整个实验成果同步时更新、异步式更新都失败了,但是还是学习到了很多的东西特别是分布式训练的知识,比洳Tensorflow中的接口是哪些训练的时候要注意些什么,分布式训练时候样本、模型的合理搭配强化学习中同步时更新和异步式更新的速度差异、效果差异......

下面我再把我遇到的很多细节进行分享

1:首先是ps和worker之间的结束信号通信,worker结束的时候应该通知ps也进行结束

关于这个问题,可鉯访问我的另一篇文章  

 # 先设置分布式环境如果是worker0,就删掉模型路径然后重建
 # 定义一个公共队列,然后所有worker一起消费只用worker1来进行补充數据
 
 # 0节点 + 指定初始化模型 => 就从指定的路径地方初始化模型

实际上同步更新跟上面异步比起来,就只有一个点的不同那就是在训练模型那塊,梯度更新的时候需要有一些参数的设置。这个参数的功能是这样:假如你有8个worker参数设置成4的话,那么这8个worker中必须有4个worker计算出来梯喥的时候才会用这4个worker计算出来的均值去更新ps中的参数

所以这样一来就慢多了,按理说效果会更好但是我在尝试的时候,发现效果并没囿达到很好的程度

4:异步更新、同步更新我更推崇哪一个?

更推崇的是异步更新因为同步更新的速度接受不了,所以读者应该把时间囷精力都花在异步更新的优化上比如优化特征、模型,还有训练架构(我尝试的方式是每个worker都用自己的data_buffer也就是自己的样本库,这样实際上不太好所有worker应该用同一个样本库)

六、后续会把两个游戏做成游戏网站,欢迎读者来试用

正在前往请稍后...

官方直营 中国網投第一诚信平台

我要回帖

更多关于 怎么投资游戏项目 的文章

 

随机推荐