基于深度强化学习方法的中国象棋博弈学习方法及系统与流程

文档序号:27266079发布日期:2021-11-06 01:03阅读:2039来源:国知局
基于深度强化学习方法的中国象棋博弈学习方法及系统与流程

1.本发明涉及深度强化学习和中国象棋计算机博弈领域,具体地,涉及一种基于深度强化学习方法的中国象棋博弈学习方法及系统,更为具体地,涉及基于深度强化学习方法的中国象棋博弈学习算法。


背景技术:

2.近年来深度强化学习迅猛发展,在各种棋类游戏上的应用都取得了巨大的成功,特别是谷歌研发的alphago首次在围棋上超越了人类棋手,证明了其在解决复杂问题和在现实世界中应用的潜能,例如在机器人、自动驾驶汽车、金融、智能电网等领域的应用。深度强化学习实现了强化学习和深度学习各自优势和特点的整合,这种人工智能方法更接近人类的思维方式:深度学习被认为是一种具有较强的感知和表达能力的学习方法;强化学习模仿了人类和动物的自主学习的行为,则被认为具有较强的决策能力。然而相比于围棋,传统中国象棋博弈方法依赖于纯粹的树搜索和专业知识要求高的领域知识,例如先验评估函数和大体积的审局库。而深度强化学习方法得益于表征学习的表达能力,能显著减少甚至消除对特定领域知识的依赖。因此,我们希望以深度强化学习技术为理论基础,采用深度神经网络和强化学习中的蒙特卡洛树搜索相结合的方法,设计中国象棋博弈学习算法。
3.专利文献cn111562844a(申请号:202010364097.x)公开了一种全自动博弈中国象棋系统。该系统中人机交互模块用于收录用户的语音信息;对弈决策模块用于根据语音信息得到棋子的移动位置;棋子移动模块用于根据棋子的移动位置确定棋子的移动路径;移动装置中每个棋子底座固定有铁片,所有落点位置中行和列分别对应行继电器和列继电器,落点位置对应电磁铁;列继电器的正极均连接至电源的正极,每个列继电器的负极与对应列的所有电磁铁连接;行继电器的负极均连接至电源的负极,每个行继电器的正极与对应行的所有电磁铁连接;处理器用于控制所有继电器的通断状态,使经过的落点位置电磁铁处于通电状态,不经过电磁铁处于断电状态。
4.我们的算法基于国产自主研发的针对神经网络加速的硬件dtu,其相对于其他加速卡主要有以下两个优势:针对深度学习进行汇编级的优化,相比于cpu和gpu有更高的计算效率;支持跨机柜互联,有更好的互联拓扑结构,可扩展性更高。因此,需要针对dtu硬件进行优化,充分发挥深度神经网络的效率和蒙特卡洛树搜索的并发优势


技术实现要素:

5.针对现有技术中的缺陷,本发明的目的是提供一种基于深度强化学习方法的中国象棋博弈学习方法及系统。
6.根据本发明提供的一种基于深度强化学习方法的中国象棋博弈学习方法,包括:
7.步骤s1:将局面特征输入训练后的深度卷积神经网络,输出当前局面评估值和所有合法着法的概率;
8.步骤s2:当前局面根据当前局面评估值和合法着法的概率,利用蒙特卡洛树搜索
对当前局面进行决策,选择下一步的着法并执行走子,获取当前局面特征,重复触发步骤s1至步骤s2,直至棋局走到终局,得到对弈结果。
9.优选地,获取训练数据集对深度神经网络使用多进程并行和队列边读取边消耗的方式进行多卡并行训练,得到训练后的深度卷积神经网络。
10.优选地,对深度卷积神经网络输入的局面特征和输出的局面评估值和所有合法着法概率特征进行设置,将棋谱数据处理为统一格式,并将棋谱翻译成输入输出向量的处理函数。
11.优选地,所述对深度卷积神经网络输入的局面特征和输出的局面评估值和所有合法着法概率特征进行设置采用:
12.步骤s3:原始获得的棋谱中的着法格式转换为四个数字构成的字符串表示着法格式,前两个数字表示起始的位置坐标;后两个数字表示到达的位置坐标,每对数字中的每个数字分别表示棋子的横坐标和纵坐标;
13.步骤s4:将物理的棋局局面根据预设要求转换为fen文件格式的字符串格式;
14.步骤s5:将着法格式和字符串格式转为大小为预设值的向量,并利用预设值的向量表示当前局面特征输入深度卷积神经网络;
15.步骤s6:深度卷积神经网络输出局面评估值和合法着法概率,局面评估值用介于预设区间之间的标量表示;合法着法概率用长度为预设值的一维向量表示。
16.优选地,所述训练数据集采用:加载数据集,并将数据集转换为预设格式,使用one

hot标记法对棋子所在位置进行标记,得到输入数据局面状况;根据每一步着法构建策略向量policy,使用贪心法,策略向量中着法对应的那一维为1,其余为0;根据对弈结果获得局面评估值,胜为+1,负为

