分子属性梯度引导的3D分子生成扩散模型 TAGMOL - 评测

TAGMoL 是一个基于分子属性条件引导扩散的 3D 分子生成模型,适合在给定靶标蛋白质的情况下,可以生成一系列满足目标特性(分子属性,binding affinity)的候选分子。

一、背景介绍

TAGMoL 来源于新德里 Molecule AI, 以及美国马萨诸塞大学曼宁信息与计算机科学学院 的Vineeth Dorna 和 D. Subhalingam 为通讯作者的文章:《TAGMoL : Target Aware Gradient-guided Molecule Generation》。文章链接:https://arxiv.org/abs/2406.01650 。该文章于 2024 年 6 月 3 日发表在 arxiv 上。

当前基于结构的分子生成模型主要关注配体-靶标结合,在分子生成同时要求生成的配体具有多个理想特性(如类药性和可合成性)时可能存在不足。此外,仅针对靶标配体分布进行训练的模型可能无法满足药物发现的更广泛目标,例如:开发具有所需特性(如药物相似性和可合成性)的新型配体,这凸显了药物设计过程的多面性。为此,TAGMoL 把开发过程分成分子生成和属性预测两部分,属性预测时引导扩散采样过程,从而生成具有目标特性的分子。TAGMoL 与当前最先进的baseline ,平均 vina 打分高出 22%,并且生成的分子也在特性预测方面有良好的表现。

二、模型介绍

TAGMoL  模型是 Target-Aware Gradient-guided Molecule Generation 的简称。其中,将分子生成与特性预测分离开来。首先训练一个时间依赖的引导模型,该模型使用与基础扩散模型相似噪声水平的输入来预测分子属性,即输入含有噪音的特征,引导模型则预测分子属性(类似于扩散模型中的去噪过程,输入白噪音,预测分子)。至关重要的是,将使用低质量数据的挑战(即感兴趣的特性在数据集中包含次优值的情况下分布广泛)转化为稳健引导训练的优势。

受扩散模型中的分类器(classifier guidance in diffusion models)引导的启发,使用引导梯度在扩散采样过程中引导潜在空间,确保重构的分子具有目标属性。在采样阶段,利用了生成模型和引导的优势。这种梯度引导使 TAGMoL  模型能够探索具有优越属性的区域,同时去噪潜在空间以生成多样化的分子。使用梯度引导的许多现有方法不能感知靶标或者整合 3D 结构。我们的方法同时优化3D空间中的靶标感知和分子属性,减少了对后优化技术的依赖。为了解决实际场景中存在的多重特性约束问题,我们为每个属性分别训练了引导模型,在扩散过程中利用它们进行引导。

总的来说,本研究的关键贡献是:

(1)把基于结构的分子生成任务从原来仅考虑优化结合活性扩展到同时考虑多种药理学属性。生成分子的药理学属性优化是通过目标引导模型,利用梯度引导扩散模型采样的区域朝着理想的属性方向倾向。这样可以显著提升生成分子的结合亲和力和药理学属性表现。即使这些属性在训练集中没有充分存在,通过扩散引导也可以实现优化。

(2)在算法上,TAGMoL 联合利用来自两个不同模型的信号:SE(3) 等变图扩散模型来模拟训练集的几何形状,以及由 SE(3) 不变 GNN 赋能的多目标引导模型,通过利用梯度将扩散采样的探索区域引导至感兴趣的属性。

(3)TAGMoL  与当前最先进的 baseline ,平均 vina 打分高出 22%,并且生成的分子也在特性预测方面有良好的表现。

2.1 模型框架

如下图所示,TAGMol  引导模型由两个关键组件构成。一个是引导训练(Guide Training)组件,目标是评估分子和期待的特性的符合程度。另一个是引导采样(Guide sampling)组件,使用引导训练组件,引导扩散模型生成特定性质的分子。

TAGMol 把 TargetDiff 作为主干模型,无需重新训练模型。通过使用引导训练(Guide Training)获得的模型,进行引导采样(Guide sampling),调整分子的坐标以引导扩散采样过程。这样设计使模型在去噪阶段始终以最佳特性值(可以是binding affinity,也可以是特定的QED等属性)为条件,进行分子生成。通过在去噪过程中向最佳特性引导,显著增强了模型生成具有期望特性的分子的能力。

