七個(gè)用于圖形深度學(xué)習(xí)的開(kāi)源代碼庫(kù)
譯文【51CTO.com快譯】如果你是一名深度學(xué)習(xí)的愛(ài)好者,那么可能已經(jīng)熟悉一些基本的數(shù)學(xué)原語(yǔ),這些原語(yǔ)推動(dòng)了具有強(qiáng)大功能的深度神經(jīng)網(wǎng)絡(luò)的發(fā)展。盡管很多人喜歡將基本的人工神經(jīng)網(wǎng)絡(luò)視為具有一些加權(quán)連接的一些節(jié)點(diǎn),但將神經(jīng)網(wǎng)絡(luò)視為矩陣乘法在計(jì)算上更有效。
公共領(lǐng)域的多層感知器
這種類型的神經(jīng)網(wǎng)絡(luò)是一種前饋多層感知器(MLP)。如果想讓計(jì)算機(jī)計(jì)算這個(gè)模型的前向傳遞,它將在隱藏層中使用矩陣乘法和某種非線性數(shù)據(jù)。
前饋多層感知器(MLP)非常適合可以自然形成的一維向量數(shù)據(jù)。雖然很簡(jiǎn)潔,但是當(dāng)數(shù)據(jù)樣本很大時(shí),前饋多層感知器(MLP)會(huì)采用大量參數(shù),這對(duì)于處理高維數(shù)據(jù)(如2D圖像或3D體積)來(lái)說(shuō)并不是一種非常有效的方法。2D類似數(shù)據(jù)的圖像自然適用于卷積運(yùn)算,其中權(quán)重應(yīng)用于整個(gè)圖像的局部鄰域,而不是賦予層之間的每個(gè)點(diǎn)對(duì)點(diǎn)連接自己的權(quán)重。這種類型的權(quán)重共享有許多優(yōu)點(diǎn),其中包括平移等方差、正則化和參數(shù)效率等。
卷積可以實(shí)現(xiàn)可視化。當(dāng)然,開(kāi)發(fā)人員現(xiàn)在不可能采用人工執(zhí)行這些操作,他們想要的是一種能夠以計(jì)算機(jī)友好的方式在每個(gè)圖像通道上快速執(zhí)行卷積的算法。
卷積運(yùn)算再次實(shí)現(xiàn)為矩陣的乘法,盡管這次是按元素進(jìn)行的。這要?dú)w功于傅里葉變換的卷積定理,它指出傅里葉域中的乘法與空間域中的卷積有關(guān)。但是,當(dāng)開(kāi)發(fā)人員感興趣的數(shù)據(jù)不是特別適合表示為1D矢量或2D/3D圖像,而是自然地表示為圖形時(shí)會(huì)發(fā)生什么?
就開(kāi)發(fā)人員的目的而言,圖形是由邊連接的節(jié)點(diǎn)的集合,邊可以具有自己的屬性,例如權(quán)重或方向性,并且節(jié)點(diǎn)通常具有某種狀態(tài)或特征,就像前饋多層感知器(MLP)中的節(jié)點(diǎn)激活一樣。
在圖形神經(jīng)網(wǎng)絡(luò)中,每個(gè)“層”只是圖節(jié)點(diǎn)狀態(tài)的快照,這些狀態(tài)通過(guò)與每個(gè)節(jié)點(diǎn)及其相鄰節(jié)點(diǎn)相關(guān)的操作更新連接,例如作為節(jié)點(diǎn)之間邊的神經(jīng)網(wǎng)絡(luò)。
如果想使用圖神經(jīng)網(wǎng)絡(luò)在圖形結(jié)構(gòu)數(shù)據(jù)上取得令人印象深刻的結(jié)果,就像卷積神經(jīng)網(wǎng)絡(luò)對(duì)圖像進(jìn)行深度學(xué)習(xí)所做的那樣,需要采用在計(jì)算機(jī)上實(shí)現(xiàn)這些模型的有效方法。這通常意味著需要一種方法將概念圖神經(jīng)網(wǎng)絡(luò)框架轉(zhuǎn)換為適用于現(xiàn)代深度學(xué)習(xí)的東西。
圖形卷積網(wǎng)絡(luò)
那么怎么可能將圖形神經(jīng)網(wǎng)絡(luò)的復(fù)雜思想轉(zhuǎn)換為矩陣乘法的另一種形式?表示連接的一種方法是使用鄰接矩陣。顧名思義,鄰接矩陣描述了圖中哪些節(jié)點(diǎn)彼此相鄰(即通過(guò)邊彼此連接)。
但是圖形神經(jīng)網(wǎng)絡(luò)需要對(duì)具有任意結(jié)構(gòu)的圖形進(jìn)行操作,因此不能期望每次輸入的數(shù)據(jù)都有相同的鄰接矩陣,甚至每個(gè)鄰接矩陣都有相同的維數(shù)。開(kāi)發(fā)人員可以通過(guò)將多個(gè)樣本的鄰接矩陣對(duì)角組合成一個(gè)更大的矩陣來(lái)描述一批中的所有連接來(lái)處理這個(gè)問(wèn)題。
這使開(kāi)發(fā)人員能夠在一個(gè)批次中處理具有不同結(jié)構(gòu)的多個(gè)圖,他們會(huì)注意到其公式也會(huì)導(dǎo)致節(jié)點(diǎn)之間的權(quán)重共享。還有一些更多的細(xì)節(jié):鄰接矩陣應(yīng)該被歸一化,這樣特征尺度不會(huì)完全改變,除了在這里討論的圖形卷積神經(jīng)網(wǎng)絡(luò)(GNN)方法之外,還有其他的圖卷積方法,但是這是理解圖形卷積神經(jīng)網(wǎng)絡(luò)(GNN)前向傳遞的一個(gè)很好的起點(diǎn)。
這足以在圖形上實(shí)施深度學(xué)習(xí)所需的數(shù)據(jù)準(zhǔn)備和數(shù)學(xué)運(yùn)算。幸運(yùn)的是,對(duì)圖形結(jié)構(gòu)數(shù)據(jù)深度學(xué)習(xí)的興趣推動(dòng)了許多用于圖形深度學(xué)習(xí)的開(kāi)源庫(kù)的開(kāi)發(fā),為研究人員和工程師提供了更多的認(rèn)知空間,使他們專注于架構(gòu)、實(shí)驗(yàn)和應(yīng)用。
以下對(duì)7個(gè)新興的圖形深度學(xué)習(xí)開(kāi)源代碼庫(kù)進(jìn)行介紹,并按受歡迎程度進(jìn)行從低向高排列。
7.GeometricFlux.jl
這個(gè)列表中的大多數(shù)條目都使用Python,并構(gòu)建在TensorFlow、PyTorch或JAX之上,這反映了圖形深度學(xué)習(xí)語(yǔ)言的主導(dǎo)地位。然而,其第一個(gè)條目是一個(gè)基于Julia編程語(yǔ)言的Flux深度學(xué)習(xí)框架的圖形神經(jīng)網(wǎng)絡(luò)開(kāi)源庫(kù)。
由于從業(yè)者的數(shù)量相對(duì)較少,人們可能會(huì)放棄GeometricFlux.jl,甚至放棄使用Julia語(yǔ)言進(jìn)行深度學(xué)習(xí)的整個(gè)想法,但它是一種不斷發(fā)展的語(yǔ)言,與Python相比具有許多技術(shù)優(yōu)勢(shì)。人們很難預(yù)料到,DeepMind會(huì)在幾年前開(kāi)始放棄TensorFlow,轉(zhuǎn)而支持JAX,同樣在短短幾年內(nèi),人們可能會(huì)看到Julia語(yǔ)言開(kāi)始取代Python作為標(biāo)準(zhǔn)機(jī)器學(xué)習(xí)語(yǔ)言。
Julia編程語(yǔ)言從一開(kāi)始就被設(shè)計(jì)為既高效(如Python)又快速(像C等編譯語(yǔ)言一樣)。Julia語(yǔ)言使用即時(shí)編譯來(lái)實(shí)現(xiàn)快速執(zhí)行速度,而其read-execute-print循環(huán)(REPL)使得交互式和迭代編程具有相當(dāng)高的效率。當(dāng)用戶第一次運(yùn)行代碼時(shí),會(huì)注意到一點(diǎn)延遲,特別是當(dāng)習(xí)慣于以一種特別交互式的方式使用Python時(shí)(比如在Jupyter記事本中),但是隨著時(shí)間的推移,給定工作流的速度會(huì)顯著提高。
Julia被設(shè)計(jì)為一種科學(xué)編程語(yǔ)言,在過(guò)去五年的時(shí)間,自動(dòng)微分軟件包有了長(zhǎng)足的發(fā)展。最終結(jié)果是其功能可以將諸如DifferentialEquations.jl包等以研究為中心的庫(kù)與機(jī)器學(xué)習(xí)功能相結(jié)合,正如人們?cè)谏窠?jīng)微分方程包DiffEqFlux.jl中看到的那樣。GeometricFlux.jl也是如此,它旨在與圖論研究JuliaGraphs生態(tài)系統(tǒng)以及Flux的其他部分相兼容。
如果在工作中使用圖形深度學(xué)習(xí),那么堅(jiān)持使用基于PyTorch的庫(kù)或用于其他項(xiàng)目的深度學(xué)習(xí)標(biāo)準(zhǔn)工作框架可能是最有效的。但是,如果是從頭開(kāi)始或進(jìn)行研究,GeometricFlux.jl為使用Julia進(jìn)行圖深度學(xué)習(xí)和可微編程提供了一個(gè)引人注目的切入點(diǎn)。該庫(kù)友好的MIT許可證還可以輕松構(gòu)建和貢獻(xiàn)開(kāi)發(fā)人員需要的工具,或解決項(xiàng)目GitHub存儲(chǔ)庫(kù)中的一些未解決的問(wèn)題。
6.PyTorch GNN
PyTorch GNN庫(kù)是微軟公司的圖形深度學(xué)習(xí)庫(kù),在2020年5月發(fā)布之后仍在積極開(kāi)發(fā)0.9.x版本。PyTorch GNN(PTGNN)旨在讓熟悉基于PyTorch構(gòu)建模型的用戶容易熟悉torch.nn.Module類,并處理數(shù)據(jù)加載器的工作流任務(wù)。并將圖形轉(zhuǎn)換為PyTorch-ready tensors。
PTGNN基于一個(gè)有趣的架構(gòu),稱為Abstract Neural Model。這個(gè)類封裝了訓(xùn)練圖神經(jīng)網(wǎng)絡(luò)的整個(gè)過(guò)程,包括張量化和預(yù)處理原始數(shù)據(jù),還包括從PyTorch的nn.Module類中提取的實(shí)際神經(jīng)模型子類T Neural Module。神經(jīng)模塊可以獨(dú)立于Abstract Neural Model對(duì)象使用,事實(shí)上,如果需要的話,可以與其他類型的Pytork模塊/層結(jié)合使用。
PTGNN比GeometricFlux.jl推出略晚,提交歷史不太活躍,但是GitHub的Star和Fork稍微多一些。它具有相同的寬松和開(kāi)源MIT許可證,但如果正在尋找一個(gè)可以貢獻(xiàn)的項(xiàng)目,則需要大量的自我指導(dǎo)和學(xué)習(xí)。GitHub上的“問(wèn)題”選項(xiàng)卡幾乎沒(méi)有提供需要修復(fù)或?qū)嵤┑膬?nèi)容方向。
PTGNN在其構(gòu)造中有一些有趣的設(shè)計(jì)元素,可能會(huì)對(duì)其使用或使用感興趣,但如果開(kāi)發(fā)人員是圖形神經(jīng)網(wǎng)絡(luò)愛(ài)好者,并正在尋找基于PyTorch的圖深度學(xué)習(xí)庫(kù),那么可以使用PyTorch Geometric。PyTorch Geometric更加成熟,已經(jīng)開(kāi)發(fā)了大約4年的時(shí)間,并且擁有一個(gè)成熟且不斷增長(zhǎng)的用戶和開(kāi)發(fā)者社區(qū)。
5.Jraph
人們可能已經(jīng)注意到DeepMind在2020年12月發(fā)表的一篇博客文章,描述了他們?cè)陂_(kāi)發(fā)和使用基于功能可微編程庫(kù)JAX的深度學(xué)習(xí)研究庫(kù)的強(qiáng)大生態(tài)系統(tǒng)方面所做的持續(xù)努力。JAX是最初作為Python(尤其是NumPy)中簡(jiǎn)單但幾乎通用的自動(dòng)微分學(xué)術(shù)項(xiàng)目Autograd的概念產(chǎn)物推出的。
在谷歌公司招募到幾位最初負(fù)責(zé)Autograd開(kāi)發(fā)的程序人員之后,他們開(kāi)發(fā)了JAX。JAX是一個(gè)有趣的包,這在很大程度上歸功于它對(duì)可組合函數(shù)式編程范例的重視。它還關(guān)注“可微分編程”的一般概念,而不是主要關(guān)注像TensorFlow或PyTorch這樣的神經(jīng)網(wǎng)絡(luò)。盡管PyTorch和TensorFlow都可用于構(gòu)建可微物理模型而不是神經(jīng)網(wǎng)絡(luò),但JAX更容易從一開(kāi)始就更適合用于科學(xué)和其他編程任務(wù)的靈活可微編程。盡管之前曾花費(fèi)大量時(shí)間構(gòu)建基于TensorFlow的工具(如Sonnet),但JAX產(chǎn)品足以促使DeepMind開(kāi)始大量采用和開(kāi)發(fā)。
作為DeepMind為深度學(xué)習(xí)研究開(kāi)發(fā)基于JAX的生態(tài)系統(tǒng)的努力的一部分,他們開(kāi)發(fā)了一個(gè)名為Jraph的圖學(xué)習(xí)庫(kù)。
與這一列表中的其他一些庫(kù)不同,Jraph是一個(gè)輕量級(jí)和簡(jiǎn)約的圖學(xué)習(xí)庫(kù),它通常不規(guī)定特定的使用方式。Jraph繼承了其前身Graph Nets的一些設(shè)計(jì)模式,它使用TensorFlow和Sonnet構(gòu)建。也就是Jraph使用與Graph Nets相同的Graphs Tuple概念,它是一種包含描述節(jié)點(diǎn)、邊和邊方向的信息的數(shù)據(jù)結(jié)構(gòu)。Jraph處理的另一個(gè)特性為使用掩碼和填充處理可變結(jié)構(gòu)圖提供了特殊的便利。對(duì)于這一列表中的大多數(shù)其他Python庫(kù),這不是一個(gè)問(wèn)題,但由于在JAX中使用即時(shí)編譯,這是必要的。這可以確保在JAX中使用圖形,并不意味著放棄JAX在GPU和CPU硬件上提供的執(zhí)行加速。
4.Spektral
Spektral是一個(gè)基于Tensorflow 2和Keras的圖形深度學(xué)習(xí)庫(kù),其徽標(biāo)明顯受到Pac-Man ghost villains的啟發(fā)。如果開(kāi)發(fā)人員打算使用基于TensorFlow的庫(kù)來(lái)滿足其圖形深度學(xué)習(xí)需求,那么Spektral可能是最佳選擇。它旨在易于使用和靈活,同時(shí)保留盡可能接近熟悉的Keras API的用法。這意味著開(kāi)發(fā)人員甚至可以使用方便的model.fit()方法訓(xùn)練模型,只要提供Spetkral數(shù)據(jù)加載器來(lái)處理定義圖形的TensorFlow友好稀疏矩陣的形成。然而,Spektral的易用性需要權(quán)衡,與其他主要庫(kù)DGL和PyTorchGeometric相比,大多數(shù)任務(wù)的訓(xùn)練速度明顯較慢。
Spektral已被廣泛采用,如果開(kāi)發(fā)人員想使用TensorFlow構(gòu)建圖形模型,它可能是一個(gè)有吸引力的選擇。它可能比Deepmind的GraphNets庫(kù)得到更好的支持,但從各方面來(lái)看,它正在逐步淘汰,取而代之的是基于JAX的Jraph。Spektral是在Apache2.0開(kāi)源許可下發(fā)布的,并有一個(gè)活躍的問(wèn)題板,它將定期將請(qǐng)求整合在一起,這使得這個(gè)庫(kù)成為一個(gè)吸引人的深度學(xué)習(xí)庫(kù)。
3.Graph Nets
Graph Nets是Deepmind的另一個(gè)圖形深度學(xué)習(xí)庫(kù)。它建立在TensorFlow和Sonnet(另一個(gè)DeepMind庫(kù))之上,可能很快就會(huì)被前面描述的基于JAX的Jraph所取代。Graph Nets需要TensorFlow1,盡管它只有大約3年的使用歷史,但感覺(jué)有些過(guò)時(shí)。它在GitHub上擁有令人印象深刻的737個(gè)Fork和近5,000個(gè)Star,并且與來(lái)自Google/DeepMind的大多數(shù)其他庫(kù)一樣,在Apache2.0下獲得許可。Graph Nets起源于Jraph使用的Graphs Tuple數(shù)據(jù)結(jié)構(gòu)。
盡管Graph Nets在GitHub上似乎很受歡迎,但它可能沒(méi)有這一列表中的其他庫(kù)那么吸引人,除非開(kāi)發(fā)人員正在處理已經(jīng)大量使用該庫(kù)的現(xiàn)有代碼庫(kù)。對(duì)于使用TensorFlow的新項(xiàng)目來(lái)說(shuō),Spektral和DGL可能是更好的選擇,因?yàn)樗鼈兪怯酶碌募夹g(shù)構(gòu)建的,并且可能會(huì)在幾年內(nèi)繼續(xù)獲得支持。
2.Deep Graph Library (DGL)
DGL與微軟的PTGNN或谷歌/DeepMind的Jraph和GraphNets等大型科技公司無(wú)關(guān),而是一個(gè)名稱為“分布式深度機(jī)器學(xué)習(xí)社區(qū)”的一些深度學(xué)習(xí)愛(ài)好者的產(chǎn)品。它在GitHub上擁有超過(guò)100名貢獻(xiàn)者、1500次以上的提交和7,000多個(gè)Star。DGL在這一列表中也是獨(dú)一無(wú)二的,它提供了靈活的后端選擇。該模型可以運(yùn)行PyTorch、TensorFlow或MXNet,同時(shí)提供與驅(qū)動(dòng)實(shí)驗(yàn)的體驗(yàn)大致相似的體驗(yàn)。它是這一列表中仍在積極開(kāi)發(fā)中的壽命較長(zhǎng)的庫(kù)之一,其第一次提交可追溯到2018年4月。DGL最近被用來(lái)構(gòu)建SE(3)轉(zhuǎn)換器,這是一種強(qiáng)大的圖形轉(zhuǎn)換器,具有旋轉(zhuǎn)和平移等方差可能是AlphaFold2的構(gòu)建塊或靈感。該模型是已經(jīng)令人印象深刻的AlphaFold的繼承者,是DeepMind在2020年CASP14蛋白質(zhì)結(jié)構(gòu)預(yù)測(cè)挑戰(zhàn)賽上令人印象深刻的獲獎(jiǎng)表現(xiàn)背后的明星。這一事件促使一些新聞機(jī)構(gòu)宣布AlphaFold2是第一個(gè)解決重大科學(xué)挑戰(zhàn)的人工智能項(xiàng)目。
DGL是圍繞Gilmer等人描述的神經(jīng)消息傳遞范式在2017年構(gòu)建的。它提供了一個(gè)靈活的框架,涵蓋了用于構(gòu)建圖形神經(jīng)網(wǎng)絡(luò)的大多數(shù)類型的圖層。通過(guò)閱讀代碼存儲(chǔ)庫(kù)和文檔,就會(huì)注意到DGL是一個(gè)龐大的項(xiàng)目。這也意味著有很多(將近200個(gè))未解決的問(wèn)題,對(duì)于希望為具有重大影響的圖形深度學(xué)習(xí)項(xiàng)目做出貢獻(xiàn)的人來(lái)說(shuō),這是一個(gè)成熟的機(jī)會(huì)。DGL用于許多專門(mén)的應(yīng)用程序,在一定程度上已經(jīng)在它的基礎(chǔ)上構(gòu)建了幾個(gè)額外的庫(kù)。DGL-LifeSci是一個(gè)專為應(yīng)用于化學(xué)和生物信息學(xué)的深度學(xué)習(xí)圖而構(gòu)建的庫(kù),而DGL-KE是為處理知識(shí)圖嵌入而構(gòu)建的。這兩個(gè)額外的庫(kù)都是由AWS實(shí)驗(yàn)室開(kāi)發(fā)的。
1. PyTorch Geometric
在這一列表中名列榜首的庫(kù)就是PyTorch Geometric。PyTorch Geometric或PyG是一個(gè)成熟的幾何深度學(xué)習(xí)庫(kù),擁有1萬(wàn)多個(gè)stars和4400次提交,其中大部分都是一名才華橫溢的博士生Ru Stu1s推出的。PyG提供了一個(gè)實(shí)現(xiàn)圖神經(jīng)網(wǎng)絡(luò)層列表,它不僅可以非常快速地運(yùn)行深度圖網(wǎng)絡(luò),而且PyG還可以用于其他類型的幾何深度學(xué)習(xí),例如點(diǎn)云和基于網(wǎng)格的模型。
PyG有一個(gè)精心編寫(xiě)的示例教程介紹,自從2017年以來(lái)一直在開(kāi)發(fā),它非常完善,并得到了用戶社區(qū)和140多個(gè)貢獻(xiàn)者的大力支持。對(duì)于以前使用過(guò)PyTorch的任何人來(lái)說(shuō),使用PyG是非常熟悉的,最明顯的區(qū)別是數(shù)據(jù)輸入的一些差異。與通常的forward(x)編程模式不同,開(kāi)發(fā)人員將習(xí)慣于使用forward(batch),其中“batch”是包含描述圖形特性和連接的所有信息的數(shù)據(jù)結(jié)構(gòu)。
對(duì)于可以自由選擇庫(kù)的新項(xiàng)目,PyTorchGeometric很難被擊敗。
以下是這些用于圖形深度學(xué)習(xí)的開(kāi)源代碼庫(kù)之間的比較:
如何選擇深度學(xué)習(xí)庫(kù)
在許多情況下,開(kāi)發(fā)人員對(duì)深度圖學(xué)習(xí)庫(kù)的選擇將受到自己、雇主或指導(dǎo)人員之前選擇的深度學(xué)習(xí)庫(kù)的嚴(yán)重影響。例如,如果喜歡KerasAPI和TensorFlow,或者需要與預(yù)先存在的代碼庫(kù)保持一致的依賴關(guān)系,例如,Spektral可能是適合的庫(kù)。在此不建議使用DeepMind的GraphNets和TensorFlow1啟動(dòng)新項(xiàng)目,但該庫(kù)仍然會(huì)偶爾更新,并且可能是支持遺留項(xiàng)目的合理選擇。
如果開(kāi)發(fā)人員希望從頭開(kāi)始,可能有幾個(gè)誘人的選擇。如果認(rèn)為Julia Programming的深思熟慮的生產(chǎn)力+執(zhí)行速度優(yōu)先是機(jī)器學(xué)習(xí)和科學(xué)編程的未來(lái),那么GeometricFlux.jl將面臨令人興奮的前景。如果對(duì)函數(shù)式編程范式感興趣,并希望保留即時(shí)編譯(如Julia)的一些速度優(yōu)勢(shì),那么使用基于JAX的Jraph是一個(gè)更具吸引力的選擇。最后,如果想要一個(gè)處于相對(duì)成熟和成熟的開(kāi)發(fā)狀態(tài)的快速、功能強(qiáng)大的庫(kù),那么PyTorchGeometric將是一個(gè)理想選擇。
原文標(biāo)題:7 Open Source Libraries for Deep Learning Graphs,作者:Kevin Vu
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】