1,和棋为0,最终获得训练数据集。
17.优选地,所述蒙特卡洛树搜索采用:树搜索策略创建预设个模拟线程,每当有一个模拟线程返回,则将返回的模拟结果和path作为参数调用创建反馈线程;当所有线程的工作结束,调用选择方法在当前节点选择最优的着法作为结果返回。
18.优选地,在模拟过程中根据当前模拟局面的评估值对历史节点进行早反馈;
19.步骤s7:检查当前局面是否存在,当不存在时,则先执行扩张操作创建节点,并对扩张操作中神经网络计算所得的局面评估值v(s)执行反馈操作;
20.步骤s8:检查当前局面是否已经判出胜负,当出现胜负则进行反馈操作;
21.步骤s9:计算当前局面所有着法的置信上限u(s,a)+q(s,a),并选择最大值对应的着法,并将n(s,a)加一;
22.其中,c
puct
表示决定探索程度的一个常量;b表示遍历当前所有可能着法的变量;p(s,a)表示当前着法的先验概率;n(s,a)表示当前着法在模拟时被走过几次;n(s,b)在当前局面执行着法b在模拟时被走过几次;q(s,a)表示当前着法的平均价值;
23.步骤s10:根据所选着法前进到下一个局面,重复触发步骤s7至步骤s10直至出现胜负并进行反馈操作。
24.优选地,模拟过程中,设置公交车式的请求处理方法进行推理请求的并发处理操作,充分利用dtu算力以及降低推理请求延迟中做出平衡;
25.步骤s11:将推理请求抽象为一个载客量为预设数值的公交车,每个扩张操作给出的输入是乘客;
26.步骤s12:当有n个dtu设备可以用来推理时,则最多可同时执行n个推理请求,车站拥有n辆公交车;
27.步骤s13:所有乘客到车站时,都会坐上第一辆停着的公交车;每辆公交车根据时间表出发,公交车等待预设时间后,无论车是否满载都将出发;当一个dtu空闲时间预设时间后,无论是否累计了预设数值的输入,立即发起推理请求;
28.步骤s14:公交车的班次时间t由车站内的公交车数量n决定:k表示比例系数。
29.根据本发明提供的一种基于深度强化学习方法的中国象棋博弈学习系统,包括:
30.模块m1:将局面特征输入训练后的深度卷积神经网络,输出当前局面评估值和所有合法着法的概率;
31.模块m2:当前局面根据当前局面评估值和合法着法的概率,利用蒙特卡洛树搜索对当前局面进行决策,选择下一步的着法并执行走子,获取当前局面特征,重复触发模块m1至模块m2,直至棋局走到终局,得到对弈结果。
32.优选地,获取训练数据集对深度神经网络使用多进程并行和队列边读取边消耗的方式进行多卡并行训练,得到训练后的深度卷积神经网络;
33.对深度卷积神经网络输入的局面特征和输出的局面评估值和所有合法着法概率特征进行设置,将棋谱数据处理为统一格式,并将棋谱翻译成输入输出向量的处理函数;
34.所述对深度卷积神经网络输入的局面特征和输出的局面评估值和所有合法着法概率特征进行设置采用:
35.模块m3:原始获得的棋谱中的着法格式转换为四个数字构成的字符串表示着法格式,前两个数字表示起始的位置坐标;后两个数字表示到达的位置坐标,每对数字中的每个数字分别表示棋子的横坐标和纵坐标;
36.模块m4:将物理的棋局局面根据预设要求转换为fen文件格式的字符串格式;
37.模块m5:将着法格式和字符串格式转为大小为预设值的向量,并利用预设值的向量表示当前局面特征输入深度卷积神经网络;
38.模块m6:深度卷积神经网络输出局面评估值和合法着法概率,局面评估值用介于预设区间之间的标量表示;合法着法概率用长度为预设值的一维向量表示;
39.所述训练数据集采用:加载数据集,并将数据集转换为预设格式,使用one

hot标记法对棋子所在位置进行标记,得到输入数据局面状况;根据每一步着法构建策略向量policy,使用贪心法,策略向量中着法对应的那一维为1,其余为0;根据对弈结果获得局面评估值,胜为+1,负为

