开心六月综合激情婷婷|欧美精品成人动漫二区|国产中文字幕综合色|亚洲人在线成视频

    1. 
      
        <b id="zqfy3"><legend id="zqfy3"><fieldset id="zqfy3"></fieldset></legend></b>
          <ul id="zqfy3"></ul>
          <blockquote id="zqfy3"><strong id="zqfy3"><dfn id="zqfy3"></dfn></strong></blockquote>
          <blockquote id="zqfy3"><legend id="zqfy3"></legend></blockquote>
          打開APP
          userphoto
          未登錄

          開通VIP,暢享免費電子書等14項超值服

          開通VIP
          圖注意力網(wǎng)絡入門:從數(shù)學理論到到NumPy實現(xiàn)

          圖神經(jīng)網(wǎng)絡(GNNs)已經(jīng)成為學習圖數(shù)據(jù)的標準工具箱。gnn能夠推動不同領域的高影響問題的改進,如內(nèi)容推薦或藥物發(fā)現(xiàn)。與圖像等其他類型的數(shù)據(jù)不同,從圖形數(shù)據(jù)中學習需要特定的方法。正如Michael Bronstein所定義的:

          這些方法基于圖形上的某種形式的消息傳遞,允許不同的節(jié)點交換信息。

          為了完成圖上的特定任務(節(jié)點分類,鏈接預測等),GNN層通過所謂的遞歸鄰域擴散(或消息傳遞)來計算節(jié)點和邊緣表示。 根據(jù)此原理,每個圖節(jié)點從其鄰居接收并聚合特征以表示局部圖結(jié)構:不同類型的GNN層執(zhí)行各種聚合策略。

          GNN層的最簡單公式(例如圖卷積網(wǎng)絡(GCN)或GraphSage)執(zhí)行各向同性聚合,其中每個鄰居均做出同等貢獻以更新中心節(jié)點的表示形式。 這篇文章介紹了一個專門用于圖注意力網(wǎng)絡(GAT)分析的微型系列文章(共2條),該系列定義了遞歸鄰域擴散中的各向異性操作。 利用各向異性范式,通過注意力機制提高了學習能力,注意力機制為每個鄰居的貢獻賦予了不同的重要性。

          GCN vs GAT -數(shù)學基礎

          這個熱身是基于Deep Graph Library網(wǎng)站的GAT細節(jié)。

          在理解GAT層的行為之前,讓我們回顧一下GCN層執(zhí)行的聚合背后的數(shù)學運算。

          N是節(jié)點i的單跳鄰居的集合,也可以通過添加一個自循環(huán)將該節(jié)點包含在鄰居中。

          c是基于圖結(jié)構的歸一化常數(shù),定義了各向同性平均計算。

          σ是一個激活函數(shù),它在變換中引入了非線性。

          W為特征變換采用的可學習參數(shù)的權矩陣。

          GAT層擴展了GCN層的基本聚合功能,通過注意系數(shù)為每條邊分配不同的重要性。

          公式(1)是嵌入h_i的下層的線性變換,W是其可學習的權重矩陣。此轉(zhuǎn)換有助于實現(xiàn)足夠的表達能力,以將輸入要素轉(zhuǎn)換為高級且密集的特征。

          公式(2)計算兩個鄰居之間的成對非標準化注意力得分。在這里,它首先連接兩個節(jié)點的z嵌入,其中||表示串聯(lián)。然后,采用這種串聯(lián)的點積和可學習的權重向量a。最后,將LeakyReLU應用于點積的結(jié)果。注意分數(shù)表示消息傳遞框架中鄰居節(jié)點的重要性。

          公式(3)應用softmax來標準化每個節(jié)點進入邊緣上的注意力得分。 softmax將前一步的輸出編碼為概率分布。結(jié)果,在不同節(jié)點之間的注意力得分更具可比性。

          公式(4)與GCN聚合類似(請參閱本節(jié)開頭的公式)。來自鄰居的嵌入被聚集在一起,并按照注意力得分進行縮放。此縮放過程的主要結(jié)果是從每個鄰居節(jié)點獲悉不同的貢獻。

          NumPy實現(xiàn)

          第一步是準備成分(矩陣)來表示一個簡單的圖形,并執(zhí)行線性變換。

          print('\n\n----- One-hot vector representation of nodes. Shape(n,n)\n') X = np.eye(5, 5) n = X.shape[0] np.random.shuffle(X) print(X) print('\n\n----- Embedding dimension\n') emb = 3 print(emb) print('\n\n----- Weight Matrix. Shape(emb, n)\n') W = np.random.uniform(-np.sqrt(1. / emb), np.sqrt(1. / emb), (emb, n)) print(W) print('\n\n----- Adjacency Matrix (undirected graph). Shape(n,n)\n') A = np.random.randint(2, size=(n, n)) np.fill_diagonal(A, 1) A = (A + A.T) A[A > 1] = 1 print(A)

          第一個矩陣定義了節(jié)點的一個熱編碼表示。然后,利用定義的嵌入維數(shù)定義一個權重矩陣。 我突出顯示了W的第3列向量,因為正該向量定義了節(jié)點1的更新表示形式(在第三位置初始化了一個1值)。 我們可以執(zhí)行線性變換,以從這些要素開始為節(jié)點特征實現(xiàn)足夠的表達能力。 此步驟旨在將(一次熱編碼)輸入特征轉(zhuǎn)換為低而密集的表示形式。

          # equation (1) print('\n\n----- Linear Transformation. Shape(n, emb)\n') z1 = X.dot(W.T) print(z1)

          接下來的操作是為每個邊緣引入自注意系數(shù)。 我們將源節(jié)點的表示和目標節(jié)點的表示的表示連接起來。 該鄰接過程由鄰接矩陣A啟用,鄰接矩陣A定義了圖中所有節(jié)點之間的關系。

          # equation (2) - First part print('\n\n----- Concat hidden features to represent edges. Shape(len(emb.concat(emb)), number of edges)\n') edge_coords = np.where(A==1) h_src_nodes = z1[edge_coords[0]] h_dst_nodes = z1[edge_coords[1]] z2 = np.concatenate((h_src_nodes, h_dst_nodes), axis=1)

          在上一個塊中,我突出顯示了代表與節(jié)點1連接的4個邊緣的4行。每行的前3個元素定義節(jié)點1鄰居的嵌入表示,而每行的其他3個元素定義節(jié)點1的嵌入。 節(jié)點1本身(您會注意到,第一行編碼一個自循環(huán))。

          完成此操作后,我們可以引入注意力系數(shù),并將它們與邊緣表示相乘,這是由串聯(lián)過程產(chǎn)生的。 最后,Leaky Relu函數(shù)應用于該產(chǎn)品的輸出。

          # equation (2) - Second part print('\n\n----- Attention coefficients. Shape(1, len(emb.concat(emb)))\n') att = np.random.rand(1, z2.shape[1]) print(att) print('\n\n----- Edge representations combined with the attention coefficients. Shape(1, number of edges)\n') z2_att = z2.dot(att.T) print(z2_att) print('\n\n----- Leaky Relu. Shape(1, number of edges)') e = leaky_relu(z2_att) print(e)

          在此過程的最后,我們?yōu)閳D形的每個邊緣獲得了不同的分數(shù)。 在上面的方框中,我強調(diào)了與第一條邊相關的系數(shù)的演變。 然后,為了使系數(shù)可以輕松地在不同節(jié)點之間進行比較,將softmax函數(shù)應用于每個目標節(jié)點的所有鄰居的貢獻。

          # equation (3) print('\n\n----- Edge scores as matrix. Shape(n,n)\n') e_matr = np.zeros(A.shape) e_matr[edge_coords[0], edge_coords[1]] = e.reshape(-1,) print(e_matr) print('\n\n----- For each node, normalize the edge (or neighbor) contributions using softmax\n') alpha0 = softmax(e_matr[:,0][e_matr[:,0] != 0]) alpha1 = softmax(e_matr[:,1][e_matr[:,1] != 0]) alpha2 = softmax(e_matr[:,2][e_matr[:,2] != 0]) alpha3 = softmax(e_matr[:,3][e_matr[:,3] != 0]) alpha4 = softmax(e_matr[:,4][e_matr[:,4] != 0]) alpha = np.concatenate((alpha0, alpha1, alpha2, alpha3, alpha4)) print(alpha) print('\n\n----- Normalized edge score matrix. Shape(n,n)\n') A_scaled = np.zeros(A.shape) A_scaled[edge_coords[0], edge_coords[1]] = alpha.reshape(-1,) print(A_scaled)

          為了解釋定義歸一化邊緣得分的最后一個矩陣的含義,讓我們回顧一下鄰接矩陣的內(nèi)容。

          ----- Adjacency Matrix (undirected graph). Shape(n,n)[[1 1 1 0 1] [1 1 1 1 1] [1 1 1 1 0] [0 1 1 1 1] [1 1 0 1 1]]

          如您所見,我們沒有使用1個值來定義邊,而是重新縮放了每個鄰居的貢獻。 最后一步是計算鄰域聚合:將鄰居的嵌入合并到目標節(jié)點中,并按注意力分數(shù)進行縮放。

          # equation (4) print('\n\nNeighborhood aggregation (GCN) scaled with attention scores (GAT). Shape(n, emb)\n') ND_GAT = A_scaled.dot(z1) print(ND_GAT)

          下一步

          在以后的文章中,我將描述多頭GAT層背后的機制,并且我們將看到一些用于鏈接預測任務的應用程序。

          以下代碼提供了代碼的運行版本。github/giuseppefutia/notebooks/blob/main/gnns/gat.ipynb

          本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報
          打開APP,閱讀全文并永久保存 查看更多類似文章
          猜你喜歡
          類似文章
          圖神經(jīng)網(wǎng)絡原理解析及代碼實現(xiàn)(PyTorch)
          基于深度學習的文本自動生成
          Open3D人臉深度圖轉(zhuǎn)點云,點云表面重建
          ML之UliR:利用非線性回歸,梯度下降法(迭代十萬次)求出學習參數(shù)θ,進而求得Cost函數(shù)最優(yōu)值
          AdaBoost
          線性回歸基礎代碼
          更多類似文章 >>
          生活服務
          分享 收藏 導長圖 關注 下載文章
          綁定賬號成功
          后續(xù)可登錄賬號暢享VIP特權!
          如果VIP功能使用有故障,
          可點擊這里聯(lián)系客服!

          聯(lián)系客服