人工智能技术前沿—用少于10行代码训练前沿深度学习新药研发模型

深度学习正在革新药研发行业。在本文中,我们将展示如何使用 DeepPurpose,一个基于 PyTorch 的工具包来解锁 50 多个用于药物-靶标相互作用(Drug-Target Interaction)预测的模型。

 

DTI 预测是新药研发中的一项基本任务。DeepPurpose 的操作模式是像 scikit-learn 一样。只需几行代码,就可以利用最前沿的深度学习和药物研发模型。DeepPurpose 还有一个简单的界面来做 DTI 预测的两个重要应用:虚拟筛选(Virtual Screening)和旧药新用(Drug Repurposing)。

 

发现一种新药要花费 10 年以上的时间,成本要超过 26 亿美元 [1]。最近,许多 AI 药物研发创业公司出现并成功应用了深度学习技术来辅助新药研发,并大大缩短了时间/节省成本[2,3]。在国内前两天在世界人工智能大会,大药厂 AstraZeneca 的演讲和腾讯的云深智药平台发布,都预示着人工智能新药研发将会在未来非常的火。因此,这是一个非常令人兴奋和蓬勃发展的领域!

 

▲ Image by authors.

 

 

背景

 

让我们从一些生物化学概念开始。疾病通常归因于疾病途径中的靶蛋白。药物可以用来调节这个靶蛋白,以此来治愈疾病。相当于是断了这个疾病的发生途径。其中一个主要的药物作用机制是“锁与钥匙”理论 [4]。靶蛋白是“锁” ,而药物是那把合适的“钥匙” 以解锁这个靶蛋白。锁和钥匙的匹配程度也被称为绑定亲和力(binding affinity)。

 

▲ Image permission granted by Christopher Vakoc.

 

药物-靶标相互作用(Drug-Target Interaction, DTI)测量的就是药物分子与蛋白质靶标的结合亲和力。因此,我们可以轻松地想象到,如果一个 DTI 深度学习预测模型能准确预测药物分子与蛋白质靶标的结合亲和,它可以极大地有益于药物的发现 [5]。

 

更具体地说,虚拟筛选(Virtual Screening)和旧药新用(Drug Repurposing)是基于 DTI 的两个主要应用。虚拟筛选有助于识别可以与目标蛋白质结合的配体候选物,而药物重新定位则为现有药物找到新的治疗目的。

 

▲ Image by authors.

 

 

DeepPurpose概述

 

DeepPurpose 将 DTI 模型表述为编码器-解码器 (encoder-decoder) 框架, 这个框架包括以前的大部分工作 [6,7,8,9,10],并还包括了很多新的模型。两个编码器(encoder)分别为药物和蛋白质生成 embedding,然后将它们串联到解码器(decoder)中,在 decoder 中预测结合亲和力(binding affinity score)。DeepPurpose 是用 PyTorch 写的。

 

▲ Image by authors.

 

DeepPurpose 使用最容易的输入数据格式。输入是药物靶标对(drug-target pair),其中药物使用 SMILES 字符串(药物分子图像上的 Depth-First Traversal),而靶蛋白则使用氨基酸序列(amino acid sequence)。输出是指示药物-靶对的结合活性的分数。

 

▲ Image by authors.

 

对于药物分子,我们提供了 8 种 encoder:四个经典的化学信息学指纹(Morgan,Pubchem,Daylight 和 RDKit 2D),并在它们之上用深度神经网络(DNN);1D 卷积神经网络(CNN),在 SMILES 字符串上;在 CNN 之上加上递归神经网络,以利用序列顺序上的信息;子结构分区指纹上的 Transformer [11];分子图上的图神经网络(Message Passing Neural Network)。

 

▲ Image by authors.

 

对于靶蛋白,我们提供了 7 种 encoder:在四个经典计算生物学指纹(AAC,PseAAC,Conjoint Triad, Quasi-sequence)之上的 DNN;在上的氨基酸序列上的 1D CNN;在 CNN 加 RNN;和在 substructure fingerprint 上用 transformer。

 

▲ Image by authors.

 

DeepPurpose 总共提供了 56 种(8 乘 7)模型!另外,大多数模型都是 novel 的!

 

 

DeepPurpose编程框架

 

现在,在对 DTI 和 DeepPurpose 进行概念性概述之后,我将开始介绍 DeepPurpose 编程框架。该框架由几个步骤组成,其中每个步骤都由一行代码组成:

 

  • Data loading(数据加载) 

  • Encoder specification(编码器规格)

  • Data encoding and split(数据编码和分割)

  • Model configuration generation(模型配置生成)

  • Model initialization(模型初始化)

  • Model training(模型训练)

  • Repurposing/Screening(旧药新用/虚拟筛选)

  • Model saving and loading(模型保存和加载)

 

