项目问题
SRTP - 基于机器学习的零和博弈AI研究与实现:
设计思路
训练原理主要分为策略价值网络和蒙特卡洛树搜索。MCTS在策略价值网络的指导下进行模拟、自我对局。自我对局的数据又用来训练神经网络,来更好地预测走子策略和价值。以此循环,自我强化,构成了训练整个过程。
创新点
- 传统的棋类游戏都是基于开局库+终局库+人工局面评估函数+Alpha–beta 剪枝方案。但是我们的项目采用深度强化学习的策略,不引入象棋规则外的任何人类知识 (开局库, 人工局面评估函数), 从零开始训练出一个象棋模型。
- 分布式训练
集群分为master和slave,加入集群的机器均为slave,master和slave分工如下:
- slave : 负责自动从master拉取最新模型权重,完成自对弈,并且把棋谱自动上传到master
- master: 负责给slave提供权重,并且负责模型的更新,评估,以及从slave接收棋谱
用到的技术
训练:Tensorflow,Python
可视化:ECharts,Vue,BootStrap, Flask
可视化:
- 通过matplotlib可视化象棋棋谱
- 使用cbf格式的文件存储自对弈棋谱,cbf的文件格式可以被象棋桥软件读取,非常方便分析自对弈棋局
- 训练过程以Flask为后端,以Echarts和BootStrap为前端框架,在网页端可视化并实时展示
- 最终使用了ELO分数为2100的模型,做出了一个网页版的象棋游戏AI。
后续可能的改进
在分布式训练上可以引入Hadoop、Spark等分布式框架来方便管理数据。
碰到的重难点以及解决方案
算力不够
面对这个问题,有两种解决方法,第一是堆叠服务器提高算力。第二是提高代码效率。第一个方面,我们通过10台GTX1070显卡的机子组了一个分布式集群。其次我们也能通过一些提高效率的方法来缓解一些这个问题,比如:
- 使用 Rust 加速部分代码
- 使用多进程同时跑多个网络的前向
- 使用协程来将多个前向组成 batch,提高 GPU利用效率
- 使用协程的蒙特卡洛树算法,提速蒙特卡洛树的搜索速度,在这里使用了32个协程来异步进行Playout
- 使用多台机器分布式跑棋谱,利用更多GPU。这里的所谓“分布式”并不是指要把一个蒙特卡罗树跑到多台机器上,而仅仅是让多台机器分别产生棋谱,自动拉取最新的权重,然后自动推送棋谱到master。这是一个master-slave的经典分布式集群,因为单台机器即使装备了多块显卡,算力仍然不够。整体流程就是各个slave会在每盘棋局完成的时候通过http接口推送到master,顺便问一下master有没有新的模型,如果有的话就顺便拿下来加载一下权重。
⻓将,长捉,长将陷阱
- MCTS搜索的时候经常陷⼊长将或者长捉的循环出不来,⽽我又觉得写很多规则太过复杂,于是我⼀劳永逸的写了⼀条规则:先同局三现者判负,于是mcts不会再陷⼊长将或者长捉的怪圈了,但是也和中国象棋的亚洲规则或中国规则跑偏了。
- 在进⾏了⼀段时间⾃对弈后,我在review棋谱的时候发现经常出现长将致胜的现象,但是不同于之前遇到的长将的时候循环出不来,⽽是红⽅或者⿊⽅“有意的”让对⽅被“先同局三现者判负”的规则判负,⽽先长将的依然
是⾃⼰。最后的解决⽅案是改了策略,改成当同局三现的时候,如果最后⼀步动的不是将军,那么才判负。
c_puct,狄利克雷噪声分布参数
这个参数关乎搜索的优先级,是优先探索还是优先评估,我尝试了⼏组值,并且让不同取值的蒙特卡洛树进⾏了互相的对弈,显然c_puct为5的情况探索-评估达到了⼀个更好的平衡。
狄利克雷分布的参数在alpha go zero中是0.03,然⽽0.03这个值在象棋中会造成⾮常极端的分布,即⼀个数趋近于1,其他的趋近于0,所以说需要调整这个参数使其在中国象棋中达到和围棋中相近的探索程度,围棋开局有⼤约400个可以⾛的位置,⽽中国象棋⼤约有40个,考虑这个差距,再结合分布实验,我认为0.3对于中国象棋是⼀个⽐较合理的参数。
自己的收获
- 熟悉并运用了Alpha Zero式深度强化学习的知识来做了这个象棋软件;
- 学习了多种神经网络
- 熟悉了分布式训练的过程
技术细节
蒙特卡洛树部分:每一次走子前都会有许多次模拟,每一次模拟都是一次完整的MCTS的过程。在此设置了10000次迭代的模拟。也就是说在每一次落子前模型将结合神经网络和进行10000次落子的模拟,最后得到所有可能落子的走子动作的分布。然后选择一个走子动作分数最高的落子作为最后的落子。走子动作由UCB公式计算而得,结合了落子的先验概率和神经网络计算得到走子价值。
与传统蒙特卡罗树搜索不同,我们的模拟是在神经网络输出结果指导下的模拟,但流程类似于传统的MCTS算法。
-
首先在selection阶段,我们选择节点是根据神经网络指导下进行选择的,每次选择选取最大的upper confidence bound值的节点。这是第一个与传统MCTS不同的地方,策略价值网络的其中一个输出P就用于UCB公式的计算,即当前节点的先验概率。在这里UCB是一个权衡置信度(或者方差)和探索值的公式。未探索的action和已经探索很多次但是探索反馈很高的action都会有较大的UCB值。Q值代表蒙特卡罗树中以探索的值,Q值的更新就是在之前蒙特卡罗树搜索中每一次backpropagation反馈的值的平均值。而P值是先验概率,是由神经网络计算得到的值,而N是该action的探索次数,而c是一个用于调节平衡模型探索的超参数。所以这个公式的特点就是,对于一个反复探索同时有很好的奖励的action,和缺乏探索的action都会有很高的值。这样就能很好的平衡探索与最优之间的平衡了。
-
扩展(Node Expansion)
比如我们从根节点出发,它不是叶子节点。之后计算它的两个子节点的 UCB 值,比如说结点 3 的 UCB 值更大,但是它之前已经被访问过了,该节点不会直接进行rollout,而是枚举出当前节点所有可行的动作并添加到树中,并根据神经网络的打分作为每个节点的先验概率。然后接下来我们再看我们要采取哪种动作。
-
仿真(Rollout/Simulation)
这是第二个与传统MCTS不同的地方,象棋训练中的MCTS不需要随机rollout至分出胜负,来获取当前节点value的值(即胜为1,输为-1,平为0)。如果当前节点还没有分出胜负,是由神经网络进行打分(value),反馈的是策略价值网络的另一个输出v,即当前局面的评分,而不是随机探索出来的结果。如果在有限的MCTS模拟的次数中,当前节点分出了胜负,当前节点的value仍然按照胜为1,输为-1,平为0。
从棋局上来说,这个过程就是模型棋手模拟对局,并获取所有可能落子概率分布的过程。最后它将选择一个胜率最大的落子作为最终落子。
-
反向传播(Backpropagation)
在第三步获取当前节点value以后,反向传播还是一样的。返回的value值会对父节点的Q值(所有子节点value的平均值)进行更新,同时和N值(父节点的访问次数)+1。
神经网络部分:
- 输入特征的设计:
先设计输入特征棋子分为:车、马、炮、象、士、将、兵,共7种棋子,那就是每个玩家7个特征平面,一共14个特征平面。至于论文中其他的特征平面,比如颜色、回合数、重复局面、历史走子记录等等我没有实现,只使用了当前棋盘上每个玩家每个棋子的位置特征作为输入,一共14个平面,棋盘大小是9∗10。
接下来是定义输入的概率向量pi(π),需要确定向量的长度,意味着需要确定所有合法走子的集合长度。定义方式是根据中国象棋通用引擎协议定义的(https://www.xqbase.com/protocol/cchess_ucci.htm)。
- 实现神经网络计算图:
这里完全是按照论文所述的神经网络结构实现的,是一一对应的。在value⽹络过拟合的处理上,AlphaGo使⽤分离Value和Policy network,并且⼀局游戏只抽取⼀个局⾯的⽅法避免过拟合,⽽Alpha Zero声明将Value和Policy network合成⼀个多⽬标⽹络,并且减少value⽹络的权重就可以避免过拟合。本项目使⽤了第⼆种⽅案。
- 损失函数:
损失函数那里相当于是policy和 value的loss直接相加。policy是用交叉熵来表示loss的,value是用mean squared error 来表示的。再加一个防止过拟合的L2正则项。
数学建模国赛
建模思路
- 数据初步处理:去掉作废发票的数据、数据的无量纲化处理和归一化处理
- 首先采用灰色关联分析,筛选出了13个与信贷风险强相关的指标,分为企业信誉和企业实力。接下来采用熵权法计算出每个评估指标在风险评估模型中的比重,并且计算每个企业的企业信誉、企业实力的评分,综合两者就得到了信贷风险的得分。此后,采用 K-means 聚类算法,从企业信誉评分和企业实力评分的维度将企业聚类为五类。在附件 3 的信誉评级 A 和 B 间,B 和 C 间分别插值,并拟合出了 5 条客户流失率关于贷款年利率的函数曲线。通过对应五类企业的信誉等级可以分别得到其流失率和贷款年利率的函数关系。结合该函数关系、年利率、额度限制条件,可以得到以银行利润最大为目标的单目标优化模型。求解该模型即可得到银行对于不同企业类的信贷策略。
具体模型
- 熵权法
- Logistic回归模型
- SVM分类模型
- K-means聚类
- 灰色关联分析
可能问题
CRISP-DM是什么
三下乡
作为项目主要负责人,带领“松言蜜语”精准扶贫项目团队,在暑期“三下乡”时对阿坝州大藏乡
- 进行实地调研
- 拍摄视频,制作宣传片
- 建立公众号
- 完成产品质检,帮助产品上市
- 建立网上销售平台以及配套产品,帮助乡民们解决产品滞销的问题并获得了上万元的收益。
该项目被四川新闻网、中青网等媒体报道,十几家媒体转发。
未来研究计划
- 数据挖掘领域主要包括以下方面:
- 基础理论研究
- 社交网络分析和大规模图挖掘
- 大数据挖掘(算法的并行、分布式扩展、多源异构数据融合挖掘等)和信息检索
- 数据隐私保护
- 基于文本语义处理的智能信息服务技术
研究生阶段,结合我的个人兴趣以及报考方向,我计划研究基于大数据分析的推荐系统,其中包括但不限于以下的方向:
1.对话推荐
2.结合本科研究过的强化学习,应用在推荐系统领域
3.知识图谱+推荐
4.可解释性
其他感兴趣的方向包括:基于文本语义处理的智能信息服务技术、深度强化学习等