材料科学中的数据挖掘:晶体图神经网络解读与代码解析
?PaperWeekly 原創(chuàng) ·?作者|張瑋瑋
學(xué)校|東北大學(xué)碩士
研究方向|情緒識(shí)別
論文標(biāo)題:
Crystal Graph Neural Networks for Data Mining in Materials Science
論文鏈接:
https://storage.googleapis.com/rimcs_cgnn/cgnn_matsci_May_27_2019.pdf
代碼鏈接:
https://github.com/Tony-Y/cgnn
OQMD 數(shù)據(jù)庫(kù)(這個(gè)數(shù)據(jù)庫(kù)比較大,提供 python API 與晶體結(jié)構(gòu)可視化,可以使用 MySQL 讀入):OQMD [2]
晶體材料性質(zhì)一般通過(guò)輸入晶胞內(nèi)的原子數(shù)目、原子分子坐標(biāo)、晶格常數(shù)利用密度泛函理論(DFT)計(jì)算得出。機(jī)器學(xué)習(xí)方法在加速新材料設(shè)計(jì)方面正變得越來(lái)越流行,其預(yù)測(cè)材料性能的準(zhǔn)確性接近從頭算計(jì)算,但計(jì)算速度要快數(shù)量級(jí)。最近有人提出用稱(chēng)為晶體圖來(lái)表示晶體材料 [1],適應(yīng)于晶體圖的卷積神經(jīng)網(wǎng)絡(luò)利用平衡鍵距作為空間信息成功地預(yù)測(cè)了材料的體積特性。
預(yù)備知識(shí)
1.1 晶格常數(shù)(點(diǎn)陣常數(shù))
晶胞三個(gè)棱的常數(shù)以及這三個(gè)棱之間的夾角 6 個(gè)參數(shù)組成。按晶格常數(shù)的不同可以分為七大晶系。在本文中點(diǎn)陣矢量定義為 。
1.2 原子坐標(biāo)
原子坐標(biāo)有兩種表示形式:分?jǐn)?shù)坐標(biāo)和笛卡爾坐標(biāo)。分?jǐn)?shù)坐標(biāo)是把點(diǎn)陣矢量看成是單位矢量下確定原子位置; 笛卡爾坐標(biāo)是絕對(duì)坐標(biāo),是直角坐標(biāo)系與斜角坐標(biāo)系的統(tǒng)稱(chēng),考慮點(diǎn)陣常數(shù)的大小。本文利用的是原子的分?jǐn)?shù)坐標(biāo) 。笛卡爾坐標(biāo)可以和分?jǐn)?shù)坐標(biāo)相互轉(zhuǎn)換,在 定義的晶胞中,第 個(gè)原子的笛卡爾位置計(jì)算為 ,單元格體積 必須大于 0。
1.3 晶體性質(zhì)
晶體材料的總能量取決于晶體結(jié)構(gòu) ,并且可以使用 DFT 來(lái)近似計(jì)算,其中,原子數(shù)目為 。近似能量表示為:,可以通過(guò)最小化總能量來(lái)得到平衡結(jié)構(gòu):
表示平衡能的最小值。DFT 計(jì)算也給出體積特性,如形成能 、單位單元體積 、帶隙 和總磁化強(qiáng)度 。
1.4 數(shù)據(jù)集
現(xiàn)有的理論材料數(shù)據(jù)庫(kù)包含了無(wú)機(jī)晶體材料的松弛結(jié)構(gòu)及其性能。The Materials Project(MP)數(shù)據(jù)庫(kù)擁有 86k 條目,大多與實(shí)驗(yàn)觀察到的結(jié)構(gòu)有關(guān)。The Open Quantum Materials Database(OQMD v1.2)包含 563k 個(gè)與實(shí)驗(yàn)和假設(shè)化合物相關(guān)的條目。?
晶體圖神經(jīng)網(wǎng)絡(luò)
晶體圖神經(jīng)網(wǎng)絡(luò)(CGNNs)引入了一種比例不變的圖協(xié)調(diào)器(Crystal Graph Coordinator)來(lái)構(gòu)成晶體圖,用于在 OQMD 數(shù)據(jù)集上訓(xùn)練 CGNN 模型。CGNN模型對(duì)每一種測(cè)試材料的形成能、單元體積、帶隙和總磁化強(qiáng)度等體積特性進(jìn)行了預(yù)測(cè),其平均誤差小于數(shù)據(jù)庫(kù)中相應(yīng)的誤差。將預(yù)測(cè)的帶隙和總磁化率用于金屬絕緣體和非磁-磁材料二元分類(lèi)。?
CGNN 框架如圖 1 所示,CG-Gen 是原子序數(shù)的函數(shù),會(huì)產(chǎn)生平衡結(jié)構(gòu)下的晶體圖 , 是有向邊的集合 。P-CGNN 是一個(gè)預(yù)測(cè)平衡特性的多任務(wù)模型,。S-CGNN 是在 條件下,推導(dǎo)出晶胞形狀 和原子分?jǐn)?shù)坐標(biāo) 。本文通過(guò)預(yù)測(cè)的晶胞體積來(lái)縮放 來(lái)獲得平衡晶胞 。?
2.1 The Crystal Graph Coordinator
為了訓(xùn)練 CGNN 和 CG-Gen,框架需要一組由平衡結(jié)構(gòu)組成的晶體圖。在晶體學(xué)中,用泰森多邊形找出原子的最近鄰居,參考文獻(xiàn) [1] 運(yùn)用了該方法。CGNN 引入了一種晶體圖協(xié)調(diào)器,它通過(guò)聚類(lèi)來(lái)連接原子間的原子間距。由于使用了體積校正因子和縮放距離,晶體圖在單位單元的任何均勻變形下都具有不變性。偽代碼如下圖所示:
源代碼如下所示:
def?get_neighbors(geom):elems?=?[Element.from_Z(z)?for?z?in?geom.atomic_numbers]#通過(guò)原子序數(shù)來(lái)得到元素種類(lèi);OQMD數(shù)據(jù)庫(kù)共有89種化學(xué)元素,原子序數(shù)為1到83,89到94 radii?=?np.array([get_radius(e)?for?e?in?elems])#原子半徑是從PyMatGen庫(kù)獲得cutoff?=?radii[:,np.newaxis]?+?radii[np.newaxis,?:]#將任意兩個(gè)原子的半徑相加,比如有4種原子,則返回一個(gè)4*4的矩陣。vol_atom?=?(4?*?np.pi?/?3)?*?np.array([r**3?for?r?in?radii]).sum()#將晶胞內(nèi)的原子體積相加factor_vol?=?(geom.volume?/?vol_atom)**(1.0/3.0)#體積校正因子通過(guò)晶胞體積和原子體積之和得來(lái)factor?=?factor_vol?*?RADIUS_FACTORcutoff?*=?factor#得到截止半徑candidates?=?get_nbrs(geom.cart_coords,?geom.lattice.matrix,?cutoff)#這部分代碼函數(shù)在下文提供,主要是將原子的笛卡爾坐標(biāo)轉(zhuǎn)換為分子坐標(biāo)并且得到當(dāng)前原子小于截止半徑范圍內(nèi)的候選鄰居原子。neighbors?=?[]for?j?in?range(len(candidates)):dists?=?[]for?nbr?in?candidates[j]:i?=?nbr[0]#第一維表示原子索引d?=?nbr[1]#第二維表示距離r?=?nbr[2]dists.append(d?/?cutoff[j,i])#距離歸一到[0,1],以便進(jìn)行后續(xù)的聚類(lèi)X?=?np.array(dists).reshape((-1,?1))nnc_nbrs?=?get_nnc_loop(X)#得到最近鄰居原子的位置索引neighbors.append([candidates[j][i][0]?for?i?in?nnc_nbrs])return?neighbors def?get_nbrs(crystal_xyz,?crystal_lat,?R_max):A?=?np.transpose(crystal_lat)B?=?np.linalg.inv(A)crystal_red?=?np.matmul(crystal_xyz,?np.transpose(B))#笛卡爾坐標(biāo)系轉(zhuǎn)換為分?jǐn)?shù)坐標(biāo)系crystal_nbrs?=?pbc.get_shortest_distances(crystal_red,?A,?R_max,crdn_only=True)#得到當(dāng)前原子小于截止半徑范圍內(nèi)的候選鄰居原子return?crystal_nbrs得到的晶體圖如下例所示:
2.2 Crystal Graph Neural Networks
作者對(duì)模型結(jié)構(gòu)的介紹可以見(jiàn) Architectures-CGNN(tony-y.github.io)[3]
CGNN 體系結(jié)構(gòu)從原子序數(shù) 的嵌入層開(kāi)始構(gòu)造,得到初始隱藏狀態(tài):。?
T 個(gè)卷積塊會(huì)產(chǎn)生一系列更高維的隱藏特征:。卷積塊由邊神經(jīng)網(wǎng)絡(luò) (EdgeNet)、門(mén)控卷積和多層全連接神經(jīng)網(wǎng)絡(luò)(MFCNet)組成,如圖 3(b) 所示。圖 3(c) 所示的 EdgeNet 可以表示為:
本文設(shè)計(jì)了 EdgeNet 層的三個(gè)變體:Original EdgeNet Layer,Fast EdgeNet Layer,Aggregate EdgeNet Layer。
門(mén)控卷積表示為 ,MFCNet 各層使用 權(quán)值矩陣。graph-level 表示 是由所有的隱藏層狀態(tài) ,按照以下步驟進(jìn)行:在每一步中,隱藏狀態(tài)使用 Gated Pooling 機(jī)制匯合為:
然后,graph-level 狀態(tài)表示為 被加權(quán)平均為:
送入 graph-level MFCNet 輸出 ,最后層的輸出作為線性回歸模型的輸入來(lái)預(yù)測(cè)目標(biāo)值。
class?GGNN(nn.Module):"""Gated?Graph?Neural?NetworksNodes?->?Embedding?->?Gated?Convolutions?->?Graph?Pooling?->?Full?Connections?->?Linear?Regression"""def?__init__(self,?n_node_feat,?n_hidden_feat,?n_graph_feat,?n_conv,?n_fc,activation,?use_batch_norm,?node_activation,?use_node_batch_norm,edge_activation,?use_edge_batch_norm,?n_edge_net_feat,?n_edge_net_layers,edge_net_activation,?use_edge_net_batch_norm,?use_fast_edge_network,fast_edge_network_type,?use_aggregated_edge_network,?edge_net_cardinality,edge_net_width,?use_edge_net_shortcut,?n_postconv_net_layers,postconv_net_activation,?use_postconv_net_batch_norm,?conv_type,conv_bias=False,?edge_net_bias=False,?postconv_net_bias=False,full_pooling=False,?gated_pooling=False,use_extension=False):super(GGNN,?self).__init__() #設(shè)置激活函數(shù),論文共設(shè)置了softplus,ssp,elu,relu,selu,celu六種激活函數(shù)act_fn?=?get_activation(activation)if?node_activation?is?not?None:node_act_fn?=?get_activation(node_activation)else:node_act_fn?=?Noneif?edge_activation?is?not?None:edge_act_fn?=?get_activation(edge_activation)else:edge_act_fn?=?Nonepostconv_net_act_fn?=?get_activation(postconv_net_activation) #EdgeNet層的三個(gè)變體if?n_edge_net_layers?<?1:edge_nets?=?[None?for?i?in?range(n_conv)]else:edge_net_act_fn?=?get_activation(edge_net_activation)if?use_aggregated_edge_network:#AggregatedEdgeNetworkedge_nets?=?[AggregatedEdgeNetwork(n_hidden_feat,?n_edge_net_feat,n_edge_net_layers,?cardinality=edge_net_cardinality,width=edge_net_width,?activation=edge_net_act_fn,use_batch_norm=use_edge_net_batch_norm,bias=edge_net_bias,use_shortcut=use_edge_net_shortcut)for?i?in?range(n_conv)]elif?use_fast_edge_network:#FastEdgeNetworkedge_nets?=?[FastEdgeNetwork(n_hidden_feat,?n_edge_net_feat,n_edge_net_layers,?activation=edge_net_act_fn,net_type=fast_edge_network_type,use_batch_norm=use_edge_net_batch_norm,bias=edge_net_bias,use_shortcut=use_edge_net_shortcut)for?i?in?range(n_conv)]else:#Original?EdgeNet?Layeredge_nets?=?[EdgeNetwork(n_hidden_feat,?n_edge_net_feat,n_edge_net_layers,?activation=edge_net_act_fn,use_batch_norm=use_edge_net_batch_norm,bias=edge_net_bias,use_shortcut=use_edge_net_shortcut)for?i?in?range(n_conv)]if?n_postconv_net_layers?<?1:postconv_nets?=?[None?for?i?in?range(n_conv)]else:postconv_nets?=?[PostconvolutionNetwork(n_hidden_feat,?n_hidden_feat,n_postconv_net_layers,activation=postconv_net_act_fn,use_batch_norm=use_postconv_net_batch_norm,bias=postconv_net_bias)for?i?in?range(n_conv)]self.embedding?=?NodeEmbedding(n_node_feat,?n_hidden_feat)#節(jié)點(diǎn)嵌入層,使用線性層self.convs?=?[GatedGraphConvolution(n_hidden_feat,?n_hidden_feat,node_activation=node_act_fn,edge_activation=edge_act_fn,use_node_batch_norm=use_node_batch_norm,use_edge_batch_norm=use_edge_batch_norm,bias=conv_bias,conv_type=conv_type,edge_network=edge_nets[i],postconv_network=postconv_nets[i])for?i?in?range(n_conv)]#門(mén)卷積層self.convs?=?nn.ModuleList(self.convs)if?full_pooling:n_steps?=?n_convif?gated_pooling:self.pre_poolings?=?[GatedPooling(n_hidden_feat)for?_?in?range(n_conv)]else:self.pre_poolings?=?[LinearPooling(n_hidden_feat)for?_?in?range(n_conv)]else:n_steps?=?1self.pre_poolings?=?[None?for?_?in?range(n_conv-1)]if?gated_pooling:self.pre_poolings.append(GatedPooling(n_hidden_feat))else:self.pre_poolings.append(LinearPooling(n_hidden_feat))self.pre_poolings?=?nn.ModuleList(self.pre_poolings)#門(mén)pooling層self.pooling?=?GraphPooling(n_hidden_feat,?n_steps,?activation=act_fn,use_batch_norm=use_batch_norm)#多層全連接神經(jīng)網(wǎng)絡(luò)self.fcs?=?[FullConnection(n_hidden_feat,?n_graph_feat,activation=act_fn,?use_batch_norm=use_batch_norm)]self.fcs?+=?[FullConnection(n_graph_feat,?n_graph_feat,activation=act_fn,?use_batch_norm=use_batch_norm)for?i?in?range(n_fc-1)]self.fcs?=?nn.ModuleList(self.fcs)#線性回歸self.regression?=?LinearRegression(n_graph_feat)if?use_extension:self.extension?=?Extension()else:self.extension?=?Nonedef?forward(self,?input):#模型順序如下:Nodes -> Embedding -> Gated Convolutions -> Graph Pooling -> Full Connections -> Linear Regressionx?=?self.embedding(input.nodes)y?=?[]for?conv,?pre_pooling?in?zip(self.convs,?self.pre_poolings):x?=?conv(x,?input.edge_sources,?input.edge_targets)if?pre_pooling?is?not?None:y.append(pre_pooling(x,?input.graph_indices,?input.node_counts))x?=?self.pooling(y)for?fc?in?self.fcs:x?=?fc(x)x?=?self.regression(x)if?self.extension?is?not?None:x?=?self.extension(x,?input.node_counts)return?x實(shí)驗(yàn)結(jié)果
研究使用的數(shù)據(jù)集包括從 OQMD 的 561,888 個(gè)不同條目中提取的松弛結(jié)構(gòu)、形成能、晶胞體積、帶隙和總磁化率。P-GCNN 模型分別進(jìn)行了形成能預(yù)測(cè)、晶胞體積預(yù)測(cè)、帶隙預(yù)測(cè),其預(yù)測(cè)結(jié)果如下所示:
測(cè)試集中非磁體有 30,299 個(gè),磁體有 25,629 個(gè)。非磁體組的總磁化率幾乎為零,占檢測(cè)組總磁化率的 54.2%,而磁性組的均值為 /atom,標(biāo)準(zhǔn)差為 /atom,最大值為 /atom。與帶隙數(shù)據(jù)一樣,全題磁化數(shù)據(jù)在零處非負(fù)偏置,但磁數(shù)據(jù)具有大于 1 的正偏度 1.66 和 4.72 的高峰度,表明具有重尾分布。金屬絕緣體和非磁-磁材料分類(lèi)結(jié)果如下:
結(jié)果與討論
對(duì)于 OQMD 測(cè)試集中的每一種材料,P-CGNN 模型成功地預(yù)測(cè)了其形成能、單元體積、帶隙和總磁化強(qiáng)度,并將其分為金屬和絕緣體、非磁體和磁體。重要的是,預(yù)測(cè)沒(méi)有使用空間距離鍵長(zhǎng)信息。并且 CGNN 模型提供了與基于 DFT 的材料性質(zhì)預(yù)測(cè)的準(zhǔn)確性。
當(dāng) CG-Gen 從適當(dāng)?shù)牟牧蠑?shù)據(jù)庫(kù)中幾乎完全學(xué)習(xí)了晶體圖上的合成化學(xué)時(shí),就可以實(shí)現(xiàn)材料數(shù)據(jù)挖掘。由于晶體圖形序列是由對(duì)應(yīng)的圖形轉(zhuǎn)換序列生成的,因此整個(gè)圖形轉(zhuǎn)換序列集合可以看作是存儲(chǔ)了材料合成的完整信息的物質(zhì)基因組,就像人類(lèi)基因組是人類(lèi)核酸序列的完整集合一樣。
參考文獻(xiàn)
[1] Xie T, Grossman J C. Crystal graph convolutional neural networks for an accurate and interpretable prediction of material properties[J]. Physical review letters, 2018, 120(14): 145301.
[2] http://www.oqmd.org/
[3] https://tony-y.github.io/cgnn/architectures/
更多閱讀
#投 稿?通 道#
?讓你的論文被更多人看到?
如何才能讓更多的優(yōu)質(zhì)內(nèi)容以更短路徑到達(dá)讀者群體,縮短讀者尋找優(yōu)質(zhì)內(nèi)容的成本呢?答案就是:你不認(rèn)識(shí)的人。
總有一些你不認(rèn)識(shí)的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學(xué)者和學(xué)術(shù)靈感相互碰撞,迸發(fā)出更多的可能性。?
PaperWeekly 鼓勵(lì)高校實(shí)驗(yàn)室或個(gè)人,在我們的平臺(tái)上分享各類(lèi)優(yōu)質(zhì)內(nèi)容,可以是最新論文解讀,也可以是學(xué)習(xí)心得或技術(shù)干貨。我們的目的只有一個(gè),讓知識(shí)真正流動(dòng)起來(lái)。
?????來(lái)稿標(biāo)準(zhǔn):
? 稿件確系個(gè)人原創(chuàng)作品,來(lái)稿需注明作者個(gè)人信息(姓名+學(xué)校/工作單位+學(xué)歷/職位+研究方向)?
? 如果文章并非首發(fā),請(qǐng)?jiān)谕陡鍟r(shí)提醒并附上所有已發(fā)布鏈接?
? PaperWeekly 默認(rèn)每篇文章都是首發(fā),均會(huì)添加“原創(chuàng)”標(biāo)志
?????投稿郵箱:
? 投稿郵箱:hr@paperweekly.site?
? 所有文章配圖,請(qǐng)單獨(dú)在附件中發(fā)送?
? 請(qǐng)留下即時(shí)聯(lián)系方式(微信或手機(jī)),以便我們?cè)诰庉嫲l(fā)布時(shí)和作者溝通
????
現(xiàn)在,在「知乎」也能找到我們了
進(jìn)入知乎首頁(yè)搜索「PaperWeekly」
點(diǎn)擊「關(guān)注」訂閱我們的專(zhuān)欄吧
關(guān)于PaperWeekly
PaperWeekly 是一個(gè)推薦、解讀、討論、報(bào)道人工智能前沿論文成果的學(xué)術(shù)平臺(tái)。如果你研究或從事 AI 領(lǐng)域,歡迎在公眾號(hào)后臺(tái)點(diǎn)擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
總結(jié)
以上是生活随笔為你收集整理的材料科学中的数据挖掘:晶体图神经网络解读与代码解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 24张IT工程师技能图谱,这些你都会吗?
- 下一篇: 最新综述:多标签学习的新趋势