圖學(xué)習(xí)之項目實踐實現(xiàn)論文節(jié)點分類、新冠疫苗項目實戰(zhàn),助力疫情
原項目鏈接:https://aistudio.baidu.com/aistudio/projectdetail/5100049?contributionType=1
1.圖學(xué)習(xí)技術(shù)與應(yīng)用
圖是一個復(fù)雜世界的通用語言,社交網(wǎng)絡(luò)中人與人之間的連接、蛋白質(zhì)分子、推薦系統(tǒng)中用戶與物品之間的連接等等,都可以使用圖來表達。圖神經(jīng)網(wǎng)絡(luò)將神經(jīng)網(wǎng)絡(luò)運用至圖結(jié)構(gòu)中,可以被描述成消息傳遞的范式。百度開發(fā)了PGL2.2,基于底層深度學(xué)習(xí)框架paddle,給用戶暴露了編程接口來實現(xiàn)圖網(wǎng)絡(luò)。與此同時,百度也使用了前沿的圖神經(jīng)網(wǎng)絡(luò)技術(shù)針對一些應(yīng)用進行模型算法的落地。本次將介紹百度的PGL圖學(xué)習(xí)技術(shù)與應(yīng)用。
1.1圖來源與建模
首先和大家分享下圖學(xué)習(xí)主流的圖神經(jīng)網(wǎng)絡(luò)建模方式。

14年左右開始,學(xué)術(shù)界出現(xiàn)了一些基于圖譜分解的技術(shù),通過頻域變換,將圖變換至頻域進行處理,再將處理結(jié)果變換回空域來得到圖上節(jié)點的表示。后來,空域卷積借鑒了圖像的二維卷積,并逐漸取代了頻域圖學(xué)習(xí)方法。圖結(jié)構(gòu)上的卷積是對節(jié)點鄰居的聚合。

基于空間的圖神經(jīng)網(wǎng)絡(luò)主要需要考慮兩個問題:
怎樣表達節(jié)點特征;
怎樣表達一整張圖。
第一個問題可以使用鄰居聚合的方法,第二問題使用節(jié)點聚合來解決。

目前大部分主流的圖神經(jīng)網(wǎng)絡(luò)都可以描述成消息傳遞的形式。需要考慮節(jié)點如何將消息發(fā)送至目標(biāo)節(jié)點,然后目標(biāo)節(jié)點如何對收到的節(jié)點特征進行接收。
1.2 PGL2.2回顧介紹
PGL2.2基于消息傳遞的思路構(gòu)建整體框架。PGL最底層是飛漿核心paddle深度學(xué)習(xí)框架。在此之上,搭建了CPU圖引擎和GPU上進行tensor化的圖引擎,來方便對圖進行如圖切分、圖存儲、圖采樣、圖游走的算法。再上一層,會對用戶暴露一些編程接口,包括底層的消息傳遞接口和圖網(wǎng)絡(luò)實現(xiàn)接口,以及高層的同構(gòu)圖、異構(gòu)圖的編程接口。框架頂層會支持幾大類圖模型,包括傳統(tǒng)圖表示學(xué)習(xí)中的圖游走模型、消息傳遞類模型、知識嵌入類模型等,去支撐下游的應(yīng)用場景。

最初的PGL是基于paddle1.x的版本進行開發(fā)的,所以那時候還是像tensorflow一樣的靜態(tài)圖模式。目前paddle2.0已經(jīng)進行了全面動態(tài)化,那么PGL也相應(yīng)地做了動態(tài)圖的升級?,F(xiàn)在去定義一個圖神經(jīng)網(wǎng)絡(luò)就只需要定義節(jié)點數(shù)量、邊數(shù)量以及節(jié)點特征,然后將圖tensor化即可。可以自定義如何將消息進行發(fā)送以及目標(biāo)節(jié)點如何接收消息。

上圖是使用PGL構(gòu)建一個GAT網(wǎng)絡(luò)的例子。最開始會去計算節(jié)點的權(quán)重,在發(fā)送消息的時候GAT會將原節(jié)點和目標(biāo)節(jié)點特征進行求和,再加上一個非線性激活函數(shù)。在接收的時候,可以通過reduce_softmax對邊上的權(quán)重進行歸一化,再乘上hidden state進行加權(quán)求和。這樣就可以很方便地實現(xiàn)一個GAT網(wǎng)絡(luò)。