2.2 数据集和基线模型

TAGMol 在 CrossDocked 2020 数据集上进行训练和评估,从原始数据集中,把对接构象和真实构象 RMSD 超过 1 Å ,蛋白序列相似度超过 30% 的对接复合物数据剔除,留下 10 万个对接复合物作为训练数据,另外还划分出 100 个蛋白质作为测试数据。

作者挑选了当前五种最具有代表性的基于结构的 3D 分子生成模型和 TAGMol 作比较,包括:liGAN, AR,Pocket2Mol,TargetDiff, DecompDiff。liGAN 利用条件变分自编码器(CVAE)并在蛋白质-配体结构的原子密度网格表示上进行训练。AR 和 Pocket2Mol 都是基于 GNN ,并使用了自回归框架的方法,通过基于蛋白质口袋和先前生成的原子来生成 3D 分子。TargetDiff 和 DecompDiff 这两种基于扩散模型的方法使用非自回归生成原子坐标和类型。DecompDiff 是在 TargetDiff 的基础上,加入成键考虑和引入侧链和骨架的先验改进而来的。

2.3 评价指标

生成分子的评价指标主要包括分子本身的特性和结合亲和力两个方面。分子特性包括类药性(QED)、可合成性(SA)、生成分子内部多样性(Diversity)和衡量参考分子和生成分子键距离分布差异的 Jensen-Shannon divergences (也称为,JSD散度)。结合亲和力指标包括:生成分子的 Vina 打分(Vina Score)、局部结构最小化之后的 Vina 打分(Vina Min)、生成分子的重新对接打分(Vina Dock)和 生成分子比参考分子亲和力高的百分比(High Affinity)。

作者把 QED≥0.4,SA≥0.5,Vina Dock≤-8.18 kcal/mol 的分子定义为命中分子,统计命中分子在生成分子中的百分比。此百分比称之为 hit rate。

2.4 模型性能

TAGMoL 在多个指标上都取得了 SOTA 的分数。在结合亲和力相关的指标上是所有方法中表现最好的。在分子属性指标上,QED 和 Diversity 和多样性指标上,TAGMoL 的表现与最好的方法相差不大,但在 SA 上,TAGMoL 的表现是最差的。但综合分子特性和结合亲和力两个方面,TAGMoL 生成了最高百分比的命中分子(27.7%)。

TAGMoL 的键距离分布和扩散模型方法基本一致,都比非扩散模型表现更好。这个结果表明引导模型和扩散模型之间可以良好协同,不仅提高了生成目标特性分子的能力,还能保持分子构象。

(下图中,-代表单键,=代表双键,:代表芳香键)

作者对多种属性的引导机制分别进行了消融研究。结果表明,当为一种属性提供引导时,生成分子的相应特性表现良好,并且不会导致其他特性的变差,突显了去噪模型和引导模型之间的协作机制,强调了生成分子的综合表现。特别的是,当为结合亲和力提供引导时,分子的结合亲和力表现明显提升。这可能是使用的对接软件依赖原子距离,引导模型对建模原子距离的偏差进行了归纳,所以得到了明显提升。不依赖于空间结构的 QED 和 SA 的得分提升就相对较小。

下图展示了由 TAGMoL 模型生成的配体分子的例子,具有有效的结构和与目标合理的结合方式。

三、TAGMoL  评测

3.1 安装环境

复制代码项目:

git clone https://github.com/MoleculeAI/TAGMoL .git

创建 TAGMoL 环境

conda create -n TAGMoL  python=3.8.17
conda activate TAGMoL  
conda install pytorch=1.13.1 pytorch-cuda=11.6 -c pytorch -c nvidia
conda install pyg=2.2.0 -c pyg
conda install rdkit=2022.03.2 openbabel=3.1.1 tensorboard=2.13.0 pyyaml=6.0 easydict=1.9 python-lmdb=1.4.1 -c conda-forge