1,和棋为0,最终获得训练数据集;
40.所述蒙特卡洛树搜索采用:树搜索策略创建预设个模拟线程,每当有一个模拟线程返回,则将返回的模拟结果和path作为参数调用创建反馈线程;当所有线程的工作结束,调用选择方法在当前节点选择最优的着法作为结果返回;
41.在模拟过程中根据当前模拟局面的评估值对历史节点进行早反馈;
42.模块m7:检查当前局面是否存在,当不存在时,则先执行扩张操作创建节点,并对
扩张操作中神经网络计算所得的局面评估值v(s)执行反馈操作;
43.模块m8:检查当前局面是否已经判出胜负,当出现胜负则进行反馈操作;
44.模块m9:计算当前局面所有着法的置信上限u(s,a)+q(s,a),并选择最大值对应的着法,并将n(s,a)加一;
45.其中,c
puct
表示决定探索程度的一个常量;b表示遍历当前所有可能着法的变量;p(s,a)表示当前着法的先验概率;n(s,a)表示当前着法在模拟时被走过几次;n(s,b)在当前局面执行着法b在模拟时被走过几次;q(s,a)表示当前着法的平均价值;
46.模块m10:根据所选着法前进到下一个局面,重复触发模块m7至模块m10直至出现胜负并进行反馈操作。
47.与现有技术相比,本发明具有如下的有益效果:
48.1、本发明通过基于人类专家棋谱的监督学习和基于自我对弈的自学习的技术特征,实现快速提升模型棋力,并以迭代式方法逐步增强棋力以至模型棋力最终超过人类棋手的技术效果;
49.2、本发明通过多卡并行训练和队列加载数据的技术特征,实现减小cpu加载数据到gpu的延迟瓶颈,提高多gpu的训练利用率,加速深度神经网络训练的技术效果;
50.3、本发明通过对基础的蒙特卡洛树搜索进行基于局面评估的早反馈等优化的技术特征,实现模拟操作的并行执行,提高反馈的时效性的技术效果;
51.4、本发明通过基于dtu硬件的有针对性地优化,如推理请求的并发处理等地技术特征,实现充分利用dtu算力和降低请求延迟地平衡的技术效果。
附图说明
52.通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:
53.图1为整体算法流程框架。
54.图2为深度卷积神经网络结构。
55.图3为蒙特卡洛树搜索流程。
具体实施方式
56.下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变化和改进。这些都属于本发明的保护范围。
57.实施例1
58.本发明针对中国象棋这一特定领域,以深度强化学习技术为理论基础,采用深度神经网络和蒙特卡洛树搜索相结合的方法,设计了中国象棋学习算法。前期使用基于人类专家棋谱的监督学习,后期使用基于自我对弈获得的棋谱进行训练的自学习。同时,基于国产加速硬件dtu,进行有针对性的优化,如基于局面评估的早反馈、节点粒度的锁、推理请求
的并发处理等,设计提高神经网络效率来提升蒙特卡洛树搜索,充分发挥蒙特卡洛树搜索的并发优势。
59.本发明的设计模型如图1所示。使用蒙特卡洛树搜索执行决策,局面通过深度卷积神经网络进行处理,获得当前局面的评估值和所有合法着法概率,树搜索参考神经网络的输出值,对下一步的着法进行评估选择并执行,进入下一个局面,如此循环进行,直到对弈走到终局。
60.根据本发明提供的一种基于深度强化学习方法的中国象棋博弈学习方法,包括:
61.步骤s1:将局面特征输入训练后的深度卷积神经网络,输出当前局面评估值和所有合法着法的概率;
62.步骤s2:当前局面根据当前局面评估值和合法着法的概率,利用蒙特卡洛树搜索对当前局面进行决策,选择下一步的着法并执行走子,获取当前局面特征,重复触发步骤s1至步骤s2,直至棋局走到终局,得到对弈结果。
63.具体地,获取训练数据集对深度神经网络使用多进程并行和队列边读取边消耗的方式进行多卡并行训练,得到训练后的深度卷积神经网络。
64.具体地,对深度卷积神经网络输入的局面特征和输出的局面评估值和所有合法着法概率特征进行设置,将棋谱数据处理为统一格式,并将棋谱翻译成输入输出向量的处理函数。
65.具体地,所述对深度卷积神经网络输入的局面特征和输出的局面评估值和所有合法着法概率特征进行设置采用:
66.步骤s3:原始获得的棋谱中的着法格式转换为四个数字构成的字符串表示着法格式,前两个数字表示起始的位置坐标;后两个数字表示到达的位置坐标,每对数字中的每个数字分别表示棋子的横坐标和纵坐标;
67.步骤s4:将物理的棋局局面根据预设要求转换为fen文件格式的字符串格式;
68.步骤s5:将着法格式和字符串格式转为大小为预设值的向量,并利用预设值的向量表示当前局面特征输入深度卷积神经网络;
69.步骤s6:深度卷积神经网络输出局面评估值和合法着法概率,局面评估值用介于预设区间之间的标量表示;合法着法概率用长度为预设值的一维向量表示。
70.具体地,所述训练数据集采用:加载数据集,并将数据集转换为预设格式,使用one

hot标记法对棋子所在位置进行标记,得到输入数据局面状况;根据每一步着法构建策略向量policy,使用贪心法,策略向量中着法对应的那一维为1,其余为0;根据对弈结果获得局面评估值,胜为+1,负为

