该存储库提供了我们的 NeurIPS 2024 论文《Amortized Planning with Large-Scale Transformers: A Case Study on Chess》的实现。
本文使用国际象棋这一人工智能中具有里程碑意义的规划问题来评估 Transformer 在规划任务中的表现,在该任务中,记忆是徒劳的——即使是大规模的规划任务。为此,我们发布了ChessBench,这是由最先进的国际象棋引擎Stockfish 16提供的包含1000万盘国际象棋棋局的大规模基准数据集,具有合法的走法和价值注释(150亿个数据点)。我们通过监督学习在 ChessBench 上训练具有多达 2.7 亿个参数的 Transformer,并执行广泛的消融来评估数据集大小、模型大小、架构类型和不同预测目标(状态值、动作值和行为克隆)的影响。我们最大的模型学会相当准确地预测新董事会的行动价值,这意味着高度非平凡的概括。尽管没有进行明确的搜索,但我们得出的国际象棋策略解决了具有挑战性的国际象棋难题,并在对抗人类方面取得了令人惊讶的强大 Lichess blitz Elo 2895(大师级别)。我们还与带搜索和不带搜索的 Leela Chess Zero 和 AlphaZero(通过自我对弈在没有监督的情况下训练)进行了比较。我们表明,虽然 Stockfish 基于搜索的算法的非常好的近似可以通过监督学习提炼成大规模的 Transformer,但完美的提炼仍然遥不可及,因此使 ChessBench 非常适合未来的研究。
.
|
├── BayesElo - Elo computation (need to be installed)
|
├── checkpoints - Model checkpoints (need to be downloaded)
| ├── 136M
| ├── 270M
| └── 9M
|
├── data - Datasets (need to be downloaded)
| ├── eco_openings.csv
| ├── test
| ├── train
| └── puzzles.csv
|
├── lc0 - Leela Chess Zero (needs to be installed)
|
├── src
| ├── engines
| | ├── constants.py - Engine constants
| | ├── engine.py - Engine interface
| | ├── lc0_engine.py - Leela Chess Zero engine
| | ├── neural_engines.py - Neural engines
| | └── stockfish_engine.py - Stockfish engine
| |
| ├── bagz.py - Readers for our .bag data files
| ├── config.py - Experiment configurations
| ├── constants.py - Constants, interfaces, and types
| ├── data_loader.py - Data loader
| ├── metrics_evaluator.py - Metrics (e.g., Kendall's tau) evaluator
| ├── puzzles.py - Puzzle evaluation script
| ├── searchless_chess.ipynb - Model analysis notebook
| ├── tokenizer.py - Chess board tokenization
| ├── tournament.py - Elo tournament script
| ├── train.py - Example training + evaluation script
| ├── training.py - Training loop
| ├── training_utils.py - Training utility functions
| ├── transformer.py - Decoder-only Transformer
| └── utils.py - Utility functions
|
├── Stockfish - Stockfish (needs to be installed)
|
├── README.md
└── requirements.txt - Dependencies
将源代码克隆到本地目录:
git clone https://github.com/google-deepmind/searchless_chess.git
cd searchless_chess
该存储库需要 Python 3.10。 pip install -r requirements.txt
将安装所有必需的依赖项。最好在 conda 环境中完成此操作。为此,安装 Anaconda。然后,创建并激活 conda 环境:
conda create --name searchless_chess python=3.10
conda activate searchless_chess
安装pip
并使用它来安装所有依赖项:
conda install pip
pip install -r requirements.txt
如果您有可用的 GPU(强烈建议用于快速训练),那么您可以安装支持 CUDA 的 JAX。
pip install --upgrade " jax[cuda12_pip] " -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html
请注意,jax 版本必须与您希望使用的现有 CUDA 安装相对应(上例中的 CUDA 12)。请参阅 JAX 文档了解更多详细信息。
下载并编译最新版本的Stockfish(适用于类Unix系统):
git clone https://github.com/official-stockfish/Stockfish.git
cd Stockfish/src
make -j profile-build ARCH=x86-64-avx2
cd ../..
按照 Lc0 下载说明进行操作,即
git clone -b release/0.30 --recurse-submodules https://github.com/LeelaChessZero/lc0.git
然后按照 Lc0 构建说明中的描述构建引擎。
我们使用 Lc0 模型目录中最大可能的网络(即Large
网络)来评估 Lc0。要下载该网络,请运行以下命令:
cd lc0/build/release
wget https://storage.lczero.org/files/768x15x24h-t82-swa-7464000.pb.gz
gzip -d 768x15x24h-t82-swa-7464000.pb.gz
cd ../../..
为了计算不同代理的 Elos,我们需要 BayesElo,它可以按如下方式安装:
wget https://www.remi-coulom.fr/Bayesian-Elo/bayeselo.tar.bz2
tar -xvjf bayeselo.tar.bz2
cd BayesElo
make bayeselo
cd ..
要将我们的数据集下载到正确的位置,请运行以下命令:
cd data
./download.sh
cd ..
我们还在下表中提供了各个数据集的下载链接(由于其大小,操作值数据集被分为 2148 个文件,下面仅列出了第一个分片的链接):
分裂 | 行动价值 | 行为克隆 | 状态价值 | 谜题 |
---|---|---|---|---|
火车 | 1.2 GB(1.1 TB) | 34GB | 36GB | - |
测试 | 141MB | 4.1MB | 4.4MB | 4.5MB |
要将预训练模型下载到正确的位置,请运行以下命令:
cd checkpoints
./download.sh
cd ..
在运行任何代码之前,请确保激活 conda 环境并设置PYTHONPATH
:
conda activate searchless_chess
export PYTHONPATH= $( pwd ) /..
要在本地训练模型,请运行以下命令:
cd src
python train.py
cd ..
模型检查点将保存到/checkpoints/local
。
要评估模型的拼图准确性,请运行以下命令:
cd src
python puzzles.py --num_puzzles 10 --agent=local
cd ..
puzzles.py
支持以下代理:
local
9M
、 136M
和270M
stockfish
和stockfish_all_moves
leela_chess_zero_depth_1
、 leela_chess_zero_policy_net
和leela_chess_zero_400_sims
要计算不同代理的 Elo,请运行锦标赛以在它们之间玩游戏,然后计算锦标赛生成的 PGN 文件的 Elo(有关 BayesElo 的更多信息可以在此处找到):
cd src
python tournament.py --num_games=200
cd ../BayesElo
./bayeselo
> ...
ResultSet > readpgn ../data/tournament.pgn
> N game(s) loaded, 0 game(s) with unknown result ignored.
ResultSet > elo
ResultSet-EloRating > mm
> 00:00:00,00
ResultSet-EloRating > exactdist
> 00:00:00,00
ResultSet-EloRating > ratings
> ...
cd ..
要研究模型的行为(例如,计算所有合法棋步的获胜百分比),请启动笔记本服务器,然后在浏览器中打开src/searchless_chess.ipynb
:
jupyter notebook
@inproceedings{ruoss2024amortized,
author = {Anian Ruoss and
Gr{ ' {e}}goire Del{ ' {e}}tang and
Sourabh Medapati and
Jordi Grau{-}Moya and
Li Kevin Wenliang and
Elliot Catt and
John Reid and
Cannada A. Lewis and
Joel Veness and
Tim Genewein},
title = {Amortized Planning with Large-Scale Transformers: A Case Study
on Chess},
booktitle = {NeurIPS},
year = {2024}
}
版权所有 2024 DeepMind 技术有限公司
所有软件均根据 Apache 许可证 2.0 版 (Apache 2.0) 获得许可;除非遵守 Apache 2.0 许可证,否则您不得使用此文件。您可以在以下位置获取 Apache 2.0 许可证的副本:https://www.apache.org/licenses/LICENSE-2.0
模型权重根据 Creative Commons Attribution 4.0 (CC-BY) 获得许可。您可以通过以下网址获取 CC-BY 许可证副本:https://creativecommons.org/licenses/by/4.0/legalcode
数据集的某些部分通过 lichess.org 的知识共享 CC0 许可证属于公共领域。数据集的其余部分已根据知识共享署名 4.0 (CC-BY) 获得许可。您可以通过以下网址获取 CC-BY 许可证副本:https://creativecommons.org/licenses/by/4.0/legalcode。
除非适用法律要求或书面同意,否则根据 Apache 2.0 或 CC-BY 许可分发的软件和材料均按“原样”分发,不附带任何明示或暗示的保证或条件。请参阅特定语言的许可证,了解这些许可证下的权限和限制。
这不是 Google 官方产品。