# 安装 vina 对接所需的依赖库
pip install meeko==0.1.dev3 scipy pdb2pqr vina==1.2.2 
python -m pip install git+https://github.com/Valdes-Tresanco-MS/AutoDockTools_py3

此外,在使用对接方法评估生成的分子时,需要将分子和蛋白转化为PDBQT文件,需要新建一个Adt环境。

conda env create -f env_adt.yml
conda activate adt
# 安装 qvina2
conda install -c conda-forge qvina

注:env_adt.yml 文件可以从PMDM中获取。

3.2 分子生成案例测试

作者把处理好的项目数据集和训练好的模型保存在谷歌网盘,链接是 https://drive.google.com/drive/folders/1INaXCjVZCOQ_awNeGl5Xpsde_8JfnJiy 。

其中 data 文件夹中是预处理好的 CrossDock 数据集。pretrained_models 文件夹中是预训练好的模型。logs是作者的三个不同条件的引导模型。results是作者之前的测试结果文件, 目录如下:

.
|-- training_dock_guide_2023_12_17__06_23_35
|   |-- checkpoints
|   `-- training_dock_guide.yml
|-- training_dock_guide_qed_2024_01_06__01_35_21
|   |-- checkpoints
|   `-- training_dock_guide_qed.yml
|-- training_dock_guide_sa_2024_01_20__15_38_49
|   |-- checkpoints
|   `-- training_dock_guide_sa.yml

下载完成后,直接放置在根目录./,完整的项目目录如下:

.
|-- README.md
|-- configs
|-- data
|-- datasets
|-- environment.yml
|-- experiments
|-- logs
|-- logs_diffusion
|-- models
|-- outputs
|-- pretrained_models
|-- results
|-- scripts
`-- utils

12 directories, 2 files

项目提供训练好的模型,TAGMoL  把 TargetDiff 作为主干模型(BackBone模型),训练好的模型是:

./pretrained_models/pretrained_diffusion.pt

训练好的引导模型是保存在 ./logs 中,BA、QED 和 SA 三个特性分别对应:

./logs/training_dock_guide_2023_12_17__06_23_35/checkpoints/184000.pt
./logs/training_dock_guide_qed_2024_01_06__01_35_21/checkpoints/186000.pt
./logs/training_dock_guide_sa_2024_01_20__15_38_49/checkpoints/162000.pt

3.2.1 内置案例

接下来,我们使用训练好的模型生成分子。项目提供的测试集在 ./data/test_set 中,共包含 100 个蛋白,对应的编号范围是 0-99。本次测试以编号为 0 的口袋生成作为测试案例。

TargetDiff模型

仅使用训练好的主干模型生成分子(BackBone),即直接使用TargetDiff进行分子生成,命令如下(默认是对测试集体系进行分子生成,测试集保存在 ./data/test_set 文件夹中,其中,包含了95个体系):

python scripts/sample_diffusion.py \
  configs/sampling.yml \
  --data_id 0

其中,configs/sampling.yml 文件制定了TargetDiff的分子生成参数,内容如下:

model:
  checkpoint: ./pretrained_models/pretrained_diffusion.pt

sample:
  seed: 2021
  num_samples: 100
  num_steps: 1000
  pos_only: False
  center_pos_mode: protein
  sample_num_atoms: prior

通过 --data_id 0 指定编号为 0 的蛋白口袋做分子生成测试。项目提供处理好的蛋白和配体在 ./data/test_set/BSD_ASPTE_1_130_0 文件夹中,PDB ID 是 2Z3H。编号为 0 的蛋白 2Z3H 口袋形状如下,原在口袋中的分子使用stick展示:

配体的 2D 结构如下所示:

在3090显卡上,运行时间为23分钟,运行输出:

[2024-08-15 01:25:21,766::sampling::INFO] {'model': {'checkpoint': './pretrained_models/pretrained_diffusion.pt'}, 'sample': {'seed': 2021, 'num_samples': 100, 'num_steps': 1000, 'pos_only': False, 'center_pos_mode': 'protein', 'sample_num_atoms': 'prior'}}
[2024-08-15 01:25:23,126::sampling::INFO] Training Config: {'data': {'name': 'pl', 'path': './data/crossdocked_v1.1_rmsd1.0_pocket10', 'split': './data/crossdocked_pocket10_pose_split.pt', 'transform': {'ligand_atom_mode': 'add_aromatic', 'random_rot': False}}, 'model': {'denoise_type': 'diffusion', 'model_mean_type': 'C0', 'gt_noise_type': 'origin', 'beta_schedule': 'sigmoid', 'beta_start': 1e-07, 'beta_end': 0.002, 'v_beta_schedule': 'cosine', 'v_beta_s': 0.01, 'num_diffusion_timesteps': 1000, 'loss_v_weight': 100.0, 'v_mode': 'categorical', 'v_net_type': 'mlp', 'loss_pos_type': 'mse', 'sample_time_method': 'symmetric', 'time_emb_dim': 0, 'time_emb_mode': 'simple', 'center_pos_mode': 'protein', 'node_indicator': True, 'model_type': 'uni_o2', 'num_blocks': 1, 'num_layers': 9, 'hidden_dim': 128, 'n_heads': 16, 'edge_feat_dim': 4, 'num_r_gaussian': 20, 'knn': 32, 'num_node_types': 8, 'act_fn': 'relu', 'norm': True, 'cutoff_mode': 'knn', 'ew_net_type': 'global', 'r_feat_mode': 'sparse', 'energy_h_mode': 'basic', 'num_x2h': 1, 'num_h2x': 1, 'r_max': 10.0, 'x2h_out_fc': False, 'sync_twoup': False}, 'train': {'seed': 2021, 'batch_size': 4, 'num_workers': 4, 'max_iters': 10000000, 'val_freq': 2000, 'pos_noise_std': 0.1, 'max_grad_norm': 8.0, 'bond_loss_weight': 1.0, 'optimizer': {'type': 'adam', 'lr': 0.0005, 'weight_decay': 0, 'beta1': 0.95, 'beta2': 0.999}, 'scheduler': {'type': 'plateau', 'factor': 0.6, 'patience': 10, 'min_lr': 1e-06}}}
[2024-08-15 01:25:23,136::sampling::INFO] Successfully load the dataset (size: 100)!
[2024-08-15 01:25:23,221::sampling::INFO] Successfully load the model! ./pretrained_models/pretrained_diffusion.pt
sampling: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [22:14<00:00,  1.33s/it]
100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [23:22<00:00, 1402.63s/it]
[2024-08-15 01:48:45,881::sampling::INFO] Sample done!

运行结束后,生成的文件默认保存在:/outputs目录中,文件名为:result_0.pt(因为我们设置了id 仅为0,因此只有一个result_0.pt文件)。同时,运行分子生成的配置文件 sample.yml 也被保存 。

注:TargetDiff没有直接生成小分子的sdf文件,而是保存在pt文件中。

评价 TargetDiff 模型在编号为 0 的蛋白上生成的分子,命令如下:

python scripts/evaluate_diffusion.py \
  ./outputs \
  --docking_mode vina_score \
  --protein_root data/test_set

制定要评估的生成分子的保存路径是 ./outputs ,命令会检索 ./outputs 中全部匹配 *result_*.pt 的 pt 文件,进行分子评估。评估分子稳定性、 原子稳定性、 成功率、各种键长与测试集的KL散度、QED、SA、Vina score、以及分子中环的出现频率。

运行结束后,会在终端直接输出分子评估整体结果如下:

Evaluate done! 100 samples in total.
mol_stable:   0.2500
atm_stable:   0.9430
recon_success:        0.9800
eval_success: 0.8900
complete:     0.8900
JS bond distances of complete mols: 
JSD_6-6|4:    0.2866
JSD_6-6|1:    0.3469
JSD_6-8|1:    0.3645
JSD_6-7|1:    0.3067
JSD_6-8|2:    0.4282
JSD_6-6|2:    0.3437
JSD_6-7|4:    0.3751
JSD_6-7|2:    0.3808
JSD_CC_2A:    0.2587
JSD_All_12A:  0.0726
Atom type JS: 0.0879
Number of reconstructed mols: 98, complete mols: 89, evaluated mols: 89
QED:   Mean: 0.343 Median: 0.326
SA:    Mean: 0.547 Median: 0.540
Vina Score:  Mean: -3.445 Median: -5.399
Vina Min  :  Mean: -5.247 Median: -6.562
ring size: 3 ratio: 0.000
ring size: 4 ratio: 0.067
ring size: 5 ratio: 0.640
ring size: 6 ratio: 0.831
ring size: 7 ratio: 0.191
ring size: 8 ratio: 0.067
ring size: 9 ratio: 0.011

