Design-Bench
收藏Design-Bench 数据集概述
数据集描述
Design-Bench 是一个用于解决自动设计问题的基准测试框架,涉及选择一个输入以最大化一个黑盒函数。这种类型的优化在科学和工程领域有广泛应用,例如设计具有特定功能的蛋白质和DNA序列、化学公式和分子子结构、机器人形态和控制器等。
数据集目标
目标是在不查询新数据点的情况下,找到一个输入 x 以最大化未知黑盒函数 f。函数 f 通常难以评估或成本高昂,例如在蛋白质设计中需要湿实验室实验。f 由一组函数评估描述:D = {(x_0, y_0), (x_1, y_1), ... (x_n, y_n)}。
安装指南
Design-Bench 可以通过 pip 包安装,包含完整的基准测试集: bash conda create -n mbo -c conda-forge rdkit pip install design-bench[all]==2.0.20 pip install morphing-agents==1.5.1
或者选择最小安装(不包含 MuJoCo): bash conda create -n mbo -c conda-forge rdkit pip install design-bench==2.0.20
可用任务
以下表格列出了支持的数据集和目标函数组合,✅ 表示特定组合已经过测试并可从服务器下载。
| Dataset Oracle | Exact | Gaussian Process | Random Forest | Fully Connected | LSTM | ResNet | Transformer |
|---|---|---|---|---|---|---|---|
| TF Bind 8 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| GFP | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
| ChEMBL | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
| UTR | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
| Hopper Controller | ✅ | ✅ | ✅ | ✅ | |||
| Superconductor | ✅ | ✅ | ✅ | ||||
| Ant Morphology | ✅ | ✅ | ✅ | ✅ | |||
| DKitty Morphology | ✅ | ✅ | ✅ | ✅ |
任务详情
以下是每个任务的详细信息,包括数据集大小和 Spearmans ρ 值。
| Task Name | Dataset | Oracle | Dataset Size | Spearmans ρ |
|---|---|---|---|---|
| TFBind8-Exact-v0 | TF Bind 8 | Exact | 65792 | |
| GFP-Transformer-v0 | GFP | Transformer | 56086 | 0.8497 |
| ChEMBL-ResNet-v0 | ChEMBL | ResNet | 40516 | 0.3208 |
| UTR-ResNet-v0 | UTR | ResNet | 280000 | 0.8617 |
| HopperController-Exact-v0 | Hopper Controller | Exact | 3200 | |
| Superconductor-RandomForest-v0 | Superconductor | Random Forest | 21263 | 0.9155 |
| AntMorphology-Exact-v0 | Ant Morphology | Exact | 25009 | |
| DKittyMorphology-Exact-v0 | DKitty Morphology | Exact | 25009 |
基准性能
以下是不同方法在各个任务上的性能表现,以标准化形式报告,1.0 表示性能等同于完整未观测数据集中表现最好的设计,0.0 表示性能等同于最差的设计。
连续任务
| Method Task | GFP | TF Bind 8 | UTR | ChEMBL |
|---|---|---|---|---|
| Auto. CbAS | 0.865 ± 0.000 | 0.910 ± 0.044 | 0.650 ± 0.006 | 0.470 ± 0.000 |
| CbAS | 0.865 ± 0.000 | 0.927 ± 0.051 | 0.650 ± 0.002 | 0.517 ± 0.055 |
| BO-qEI | 0.254 ± 0.352 | 0.798 ± 0.083 | 0.659 ± 0.000 | 0.333 ± 0.035 |
| CMA-ES | 0.054 ± 0.002 | 0.953 ± 0.022 | 0.666 ± 0.004 | 0.350 ± 0.017 |
| Grad. | 0.864 ± 0.001 | 0.977 ± 0.025 | 0.639 ± 0.009 | 0.360 ± 0.029 |
| Grad. Min | 0.864 ± 0.000 | 0.984 ± 0.012 | 0.647 ± 0.007 | 0.361 ± 0.004 |
| Grad. Mean | 0.864 ± 0.000 | 0.986 ± 0.012 | 0.647 ± 0.005 | 0.373 ± 0.013 |
| MINs | 0.865 ± 0.001 | 0.905 ± 0.052 | 0.649 ± 0.004 | 0.473 ± 0.057 |
| REINFORCE | 0.865 ± 0.000 | 0.948 ± 0.028 | 0.646 ± 0.005 | 0.459 ± 0.036 |
离散任务
| Method Task | Superconductor | Ant Morphology | DKitty Morphology | Hopper Controller |
|---|---|---|---|---|
| Auto. CbAS | 0.421 ± 0.045 | 0.884 ± 0.046 | 0.906 ± 0.006 | 0.137 ± 0.005 |
| CbAS | 0.503 ± 0.069 | 0.879 ± 0.032 | 0.892 ± 0.008 | 0.141 ± 0.012 |
| BO-qEI | 0.402 ± 0.034 | 0.820 ± 0.000 | 0.896 ± 0.000 | 0.550 ± 0.118 |
| CMA-ES | 0.465 ± 0.024 | 1.219 ± 0.738 | 0.724 ± 0.001 | 0.604 ± 0.215 |
| Grad. | 0.518 ± 0.024 | 0.291 ± 0.023 | 0.874 ± 0.022 | 1.035 ± 0.482 |
| Grad. Min | 0.506 ± 0.009 | 0.478 ± 0.064 | 0.889 ± 0.011 | 1.391 ± 0.589 |
| Grad. Mean | 0.499 ± 0.017 | 0.444 ± 0.081 | 0.892 ± 0.011 | 1.586 ± 0.454 |
| MINs | 0.469 ± 0.023 | 0.916 ± 0.036 | 0.945 ± 0.012 | 0.424 ± 0.166 |
| REINFORCE | 0.481 ± 0.013 | 0.263 ± 0.032 | 0.562 ± 0.196 | -0.020 ± 0.067 |
任务 API
Design-Bench 任务共享一个在 design_bench/task.py 中定义的通用接口,提供一组输入设计 task.x 和一组输出预测 task.y。此外,可以使用 y = task.predict(x) 评估新输入设计的性能。
示例代码
python import design_bench task = design_bench.make(TFBind8-Exact-v0)
def solve_optimization_problem(x0, y0): return x0 # 解决一个基于模型的优化问题
解决并评估最佳输入 x_star
x_star = solve_optimization_problem(task.x, task.y) y_star = task.predict(x_star)
数据集 API
数据集提供关于黑盒函数的信息,并用于在 Design-Bench 中拟合近似目标模型。所有数据集继承自 design_bench.datasets.dataset_builder 中定义的 DatasetBuilder 类。
示例代码
python from design_bench.datasets.discrete.gfp_dataset import GFPDataset dataset = GFPDataset()
将 x 转换为分类概率分布的 logits
dataset.map_to_logits() discrete_x = dataset.to_integers(dataset.x)
将输入归一化为零均值和单位方差
dataset.map_normalize_x() original_x = dataset.denormalize_x(dataset.x)
将输出归一化为零均值和单位方差
dataset.map_normalize_y() original_y = dataset.denormalize_y(dataset.y)
修改数据集的分布
dataset.subsample(max_samples=10000, distribution="uniform", min_percentile=10, max_percentile=90)
更改输出的函数
dataset.relabel(lambda x, y: y ** 2 - 2.0 * y)
将数据集拆分为验证集
training, validation = dataset.split(val_fraction=0.1)
自定义数据集
如果需要定义自己的数据集,可以直接实例化连续或离散数据集。DiscreteDataset 和 ContinuousDataset 类接受输入 x 和输出 y 的 numpy 数组。
示例代码
python from design_bench.datasets.discrete_dataset import DiscreteDataset from design_bench.datasets.continuous_dataset import ContinuousDataset import numpy as np
创建虚拟输入和输出
x = np.random.randint(500, size=(5000, 43)) y = np.random.uniform(size=(5000, 1))
创建离散数据集
dataset = DiscreteDataset(x, y)
创建虚拟输入和输出
x = np.random.uniform(size=(5000, 871)) y = np.random.uniform(size=(5000, 1))
创建连续数据集
dataset = ContinuousDataset(x, y)
磁盘资源数据集
如果数据集保存在一组分片 numpy 文件中,可以使用 DiskResource 类创建数据集。DiscreteDataset 和 ContinuousDataset 类接受输入 x 和输出 y 的分片列表。
示例代码
python from design_bench.disk_resource import DiskResource from design_bench.datasets.discrete_dataset import DiscreteDataset from design_bench.datasets.continuous_dataset import ContinuousDataset import os import numpy as np
列出每个分片的磁盘资源
os.makedirs("new_dataset/") x = [DiskResource("new_dataset/shard-x-0.npy"), DiskResource("new_dataset/shard-x-1.npy")] y = [DiskResource("new_dataset/shard-y-0.npy"), DiskResource("new_dataset/shard-y-1.npy")]
创建虚拟输入和输出
xs = np.random.randint(500, size=(5000, 43)) ys = np.random.uniform(size=(5000, 1))
将数据集保存到分片文件
np.save("new_dataset/shard-x-0.npy", xs[:3000]) np.save("new_dataset/shard-x-1.npy", xs[3000:]) np.save("new_dataset/shard-y-0.npy", ys[:3000]) np.save("new_dataset/shard-y-1.npy", ys[3000:])
创建离散数据集
dataset = DiscreteDataset(x, y)
创建虚拟输入和输出
xs = np.random.uniform(size=(5000, 871)) ys = np.random.uniform(size=(5000, 1))
将数据集保存到分片文件
np.save("new_dataset/shard-x-0.npy", xs[:3000]) np.save("new_dataset/shard-x-1.npy", xs[3000:]) np.save("new_dataset/shard-y-0.npy", ys[:3000]) np.save("new_dataset/shard-y-1.npy", ys[3000:])
创建连续数据集
dataset = ContinuousDataset(x, y)
Oracle API
Oracle 提供了一种在不进行额外实际实验的情况下测量模型优化算法找到的候选解决方案性能的方法。Oracle 实现了一个预测函数 oracle.predict(x),该函数接受一组设计并对其性能进行预测。
示例代码
python from design_bench.datasets.discrete.gfp_dataset import GFPDataset from design_bench.oracles.tensorflow import TransformerOracle
创建数据集和噪声 oracle
dataset = GFPDataset() oracle = TransformerOracle(dataset, noise_std=0.1)
def solve_optimization_problem(x0, y0): return x0 # 解决一个基于模型的优化问题
评估解决方案 x_star 的性能
x_star = solve_optimization_problem(dataset.x, dataset.y) y_star = oracle.predict(x_star)
近似 Oracle
Design-Bench 提供了一组近似 Oracle,包括高斯过程、随机森林和几种专门针对特定数据模式的深度神经网络架构。这些近似 Oracle 可能具有以下参数:
示例代码
python from design_bench.datasets.discrete.gfp_dataset import GFPDataset from design_bench.oracles.tensorflow import TransformerOracle
Transformer 架构的参数
model_kwargs=dict( hidden_size=64, feed_forward_size=256, activation=relu, num_heads=2, num_blocks=4, epochs=20, shuffle_buffer=60000, learning_rate=0.0001, dropout_rate=0.1)
构建验证集的参数
split_kwargs=dict( val_fraction=0.1, subset=None, shard_size=5000, to_disk=True, disk_target="gfp/split", is_absolute=False)

- 1Design-Bench: Benchmarks for Data-Driven Offline Model-Based Optimization加州大学伯克利分校 · 2022年