为了获得更好的学习体验,建议在您自己的 Jupyter Notebook 中或通过这个帖子的笔记本执行以下步骤。

 

https://github.com/kexinhuang12345/DeepPurpose/blob/master/Tutorial_1_DTI_Prediction.ipynb

 

要安装 DeepPurpose,您可以使用 DeepPurpose Binder 云笔记本(只需单击链接!):

 

https://mybinder.org/v2/gh/kexinhuang12345/DeepPurpose/master

 

也可以使用本地 DeepPurpose 环境。可以在此处找到安装说明:

 

https://github.com/kexinhuang12345/DeepPurpose#install--usage

 

还可以在其中找到视频安装教程:

 

https://youtu.be/bqinehjnWvE

 

Data loading(数据加载)

 

DeepPurpose 接受 1. 一个药物的 SMILES 字符串的 NumPy array(X_drugs);2. NumPy 阵列的一个靶蛋白的氨基酸序列 NumPy array(X_targets);3. 一个标签 NumPy array(y)。

 

这个 y 可以是 binary 的 0/1,表示这个药物和靶蛋白会不会反应;也可以是表示绑定亲和力值的实数。这个 input 药物和靶蛋白和标签应成对,即 y [0] 是 X_drugs [0] 和 X_targets [0] 的标签。DeepPurpose 会根据数据集自动在二分类任务或回归任务之间切换。 

 

除了通过自己处理转换为 NumPy array 外,DeepPurpose 还提供基准数据集(benchmark)加载器(DAVIS / KIBA / BindingDB)以简化预处理。例如,在本文中,我们将使用 DAVIS 数据集:

 

from DeepPurpose import utils, models, dataset

X_drugs, X_targets, y = dataset.load_process_DAVIS(path = './data', binary = False, convert_to_log = True, threshold = 30)
print('Drug 1: ' + X_drugs[0])
print('Target 1: ' + X_targets[0])
print('Score 1: ' + str(y[0]))

# ------ Output ------
# Beginning Processing...
# Beginning to extract zip file...
# Default set to logspace (nM -> p) for easier regression
# Done!
# Drug 1: CC1=C2C=C(C=CC2=NN1)C3=CC(=CN=C3)OCC(CC4=CC=CC=C4)N
# Target 1: MKKFFDSRREQGGSGLGSGSSGGGGSTSGLGSGYIGRVFGIGRQQVTVDEVLAEGGFAIVFLVRTSNGMKCALKRMFVNNEHDLQVCKREIQIMRDLSGHKNIVGYIDSSINNVSSGDVWEVLILMDFCRGGQVVNLMNQRLQTGFTENEVLQIFCDTCEAVARLHQCKTPIIHRDLKVENILLHDRGHYVLCDFGSATNKFQNPQTEGVNAVEDEIKKYTTLSYRAPEMVNLYSGKIITTKADIWALGCLLYKLCYFTLPFGESQVAICDGNFTIPDNSRYSQDMHCLIRYMLEPDPDKRPDIYQVSYFSFKLLKKECPIPNVQNSPIPAKLPEPVKASEAAAKKTQPKARLTDPIPTTETSIAPRQRPKAGQTQPNPGILPIQPALTPRKRATVQPPPQAAGSSNQPGLLASVPQPKPQAPPSQPLPQTQAKQPQAPPTPQQTPSTQAQGLPAQAQATPQHQQQLFLKQQQQQQQPPPAQQQPAGTFYQQQQAQTQQFQAVHPATQKPAIAQFPVVSQGGSQQQLMQNFYQQQQQQQQQQQQQQLATALHQQQLMTQQAALQQKPTMAAGQQPQPQPAAAPQPAPAQEPAIQAPVRQQPKVQTTPPPAVQGQKVGSLTPPSSPKTQRAGHRRILSDVTHSAVFGVPASKSTQLLQAAAAEASLNKSKSATTTPSGSPRTSQQNVYNPSEGSTWNPFDDDNFSKLTAEELLNKDFAKLGEGKHPEKLGGSAESLIPGFQSTQGDAFATTSFSAGTAEKRKGGQTVDSGLPLLSVSDPFIPLQVPDAPEKLIEGLKSPDTSLLLPDLLPMTDPFGSTSDAVIEKADVAVESLIPGLEPPVPQRLPSQTESVTSNRTDSLTGEDSLLDCSLLSNPTTDLLEEFAPTAISAPVHKAAEDSNLISGFDVPEGSDKVAEDEFDPIPVLITKNPQGGHSRNSSGSSESSLPNLARSLLLVDQLIDL
# Score 1: 7.3655227298392685
# --------------------

 

您还可以使用 dataset.read_file_training_dataset_drug_target_pairs 函数从 txt 文件加载自己的数据集,其中每行是药物 SMILES 字符串,目标氨基酸序列和结合分数。

 