1,和棋为0,最终获得训练数据集。
71.具体地,所述蒙特卡洛树搜索采用:树搜索策略创建预设个模拟线程,每当有一个模拟线程返回,则将返回的模拟结果和path作为参数调用创建反馈线程;当所有线程的工作结束,调用选择方法在当前节点选择最优的着法作为结果返回。
72.具体地,在模拟过程中根据当前模拟局面的评估值对历史节点进行早反馈;
73.步骤s7:检查当前局面是否存在,当不存在时,则先执行扩张操作创建节点,并对扩张操作中神经网络计算所得的局面评估值v(s)执行反馈操作;
74.步骤s8:检查当前局面是否已经判出胜负,当出现胜负则进行反馈操作;
75.步骤s9:计算当前局面所有着法的置信上限u(s,a)+q(s,a),并选择最大值对应的
着法,并将n(s,a)加一;
76.其中,c
puct
表示决定探索程度的一个常量;b表示遍历当前所有可能着法的变量;p(s,a)表示当前着法的先验概率;n(s,a)表示当前着法在模拟时被走过几次;n(s,b)在当前局面执行着法b在模拟时被走过几次;q(s,a)表示当前着法的平均价值;
77.步骤s10:根据所选着法前进到下一个局面,重复触发步骤s7至步骤s10直至出现胜负并进行反馈操作。
78.具体地,模拟过程中,设置公交车式的请求处理方法进行推理请求的并发处理操作,充分利用dtu算力以及降低推理请求延迟中做出平衡;
79.步骤s11:将推理请求抽象为一个载客量为预设数值的公交车,每个扩张操作给出的输入是乘客;
80.步骤s12:当有n个dtu设备可以用来推理时,则最多可同时执行n个推理请求,车站拥有n辆公交车;
81.步骤s13:所有乘客到车站时,都会坐上第一辆停着的公交车;每辆公交车根据时间表出发,公交车等待预设时间后,无论车是否满载都将出发;当一个dtu空闲时间预设时间后,无论是否累计了预设数值的输入,立即发起推理请求;
82.步骤s14:公交车的班次时间t由车站内的公交车数量n决定:k表示比例系数。
83.根据本发明提供的一种基于深度强化学习方法的中国象棋博弈学习系统,包括:
84.模块m1:将局面特征输入训练后的深度卷积神经网络,输出当前局面评估值和所有合法着法的概率;
85.模块m2:当前局面根据当前局面评估值和合法着法的概率,利用蒙特卡洛树搜索对当前局面进行决策,选择下一步的着法并执行走子,获取当前局面特征,重复触发模块m1至模块m2,直至棋局走到终局,得到对弈结果。
86.具体地,获取训练数据集对深度神经网络使用多进程并行和队列边读取边消耗的方式进行多卡并行训练,得到训练后的深度卷积神经网络;
87.对深度卷积神经网络输入的局面特征和输出的局面评估值和所有合法着法概率特征进行设置,将棋谱数据处理为统一格式,并将棋谱翻译成输入输出向量的处理函数;
88.所述对深度卷积神经网络输入的局面特征和输出的局面评估值和所有合法着法概率特征进行设置采用:
89.模块m3:原始获得的棋谱中的着法格式转换为四个数字构成的字符串表示着法格式,前两个数字表示起始的位置坐标;后两个数字表示到达的位置坐标,每对数字中的每个数字分别表示棋子的横坐标和纵坐标;
90.模块m4:将物理的棋局局面根据预设要求转换为fen文件格式的字符串格式;
91.模块m5:将着法格式和字符串格式转为大小为预设值的向量,并利用预设值的向量表示当前局面特征输入深度卷积神经网络;
92.模块m6:深度卷积神经网络输出局面评估值和合法着法概率,局面评估值用介于预设区间之间的标量表示;合法着法概率用长度为预设值的一维向量表示;
93.所述训练数据集采用:加载数据集,并将数据集转换为预设格式,使用one

hot标记法对棋子所在位置进行标记,得到输入数据局面状况;根据每一步着法构建策略向量policy,使用贪心法,策略向量中着法对应的那一维为1,其余为0;根据对弈结果获得局面评估值,胜为+1,负为

1,和棋为0,最终获得训练数据集;
94.所述蒙特卡洛树搜索采用:树搜索策略创建预设个模拟线程,每当有一个模拟线程返回,则将返回的模拟结果和path作为参数调用创建反馈线程;当所有线程的工作结束,调用选择方法在当前节点选择最优的着法作为结果返回;
95.在模拟过程中根据当前模拟局面的评估值对历史节点进行早反馈;
96.模块m7:检查当前局面是否存在,当不存在时,则先执行扩张操作创建节点,并对扩张操作中神经网络计算所得的局面评估值v(s)执行反馈操作;
97.模块m8:检查当前局面是否已经判出胜负,当出现胜负则进行反馈操作;
98.模块m9:计算当前局面所有着法的置信上限u(s,a)+q(s,a),并选择最大值对应的着法,并将n(s,a)加一;
99.其中,c
puct
表示决定探索程度的一个常量;b表示遍历当前所有可能着法的变量;p(s,a)表示当前着法的先验概率;n(s,a)表示当前着法在模拟时被走过几次;n(s,b)在当前局面执行着法b在模拟时被走过几次;q(s,a)表示当前着法的平均价值;
100.模块m10:根据所选着法前进到下一个局面,重复触发模块m7至模块m10直至出现胜负并进行反馈操作。
101.实施例2
102.实施例2是实施例1的优选例
103.本发明设计基于深度卷积神经网络和蒙特卡洛树搜索。整体算法流程如图1所示,其中,π
i
表示一局对弈中第i步的着法,(s,π
i
,z)中s表示走第i时的局面,z表示该局对弈的结果。在每一个局面,蒙特卡洛树搜索会进行多次模拟。每一次模拟时,每遇到一个新局面,局面特征通过深度神经网络处理,得到当前局面的评估值和下一步的走法,将结果返回给蒙特卡洛树,树搜索基于神经网络的参考结果选择当前最优的走法。深度神经网络网络前期使用人类专家棋谱进行监督学习,以快速获得一定的棋力,后期使用基于自我对弈得到的棋谱进行训练的自学习,以迭代式的方法逐步提升棋力。
104.本发明主要包括深度神经网络训练和蒙特卡洛树搜索这两个模块。
105.算法中使用一种深度卷积神经网络模型,提取中国象棋棋谱中的特征,并通过监督学习和自学习使神经网络的参数在数据集上得到收敛。模型结构如图2所示。输入为当前局面特征,输出走法概率分布和局面评估值。该模块主要包括数据特征处理和神经网络训练两个方面。
106.本发明提供的一个基于深度神经网络方法的中国象棋学习算法,包括以下步骤:
107.步骤s1:深度卷积神经网络处理输入局面特征,输出局面评估值和所有合法着法的概率。
108.步骤s2:蒙特卡洛树搜索基于当前局面进行决策,参考神经网络的输出结果,选择下一步的着法,执行并进入下一个局面,重复触发步骤s1至步骤s2,直至棋局走到终局,得
到对弈结果即胜、平或负为止。
109.蒙特卡洛树搜索以当前局面为根节点进行多次模拟,每次模拟的过程中,如果遇到未出现过的局面,使用神经网络对局面进行处理,输出的局面评估值和合法着法概率返回给蒙特卡洛树,树中会保存所有节点即局面的评估值和所有边即着法的概率,并根据神经网络的返回结果更新树上的数据。多次模拟结束后,在根节点处选择最优的边即着法执行。
110.所述的深度卷积神经网络模型,包括如下步骤:
111.数据特征处理步骤:对深度神经网络的输入和输出特征进行设计,将棋谱数据处理成统一格式,并设计将棋谱翻译成输入输出向量的处理函数。
112.神经网络训练步骤:神经网络训练使用多卡并行训练,加载大数据集使用多进程并行和队列边读取边消耗的方式。
113.神经网络训练分为两个部分:加载大数据集到gpu和gpu上数据的训练。加载大数据集主要由cpu负责,采用多进程并行和队列边读取边消耗的方法。gpu上数据的训练使用多卡并行,即多个gpu并行。
114.所述数据特征处理步骤包括:
115.步骤s3:对神经网络的输入和输出特征进行设计。中国象棋总共有7种棋子:车、马、炮、相(象)、士、帅(将)、兵(卒);每个玩家分别拥有7个特征平面,因此总共需要14个特征平面,在每一种棋子对应的特征平面上,使用0和1来表示棋盘上是否有该种棋子。棋盘的大小是10
×
9。所以神经网络的输入大小是14
×
10
×
9,表示的是当前的棋盘局面状态。神经网络的输出有两个,一个是表示着法概率分布的向量policy,向量的长度是所有合法着法的集合长度;另一个是当前局面的评估值value,是一个介于[

1,1]之间的标量。所有合法着法合集的长度是根据不同棋子的行棋规则,通过计算得到,主要分为三类:(1)只能沿着横线和纵线左右或者上下移动一步或多步的,例如车、炮、兵(卒)、帅(将)等;(2)采用特殊的行棋规则的,例如马走日字形;(3)另外单独列出士和相(象)所有的合法着法,因为这两种棋子不仅采用特殊的行棋规则,行棋范围上也有限制,士只能沿着九宫中的斜线走一步,也就是沿着方格的对角线来行走,相(象)走田字形,而且不能越过河界。经过计算可得合法着法合集的长度为2086。这就是神经网络第一个输出的向量的长度。
[0116]
步骤s4:将获得的人类专家棋谱使用统一的格式改写,对于中国象棋的着法表示,选择使用坐标方式。这种方法把棋盘上的每一个格子按照坐标进行编号。只要知道起始的坐标和到达的坐标,就可以确定着法。按照中国象棋的规则,从红方的视角来看,纵线从左至右依次表示为abcdefghi,横线从下至上依次为0123456789。如图所示。为了使用方便,纵线和横线一样,也是使用数字编号,从左到右依次为012345678。整个棋盘构成了一个坐标系,以左下角为原点,红方始终在下。着法使用四个数字构成的字符串表示,前两个数字表示起始的位置坐标,后两个数字表示到达的位置坐标,每对数字中的两个数字分别表示棋子的横坐标和纵坐标。例如着法记录序列实例中的第一个着法“7242”,表示的是位置坐标原本在(7,2)的棋子走到位置坐标(4,2),也就是红方的炮从纵线八平移到纵线五。
[0117]
步骤s5:对棋盘局面的表示采用了fen文件格式。fen即“福斯夫