从返回结果可以看出,生成分子 QED 、 SA 、Vina Score 和 Vina Min 均值分别为 0.343 、 0.547、-3.445 和 -5.247 。生成分子中包含 五、六环的比例分别为 0.640 和 0.831。更多分子评价的细节信息默认保存在  ./outputs/eval_results/metrics_-1.pt 中,包括分子 SMILES 和评价指标数据等信息。

一共生成了 89 个分子,vina score 打分最好的前 10 个分子的 2D 结构展示如下:

TAGMoL 模型

通过梯度引导模型引导 TargrtDiff 主干模型生成分子(BackBone + Gradient Guidance),使用三个特性引导模型(即:sampling_guided_qed_0.33_sa_0.33_ba_0.34.yml 配置文件)生成分子,命令如下:

python scripts/sample_multi_guided_diffusion.py \
  configs/noise_guide_multi/sampling_guided_qed_0.33_sa_0.33_ba_0.34.yml \
  --data_id 0 \
  --result_path ./outputs_TagMols

运行输出:

[2024-08-15 02:23:11,926::sampling::INFO] Guide Name: binding_affinity
[2024-08-15 02:23:11,927::sampling::INFO] Guide Training Config: {'data': {'name': 'pl_dock_guide', 'path': './data/guide/crossdocked_v1.1_rmsd1.0_pocket10', 'split': './data/guide/crossdocked_pocket10_pose_split_dock_guide.pt', 'index_path': './data/guide/crossdocked_v1.1_rmsd1.0_pocket10/index.pkl', 'transform': {'ligand_atom_mode': 'add_aromatic', 'random_rot': False}}, 'model': {'model_mean_type': 'C0', 'beta_schedule': 'sigmoid', 'beta_start': 1e-07, 'beta_end': 0.002, 'v_beta_schedule': 'cosine', 'v_beta_s': 0.01, 'num_diffusion_timesteps': 1000, 'loss_v_weight': 100.0, 'sample_time_method': 'symmetric', 'time_emb_dim': 4, 'time_emb_mode': 'sin', 'center_pos_mode': 'protein', 'node_indicator': True, 'model_type': 'egnn', 'num_blocks': 1, 'num_layers': 9, 'hidden_dim': 128, 'n_heads': 16, 'edge_feat_dim': 4, 'num_r_gaussian': 20, 'knn': 32, 'num_node_types': 8, 'act_fn': 'relu', 'norm': True, 'cutoff_mode': 'knn', 'ew_net_type': 'global', 'num_x2h': 1, 'num_h2x': 1, 'r_max': 10.0, 'x2h_out_fc': False, 'sync_twoup': False, 'update_x': False}, 'train': {'seed': 2021, 'batch_size': 16, 'num_workers': 4, 'n_acc_batch': 1, 'max_iters': 200000, 'val_freq': 2000, 'pos_noise_std': 0.1, 'max_grad_norm': 8.0, 'bond_loss_weight': 1.0, 'optimizer': {'type': 'adam', 'lr': 0.001, 'weight_decay': 0, 'beta1': 0.95, 'beta2': 0.999}, 'scheduler': {'type': 'plateau', 'factor': 0.6, 'patience': 10, 'min_lr': 1e-06}}}
sampling: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [03:23<00:00,  4.92it/s]
sampling: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [03:24<00:00,  4.89it/s]
sampling: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [03:23<00:00,  4.90it/s]
sampling: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [03:26<00:00,  4.84it/s]
sampling: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [03:26<00:00,  4.84it/s]
sampling: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [03:23<00:00,  4.90it/s]
sampling: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [03:25<00:00,  4.87it/s]
sampling: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [03:25<00:00,  4.87it/s]
sampling: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [03:26<00:00,  4.85it/s]
sampling: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [03:21<00:00,  4.95it/s]
 40%|████████████████████████████████████████████████████████████                                                                                          | 10/25 [34:09<51:09, 204.62s/it]
