AlphaFold2表示
技術(shù)背景
在前面的這一篇博客中,比較全面的介紹了組成蛋白質(zhì)的各種氨基酸的三維結(jié)構(gòu)。由于每個(gè)氨基酸大小不一,在傳統(tǒng)的蛋白質(zhì)折疊預(yù)測(cè)的方案中,一般會(huì)考慮全原子方案或者是粗粒化方案。對(duì)于全原子方案而言,即時(shí)去除了氫原子,也包含了極大的原子數(shù),對(duì)于計(jì)算量來(lái)說(shuō)是一個(gè)非常大的考驗(yàn)。而將一個(gè)氨基酸近似為一個(gè)點(diǎn)的方案,因?yàn)橥雎粤颂嗟男畔?,比如氨基酸之間的二面角等,因此無(wú)法達(dá)到很好的預(yù)測(cè)效果。在AlphaFold中,將每一個(gè)氨基酸在主鏈上的位置,用一個(gè)三角形剛體來(lái)表示。這個(gè)三角形的三個(gè)頂點(diǎn)分別是C原子、N原子和αα位的C原子。由于一個(gè)三角形就可以確定一個(gè)平面,因此每一個(gè)氨基酸可以通過(guò)一個(gè)三角形的內(nèi)坐標(biāo)和一個(gè)頂點(diǎn)的笛卡爾坐標(biāo)來(lái)完整的表示出來(lái)。
算法實(shí)現(xiàn)
這里我們使用MindSpore復(fù)現(xiàn)一下AlphaFold2中的算法21,也就是剛體表示算法。由于是一個(gè)剛體,我們可以將其中除了用于定位頂點(diǎn)的笛卡爾坐標(biāo)以外的內(nèi)坐標(biāo)做一個(gè)歸一化處理。該算法的基本流程為:
輸入三角形ΔCCαNΔCCαN的笛卡爾坐標(biāo);
計(jì)算CαC→CαC→的單位向量,表示為e1→e1→;
計(jì)算CαC→CαC→到NN的垂向量的單位向量,表示為e2→e2→;
計(jì)算e1→e1→和e2→e2→的叉乘,得到一個(gè)跟三角形ΔCCαNΔCCαN平面相垂直的單位向量e3→e3→;
用e1→e1→、e2→e2→和e3→e3→表示當(dāng)前氨基酸的空間位置,保留CαCα的坐標(biāo)用于表示當(dāng)前氨基酸在空間中的絕對(duì)位置。
具體算法實(shí)現(xiàn)如下所示:
# algorithm21.py# 關(guān)閉MindSpore的Warning信息import osos.environ['GLOG_v'] = '4'import numpy as npimport mindspore as msfrom mindspore import Tensor, opsfrom mindspore import numpy as msnpdef rigidFrom3Points(crd):""" Transform the coordinates formulation. """v1 = crd[:, 2] - crd[:, 1]v2 = crd[:, 0] - crd[:, 1]e1 = v1 / v1.norm(axis=-1, keep_dims=True)u2 = v2 - e1 * ops.Einsum('ij,ij->i')((e1, v2))[:, None]e2 = u2 / u2.norm(axis=-1, keep_dims=True)e3 = msnp.cross(e1, e2, axisc=-1)R = ops.Concat(axis=-2)((e1[:, None], e2[:, None], e3[:, None]))t = crd[:, 1][:, None]new_crd = ops.Concat(axis=-2)((R, t))return new_crdif __name__ == '__main__':np.random.seed(1)BATCHES = 2DIMENSIONS = 3ATOMS = 3# 定義原始坐標(biāo)origin_crd = Tensor(np.random.random((BATCHES, ATOMS, DIMENSIONS)), ms.float32)print ('The original coordinates is: \n{}'.format(origin_crd))trans_crd = rigidFrom3Points(origin_crd)print ('The transformed coordinates is: \n{}'.format(trans_crd))
該算法的輸出結(jié)果為:
The original coordinates is:[[[4.17021990e-01 7.20324516e-01 1.14374816e-04][3.02332580e-01 1.46755889e-01 9.23385918e-02][1.86260208e-01 3.45560730e-01 3.96767467e-01]][[5.38816750e-01 4.19194520e-01 6.85219526e-01][2.04452246e-01 8.78117442e-01 2.73875929e-02][6.70467496e-01 4.17304814e-01 5.58689833e-01]]]The transformed coordinates is:[[[-0.30411592 ?0.5208795 ? 0.79762024][ 0.30775824 ?0.8461014 ?-0.43519795][-0.90155333 ?0.11312358 -0.41761786][ 0.30233258 ?0.14675589 ?0.09233859]][[ 0.55235845 -0.5461919 ? 0.6297417 ][-0.73928094 ?0.02810205 ?0.67281044][-0.38518062 -0.8371886 ?-0.38826686][ 0.20445225 ?0.87811744 ?0.02738759]]]
如此一來(lái),我們就可以通過(guò)調(diào)整給定蛋白質(zhì)坐標(biāo)的CαCα位置和旋轉(zhuǎn)用于表示氨基酸內(nèi)坐標(biāo)的三個(gè)向量e1→e1→、e2→e2→和e3→e3→,以得到一個(gè)使得整體模型的Loss最低的采樣器,就可以用于預(yù)測(cè)生成一系列給定氨基酸序列的蛋白質(zhì)構(gòu)象。
總結(jié)概要
本文主要通過(guò)MindSpore復(fù)現(xiàn)了一個(gè)AlphaFold2文章中的算法21,該算法可以用于將蛋白質(zhì)構(gòu)象中的每一個(gè)氨基酸轉(zhuǎn)化成一個(gè)歸一化的空間三角形表示,更方便用于深度學(xué)習(xí)模型中的參數(shù)優(yōu)化。有了這樣一個(gè)抽象的模型,再定義一系列的梯度優(yōu)化和損失函數(shù),就可以得到一個(gè)用于預(yù)測(cè)蛋白質(zhì)構(gòu)象的生成模型。
作者ID:DechinPhy