爱德华兹记号法”(forsyth

edwards notation),是一种使用ascⅱ字符,专门为国际象棋设计用于准确表示不同局面的记录规范。在这个规范下,一个棋局局面可以简单地使用一行“fen格式串”来进
行表示。在国际象棋中,fen格式串由6个部分组成,每个部分都是1段ascⅱ字符串。其中第一段字符串用于表示的是棋盘上的所有棋子,这也是fen格式串的主要组成部分。这里我们只需要表示棋盘上的棋子,所以只采用了第一段。以最初的棋盘布局为例:
[0118]
rkemsmekr/9/1c5c1/p1p1p1p1p/9/9/p1p1p1p1p/1c5c1/9/rkemsmekr。在中国象棋的棋盘布局中,小写的字母代表的黑方棋子,大写的字母代表的是红方棋子。由于中国象棋的棋盘一共有10行,所以使用9个“/”把每一行划分开。不同种类的棋子的名称使用英文字母表示,其中具体来说,r(r)表示车,k(k)表示马,e(e)表示相(象),m(m)表示士,s(s)表示帅(将),c(c)表示炮,p(p)表示兵(卒)。每一行表示某一方视角按照纵线从右到左的位置上的棋子,棋子与棋子之间间隔了几个位置就用数字几表示。
[0119]
从上到下一行一行表示,每行之间用“/”隔开。如果红方在下,黑方的每一行从左到右表示,红方的每一行从右到左表示,如果红方在上则反之。棋子与棋子之间间隔了几个位置就用数字几表示。
[0120]
rkemsmekr/9/1c5c1/p1p1p1p1p/9/9/p1p1p1p1p/1c5c1/9/rkemsmekr,rkemsmekr表示从上到下第1行从左到右分别为黑方的车马象士将士象马车,接下去的9表示第2行为9个空位,没有棋子,1c5c1表示第3行从左到右依次为1个空位,1个黑方的炮,5个空格,1个黑方的炮,1个空位,以此类推。
[0121]
步骤s6:神经网络训练时输入的是矩阵,因此,在加载数据集时,我们需要把json格式的文件转换成神经网络输入对应格式的数据。读取棋谱文件数据时,首先获取初始的棋盘局面,根据每一步着法,通过局面转移函数获取下一个局面。将每一个fen格式的局面转换为神经网络的输入格式,即大小为14
×
10
×
9的矩阵,使用one

