如果我让两个引擎以相同的颜色进行对抗,那么每次都会产生相同的游戏吗?如果不是,那么引擎播放中的随机性来自何处?(忽略开始的书,如果我没记错的话,这本书可以告诉引擎在两个动作之间随机选择,因为它们同样好。)
我假设存在随机性,因为在Alphazero与Stockfish的比赛中,同一场比赛没有连续发生很多次。但是我不明白为什么。大概唯一的方法就是让引擎在某些时候打出低于标准的动作,这听起来像seppuku。
如果我让两个引擎以相同的颜色进行对抗,那么每次都会产生相同的游戏吗?如果不是,那么引擎播放中的随机性来自何处?(忽略开始的书,如果我没记错的话,这本书可以告诉引擎在两个动作之间随机选择,因为它们同样好。)
我假设存在随机性,因为在Alphazero与Stockfish的比赛中,同一场比赛没有连续发生很多次。但是我不明白为什么。大概唯一的方法就是让引擎在某些时候打出低于标准的动作,这听起来像seppuku。
Answers:
关于AlphaZero VS鳕鱼干的比赛,这个问题已经涵盖在这里通过SmallChess。
除了AlphaZero(在探索游戏路线时使用专门的Monte Carlo 1例程)之外,AlphaZero 对于构造基于不确定性的通常用于基于启发式的国际象棋引擎(如Stockfish等)(尽管还有其他方法)引擎具有基于MC的例程,而AFAIK Rybka曾经具有这种功能),则随机性的来源通常只是实施过程中技术方面的结果,而不是在引擎的决策中通过算法引入故意的随机性。从抽象上来说,其原因之一是引擎并非以纯粹的顺序方式运行(先执行一项任务又执行另一项任务)。取而代之的是,为了使引擎更高效,它们在可能的动作树的各个分支中执行并行搜索。他们通过所谓的多线程(或-processing,但这有点不同)来做到这一点。因此,CPU的多个线程是并发的执行搜索树的操作(并缓存访问位置的评估结果),因此可以想象每个线程都被分配了一个子树。这种实现方式的问题在于,线程的整体执行高度依赖于各种条件(等待时间,RAM交换等),因此最终可以在不允许所有其他条件的情况下选择主要变体线程以完成搜索。
实际上,确实经常发生这种情况,因为引擎被设置为在一定时间范围内做出决定,因此时间管理会改变行为。您也可以这样说:知道算法并执行确定性线程例程不足以在任何时间t后可靠地预测程序状态。当然,如果始终允许所有线程完成搜索,并且在执行过程中没有并发问题(例如,一个线程试图访问某个不可访问的缓存),那么该行为的确可以完全重现。鉴于其他一切都一样2。
1:事实是,通过额外的训练(例如自玩),其神经网络不断发展(重新调整参数),或者如果您愿意,其评估功能没有固定的固定定义(不同于基于启发式引擎的引擎) )。
2:即使如此,就像您说的那样,在开篇水平上,有一本开篇,有时引擎还是会故意做出关于选择哪个变体的随机决定。同样,在开放阶段之外,有时可能会有多个变化接近相等的评估(在为Eval选择的分辨率内),然后根据设计,最终可能会随机选择一个。最后,在引擎设置级别,您也必须小心,例如搜索深度和为每个引擎选择的思考时间(以及它们是否可以在彼此的思考时间中进一步计算)。
感谢@Phonon详细介绍了我之前的回答。我想再说一点:时间控制。
唯一的确定性时间控制是根据节点数进行的,但这并不常见。更为常见的时间控制- 固定的秒数或游戏时间通常不确定。
让我们尝试一个例子。在您的终端上运行鳕鱼。类型:
走动时间20000
该命令指示引擎在20秒后移动。我的结果:
info depth 23 seldepth 32 multipv 1 score cp 6 upperbound nodes 24325860 nps 1216171 hashfull 999 tbhits 0 time 20002 pv g1f3 d7d5
bestmove g1f3 ponder d7d5
此举是1.Nf3。接下来,我杀死了Stockfish,开始了一个新的。同样,20秒。我有:
info depth 23 seldepth 32 multipv 1 score cp 20 nodes 26185280 nps 1309067 hashfull 999 tbhits 0 time 20003 pv d2d4
bestmove d2d4 ponder g8f6
是1.d4!相同的位置,都20秒搜索!
你有看到?两者都需要20秒的移动时间,但是由于Linux操作系统的波动,我的第二次搜索得到了更深的搜索(26185280> 24325860)。
请注意,这个小实验甚至不是多线程的(线程数= 1)。多线程将使事情变得更加不确定。
在Google AlphaZero比赛中,每走一步给Stockfish一分钟。线程数是64鳕鱼干在这场比赛中的决定不能可能是确定性的。