Encoder specification(编码器规格) 

 

获得所需的数据格式后,我们需要首先指定用于药物和蛋白质的编码器 (encoder)。在这里,我们尝试将 MPNN 用作药物,将 CNN 用作靶蛋白的 encoder。请注意,您只需更改编码名称即可切换编码器。此处列出了 DeepPurpose 编码器的完整列表:

 

https://github.com/kexinhuang12345/DeepPurpose#encodings 

 

如果使用 CPU 来运行此文章的 code,您会发现 MPNN 和 CNN 有点大,则可以尝试使用较小的编码器,例如 Morgan 用于药物,而 Conjoint_triad 用于靶蛋白。

 

drug_encoding, target_encoding = 'MPNN', 'CNN'
#drug_encoding, target_encoding = 'Morgan', 'Conjoint_triad'

 

Data encoding and split(数据编码和分割)

 

现在,我们需要使用 utils.data_process 函数为不同的编码器准备数据编码。在这个函数中,我们可以指定 train/validation/test split,随机种子以确保可重复性。

 

它还支持其他数据拆分方法(例如 Cold_drug 和 Cold_protein),该方法可以在药物/蛋白质上进行 split,这样子 test set 就测试 train set 不在的的药物/蛋白质,以此来对模型进行鲁棒性评估。这个函数输出的是训练,验证和测试集的 Pandas Dataframe。

 

train, val, test = utils.data_process(X_drugs, X_targets, y, 
                                drug_encoding, target_encoding, 
                                split_method='random',frac=[0.7,0.1,0.2],
                                random_seed = 1)

# ------ Output ------ 
# in total: 30056 drug-target pairs
# encoding drug...
# unique drugs: 68
# drug encoding finished...
# encoding protein...
# unique target sequence: 379
# protein encoding finished...
# splitting dataset...
# Done.
# --------------------

 

Model configuration generation(模型配置生成)

 

现在,我们要生成一个模型的配置(config)。您可以在此功能中修改几乎所有超参数(例如 learning rate,epoch size,batch size),模型参数(例如hidden dimension,filter size 等等)。所有支持的配置参数在此链接中列出:

 

https://github.com/kexinhuang12345/DeepPurpose/blob/e169e2f550694145077bb2af95a4031abe400a77/DeepPurpose/utils.py#L486

 

config = utils.generate_config(drug_encoding = drug_encoding, 
                         target_encoding = target_encoding, 
                         cls_hidden_dims = [1024,1024,512], 
                         train_epoch = 5, 
                         LR = 0.001, 
                         batch_size = 128,
                         hidden_dim_drug = 128,
                         mpnn_hidden_size = 128,
                         mpnn_depth = 3, 
                         cnn_target_filters = [32,64,96],
                         cnn_target_kernels = [4,8,12]
                        )

 

Model initialization(模型初始化)

 

接下来,我们使用以上配置初始化模型:

 

model = models.model_initialize(**config)

 

Model training(模型训练)

 

现在,只需键入 model.train 函数即可进行训练!

 

model.train(train, val, test)

# ------ Output ------
# Let's use 1 GPU!
# --- Data Preparation ---
# --- Go for Training ---
#Training at Epoch 1 iteration 0 with loss 30.3964. Total time 0.0 hours
# Training at Epoch 1 iteration 100 with loss 0.59583. Total time 0.01277 hours
# Validation at Epoch 1 , MSE: 0.79965 , Pearson Correlation: 0.34392 with p-value: 3.23317 , Concordance Index: 0.67805
# .....
# --- Go for Testing ---
# Testing MSE: 0.5567689292029449 , Pearson Correlation: 0.5585790614300189 with p-value: 0.0 , Concordance Index: 0.783525396597284
# --- Training Finished ---
# --------------------

 

Loss 曲线将自动产生。如果该任务是二分类(binary classification)任务,则还将产生测试集上的 ROC-AUC 和 PR-AUC 曲线。

 

 

Repurposing/Screening(旧药新用/虚拟筛选)

 

训练完模型后,我们可以使用 models.repurpose 和 models.virtual_screening 函数简单地做旧药新用和虚拟筛选。

 

接下来我们来举个例,我们想针对 COVID-19 靶标 3CL 蛋白酶从一组已经上市的抗病毒药物中选取看看会不会反应。我们只要先 load 这个数据然后直接使用 models.repurpose 函数即可。我们在 DeepPurpose.dataset 中提供了相应的数据。

 

target, target_name = dataset.load_SARS_CoV2_Protease_3CL()
repurpose_drugs, repurpose_drugs_name, repurpose_drugs_pubchem_cid = dataset.load_antiviral_drugs()

y_pred = models.repurpose(X_repurpose = repurpose_drugs, target = target, model = model, 
                          drug_names = repurpose_drugs_name, target_name = target_name, 
                          result_folder = "./result/", convert_y = True)