hot标记法,即棋子所在位置为1,其余为0,得到输入数据局面状况state。根据每一步着法构建策略向量policy(着法概率分布的向量),使用贪心法,策略向量中着法对应的那一维为1,其余均为0。根据对弈结果获得局面评估值value,胜为+1,负为

1,和棋为0。由此得到两个标签值,最终获得训练数据集(state,policy,value)。
[0122]
数据集是由json格式的棋谱文件组成的数据集合,每一个棋谱文件记载了一局棋局的对弈过程,包括fen格式的初始局面,步骤s4格式的每一步的着法和对弈结果即红方还是黑方胜或者平局。
[0123]
局面转移函数指的是根据当前局面和着法获得下一个局面的函数,输入fen字符串格式的局面和步骤4中格式的着法,输出下一个fen字符串格式的局面。
[0124]
fen格式是一个字符串,json格式是文件的格式,json文件里包含了fen格式表示的初始局面。
[0125]
策略向量是一个长度为2086的向量,每一个合法着法都对应着向量中的某一维,将每一步着法转换为策略向量时,对应的那一维的值设置为1,其余维的值都设置为0。
[0126]
合法着法一共有2086个,为了表示所有合法着法的概率分布,使用一个长度为2086的向量来表示,向量的每一个维度就对应一个着法的概率。
[0127]
两个标签值为概率向量policy和局面评估值value。
[0128]
神经网络训练时的优化器使用adam优化器,同时需要指定学习率参数的大小。通常,我们希望在训练初期,让网络权重收敛得迅速一些,这时需要把学习率设置得稍微大一些;在训练的后期,网络权重已经处于最优解附近,为了使网络权重更好地收敛,我们需要
把学习率设置得小一些。因此学习率大小的设置使用了学习率衰减(learning rate decay)。随着训练step的增加,逐步地等比例降低学习率。神经网络框架使用tensorflow。
[0129]
所述神经网络训练步骤包括:
[0130]
步骤s7:多卡并行训练。多卡并行采用数据并行,使用的是tf.distribute.strategy。这是tensorflow中的一个api,使我们能够在多个gpu、多个机器或多个tpu上进行并行训练。该模块中一共有4种strategy可用,我们使用的是tf.distribute.mirroredstrategy。该api支持在一个机器上的多个gpu上同步并行训练。它在每个gpu设备上会复制一份模型。模型中的每个变量在所有设备中都会产生一份镜像。这些变量一起组成了一个单一概念上的变量,称为mirroredvariable。通过使用一致的更新,这些变量会保持同步。为了在每个设备的副本之间进行变量更新的传递,使用了有效的all

reduce算法。该算法将所有设备上的张量使用相加的方式进行聚合,并通过广播使这些数据传递到所有设备副本上,使其保持同步,是一种特别高效的融合算法,能够使同步的开销显著降低。根据设备之间可以选择的通信的类型,有许多种all

reduce算法的实现。在默认情况下,all