對于圖神經(jīng)網(wǎng)絡(luò)來講,在構(gòu)建完網(wǎng)絡(luò)后,要對它進行訓(xùn)練。訓(xùn)練方式和一般機器學(xué)習(xí)有所不同,需要根據(jù)圖的規(guī)模選擇適用的訓(xùn)練方案。

例如在小圖,即圖規(guī)模小于GPU顯存的情況下,會使用full batch模式進行訓(xùn)練。它其實就是把一整張圖的所有節(jié)點都放置在GPU上,通過一個圖網(wǎng)絡(luò)來輸出所有點的特征。它的好處在于可以跑一個很深的圖。這一訓(xùn)練方案會被應(yīng)用于中小型數(shù)據(jù)集,例如Cora、Pubmed、Citeseer、ogbn-arxiv等。最近在ICML上發(fā)現(xiàn)了可以堆疊至1000層的圖神經(jīng)網(wǎng)絡(luò),同樣也是在這種中小型數(shù)據(jù)集上做評估。

對于中等規(guī)模的圖,即圖規(guī)模大于GPU單卡顯存,知識可以進行分片訓(xùn)練,每一次將一張子圖塞入GPU上。PGL提供了另一個方案,使用分片技術(shù)來降低顯存使用的峰值。例如對一個復(fù)雜圖進行計算時,它的計算復(fù)雜度取決于邊計算時顯存使用的峰值,此時如果有多塊GPU就可以把邊計算進行分塊,每臺機器只負責(zé)一小部分的計算,這樣就可以大大地減少圖神經(jīng)網(wǎng)絡(luò)的計算峰值,從而達到更深的圖神經(jīng)網(wǎng)絡(luò)的訓(xùn)練。分塊訓(xùn)練完畢后,需要通過NCCL來同步節(jié)點特征。

在PGL中,只需要一行DistGPUGraph命令就可以在原來full batch的訓(xùn)練代碼中加入這樣一個新特性,使得可以在多GPU中運行一個深層圖神經(jīng)網(wǎng)絡(luò)。例如在obgn-arxiv中嘗試了比較復(fù)雜的TransformerConv網(wǎng)絡(luò),如果使用單卡訓(xùn)練一個三層網(wǎng)絡(luò),其GPU顯存會被占用近30G,而使用分片訓(xùn)練就可以將它的顯存峰值降低。同時,還實現(xiàn)了并行的計算加速,例如原來跑100 epoch需要十分鐘,現(xiàn)在只需要200秒。

在大圖的情況下,又回歸到平時做數(shù)據(jù)并行的mini batch模式。Mini batch與full batch相比最主要的問題在于它需要做鄰居的采樣,而鄰居數(shù)目的提升會對模型的深度進行限制。這一模式適用于一些巨型數(shù)據(jù)集,包括ogbn-products和ogbn-papers100m。

發(fā)現(xiàn)PyG的作者的新工作GNNAutoScale能夠把一個圖神經(jīng)網(wǎng)絡(luò)進行自動的深度擴展。它的主要思路是利用CPU的緩存技術(shù),將鄰居節(jié)點的特征緩存至CPU內(nèi)存中。當(dāng)訓(xùn)練圖網(wǎng)絡(luò)時,可以不用實時獲取所有鄰居的最新表達,而是獲取它的歷史embedding進行鄰居聚合計算。實驗發(fā)現(xiàn)這樣做的效果還是不錯的。

在工業(yè)界的情況下可能會存在更大的圖規(guī)模的場景,那么這時候可能單CPU也存不下如此圖規(guī)模的數(shù)據(jù),這時需要一個分布式的多機存儲和采樣。PGL有一套分布式的圖引擎接口,使得可以輕松地在MPI以及K8S集群上通過PGL launch接口進行一鍵的分布式圖引擎部署。目前也支持不同類型的鄰居采樣、節(jié)點遍歷和圖游走算法。

整體的大規(guī)模訓(xùn)練方式包括一個大規(guī)模分布式圖引擎,中間會包含一些圖采樣的算子和神經(jīng)網(wǎng)絡(luò)的開發(fā)算子。頂層針對工業(yè)界大規(guī)模場景,往往需要一個parameter server來存儲上億級別的稀疏特征。借助paddlefleet的大規(guī)模參數(shù)服務(wù)器來支持超大規(guī)模的embedding存儲。
1.3 圖神經(jīng)網(wǎng)絡(luò)技術(shù)
1.3.1 節(jié)點分類任務(wù)