# ------ Output ------
# repurposing...
# in total: 82 drug-target pairs
# encoding drug...
# unique drugs: 81
# drug encoding finished...
# encoding protein...
# unique target sequence: 1
# protein encoding finished...
# Done.
# predicting...
# --------------------

 

DeepPurpose 会自动生成候选药物排名列表:

 

 

注意因为这个模型只训练了几个 Epoch,而且在一个小的数据集上所以这个列表可能不是很准确。但我们发现在大的模型上进行训练,DeepPurpose 产出了很多在临床研究的药物。

 

DeepPurpose 更加实际的应用场景是做缩小高通量筛选实验的范围。在这些列表中,我们可以剔除那些亲和力很低的药物分子,然后把其他的送到高通量筛选实验中,这样子可以大量的减少高通量筛选实验的成本并也不遗漏可能的药物分子。

 

接下来,我们展示如何对 BindingDB 数据集中的数据样本进行虚拟筛选,然后使用 virtual_screening 函数生成具有高结合亲和力的药物-靶标对列表。如果未提供药物/靶标名称,则使用药物/靶标列表的 Index。会生成一个看起来跟上面相似的排名列表。

 

target, drugs = dataset.load_IC50_1000_Samples()
y_pred = models.virtual_screening(drugs, target, model)

# ------ Output ------
# virtual screening...
# in total: 100 drug-target pairs
# encoding drug...
# unique drugs: 100
# drug encoding finished...
# encoding protein...
# unique target sequence: 93
# protein encoding finished...
# Done.
# predicting... 
# --------------------

 

Model saving and loading(模型保存和加载) 

 

最后,保存和加载模型也非常容易。加载功能还自动检测模型是否在多个GPU上训练。保存和加载我们刚刚训练的模型的例子:

 

model.save_model('./tutorial_model')
model = models.model_pretrained(path_dir = './tutorial_model')

 

我们还提供了很多预训练模型,您可以在列表下找到所有可用的模型。

 

https://github.com/kexinhuang12345/DeepPurpose#pretrained-models

 

例如,要加载在 BindingDB Kd 数据集上预先训练的 MPNN + CNN 模型:

 

model = models.model_pretrained(model = 'MPNN_CNN_BindingDB')

# ------ Output ------
# Beginning Downloading MPNN_CNN_BindingDB Model...
# Downloading finished... Beginning to extract zip file...
# pretrained model Successfully Downloaded...
# --------------------

 

That's it!您现在已经可以为药物-靶标相互作用预测任务训练出 State-of-the-art 的深度学习模型了! 

 

DeepPurpose 还支持更多功能,例如,这个链接演示了如何使用 Ax 平台用超参数调整方法,像 Bayesian Optimization 等对 DeepPurpose 进行优化。

 

https://github.com/kexinhuang12345/DeepPurpose/blob/master/DEMO/Drug_Property_Pred-Ax-Hyperparam-Tune.ipynb

 

最后,许多现实世界中的药物开发都涉及 assay,即数据仅由药物分子和与靶标的结合分数组成。该问题也称为药物性质预测(drug property prediction)任务。DeepPurpose 对这类任务也可以用。即只使用药物编码器(drug encoder)来预测结合分数。该框架与 DTI 预测非常相似,如下所示:

 

from DeepPurpose import utils, models, dataset, property_pred

X_drugs, X_targets, y = dataset.load_AID1706_SARS_CoV_3CL(path = './data', binary = True, threshold = 15, balanced = True)

drug_encoding = 'MPNN'

train, val, test = utils.data_process(X_drug = X_drugs, y = y, drug_encoding = drug_encoding,
                                split_method='random',frac=[0.7,0.1,0.2],
                                random_seed = 1)

config = utils.generate_config(drug_encoding = drug_encoding, 
                         cls_hidden_dims = [1024,1024,512], 
                         train_epoch = 5, 
                         LR = 0.001, 
                         batch_size = 128,
                         hidden_dim_drug = 128,
                         mpnn_hidden_size = 128,
                         mpnn_depth = 3
                        )

model = property_pred.model_initialize(**config)

model.train(train, val, test)

 

更详细说明,您可以在此处找到此博客文章的 Jupyter Notebook。

 

DTI 预测:

 

https://github.com/kexinhuang12345/DeepPurpose/blob/master/Tutorial_1_DTI_Prediction.ipynb

 

药物特性预测:

 

https://github.com/kexinhuang12345/DeepPurpose/blob/master/Tutorial_2_Drug_Property_Pred_Assay_Data.ipynb

 

 

总结

 

这就是我们有关 DeepPurpose 和 DTI 预测的博客文章,希望您对深度学习新药研发这个交叉学科开始感兴趣。希望有更多的人能够为这个开源项目做出贡献! 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值