reduce实现时使用的是nvidia nccl。
[0131]
步骤s8:队列并行加载数据。tensorflow中的tf.data这个api使我们能够从简单的可重用的片段构建输入时所需的pipeline。使用函数tf.data.dataset.from_generator实现数据的边读取边训练,因此完整的数据集不必一次性加载到内存中。该函数通过生成器生成元素创建一个dataset类。函数中的generator参数必须是一个可调用的对象,例如一个生成函数,并且返回的结果是一个支持迭代器协议的对象。我们需要自定义生成器函数train_generator和valid_generator,每次调用返回(state,policy,value)这样的三元组。如果生成器函数使用循环生成数据,即每调用一次生成一个样本,那么,每读取一个batch的数据就需要上千次的循环,时间消耗非常大,训练时的大部分时间会浪费在读取数据上,显卡的利用率会非常低。因此,我们使用多线程并行读取。同时,为了避免一次性将所有数据均读入内存,我们维护了一个队列,一端不断生成数据,另一端不断消耗数据。
[0132]
所述的蒙特卡洛树搜索算法,如图3所示,包括如下步骤:
[0133]
蒙特卡洛树搜索算法结合了传统树搜索算法和现代神经网络方法,并且针对中国象棋和dtu硬件有针对性的优化,如早反馈、哈希锁等策略,充分发挥蒙特卡洛树搜索的并发优势,主要包括树搜索策略、早反馈、并发处理等模块。
[0134]
树搜索策略是蒙特卡洛树搜索算法主要的步骤,基于局面评估的早反馈和推理请求的并发处理是树搜索的子步骤的优化策略,早反馈是蒙特卡洛树搜索中的模拟和反馈子步骤的优化策略,推理请求的并发处理是蒙特卡洛树搜索中的模拟这一子步骤的优化策略。
[0135]
树搜索策略:树搜索策略创建800个模拟线程。每当有一个模拟线程返回,便把返回的模拟结果和path作为参数调用创建反馈线程。当所有线程的工作结束,调用选择方法在当前节点选择最热门的着法作为结果返回。
[0136]
基于局面评估的早反馈:引入局面评估,在模拟过程中根据当前模拟局面的评估值对历史节点进行一个早反馈。
[0137]
在模拟过程中根据当前模拟局面的评估值对历史节点进行一个早反馈这一做法的好处是,蒙特卡洛树搜索的模拟操作是并行的,这意味着一棵树会同时有多个线程在进
行自上而下的模拟操作,以提高反馈的时效性。
[0138]
推理请求的并发处理:为了在充分利用dtu算力和降低推理请求延迟中做出平衡,设计一套“公交车”式的请求处理方法。
[0139]
在这种策略下,当有大量推理需求发生时,神经网络模块会立刻发出大量远程推理请求,最大限度发挥dtu的算力;当推理需求较少时,神经网络模块也会适量地发出载有少量输入的远程推理请求,降低蒙特卡洛树搜索的等待延迟。
[0140]
蒙特卡洛树搜索的过程中有大量线程同时进行模拟,这意味着搜索过程中会产生大量的扩张操作。如果每次扩张都调用一次推理请求,那么蒙特卡洛树搜索的效率将很差。为了在充分利用dtu算力和降低推理请求延迟中做出平衡,设计了一套“公交车”式的请求处理方法。
[0141]
所述树搜索策略包括以下步骤:
[0142]
步骤s9:数据结构存储。树的每个节点s代表棋盘的局面状况state,每个a代表着法action。每个节点存储了每个该局面所有的合法着法,以及指向该着法数据结构的指针。每个边存储了四个变量n(s,a),w(s,a),q(s,a)和p(s,a)。它们分别代表了:1)n(s,a)记录了该着法在模拟时被走过几次。2)w(s,a)记录了该着法在模拟反馈后积累的行动价值。3)q(s,a)记录了该着法的平均价值。4)p(s,a)记录了该着法的先验概率(由神经网络计算所得)。把一个局面作为输入交给神经网络计算,可以得到一个长度为所有着法的向量,其值为各个着法蒙特卡洛树搜索时应该选择该着法的概率。需要指出的是,由于神经网络的输出宽度是固定的,因此该向量包含了所有着法的概率,也就是包含了该局面不可走的着法。不过经过合理训练的模型,其输出向量中的非法着法概率无限接近0,因此这种设置是合理的。蒙特卡洛树的初始状态只有一个根节点,在搜索过程中会不断增长。使用一个map来存储节点,用局面对应的字符串作为索引。节点之间的没有显式的指针连接,而是通过模拟棋盘从当前局面和着法获得下一个局面,即s
i
=step(s
i

1,a)。
[0143]
步骤s10:蒙特卡洛树搜索的选择。获取当前节点的哈希锁,拿锁状态下拷贝当前节点的所有合法着法,释放锁。根据排列所有着法的n(s,a),返回其中的最优着法。
[0144]
步骤s11:蒙特卡洛树的扩张。以输入的局面作为开始局面,执行以下循环。判定当前节点是否存在,若不存在则调用扩张方法。从扩张方法返回后,根据返回的局面评估值创建新线程进行早反馈。获取当前节点的哈希锁,拿锁状态下拷贝当前节点的所有合法着法,释放锁。根据上文的公式计算所有着法的u(s,a)+q(s,a),选择其中取值最高的着法作为模拟的下一步。对该着法进行评估,如果该着法的价值绝对值高于反馈阈值,则开启一个新线程,进行基于着法分析的早反馈。接着对该着法的w(s,a)减去虚拟损失,并用所选着法更新当前局面。当前局面可以判出胜负时,跳出循环,返回这次模拟的结果和模拟路径。
[0145]
步骤s12:蒙特卡洛树的模拟。把局面翻译成神经网络输入的特征平面,远程调用推理请求。当推理请求返回后,根据返回的policy初始化当前局面的所有合法着法。
[0146]
步骤s13:蒙特卡洛树的反馈。遍历模拟操作返回的path,一边变换模拟结果的符号一边把模拟结果加到path上的w(s,a),同时把模拟过程中减去的虚拟损失加回去。
[0147]
步骤s14:设置节点粒度的锁。模拟过程中,需要用锁来控制节点的读写冲突。最理想的拿锁策略是为每一个节点设置一个锁,但实现时存在以下两个问题:1)节点的数量太多。2)锁的检索开销过大。如果用动态分配的方式,这意味需要维护一个锁的表,实现节点
到锁的映射。如果用有序表来存储锁,则当锁的数量堆积到庞的大数量后,一次锁的检索将消耗不少计算量。如果用哈希表来存储锁,由于有线程安全的需求,因此希表的扩容过程开销极大。同时,对锁表的访问是不可并发的,这意味着需要一把大锁来保护锁表的读写,对模拟的并发性能伤害较大。为了减小锁的粒度而引入大锁,本末倒置。为了解决以上问题,选择用定长哈希数组来存储表元素。初始化一个大小为10000的锁数组。在对一个节点进行读写操作前,先用哈希函数把节点的局面fen记号映射到[0,9999]的整型数,再取锁数组中对应下标的锁来保护对当前节点的读写。在这种策略下,许多节点会共享一把锁,粒度不及一个节点一把锁来得小,这种妥协是可以接受的。模拟过程的并发量约为100个线程并行,两个节点哈希到同一把锁的概率为0.0001,一百个线程中共享锁的节点不会超过10个。由于锁数组是线程安全的,因此也不需要大锁来保护存储锁的数据结构。
[0148]
步骤s15:每当模拟探索到下一步,模拟线程会从选择着法的w(s,a)“偷取”一部分虚拟损失(virtual loss)。当下一个线程访问到当前节点时,除非被偷取后的着法评价值依然很高,否则下一个节点将倾向于选择其他节点。当模拟线程模拟完毕,其反馈阶段会把偷取的虚拟损失还给该着法。在这种机制的作用下,除非一个或若干个节点的w(s,a)明显高于其他节点,否则模拟线程会倾向于选择之前的线程没有走过的路径。特别是当一个节点刚刚创建时,其所有候选着法的w(s,a)都是零,虚拟损失的机制可以保证模拟线程不会死板地按照神经网络所给的先验概率分布来选择路径,而会尝试冷门着法。这不仅探索了冷门着法的可能性,同时也减少了热门路径中的读写冲突。
[0149]
在基础的蒙特卡洛树搜索中,各个着法的价值w(s,a)由模拟过程来更新迭代,即所有反馈操作都在模拟操作后执行。本算法引入局面评估,在模拟过程中根据当前模拟局面的评估值对历史节点进行一个早反馈。这一做法的好处是,蒙特卡洛树搜索的模拟操作是并行的,这意味着一棵树会同时有多个线程在进行自上而下的模拟操作。从初始节点到模拟结束并反馈最开始选择的着法,一个线程需要花费不可忽视的时间开销。在这个时间窗口内,从初始节点启动的后续线程择优时所参考的w(s,a)是旧值。显而易见的是,这个时间窗口越小,后续节点搜索时参考的w(s,a)越新,搜索质量也就越高。基于局面评估的早反馈包括以下步骤:
[0150]
步骤s16:检查当前局面是否存在,若不存在则先执行扩张操作创建节点,并对扩张操作中神经网络计算所得的局面评估值v(s)执行反馈操作。
[0151]
步骤s17:检查当前局面是否已经判出胜负,若出现胜负则进行反馈操作。
[0152]
步骤s18:计算当前局面所有着法的u(s,a)+q(s,a),选择其中最大值对应的着法,并将其n(s,a)加一。
[0153]
步骤s19:根据所选着法前进到下一个局面,并评估该着法的价值,如有反馈价值则进行反馈操作。最后回到步骤s16。
[0154]
新的过程中定义了两种早反馈。步骤s16中用神经网络计算所得的评估值来反馈。在神经网络的训练过程中,一个棋谱中胜者走过的所有历史局面被设置正预期值,败者走过的所有历史局面被设置负预期值。根据这个策略训练所得的神经网络,可以根据所有历史棋谱的胜率来评估输入局面。之所以选择神经网络而非传统的统计子力的方式,原因如下:1)为了得到质量较高的评估值,需要不小的计算开销,并且对开发者中国象棋理论知识要求较高。2)神经网络评估局面的依据是所有训练棋谱的胜率,跳脱了传统方法统计子力
的弊端,而是从根本上评估其对棋局结果的影响。3)神经网络中增加一个输出层,在推理时增加的开销远小于cpu与加速卡通信的开销,因此在算力节约上是划算的。步骤2)中的评估面向着法。一种简单的方式是根据v(a)=v(s
i
)

