创建国际象棋引擎,机器学习与传统引擎?


17

我既是国际象棋玩家,也是计算机程序员。我会说下棋和编程是我花费最多时间做的两件事。自然,我想创建自己的引擎,并最终创建Lichess机器人。

继去年AlphaZero对Stockfish表现出色之后,我正在考虑是否应该使用机器学习(某种类型的神经网络,可能使用Tensorflow)或传统的,硬编码的启发式算法来创建此引擎。

与其他种类的硬编码相比,我对神经网络不太熟悉。不过,对于我来说,这可能还是学习神经网络的一种好方法。

我正在考虑的另一件事是,使用哪种语言对引擎进行编码是否重要。我知道许多国际象棋引擎都使用C ++,这是我以前从未使用过的。我使用了其他基于C的语言,它们执行许多相同的操作,但语法大多不同。我最熟悉Swift和Javascript,但也熟悉Python,并认为它可以帮到我。

因此,就创建尽可能强大的国际象棋引擎而言,我应该使用神经网络还是硬编码?


4
他们对新AI引擎的关键不在于NN,而是强化学习。RL是一个复杂的主题,但在线上有很好的入门资源,例如David Silver在UCL上的RL讲座(他的网站上的幻灯片和YouTube上的讲座。他在上一堂课中与Deepmind和传统上涵盖过的alphago一起工作。您可能会开发出有趣的AI没有使用硬编码启发式算法和RL的NN引擎,这就是alphago的启动方式
asac-恢复莫妮卡

它不是国际象棋,而是最近出版的《深度学习与游戏围棋》(Deep Learning and the Game Go)一书,展示了如何将NN用于游戏引擎。引擎盖下的Alpha-Go和Alpha-Zero相似。
约翰·科尔曼

考虑到您的Python经验,可能值得一看Nim
Darren H

如果您想参加NN,这很有趣:arxiv.org/abs/1509.01549 github上也有代码:)
蚂蚁

@Ant指出,与顶级引擎相比,长颈鹿从来没有非常强大。(〜2800 elo)
奥斯卡·史密斯,

Answers:


8

第一步:定义您的目标/原因

我认为这是主要因素。以下哪项最适合您?选择一个

  1. 您想享受有趣,富有挑战性的编码任务
  2. 您想创建一个非常好的国际象棋引擎
  3. 您想了解国际象棋引擎如何工作
  4. 您想学习/练习编码技能
  5. 您想学习/实施计算机科学的概念/理论(例如机器学习)
  6. (其他)

IMO可以“抛硬币”(除了2以外的任何东西)是很好的。对于其他所有东西,无论选择ML还是硬编码,您都可以实现自己的目标。但是,您可能希望在选择之间进行比较以帮助您做出决定。

硬编码的情况

下棋(作为人类)涉及逻辑思维。您探索您和对手可以采取的可能行动的空间。这催生了一个称为博弈论的领域,其中包含用于分析博弈的理论框架。

如果您喜欢处理细节,并且对事物进行具体说明和推理,那么这对您来说可能会很好。相比之下,机器学习涉及更多模糊且不透明的“黑匣子”算法。您不知道到底发生了什么。

另外,我认为如果您采用硬编码而不是机器学习的方法,那么“自行解决”的时间会更轻松。减少您不太了解的复制粘贴内容。

机器学习案例

诞生一个创造并看着它活出自己的生命可能会令人兴奋。尽管硬编码是关于精度和细节的,但机器学习却很灵活。带走一些神经元,结果可能会相似。

硬编码是关于学习国际象棋的。机器学习与研究您创造的生物有关。

机器学习当然是一个非常热门的话题。

硬编码的语言选择

我不确定您所说的“其他基于C的语言”是什么意思。C ++是唯一类似于C的主流语言。C/ C ++的优点是它们速度很快。尽管其他语言已经流行了多年,但是C ++仍然为他们提供了赚钱的机会。

C ++并不容易。借助Rust,Golang或Swift等更现代的编译语言,您将获得出色的性能。但是,如果您选择JIT语言,应该不会更糟。即不要使用CPython解释器 ; 使用IronPython或Jython,或Node,或C#或Java。

GPU编程需要另一种方法,因此我建议您不要这样做。

机器学习的语言选择

TensorFlow的问题在于它是非常低级的。与编写专用于机器学习的接口有关的不仅仅是编写数字运算算法(可以将其植入并行硬件)。

