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

©PaperWeekly · 作者|黄柯鑫

学校|哈佛大学硕士

研究方向|图学习和生物医疗

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

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

用少于10行代码训练前沿深度学习新药研发模型_第1张图片

论文标题:DeepPurpose: a Deep Learning Library for Drug-Target Interaction Prediction and Applications to Repurposing and Screening

论文链接:https://arxiv.org/abs/2004.08919

项目链接:https://github.com/kexinhuang12345/DeepPurpose

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

用少于10行代码训练前沿深度学习新药研发模型_第2张图片

▲ Image by authors.

背景

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

用少于10行代码训练前沿深度学习新药研发模型_第3张图片

▲ Image permission granted by Christopher Vakoc.

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

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

用少于10行代码训练前沿深度学习新药研发模型_第4张图片

▲ Image by authors.

DeepPurpose概述

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

用少于10行代码训练前沿深度学习新药研发模型_第5张图片

▲ Image by authors.

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

用少于10行代码训练前沿深度学习新药研发模型_第6张图片

▲ Image by authors.

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

用少于10行代码训练前沿深度学习新药研发模型_第7张图片

▲ Image by authors.

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

用少于10行代码训练前沿深度学习新药研发模型_第8张图片

▲ 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 曲线。

用少于10行代码训练前沿深度学习新药研发模型_第9张图片

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 会自动生成候选药物排名列表:

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

注意因为这个模型只训练了几个 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 预测的博客文章,希望您对深度学习新药研发这个交叉学科开始感兴趣。希望有更多的人能够为这个开源项目做出贡献! 

要了解更多信息,请访问 arxiv 文章和 Github,请 star,分享并 contribute! 

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

如果您有任何疑问或反馈或文章中有任何不妥的地方,请随时通过 [email protected] 与我联系;或者就在 Twitter @ KexinHuang5,知乎上直接私我。 

参考文献

[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).

 

更多阅读

 

#投 稿 通 道#

 让你的论文被更多人看到 

如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。

总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。 

PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得技术干货。我们的目的只有一个,让知识真正流动起来。

???? 来稿标准:

• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向) 

• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接 

• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志

???? 投稿邮箱:

• 投稿邮箱:[email protected] 

• 所有文章配图,请单独在附件中发送 

• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通

????

现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧

关于PaperWeekly

PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。

你可能感兴趣的:(人工智能,深度学习,机器学习,编程语言,神经网络)