v(s
i
‑1)来计算一个着法的对棋局的影响。但这种评估方式本质上与步骤s16中的反馈是重复的,都是根据局面或着法的胜率来评估。我们基于中国象棋兑子关系的方法来评估行棋的结果。在人类棋手总结的棋理中,兑子原则是中期行棋的重要判断依据之一;同时用计算机分析兑子关系实现相对简单,计算开销小,因此选择该策略来评估着法的价值。
[0155]
蒙特卡洛树搜索的过程中有大量线程同时进行模拟,这意味着搜索过程中会产生大量的扩张操作。实验中发现,如果每次扩张都调用一次推理请求,那么蒙特卡洛树搜索的效率将很差。其原因是dtu加速的神经网络支持同时进行多个输入的前向传播,如果一次只对一个输入进行推理,则会让cpu与dtu之间的数据通信开销显得更重。为了在充分利用dtu算力和降低推理请求延迟中做出平衡,本算法了设计一套“公交车”式的请求处理方法,包括以下步骤:
[0156]
步骤s20:把一次推理请求抽象为一个载客量为20的公交车。每个扩张操作给出的输入是乘客。
[0157]
步骤s21:假设有n个dtu设备可以用来推理,那么就意味着最多可同时执行n个推理请求,即车站拥有n辆公交车。
[0158]
步骤s22:所有乘客到车站时,都会坐上第一辆停着的公交车。每辆公交车根据时间表出发,即公交车等待t秒后,无论车是否满载都将出发。即一个dtu空闲时间t秒后,无论是否积累了20个输入,立刻发起一个推理请求。
[0159]
步骤s23:公交车的班次时间t由车站内的公交车数量n决定:
[0160]
在这种策略下,当有大量推理需求发生时,神经网络通信模块会立刻发出大量远程推理请求,最大限度发挥dtu的算力;当推理需求较少时,神经网络通信模块也会适量地发出载有少量输入的远程推理请求,降低蒙特卡洛树搜索的等待延迟。
[0161]
本领域技术人员知道,除了以纯计算机可读程序代码方式实现本发明提供的系统、装置及其各个模块以外,完全可以通过将方法步骤进行逻辑编程来使得本发明提供的系统、装置及其各个模块以逻辑门、开关、专用集成电路、可编程逻辑控制器以及嵌入式微控制器等的形式来实现相同程序。所以,本发明提供的系统、装置及其各个模块可以被认为是一种硬件部件,而对其内包括的用于实现各种程序的模块也可以视为硬件部件内的结构;也可以将用于实现各种功能的模块视为既可以是实现方法的软件程序又可以是硬件部件内的结构。
[0162]
以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变化或修改,这并不影响本发明的实质内容。在不冲突的情况下,本技术的实施例和实施例中的特征可以任意相互组合。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1