在算法上也進行了一些研究。圖神經(jīng)網(wǎng)絡(luò)與一般機器學(xué)習(xí)場景有很大的區(qū)別。一般的機器學(xué)習(xí)假設(shè)數(shù)據(jù)之間獨立同分布,但是在圖網(wǎng)絡(luò)的場景下,樣本是有關(guān)聯(lián)的。預(yù)測樣本和訓(xùn)練樣本有時會存在邊關(guān)系。通常稱這樣的任務(wù)為半監(jiān)督節(jié)點分類問題。

解決節(jié)點分類問題的傳統(tǒng)方法是LPA標(biāo)簽傳播算法,考慮鏈接關(guān)系以及標(biāo)簽之間的關(guān)系。另外一類方法是以GCN為代表的特征傳播算法,只考慮特征與鏈接的關(guān)系。

通過實驗發(fā)現(xiàn)在很多數(shù)據(jù)集下,訓(xùn)練集很難通過過擬合達到99%的分類準(zhǔn)確率。也就是說,訓(xùn)練集中的特征其實包含很大的噪聲,使得網(wǎng)絡(luò)缺乏過擬合能力。所以,想要顯示地將訓(xùn)練label加入模型,因為標(biāo)簽可以消減大部分歧義。在訓(xùn)練過程中,為了避免標(biāo)簽泄露,提出了UniMP算法,把標(biāo)簽傳播和特征傳播融合起來。這一方法在三個open graph benchmark數(shù)據(jù)集上取得了SOTA的結(jié)果。

后續(xù)還把UniMP應(yīng)用到更大規(guī)模的KDDCup 21的比賽中,將UniMP同構(gòu)算法做了異構(gòu)圖的拓展,使其在異構(gòu)圖場景下進行分類任務(wù)。具體地,在節(jié)點鄰居采樣、批歸一化和注意力機制中考慮節(jié)點之間的關(guān)系類型。
1.3.2 鏈接預(yù)測任務(wù)

第二個比較經(jīng)典的任務(wù)是鏈接預(yù)測任務(wù)。目前很多人嘗試使用GNN與link prediction進行融合,但是這存在兩個瓶頸。首先,GNN的深度和鄰居采樣的數(shù)量有關(guān);其次,當(dāng)訓(xùn)練像知識圖譜的任務(wù)時,每一輪訓(xùn)練都需要遍歷訓(xùn)練集的三元組,此時訓(xùn)練的復(fù)雜度和鄰居節(jié)點數(shù)量存在線性關(guān)系,這就導(dǎo)致了如果鄰居比較多,訓(xùn)練一個epoch的耗時很長。

借鑒了最近基于純特征傳播的算法,如SGC等圖神經(jīng)網(wǎng)絡(luò)的簡化方式,提出了基于關(guān)系的embedding傳播。發(fā)現(xiàn)單獨使用embedding進行特征傳播在知識圖譜上是行不通的。因為知識圖譜上存在復(fù)雜的邊關(guān)系。所以,根據(jù)不同關(guān)系下embedding設(shè)計了不同的score function進行特征傳播。此外,發(fā)現(xiàn)之前有一篇論文提出了OTE的算法,在圖神經(jīng)網(wǎng)絡(luò)上進行了兩階段的訓(xùn)練。

