用少于10行代码训练前沿深度学习新药研发模型

2020 年 7 月 11 日 图与推荐

本文原创作者知乎链接为https://www.zhihu.com/people/kexin-95-6.

「总结」:深度学习正在革新药研发行业。在本文中,我们将展示如何使用DeepPurpose,一个基于PyTorch的工具包来解锁50多个用于药物-靶标相互作用(Drug-Target Interaction)预测的模型。DTI预测是新药研发中的一项基本任务。DeepPurpose的操作模式是像scikit-learn一样。只需几行代码,就可以利用最前沿的深度学习和药物研发模型。DeepPurpose还有一个简单的界面来做DTI预测的两个重要应用:虚拟筛选(Virtual Screening)和旧药新用(Drug Repurposing)。要了解更多信息,请访问「arxiv文章」https://arxiv.org/abs/2004.08919「Github」https://github.com/kexinhuang12345/DeepPurpose


发现一种新药要花费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。

Images 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。「请注意,您只需更改编码名称即可切换编码器」「此处」https://github.com/kexinhuang12345/DeepPurpose#encodings列出了DeepPurpose编码器的完整列表。

(如果使用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')

我们还提供了很多预训练模型,您可以在列表下找到所有可用的模型。例如,要加载在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还支持更多功能,例如,这个「链接」https://github.com/kexinhuang12345/DeepPurpose/blob/master/DEMO/Drug_Property_Pred-Ax-Hyperparam-Tune.ipynb演示了如何使用Ax平台用超参数调整方法,像Bayesian Optimization等对DeepPurpose进行优化。


最后,许多现实世界中的药物开发都涉及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预测的博客文章!希望您对深度学习新药研发这个交叉学科开始感兴趣!希望有更多的人能够为这个「开源项目」https://github.com/kexinhuang12345/DeepPurpose做出贡献!

要了解更多信息,请访问「arxiv文章」https://arxiv.org/abs/2004.08919「Github」https://github.com/kexinhuang12345/DeepPurpose,请star,分享并contribute!

这篇文章是由我,Kexin Huang,还有Tianfan Fu,Lucas Glass,Marinka Zitnik,Cao Xiao和Jimeng Sun共同合作。

如果您有任何疑问或反馈或文章中有任何不妥的地方,请随时通过kexinhuang@hsph.harvard.edu与我联系;或者就在Twitter @ KexinHuang5,「知乎」https://www.zhihu.com/people/kexin-95-6上直接私我!


Reference

[1] Mullard, A. New drugs cost US$2.6 billion to develop. Nature Reviews Drug Discovery (2014).

[2] Fleming, Nic. How artificial intelligence is changing drug discovery. Nature (2018).

[3] Smalley, E. AI-powered drug discovery captures pharma interest. Nature Biotechnology (2017).

[4] Gschwend DA, Good AC, Kuntz ID. Molecular docking towards drug discovery. Journal of Molecular Recognition: An Interdisciplinary Journal (1996).

[5] Mayr, Andreas, et al. Large-scale comparison of machine learning methods for drug target prediction on ChEMBL. Chemical science (2018).

[6] Öztürk H, Özgür A, Ozkirimli E. DeepDTA: deep drug-target binding affinity prediction. Bioinformatics (2018).

[7] Nguyen, Thin, Hang Le, and Svetha Venkatesh. GraphDTA: prediction of drug–target binding affinity using graph convolutional networks. BioRxiv (2019).

[8] Tsubaki, Masashi, Kentaro Tomii, and Jun Sese. Compound–protein interaction prediction with end-to-end learning of neural networks for graphs and sequences. Bioinformatics (2019).

[9] Lee, Ingoo, Jongsoo Keum, and Hojung Nam. DeepConv-DTI: Prediction of drug-target interactions via deep learning with convolution on protein sequences. PLoS computational biology (2019).

[10] Chen, Xing, et al. Drug–target interaction prediction: databases, web servers and computational models. Briefings in bioinformatics (2016).

[11] Huang K, Xiao C, Hoang T, Glass L, Sun J. CASTER: Predicting Drug Interactions with Chemical Substructure Representation. AAAI (2020).


登录查看更多
0

相关内容

2345网址导航始建于2005年9月。宗旨是方便网友们快速找到自己需要的网站,而不用去记太多复杂的网址;同时也提供多种搜索引擎入口、实用查询、天气预报、团购导航、影视大全、地方导航等服务。于2005年9月正式上线,迅速成为国内第二大网址导航网站。2345网址导航收录了网民需要的各类网站,提供实用查询、邮箱登录、天气预报、搜索引擎、在线收藏等常用网络服务。
使用Python进行医疗临床文本处理,37页ppt
专知会员服务
38+阅读 · 2020年8月5日
【Amazon】使用预先训练的Transformer模型进行数据增强
专知会员服务
56+阅读 · 2020年3月6日
【学科交叉】抗生素发现的深度学习方法
专知会员服务
24+阅读 · 2020年2月23日
【华侨大学】基于混合深度学习算法的疾病预测模型
专知会员服务
96+阅读 · 2020年1月21日
一网打尽!100+深度学习模型TensorFlow与Pytorch代码实现集合
【GitHub实战】Pytorch实现的小样本逼真的视频到视频转换
专知会员服务
35+阅读 · 2019年12月15日
Nature 一周论文导读 | 2019 年 8 月 1 日
科研圈
8+阅读 · 2019年8月11日
基于TensorFlow和Keras的图像识别
Python程序员
16+阅读 · 2019年6月24日
深度学习详解
人工智能学家
5+阅读 · 2019年4月25日
已删除
将门创投
6+阅读 · 2017年7月6日
Multi-Grained Named Entity Recognition
Arxiv
6+阅读 · 2019年6月20日
Arxiv
5+阅读 · 2018年10月23日
Arxiv
3+阅读 · 2018年4月11日
VIP会员
Top
微信扫码咨询专知VIP会员