sampling:  38%|████████████████████████████████████████████████████                                                                                      | 377/1000 [01:16<02:06,  4.92it/s]

生成的分子信息默认保存在 ./outputs 中,文件名为 result_0.pt 。在result_0.pt中,数据以字典的形式保存,键名包括 ['data', 'pred_ligand_pos', 'pred_ligand_v', 'pred_ligand_pos_traj', 'pred_ligand_v_traj', 'pred_ligand_pos0_traj', 'pred_ligand_v0_traj', 'time'] 储存生成分子的蛋白口袋、原始配体,生成分子连接情况等信息。在显存为 24 GB 的 3090 上, 该蛋白口袋的分子生成过程大概需要 1.5 个小时。

同样使用类似的命令评价 TagMol生成的分子。如下:

python scripts/evaluate_diffusion.py \
  ./outputs_TagMols \
  --docking_mode vina_score --protein_root data/test_set

指定生成分子的保存路径是 ./outputs ,命令会检索 ./outputs 中全部生成分子文件,进行分子评估。评估分子稳定性、 原子稳定性、 成功率、各种键长与测试集的KL散度、QED、SA、Vina score、以及分子中环的出现频率。TagMol 模型生成的分子,评估结果如下:

Evaluate done! 100 samples in total.
mol_stable:   0.2600
atm_stable:   0.9420
recon_success:        0.9900
eval_success: 0.9500
complete:     0.9500
JS bond distances of complete mols: 
JSD_6-6|4:    0.3250
JSD_6-6|1:    0.3893
JSD_6-8|1:    0.3693
JSD_6-7|1:    0.2880
JSD_6-8|2:    0.3960
JSD_6-6|2:    0.2892
JSD_6-7|4:    0.4279
JSD_6-7|2:    0.3504
JSD_CC_2A:    0.2430
JSD_All_12A:  0.0647
Atom type JS: 0.0864
Number of reconstructed mols: 99, complete mols: 95, evaluated mols: 95
QED:   Mean: 0.423 Median: 0.413
SA:    Mean: 0.511 Median: 0.520
Vina Score:  Mean: -8.571 Median: -8.832
Vina Min  :  Mean: -8.872 Median: -9.062
ring size: 3 ratio: 0.000
ring size: 4 ratio: 0.042
ring size: 5 ratio: 0.726
ring size: 6 ratio: 0.926
ring size: 7 ratio: 0.463
ring size: 8 ratio: 0.042
ring size: 9 ratio: 0.042

从返回结果可以看出,生成分子 QED 、 SA 、Vina Score 和 Vina Min 均值分别为 0.413 、 0.520、-8.832 和 -9.062生成分子中包含 五、六、七环的比例分别为 0.726、0.926 和 0.463,可以看出分子中的环结构的比例非常高,TAGMoL 生成的分子包括更复杂的环结构。

更多分子评价的细节信息默认保存在  ./outputs/eval_results/metrics_-1.pt 中,包括分子 SMILES 和评价指标数据等信息。一共评估了 95 个分子,vina score 打分最好的前 10 个分子的 2D 结构展示如下:

从生成的top 10 vina score 分子结构上来看,虽然分子的 Vina score 要更高,但是生成的分子更多是复杂的多元并环结构,其可合成性和类药性要低于TargetDiff的结果。

TargetDiff 模型与 TagMol的比较

在编号为 0 的蛋白案例上整体来看,TAGMoL 使用了引导模型,在所有的指标上的表现都好于 TargetDiff ,尤其是结合亲和力改善明显(除了SA指标)。

QED

SA

Vina_score

Vina_min

TargetDiff

0.343

0.547

-3.445

-5.247

TAGMoL 

0.423

0.511

-8.571

-8.872

3.2.2 我们的测试案例

(1) 5OU3
使用 TargetDiff 生成分子