当然,这可能是很棒的学习经历!今天当然非常值得学习。但是,您可能要从Keras或PyTorch开始。


1
这是一个惊人的反应,确实达到了我提到的所有要点。很难说为什么我要制造引擎。实际上,我可能不会与Stockfish,Komodo和Leela这样的公司竞争(毕竟我只是一名大学生)。不过,看到我的工作与其他引擎并驾齐驱,而不是每次都被压垮,还是很有趣的。即使我主要的理由是制造强大的引擎,我也可能会学习一种新的编程语言并提高国际象棋知识,这是制造引擎的副产品。
大卫·肖邦

1
我认为,从长远来看,我比我想要的任何东西都可以做,培育和微调。我还希望有一个项目能够客观地告诉我我的代码有多好(Wins / Draws / Losses,ELO等)。
大卫·肖邦

1
这是一个非常有趣的答案,但是出于性能方面的考虑,您是否认真推荐Node over Cpython ?
Evpok

>“ C ++是唯一类似于C的主流语言。” C#?锈?Java的?有很多语言至少是“像C一样的东西”
Maaark

我将“ like C”作为具有C样式语法的经过编译的,高度优化的,实现为机器的语言。C#,Java和PHP都使用虚拟机,它们的代码被编译为操作码,而不是特定于CPU的字节码(PHP的编译是完全透明的,如Python和Bash)。而且Rust不是主流。尽管与其他几种主流语言共享语法样式,但在这些方面,只有C ++才像“ C”。
Ghedipunk

24

如果您想使最强大的引擎成为可能,那么绝对要使用NN引擎。

传统的引擎很棒-可以说,Stockfish在共识硬件上仍然是地球上最强大的引擎-但它们很难编写。这些引擎无法在一夜之间到达目的地。他们花了很多年的时间。例如,鱼类已经连续六年稳步增长。如果您从头开始,您将无法很快达到斯托克鱼的实力;实际上,您很可能会从Stockfish当前所在的位置拖延几百个elo。为了进行比较,目前一些最强大的单作者引擎是EtherealLaserXiphos(我忽略了Houdini&Fire,因为它们不是开源的)。这些引擎都比Stockfish弱得多。

为什么它们这么弱?两个原因:

  1. 在此级别上,开发引擎需要大量的计算能力。您要做的就是仔细检查代码,并确定一个可以发挥作用的想法。一个示例的想法是,“如果我们知道此举可能是好的,请不要搜索使该举动逆转的分支机构”(如果这对您没有意义,那么这也意味着学习曲线也会很高)。然后,您编写一个实现该想法的补丁,并针对先前版本测试修改后的引擎。在此级别上,要获得足够大的样本量才能判断补丁是否有效,需要数万场游戏。玩这些游戏需要大量的计算能力。Stockfish可以使用超级硬件:截至撰写本文时,Stockfish测试场Fishtesting以1038个内核运行。为了进行比较,典型的台式计算机可能具有4-8个内核。

  2. 另一个原因是Stockfish有很多人支持。截至撰写本文时,有5个人正在测试8个补丁。如果查看补丁历史,就会发现更多编写补丁的开发人员。我不知道有多少活跃的Stockfish开发人员,但是肯定是> 20。

另一方面,NN引擎(相对)轻松达到远高于Ethereal / Laser / Xiphos的强度。在最新的国际象棋引擎冠军锦标赛中亲身体验。Ethereal / Laser / Xiphos属于第1联赛,这是足够可信的,但顶级部门(Division P)的引擎是:

  • Stockfish(社区支持的传统引擎,与Fishtesting一起运行)
  • Komodo(商业传统引擎,有专职开发人员)
  • Komodo MCTS(商业半传统引擎,有专职开发人员)
  • Houdini(商业传统引擎,是一个人的努力,两年没有更新)
  • Leela Chess Zero(社区支持的NN引擎,以Fishtesting的模拟名运行,也称为大量硬件)
  • AllieStein(2-人NN引擎)
  • Stoofvlees(NN引擎)
  • ScorpioNN(NN引擎)

最后三个引擎-AllieStein,Stoofvlees和ScorpioNN-都是由小规模的协作,据我所知,他们是像您这样的发烧友,而不是专职开发人员。经过不到两年的尝试,他们已经达到了Div P的实力(所有这些NN引擎仅在AlphaZero之后出现)。为了进行比较,在最近的计算机国际象棋历史上,只有一个人编写过传统引擎,并与他自己成功地与Stockfish&Komodo竞争(Robert Houdart,Houdini的作者)。

