0%

chemprop学习笔记

这学期做了一个计算毒理学的项目,想使用图神经网络的方式来预测化合物的毒性。在一篇论文中学习到一种定向信息传递网络方法,我之前看过一两本图神经网络的书,于是想将这个方法作为进一步学习的契机。

Analyzing Learned Molecular Representations for Property Prediction

论文阅读笔记

原文中提到了几个未解决的问题,包括:

  1. 学习的分子表示与指纹或描述符之间的比较,当前关于这个问题的研究结果并不明确。

  2. 目前的评估框架能否衡量方法在应用于新的化学空间时的泛化能力是一个问题。以及卷积模型可能会过度关注分子的结构或者重复出现的分子骨架,从而导致模型不能很好地泛化到新的、不同的分子。

  3. 如何对分子属性预测模型进行有意义的评估,以考虑训练数据和测试数据之间的叠合情况,以满足泛化要求

模型有两个显著特点:(1)它使用一种混合表示,结合了卷积和描述符,具有学习任务特定编码的灵活性,同时具有固定描述符的强先验。 (2)它通过在化学键上进行卷积而不是在原子上进行卷积来学习构建分子编码,从而避免在算法的消息传递阶段中出现不必要的循环。

该论文通过设计一个全面的评估框架,旨在回答如何评估神经网络体系结构以及如何进行分子属性预测的问题。同时,该论文提出了一种新的算法,该算法在多个数据集上均优于现有的强基线模型。该模型具有两个独特的特征:(1)它结合了卷积和描述符,这使其具有学习任务特定编码的灵活性,同时提供了固定描述符的强先验知识。(2)它通过针对化学键而不是原子的卷积来学习构建分子编码,从而避免了在算法的信息传递阶段中出现不必要的循环。
该模型属于图卷积神经网络的一类,能够直接从数据中学习自己的专家特征表示,具有很高的灵活性和捕捉复杂关系的能力。在相关研究中,已经有很多关于分子属性预测的方法,如使用支持向量机和随机森林等模型来应用专业工程化的描述符或指纹,或者直接应用于SMILES字符串或分子的基础图中。该论文中的模型与Message Passing Neural Network (MPNN) 框架相似,但是在其基础上采用了基于更新有向键的表示的消息传递模式,并进一步将计算的分子级特征与MPNN学习的分子表示相结合,从而进一步提高了该模型的性能。

DMPNN1.png

D-MPNN 的读出阶段与通用 MPNN 的读出阶段相同。在我们的读出函数 R 的实现中,首先将原子隐藏状态相加,得到分子的特征向量。

在 D-MPNN 中,信息传递阶段通过有向边的信息传递,将图结构中的信息传递给下一层。而读出阶段是将这些信息从图结构中提取出来,形成对整个分子的表征。

在该句话中,作者提到了在读出阶段的实现中,将原子隐藏状态相加来获得分子特征向量。这个特征向量可以被用来进一步进行分子属性预测等任务

The readout phase of the D-MPNN is the same as the readout phase of a generic MPNN. In our implementation of the readout function R, we first sum the atom hidden states to obtain a feature vector for the molecule


第二部分 chemprop—DMPNN的实现库

在这篇研究中,他们提供了一个可以用于训练D-MPNN模型的python库。https://github.com/chemprop/chempropchemprop官方文档

这篇文章就是我在学习这个库时做的笔记。

demo

在kevin的讲座中展示了chemprop的一个demo

里面提到Chemprop has been applied in many subsequent publications, e.g.:

demo中主要是展示了使用python script的方法对model进行训练和预测。

  1. 模型训练

模型训练时,可以将参数作为字符串列表传入。

可设置参数很完善,具体见:chemprop.args.TrainArgs

1
2
3
4
5
6
7
8
arguments = [
'--data_path', 'data/tox21.csv',
'--dataset_type', 'classification',
'--save_dir', 'tox21_checkpoints'
]

args = chemprop.args.TrainArgs().parse_args(arguments)
mean_score, std_score = chemprop.train.cross_validate(args=args, train_func=chemprop.train.run_training)
  1. 模型预测

模型预测大致有两步要走,首先是要加载预训练好的模型,然后是读取数据进行预测。

可以通过两种方式读取分子信息作为输入”a list of smiles” or “a csv file”
使用一个csv

1
2
3
4
5
6
7
arguments = [
'--test_path', 'data/tox21.csv',
'--preds_path', 'tox21_preds.csv',
'--checkpoint_dir', 'tox21_checkpoints'
]
args = chemprop.args.PredictArgs().parse_args(arguments)
preds = chemprop.train.make_predictions(args=args)

如果你只想在脚本内部使用预测结果preds,而不保存文件,将preds_path设置为/dev/null。

使用smiles列表进行预测

1
2
3
4
5
6
7
8
9
10
11
import chemprop

smiles = [['CCC'], ['CCCC'], ['OCC']]
arguments = [
'--test_path', '/dev/null',
'--preds_path', '/dev/null',
'--checkpoint_dir', 'tox21_checkpoints'
]

args = chemprop.args.PredictArgs().parse_args(arguments)
preds = chemprop.train.make_predictions(args=args, smiles=smiles)

如果提供了一系列SMILES作为输入,给定的test_path将被丢弃。

如果要连续预测多组分子,更高效的做法是只加载chemprop模型一次,然后使用预加载的模型进行预测。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import chemprop

arguments = [
'--test_path', '/dev/null',
'--preds_path', '/dev/null',
'--checkpoint_dir', 'tox21_checkpoints'
]

args = chemprop.args.PredictArgs().parse_args(arguments)

model_objects = chemprop.train.load_model(args=args)

smiles = [['CCC'], ['CCCC'], ['OCC']]
preds = chemprop.train.make_predictions(args=args, smiles=smiles, model_objects=model_objects)

smiles = [['CCCC'], ['CCCCC'], ['COCC']]
preds = chemprop.train.make_predictions(args=args, smiles=smiles, model_objects=model_objects)

超参数优化

MPNNs的性能,就像大多数神经网络一样,很大程度上取决于各种模型超参数的设置,例如神经网络层的隐藏大小。因此,为了最大化性能,我们使用Hyperopt49 Python包通过贝叶斯优化进行超参数优化。我们具体优化了模型的深度(消息传递步骤的数量)、隐藏大小(键消息向量的大小)、前馈网络层数以及丢弃概率。

命令行制行超参数优化代码。

1
chemprop_hyperopt --data_path <data_path> --dataset_type <type> --num_iters <n> --config_save_path <config_path>

最后超参数优化结果会被以json的形式放入中。

请注意,超参数优化脚本会看到所有提供给它的数据。预期的使用方式是在训练集上运行超参数优化脚本。如果你需要为几个不同的交叉验证拆分分别优化超参数,你可以设置一个bash脚本,以在每个拆分的训练和验证数据上分别运行hyperparameter_optimization.py,并保留测试数据。
这种设置可以确保在每个拆分的训练和验证数据上进行超参数优化,并且最终的测试数据集仍然保持独立,用于评估模型的最终性能。通过这种方式,你可以获取对模型在不同数据集上性能的更准确评估,并选择适合整个数据集的最佳超参数配置。

超参数优化接口
https://chemprop.readthedocs.io/en/latest/hyperopt.html

可以直接使用命令行指令进行超参数优化。