使用OGBL-WikiKG2數(shù)據(jù)集訓(xùn)練OTE模型需要超過100個小時,而如果切換到的特征傳播算法,即先跑一次OTE算法,再進行REP特征傳播,只需要1.7個小時就可以使模型收斂。所以REP帶來了近50倍的訓(xùn)練效率的提升。還發(fā)現(xiàn)只需要正確設(shè)定score function,大部分知識圖譜算法使用的特征傳播算法都會有效果上的提升;不同的算法使用REP也可以加速它們的收斂。
將這一套方法應(yīng)用到KDDCup 21 Wiki90M的比賽中。為了實現(xiàn)比賽中要求的超大規(guī)模知識圖譜的表示,做了一套大規(guī)模的知識表示工具Graph4KG,最終在KDDCup中取得了冠軍。
1.4 算法應(yīng)用落地
PGL在百度內(nèi)部已經(jīng)進行了廣泛應(yīng)用。包括百度搜索中的網(wǎng)頁質(zhì)量評估,會把網(wǎng)頁構(gòu)成一個動態(tài)圖,并在圖上進行圖分類的任務(wù)。百度搜索還使用PGL進行網(wǎng)頁反作弊,即對大規(guī)模節(jié)點進行檢測。在文本檢索應(yīng)用中,嘗試使用圖神經(jīng)網(wǎng)絡(luò)與自然語言處理中的語言模型相結(jié)合。在其他情況下,的落地場景有推薦系統(tǒng)、風(fēng)控、百度地圖中的流量預(yù)測、POI檢索等。
本文以推薦系統(tǒng)為例,介紹一下平時如何將圖神經(jīng)網(wǎng)絡(luò)在應(yīng)用中進行落地。
推薦系統(tǒng)常用的算法是基于item-based和user-based協(xié)同過濾算法。Item-based協(xié)同過濾就是推薦和item相似的內(nèi)容,而user-based 就是推薦相似的用戶。這里最重要的是如何去衡量物品與物品之間、用戶與用戶之間的相似性。
可以將其與圖學(xué)習(xí)結(jié)合,使用點擊日志來構(gòu)造圖關(guān)系(包括社交關(guān)系、用戶行為、物品關(guān)聯(lián)),然后通過表示學(xué)習(xí)構(gòu)造用戶物品的向量空間。在這個空間上就可以度量物品之間的相似性,以及用戶之間的相似性,進而使用其進行推薦。
常用的方法有傳統(tǒng)的矩陣分解方法,和阿里提出的基于隨機游走 + Word2Vec的EGES算法。近幾年興起了使用圖對比學(xué)習(xí)來獲得節(jié)點表示。
在推薦算法中,主要的需求是支持復(fù)雜的結(jié)構(gòu),支持大規(guī)模的實現(xiàn)和快速的實驗成本。希望有一個工具包可以解決GNN + 表示學(xué)習(xí)的問題。所以,對現(xiàn)有的圖表示學(xué)習(xí)算法進行了抽象。具體地,將圖表示學(xué)習(xí)分成了四個部分。第一部分是圖的類型,將其分為同構(gòu)圖、異構(gòu)圖、二部圖,并在圖中定義了多種關(guān)系,例如點擊關(guān)系、關(guān)注關(guān)系等。第二,實現(xiàn)了不同的樣本采樣的方法,包括在同構(gòu)圖中常用的node2Vec以及異構(gòu)圖中按照用戶自定義的meta path進行采樣。第三部分是節(jié)點的表示??梢愿鶕?jù)id去表示節(jié)點,也可以通過圖采樣使用子圖來表示一個節(jié)點。還構(gòu)造了四種GNN的聚合方式。
發(fā)現(xiàn)不同場景以及不同的圖表示的訓(xùn)練方式下,模型效果差異較大。所以的工具還支持大規(guī)模稀疏特征side-info的支持來進行更豐富的特征組合。用戶可能有很多不同的字段,有些字段可能是缺失的,此時只需要通過一個配置表來配置節(jié)點包含的特征以及字段即可。還支持GNN的異構(gòu)圖自動擴展。你可以自定義邊關(guān)系,如點擊關(guān)系、購買關(guān)系、關(guān)注關(guān)系等,并選取合適的聚合方式,如lightgcn,就可以自動的對GNN進行異構(gòu)圖擴展,使lightgcn變?yōu)閞elation-wise的lightgcn。
對工具進行了瓶頸分析,發(fā)現(xiàn)它主要集中在分布式訓(xùn)練中圖采樣和負樣本構(gòu)造中??梢酝ㄟ^使用In-Batch Negative的方法進行優(yōu)化,即在batch內(nèi)走負采樣,減少通訊開銷。這一優(yōu)化可以使得訓(xùn)練速度提升四至五倍,而且在訓(xùn)練效果上幾乎是無損的。此外,在圖采樣中可以通過對樣本重構(gòu)來降低采樣的次數(shù),得到兩倍左右的速度提升,且訓(xùn)練效果基本持平。相比于市面上現(xiàn)有的分布式圖表示工具,還可以實現(xiàn)單機、雙機、四機甚至更多機器的擴展。
不僅如此,還發(fā)現(xiàn)游走類模型訓(xùn)練速度較快,比較適合作為優(yōu)秀的熱啟動參數(shù)。具體地,可以先運行一次metapath2Vce算法,將訓(xùn)練得到的embedding作為初始化參數(shù)送入GNN中作為熱啟動的節(jié)點表示。發(fā)現(xiàn)這樣做在效果上有一定的提升。
1.5 Q&A
Q1:在特征在多卡之間傳遞的訓(xùn)練模式中,使用push和pull的方式通訊時間占比大概有多大?
A:通訊時間的占比挺大的。如果是特別簡單的模型,如GCN等,那么使用這種方法訓(xùn)練,通訊時間甚至?xí)戎苯优苓@個模型的訓(xùn)練時間還要久。所以這一方法適合復(fù)雜模型,即模型計算較多,且通訊中特征傳遞的數(shù)據(jù)量相比來說較小,這種情況下就比較適合這種分布式計算。
Q2:圖學(xué)習(xí)中節(jié)點鄰居數(shù)較多會不會導(dǎo)致特征過平滑?
A:這里采用的方法很多時候都很暴力,即直接使用attention加多頭的機制,這樣會極大地減緩過平滑問題。因為使用attention機制會使得少量特征被softmax激活;多頭的方式可以使得每個頭學(xué)到的激活特征不一樣。所以這樣做一定比直接使用GCN進行聚合會好。
Q3:百度有沒有使用圖學(xué)習(xí)在自然語言處理領(lǐng)域的成功經(jīng)驗?
A:之前有類似的工作,你可以關(guān)注ERINESage這篇論文。它主要是將圖網(wǎng)絡(luò)和預(yù)訓(xùn)練語言模型進行結(jié)合。也將圖神經(jīng)網(wǎng)絡(luò)落地到了例如搜索、推薦的場景。因為語言模型本身很難對用戶日志中包含的點擊關(guān)系進行建模,通過圖神經(jīng)網(wǎng)絡(luò)就可以將點擊日志中的后驗關(guān)系融入語言模型,進而得到較大的提升。
Q4:能詳細介紹一下KDD比賽中將同構(gòu)圖拓展至異構(gòu)圖的UniMP方法嗎?
A:首先,每一個關(guān)系類型其實應(yīng)該有不同的鄰居采樣方法。例如paper到author的關(guān)系,會單獨地根據(jù)它來采樣鄰居節(jié)點。如果按照同構(gòu)圖的方式來采樣,目標(biāo)節(jié)點的鄰居節(jié)點可能是論文,也可能是作者或者機構(gòu),那么采樣的節(jié)點是不均勻的。其次,在批歸一化中按照關(guān)系channel來進行歸一化,因為如果你將paper節(jié)點和author節(jié)點同時歸一化,由于它們的統(tǒng)計均值和方差不一樣,那么這種做法會把兩者的統(tǒng)計量同時帶騙。同理,在聚合操作中,不同的關(guān)系對兩個節(jié)點的作用不同,需要按照不同關(guān)系使用不同的attention注意力權(quán)重來聚合特征。
2.基于UniMP算法實現(xiàn)論文引用網(wǎng)絡(luò)節(jié)點分類任務(wù)
圖學(xué)習(xí)之基于PGL-UniMP算法的論文引用網(wǎng)絡(luò)節(jié)點分類任務(wù):https://aistudio.baidu.com/aistudio/projectdetail/5116458?contributionType=1
由于文章篇幅問題,為了讓學(xué)習(xí)者有更好的體驗,這里新開一個項目完成這個任務(wù)。
Epoch 987 Train Acc 0.7554459 Valid Acc 0.7546095Epoch 988 Train Acc 0.7537374 Valid Acc 0.75717235Epoch 989 Train Acc 0.75497127 Valid Acc 0.7573859Epoch 990 Train Acc 0.7611409 Valid Acc 0.75653166Epoch 991 Train Acc 0.75316787 Valid Acc 0.75489426Epoch 992 Train Acc 0.749561 Valid Acc 0.7547519Epoch 993 Train Acc 0.7571544 Valid Acc 0.7551079Epoch 994 Train Acc 0.7516492 Valid Acc 0.75581974Epoch 995 Train Acc 0.7563476 Valid Acc 0.7563181Epoch 996 Train Acc 0.7504627 Valid Acc 0.7538976Epoch 997 Train Acc 0.7476152 Valid Acc 0.75439596Epoch 998 Train Acc 0.7539272 Valid Acc 0.7528298Epoch 999 Train Acc 0.7532153 Valid Acc 0.75396883
3.新冠疫苗項目實戰(zhàn),助力疫情
Kaggle新冠疫苗研發(fā)競賽:https://www.kaggle.com/c/stanford-covid-vaccine/overview
mRNA疫苗已經(jīng)成為2019冠狀病毒最快的候選疫苗,但目前它們面臨著關(guān)鍵的潛在限制。目前最大的挑戰(zhàn)之一是如何設(shè)計超穩(wěn)定的RNA分子(mRNA)。傳統(tǒng)疫苗是裝在注射器里通過冷藏運輸?shù)绞澜绺鞯兀玬RNA疫苗目前還不可能做到這一點。
研究人員已經(jīng)觀察到RNA分子有降解的傾向。這是一個嚴(yán)重的限制,降解會使mRNA疫苗失效。目前,對于特定RNA的主干中哪個部位最容易受影響的細節(jié)知之甚少。在不了解這些情況的情況下,目前針對COVID-19的mRNA疫苗必須在高度冷藏條件下準(zhǔn)備和運輸,它們必須能夠得到穩(wěn)定,否則不太可能送達地球上的每個人。
由斯坦福大學(xué)醫(yī)學(xué)院(Stanford’s School of Medicine)計算生物學(xué)家瑞朱·達斯(Rhiju Das)教授領(lǐng)導(dǎo)的永恒星系(Eterna)社區(qū)將科學(xué)家和競賽玩家聚集在一起,解決謎題并發(fā)明藥物。Eterna是一款在線競賽平臺,通過謎題挑戰(zhàn)玩家解決諸如mRNA設(shè)計等科學(xué)問題。由斯坦福大學(xué)的研究人員合成并進行實驗測試,以獲得關(guān)于RNA分子的新見解。Eterna社區(qū)之前已經(jīng)開啟了新的科學(xué)原理,對致命疾病做出了新的診斷,并利用世界上最強大的智力資源改善公眾生活。Eterna社區(qū)通過其在20多份出版物上的貢獻推動了生物技術(shù),包括RNA生物技術(shù)進展。
在這次競賽中,我們希望利用Kaggle社區(qū)的數(shù)據(jù)科學(xué)專業(yè)知識來開發(fā)模型和設(shè)計RNA降解規(guī)則。模型將預(yù)測RNA分子每個堿基的可能降解率,訓(xùn)練的對象是由超過3000個RNA分子組成的Eterna數(shù)據(jù)集子集(它們跨越了一整套序列和結(jié)構(gòu)),以及它們在每個位置的降解率。然后,我們將根據(jù)Eterna玩家剛剛為COVID-19 mRNA疫苗設(shè)計的第二代RNA序列為模型評分。這些最終的測試序列目前正在合成和實驗表征在斯坦福大學(xué)與建模工作并行——自然將評分模型!
提高mRNA疫苗的穩(wěn)定性已經(jīng)在探索,我們必須解決這一深刻的科學(xué)挑戰(zhàn),以加速mRNA疫苗研究,并提供一種針對COVID-19背后病毒SARS-CoV-2的冰箱穩(wěn)定疫苗。我們正在試圖解決的問題希望得到學(xué)術(shù)實驗室、工業(yè)研發(fā)團隊和超級計算機的幫助,你可以加入電子競賽玩家、科學(xué)家和開發(fā)者的團隊,在Eterna永恒星球上對抗這一毀滅性病毒。
3.1案例簡介
將編碼的DNA送到細胞中,細胞使用mRNA(Messenger RNA)組裝蛋白,免疫系統(tǒng)檢測到組裝蛋白質(zhì)以后,利用構(gòu)建病毒蛋白的編碼基因激活免疫系統(tǒng)產(chǎn)生抗體,增強針對冠狀病毒的抵御能力。
不同的mRNA生成同一個蛋白質(zhì),
mRNA隨著時間的流逝及溫度的變化發(fā)生了降解,
如何找到結(jié)構(gòu)更加穩(wěn)定的mRNA?利用圖神經(jīng)網(wǎng)絡(luò)找到更穩(wěn)定的mRNA,顏色越深越穩(wěn)定.

