0.briefly speaking
这段时间在调研对抗搜索算法(博弈算法)(如含 α β \alpha\beta αβ剪枝的最小最大值算法、蒙特卡洛树搜索)部署在FPGA上进行加速的可行性,要在FPGA上部署这样的算法并加速,我们就必须得去挖掘算法的并行性。
这次的这篇文章就是一篇对多种并行化最大最小值算法的性能对比的一篇文章,这篇文章本身并没有提出新的算法,工作也比较简单,我阅读这篇论文其实也是为了从过去的并行化方案中寻找新的方法。这篇文章就不在这里贴了,三哥做的一篇水文,这里快速把内容过一遍。
关于minimax算法和
α
β
\alpha\beta
αβ剪枝,可以看这个视频来学习(强推),视频中John Levine教授讲解并用实例推演了minimax算法以及
α
β
\alpha\beta
αβ剪枝过程,这是John Levine老师的板书,我作为手稿记录了一下:
1.INTRODUCTION
这一部分回忆了一下最大最小值算法在棋局博弈中的应用,以及施加alpha-beta剪枝以大大减小搜索空间的必要性。
A. Minimax Algorithm
这部分主要是对minimax算法的一个简单回顾,并简单回顾了一下minimax算法在博弈过程中的使用。minimax的伪码表示如下:
朴素的minimax算法的思路非常简单,就是最大值节点和最小值节点相互拆台的过程,最大值节点从作为其孩子节点的最小值节点寻找最大值,最小值节点则从作为其孩子节点的最大值节点中寻找最小值。因为假设博弈的双方都是理性的博弈者,所以在这个过程中一定会做出最有利于自身的动作,这是算法成立的先决条件。
但朴素minimax算法的搜索空间会非常非常大,因为要搜索的可能情况非常多,如果暴力穷举所有搜索空间要耗费的时间成本和计算资源非常大。事实上有非常多的情况下,搜索动作完全不需要深入下去,例如上述手稿中示例2,最右侧的MAX节点被直接剪掉,这是因为它的结果不会影响最终的决策(至于为什么请结合John Levine教授的视频加以理解)。所以我们会引入 α β \alpha\beta αβ剪枝的技术来大大减少搜索空间,减少决策时的开销。
B.1 Sequential Alpha Beta Pruning
这部分开始进入正题,开始介绍
α
β
\alpha\beta
αβ剪枝算法。
首先给出串行
α
β
\alpha\beta
αβ剪枝算法的伪代码:
算法的大体流程不再重复介绍,相对于朴素的minimax算法,这里引入了
α
、
β
\alpha、\beta
α、β两个值,分别表示的是最大值节点与最小值节点在当前状况下可以获得的最佳收益候选值,注意算法的递归性。正是因为有了递归性,之前对部分搜索空间搜索的结果可以作为对之后搜索的剪枝的参考值(因为我们要将之前的
α
、
β
\alpha、\beta
α、β临时值传入之后的搜索步骤中作为参照值,从而进行剪枝,如果不理解这点,请看Levine教授的例子,或上述手稿中的worked example II)。
论文中展示了一幅图片,对于这张图片中的博弈树,剪枝算法可以剪掉其中加粗的分枝从而减少了搜索空间。也可以将此树作为示例,自己推理一遍剪枝过程:
B.2 Parallel Alpha Beta Pruning
并行版本和串行版本的差异在于将对每一个子节点的搜索操作完全并行化(但这样不会导致剪枝的失败吗?),其他地方和串行的版本没有什么区别。这里留下一个小小的疑问…
2.EXPERIMENTAL SETUP AND IMPLEMENTATION
A.Prerequisites for the implementation
这部分对实验环境做了简单的介绍,(Linux + Openmp + CUDA)。
B.Algorithm used for implementation of Parallel Alpha Beta
因为这篇文章要进行的是并行化 α β \alpha\beta αβ剪枝算法比较,所以这里说明了一下实现的算法版本和描述。这篇文章实现的并行 α β \alpha\beta αβ剪枝算法基于根分裂算法(这个算法有可能要额外看一篇文章),大概意思就是将根节点的直接孩子分成若干个簇,每一个簇分配给一个专门的处理器来完成计算,簇内的计算按照串行 α β \alpha\beta αβ算法完成,所有簇处理完成之后将结果返回给根节点由其挑选出最优的动作。
除此之外,还施加了另外一种优化手段,由于子节点不同的扩展顺序可能会导致在后续搜索动作中被剪枝掉的节点数量不一样多,所以在选择对哪个节点进行优先扩展是一件非常重要的事情。这篇文章使用了束搜索(Beam Search)的方式,束搜索是一种介于贪心策略和穷举策略之间的折中方案,使用束搜索可以使得整个搜索算法优先搜索最有可能得到最优值的分支,从而导致后续剪枝的可能性大大上升。
C.Mesh Architecture - CUDA
D.Shared Memory Model - OpenMP
这两部分介绍了在CUDA和Openmp中算法的并行模式。
3. EXPERIMENTAL RESULTS
A.Reordering vs Beam Search
首先比较了束搜索相对于按照随机顺序对子节点进行搜索的效率差异,结果证明束搜索可以提升平均2.45倍的执行速度:
B.Mesh Architecture vs Shared Memory Model
既然束搜索是最有效的搜索模式,那么在这一步中CUDA和Openmp均使用束搜索策略进行性能测试,结果显示CUDA的加速效果更好。所以最终结论就是CUDA的网状体系结构+束搜索策略是最好的实现并行 α β \alpha\beta αβ剪枝的策略。
感受
这篇文章做的工作很水,没有什么创新点和独特见解,只当是对并行化 α β \alpha\beta αβ剪枝算法有一点了解吧。