下载 5OU3.pdb 使用 MOE 把口袋中的配体另存为 ligand.sdf, 把溶剂、离子、配体等删除只保留蛋白。使用 PyMol 把 5OU3 的配体周围 10 Å 的范围作为口袋,保存为 ./5ou3/pocket_5ou3.pdb。

5uo3蛋白口袋与小分子的结合 pose 如下图。

TargetDiff在5uo3体系上生成的分子,如下所示:

TargetDiff_5uo3

能通过qvina对接的分子有93 个,平均的QED为 0.526, SA平均为 0.600,QVina打分均值为:-5.900。在生成的 93 个分子中,打分最高的3个分子的3D结构如下图,对应的qvina打分分别为-8.5, -8.5, -8.3。

​​​​​​​

使用 TagMol 生成分子

使用 sampling_guided_qed_0.33_sa_0.33_ba_0.34.yml 配置文件,针对5uo3口袋生成分子,即采用SA, QED, Binding同时作为引导条件。TagMol 在 5uo3 体系上生成的分子,如下所示:

outputs_5uo3_Tagmol

能通过qvina对接的分子有97个,平均的QED为0.621, SA平均为:0.566,QVina打分均值为:-6.10。在生成的97个分子中,打分最高的3个分子的3D结构如下图,对应的qvina打分分别为-9.5, -9.1, -9.0。

对应的2D结构图下图:

从上述结果来看,TagMol为了增强结合力(即使,我们在配置文件中也考虑了可合成性 SA 和类药性 QED)尽量去生成含有极性的原子,例如 N 或者 O,而且原子的数量越多,对口袋的占据就越大,那么可以vina score 打分越高。从结果上来看,是优于TargetDiff模型的,但有点钻漏洞了。

(2)3WZE

3WZE 口袋与原来配体小分子的如下图:

使用 TargetDiff 生成分子

在生成的100个分子中,能通过qvina对接的分子有87个,平均的 QED 为 0.636, SA 平均为:0.653,QVina 打分均值为:-7.268 。打分最高的3个分子的3D结构如下图,对应的qvina打分分别为-12.4, -11.6, -11.4。

对应的这三个小分子的2D结构为:

所有100个 TagretDiff 在3wze体系上生成的小分子如下:

outputs_3wze_TargetDiff

使用 TagMol 生成分子

设置生成100个分子,但一共成功生产了87个分子。平均的 QED 为 0.699, SA 平均为:0.630,QVina 打分均值为:-7.500,明显高于 TargetDiff 模型(SA指标下降明显,合成难度增大) 。

打分最高的3个分子的3D结构如下图,对应的qvina打分分别为-12.1, -11.9, -11.7。

对应的这三个小分子的2D结构为:

TagMol 在 3WZE 上生成的分子如下所示:

output_3wze_TagMol

四、总结

TagMol 模型的创新点包括:

(1)研究重新定义了基于结构的分子生成问题,在考虑结合活性的同时也要优化分子本身的类药特性。

(2)针对高质量数据稀缺的问题,开发了 TAGMoL 这一优化的生成方法,结合了两个组件:(a)SE(3) 等变图扩散模型,用来复制训练集中的几何结构;(b) 由 SE(3)不变 GNN 模型驱动的多目标引导模型。可以利用梯度把扩散采样空间导航到感兴趣的性质方向。

(3)评估结果表明,TAGMoL 可以显著提高指标性能。在优化结合亲和力的同时,也平衡了 QED 和 SA 等类药特性。

归纳来说,TagMol 是一个梯度引导的分子生成扩散模型,所生成的小分子可以根据条件引导,实现增强 Vina score。TagMol 基于 TagrtDiff 模型,直接使用了 TargetDiff 模型预训练好的权重。只是额外训练了一个引导网络模型,也称为引导训练(Guide Training)组件。在分子生成过程中,引导训练(Guide Training)组件通过梯度引导 TargetDiff 模型,生成倾向于特定性质的分子(这一过程也称为 引导采样(Guide sampling)组件)。

但目前来看,TagMol 生成的小分子类药性较差,这一点与之前的分子生成模型类似。

注:TagMol测评中代码有修改

  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值