RobertTLange/evosax
Evolution Strategies in JAX 🦎
evosax – JAX 中的进化策略
它是什么
- 一个纯 Python 库,在 JAX 之上实现了超过 30 种现代和经典的进化策略 (ES) 以及基于种群的优化器。通过利用 JAX 的 XLA 编译和转换原语 (
jit,vmap,lax.scan),这些算法可以在 CPU、GPU 和 TPU 上高效运行,而无需编写自定义的分布式代码。
为什么它很重要
- ES 是一类无梯度优化方法,广泛应用于神经进化、强化学习策略搜索、超参数调优和黑盒优化。
evosax使这些方法实现了向量化和硬件加速,让研究人员能够扩展那些原本受限于 Python 循环或手动并行化的实验。
主要特性
| 特性 | 详情 |
|---|---|
| 广泛的算法目录 | 30 多种策略,包括 CMA‑ES, Sep‑CMA‑ES, xNES, SNES, OpenAI‑ES, ARS, Guided‑ES, ASEBO, Persistent‑ES, Noise‑Reuse‑ES, SV‑CMA‑ES, SimpleGA, MR15‑GA 等。 |
| JAX 原生 API | 使用经典的 ask → evaluate → tell 循环;所有组件均与 JAX 兼容,并可通过 jit, vmap, scan 进行转换以实现大规模并行。 |
| 无状态设计 | 算法状态是一个显式的不可变对象,易于进行检查点保存、重放或集成到函数式流水线中。 |
| 开箱即用的 Notebook | 每个算法都提供了 Colab 链接(例如 BBOB 基准测试、RL 策略搜索、持久化 ES),无需任何配置即可尝试该库。 |
| 经过测试与 CI 保护 | 徽章显示了持续集成覆盖率、使用 Ruff 进行的代码检查以及已发布的 PyPI 包。 |
| 参考支持 | 每个实现都链接到原始论文,以便用户可以追溯确切的算法细节。 |
典型用例
- 神经进化:为 RL 智能体或监督任务进化神经网络权重或架构。
- 黑盒优化:在无法获取梯度的情况下优化昂贵的函数(例如模拟参数、超参数)。
- 基准测试:运行标准的 BBOB 或 RL 套件来比较不同的 ES 变体。
- 研究:通过继承基础
Algorithm类并重用 JAX 工具来原型化新的 ES 想法。
安装
pip install evosax
该包需要 Python 3.8+ 和 JAX(根据需要选择 CPU、GPU 或 TPU 版本)。
快速开始
import jax
from evosax.algorithms import CMA_ES
# 虚拟目标函数 – 请替换为您自己的函数
def fitness_fn(params):
return -jnp.sum(jnp.square(params))
# 创建一个 CMA‑ES 优化器
es = CMA_ES(population_size=32, solution=jax.random.normal(jax.random.key(0), (10,)))
params = es.default_params
key = jax.random.key(0)
state = es.init(key, es.solution, params)
for gen in range(100):
key, ask_key, eval_key = jax.random.split(key, 3)
pop, state = es.ask(ask_key, state, params) # 提出候选解
fitness = fitness_fn(pop) # 评估它们
state, metrics = es.tell(eval_key, pop, fitness, state, params)
print('最佳解:', state.best_solution)
print('最佳适应度 :', state.best_fitness)
该循环反映了教科书式的 ES 工作流程,但得益于 JAX,整个种群的评估可以在一次向量化调用中完成。
文档与示例
- 该仓库在
docs/文件夹中提供了徽标和徽章,每个算法条目都包含一个指向 Colab notebook (examples/) 的直接链接。 - 随附的 arXiv 论文 (2212.04180) 描述了其设计理念和性能基准。
谁应该尝试它
- 已经在深度学习或科学计算中使用 JAX,并且需要快速、可扩展的黑盒优化器的研究人员和工程师。
- 任何有兴趣在同一硬件栈上比较 ES 与基于梯度的方法的人。
以上所有信息均直接取自该项目的 README;未添加任何外部声明。
相关
- 项目
- 项目
- 项目
- 项目
- 项目