的确,您可能没有与Lc0竞争的硬件,但是Lc0具有如此大的计算能力,因为它是一个“零”引擎-它应该在规则之外没有任何人类知识的情况下下棋。您无需使用相同的方法。您可以使用Stein方法,例如使用监督学习的方法。可以说它甚至比“零”更好-毕竟,这是AllieStein在超级决赛中的比赛,而不是Lc0。

结果是:如果您的目标是与世界上最好的引擎竞争,那么与传统引擎相比,您使用NN引擎成功的可能性更大。


6
也许可以提及结论的另一面:如果您的目标是在进行一些编程时加深对国际象棋的了解,那么请遵循传统。
布鲁斯

1
我同意您的结论,但我也建议您使用功能强大的引擎(当然需要获得许可)的最新网络作为起点,而不是从头开始(但以不同于“通过自学和更新来训练”的方式继续进行)权重”,方法是添加或删除图层,添加输入要素,要求其他输出等)。我不记得Lc0是单头还是双头,但我相信3头(ijcai.org/proceedings/2018/0523.pdf)当前尚未由任何国际象棋引擎实现,并且可能最终会改善状态-艺术。
史蒂文·杰克逊

我认为,艾莉(Allie)的搜索使其能够抵抗较弱的引擎(KMCST,Stoofvlees),而不是斯坦因网络。
我的”

@blues我认为对国际象棋引擎进行编程实际上并不能使一个更好的国际象棋玩家-除了拉里·考夫曼(科莫多的开发者之一)之外,没有哪个顶级引擎将游戏者称为开发者,或者他们的开发者成为标题球员。
倾城

@me'是可能的,但是Leelenstein是使用Lc0二进制文件的Stein网络,并且在Chess.com的计算机国际象棋锦标赛上做得很好,因此Stein网络至少可以与Lc0网络相提并论。
倾城

9

因此,就创建尽可能强大的国际象棋引擎而言,我应该使用神经网络还是硬编码?

除非您能够使用荒谬的方法(几百个Nvidia V100),否则请不要选择NN。训练NN下象棋需要大量的硬件。看到为Lc0做出贡献的人们培训超过2亿场比赛。由于您在访问硬件时可能会遇到麻烦(您可以尝试在Google Colabatory获得帮助,但仅此而已,培训将非常缓慢)。

编辑:使用NN在监督学习下,您可以只使用Google Colab并可能使用一个强大的GPU(2080、2080Ti,Radeon VII)。

我正在考虑的另一件事是,使用哪种语言对引擎进行编码是否重要。我知道许多国际象棋引擎都使用C ++,这是我以前从未使用过的。我使用了其他基于C的语言,它们执行许多相同的操作,但语法大多不同。我最熟悉Swift和Javascript,但也熟悉Python,并认为它可以帮到我。

对于强大的国际象棋引擎,Python和Javascript可能太慢了。我没有用过Swift,但是它可能不喜欢macOS以外的平台,因此最好使用C或C ++。您也可以使用Rust,但是它具有许多使人烦恼的安全功能,而您实际上并不需要,这会令人烦恼。由于很难进行某些低级别的优化,因此要获得良好的性能也将变得更加困难。当然,您可以始终以汇编形式编写它,但这可能会花费太多工作。参见https://www.chessprogramming.org/Languages/


1
太好了,非常感谢您提供的信息!我可能会尝试创建一个在FEN位置并输出计算出的移动的API。我认为这是与Lichess机器人集成的最佳方法。
David Chopin


1
是否可以实现仅使用lc0网络的其他NN引擎?
RemcoGerlich

1
据我了解,@ RemcoGerlich,NN引擎使用两件事:二进制文件和神经网络。编写二进制文件并不容易,但是训练神经网络相对容易。从这个意义上说,Lc0衍生物已经存在-Leelenstein和Deus X(又名Fat Fritz)就是这样的衍生物。
魅力

在这种情况下,@ RemcoGerlich并不是真正的不同引擎,而是具有不同包装/接口/其他内容的Ic0引擎。
Peteris

3

我使用以下代码构建了一个纯粹的玩具国际象棋引擎:python国际象棋,不用自己编写游戏规则并只关注逻辑,这真是太好了;但是,我每秒能够评估的职位数量很少。这可能是一个很好的起点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.