3.2 新冠疫苗項目拔高實戰(zhàn)
數(shù)據(jù)分布特征
查看當(dāng)前掛載的數(shù)據(jù)集目錄
# 加載一些需要用到的模塊,設(shè)置隨機數(shù)import jsonimport randomimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport networkx as nxfrom utils.config import prepare_config, make_dirfrom utils.logger import prepare_logger, log_to_filefrom data_parser import GraphParser
seed = 123np.random.seed(seed)
random.seed(seed)
# https://www.kaggle.com/c/stanford-covid-vaccine/data# 加載訓(xùn)練用的數(shù)據(jù)df = pd.read_json('../data/data179441/train.json', lines=True)# 查看一下數(shù)據(jù)集的內(nèi)容sample = df.loc[0]
print(sample)
index ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?400
id ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?id_2a7a4496f
sequence ? ? ? ? ? ? ? GGAAAGCCCGCGGCGCCGGGCGCCGCGGCCGCCCAGGCCGCCCGGC...
structure ? ? ? ? ? ? ?.....(((...)))((((((((((((((((((((.((((....)))...
predicted_loop_type ? ?EEEEESSSHHHSSSSSSSSSSSSSSSSSSSSSSSISSSSHHHHSSS...
signal_to_noise ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?0
SN_filter ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?0
seq_length ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 107
seq_scored ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?68
reactivity_error ? ? ? [146151.225, 146151.225, 146151.225, 146151.22...
deg_error_Mg_pH10 ? ? ?[104235.1742, 104235.1742, 104235.1742, 104235...
deg_error_pH10 ? ? ? ? [222620.9531, 222620.9531, 222620.9531, 222620...
deg_error_Mg_50C ? ? ? [171525.3217, 171525.3217, 171525.3217, 171525...
deg_error_50C ? ? ? ? ?[191738.0886, 191738.0886, 191738.0886, 191738...
reactivity ? ? ? ? ? ? [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
deg_Mg_pH10 ? ? ? ? ? ?[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
deg_pH10 ? ? ? ? ? ? ? [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
deg_Mg_50C ? ? ? ? ? ? [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
deg_50C ? ? ? ? ? ? ? ?[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...Name: 0, dtype: object
例如 deg50C、degMg_50C 這樣的值全為0的行,就是我們需要預(yù)測的。
structure一行,數(shù)據(jù)中的括號是為了構(gòu)成邊用的。
本案例要預(yù)測RNA序列不同位置的降解速率,訓(xùn)練數(shù)據(jù)中提供了多個ground值,標(biāo)簽包括以下幾項:reactivity, degMgpH10, and degMg50
reactivity - (1x68 vector 訓(xùn)練集,1x91測試集) 一個浮點數(shù)數(shù)組,與seq_scores有相同的長度,是前68個堿基的反應(yīng)活性值,按順序表示,用于確定RNA樣本可能的二級結(jié)構(gòu)。
degMgpH10 - (訓(xùn)練集 1x68向量,1x91測試集)一個浮點數(shù)數(shù)組,與seq_scores有相同的長度,是前68個堿基的反應(yīng)活性值,按順序表示,用于確定在高pH (pH 10)下的降解可能性。
degMg50 - (訓(xùn)練集 1x68向量,1x91測試集)一個浮點數(shù)數(shù)組,與seq_scores有相同的長度,是前68個堿基的反應(yīng)活性值,按順序表示,用于確定在高溫(50攝氏度)下的降解可能性。
# 利用GraphParser構(gòu)造圖結(jié)構(gòu)的數(shù)據(jù)args = prepare_config("./config.yaml", isCreate=False, isSave=False)parser = GraphParser(args) # GraphParser類來自data_parser.pygdata = parser.parse(sample) # GraphParser里最主要的函數(shù)就是parse(self, sample)
數(shù)據(jù)格式:
{'nfeat': array([[0., 0., 0., ..., 0., 0., 0.],
? ? ? ?[ ],
? ? ? ?[ ],
? ? ? ?...,
? ? ? ?[ ],
? ? ? ?[ ],
? ? ? ?[ ]], dtype=float32), 'edges': array([[ ?0, ? 1],
? ? ? ?[ ],
? ? ? ?[ ],
? ? ? ?...,
? ? ? ?[ ],
? ? ? ?[ ],
? ? ? ?[ ]]), 'efeat': array([[ 0., ?0., ?0., ?1., ?1.],
? ? ? ?[ ],
? ? ? ?[ ],
? ? ? ?...,
? ? ? ?[ ],
? ? ? ?[ ],
? ? ? ?[ ]], dtype=float32), 'labels': array([[ 0. ? ?, ?0. ? ?, ?0. ? ?],
? ? ? ?[ ],
? ? ? ?...,
? ? ? ?[ ],
? ? ? ?[ ],
? ? ? ?[ ],
? ? ? ? ?..., ? ? ? ?
? ? ? ?[ ],
? ? ? ?[ ]], dtype=float32), 'mask': array([[ True],
? ? ? ?[ ],
? ? ......
? ? ? [ ]])}
# 圖數(shù)據(jù)可視化fig = plt.figure(figsize=(24, 12))
nx_G = nx.Graph()
nx_G.add_nodes_from([i for i in range(len(gdata['nfeat']))])
nx_G.add_edges_from(gdata['edges'])
node_color = ['g' for _ in range(sample['seq_length'])] + \
['y' for _ in range(len(gdata['nfeat']) - sample['seq_length'])]
options = { ? ?"node_color": node_color,
}
pos = nx.spring_layout(nx_G, iterations=400, k=0.2)
nx.draw(nx_G, pos, **options)
plt.show()

從圖中可以看到,綠色節(jié)點是堿基,黃色節(jié)點是密碼子。
結(jié)果返回的是 MCRMSE 和 loss
{'MCRMSE': 0.5496759, 'loss': 0.3025484172316889}
[DEBUG] 2022-11-25 17:50:42,468 [ trainer.py: 66]: {'MCRMSE': 0.5496759, 'loss': 0.3025484172316889} [DEBUG] 2022-11-25 17:50:42,468 [ trainer.py: 73]: write to tensorboard ../checkpoints/covid19/evalhistory/eval [DEBUG] 2022-11-25 17:50:42,469 [ trainer.py: 73]: write to tensorboard ../checkpoints/covid19/evalhistory/eval [INFO] 2022-11-25 17:50:42,469 [ trainer.py: 76]: [Eval:eval]:MCRMSE:0.5496758818626404 loss:0.3025484172316889 [INFO] 2022-11-25 17:50:42,602 [monitoredexecutor.py: 606]:?Stop Loop?** [DEBUG] 2022-11-25 17:50:42,607 [monitoredexecutor.py: 199]: saving step 12500 to ../checkpoints/covid19/model_12500
這部分代碼實現(xiàn)參考項目:[PGL圖學(xué)習(xí)之基于GNN模型新冠疫苗任務(wù)[系列九]](https://aistudio.baidu.com/aistudio/projectdetail/5123296?contributionType=1)
我們在 layer.py 里定義了一個新的 gnn 模型(my_gnn),消息傳遞的過程中加入了邊的特征(edge_feat) 然后修改 model.py 里的 GNNModel 使用修改后的模型,運行 main.py。為節(jié)省時間,設(shè)置 epochs = 100 !python main.py --config config.yaml #訓(xùn)練!python main.py --mode infer #預(yù)測
4.總結(jié)
本項目講了論文節(jié)點分類任務(wù)和新冠疫苗任務(wù),并在論文節(jié)點分類任務(wù)中對代碼進行詳細講解。PGL八九系列的項目耦合性比較大,也花了挺久時間研究希望對大家有幫助。
后續(xù)將做一次大的總結(jié)偏向業(yè)務(wù)側(cè)該如何落地以及圖算法的歸納,之后會進行不定期更新圖相關(guān)的算法!
easydict庫和collections庫!
從官方數(shù)據(jù)處理部分,學(xué)習(xí)到利用np的vstack實現(xiàn)自環(huán)邊以及知道有向邊如何添加反向邊的數(shù)據(jù)——這樣的一種代碼實現(xiàn)邊數(shù)據(jù)轉(zhuǎn)換的方式!
從模型加載部分,學(xué)習(xí)了多program執(zhí)行的操作,理清了program與命名空間之間的聯(lián)系!
從模型訓(xùn)練部分,強化了執(zhí)行器執(zhí)行時,需要傳入正確的program以及feeddict,在pgl中可以使用圖Graph自帶的tofeed方法返回一個feed_dict數(shù)據(jù)字典作為初始數(shù)據(jù),后邊再按需添加新數(shù)據(jù)!
從model.py學(xué)習(xí)了模型的組網(wǎng),以及pgl中conv類下的網(wǎng)絡(luò)模型方法的調(diào)用,方便組網(wǎng)!
重點來了:從build_model.py學(xué)習(xí)了模型的參數(shù)的加載組合,實現(xiàn)統(tǒng)一的處理和返回統(tǒng)一的算子以及參數(shù)!