成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

解密GCN,手把手教你用PyTorch實現(xiàn)圖卷積網(wǎng)絡(luò)

發(fā)布于 2024-8-27 11:42
瀏覽
0收藏

圖神經(jīng)網(wǎng)絡(luò)(GNNs,Graph Neural Networks)是一類專為圖結(jié)構(gòu)數(shù)據(jù)設(shè)計的強大神經(jīng)網(wǎng)絡(luò),擅長捕捉數(shù)據(jù)之間的復雜聯(lián)系和關(guān)系。

相較于傳統(tǒng)神經(jīng)網(wǎng)絡(luò),GNN在處理相互關(guān)聯(lián)的數(shù)據(jù)點時更具優(yōu)勢,比如在社交網(wǎng)絡(luò)分析、分子結(jié)構(gòu)建模或交通系統(tǒng)優(yōu)化等領(lǐng)域,GNN能夠發(fā)揮出卓越的性能。

1 GNN概述

圖神經(jīng)網(wǎng)絡(luò)是近年來新興的一類深度學習模型,擅長處理圖形數(shù)據(jù)。

傳統(tǒng)神經(jīng)網(wǎng)絡(luò)處理的是像數(shù)字列表這樣的簡單數(shù)據(jù),而圖神經(jīng)網(wǎng)絡(luò)能處理更復雜的圖形數(shù)據(jù),比如由很多點(稱為節(jié)點)和連接這些點的線(稱為邊)組成的圖形,并且能從這些圖形中找出重要的信息。

其核心機制是讓圖中的每個節(jié)點通過與鄰近節(jié)點的信息交換,來學習自己在整體圖形中的位置和特性。這種基于信息傳遞的方法,讓圖神經(jīng)網(wǎng)絡(luò)能夠快速捕捉到圖形里的結(jié)構(gòu)和關(guān)系。

這種技術(shù)在很多領(lǐng)域都大放異彩,比如社交網(wǎng)絡(luò)分析、分子結(jié)構(gòu)預測、知識圖譜構(gòu)建等等。

隨著科學家們不斷地研究和創(chuàng)新,圖神經(jīng)網(wǎng)絡(luò)也在蓬勃發(fā)展,衍生出多種新模型,為機器學習在圖形數(shù)據(jù)領(lǐng)域的應(yīng)用開辟了新的可能性。

2 圖卷積網(wǎng)絡(luò)(Graph Convolutional Networks)

簡單來說,圖卷積網(wǎng)絡(luò)(GCN)跟傳統(tǒng)神經(jīng)網(wǎng)絡(luò)一樣,是由多層結(jié)構(gòu)堆疊而成的。

在深度學習中,圖卷積網(wǎng)絡(luò)(GCN)的核心是圖卷積層,其工作機制與卷積神經(jīng)網(wǎng)絡(luò)(CNN)的卷積層頗為相似。

在CNN中,卷積層負責捕捉圖像中局部區(qū)域的像素信息,這個過程稱之為“感受野”(Receptive Field),通過它,我們可以提取出圖像的簡化和低維特征。

解密GCN,手把手教你用PyTorch實現(xiàn)圖卷積網(wǎng)絡(luò)-AI.x社區(qū)

GCN層的工作原理與之類似,不過不是處理像素,而是處理圖中的節(jié)點信息。它通過收集每個節(jié)點及其相鄰節(jié)點的信息,來構(gòu)建節(jié)點的表示,從而捕捉圖中的結(jié)構(gòu)特征。

解密GCN,手把手教你用PyTorch實現(xiàn)圖卷積網(wǎng)絡(luò)-AI.x社區(qū)

3 推導GCN方程式

來聊聊圖卷積網(wǎng)絡(luò)(GNN)的數(shù)學原理。

首先,GNN的輸入是一個圖,這個圖可以用節(jié)點特征的矩陣和鄰接矩陣來表示。鄰接矩陣里的1代表兩個節(jié)點之間有連接,0則表示沒有連接。

解密GCN,手把手教你用PyTorch實現(xiàn)圖卷積網(wǎng)絡(luò)-AI.x社區(qū)

這個例子的鄰接矩陣是這樣的:

節(jié)點 1 -- 節(jié)點 2
     |
   節(jié)點 3

當我們用A乘以節(jié)點特征矩陣X,得到的結(jié)果是每個節(jié)點的鄰居對每個特征的貢獻總和。簡單來說,就是把每個節(jié)點i的鄰居j的特征加起來:

解密GCN,手把手教你用PyTorch實現(xiàn)圖卷積網(wǎng)絡(luò)-AI.x社區(qū)

然而,我們不應(yīng)忽視節(jié)點自身的特征。為了將節(jié)點自身的特征也考慮進來,可以在鄰接矩陣A的對角線上增加1,這在數(shù)學上相當于引入了單位矩陣I。

解密GCN,手把手教你用PyTorch實現(xiàn)圖卷積網(wǎng)絡(luò)-AI.x社區(qū)

這樣:

解密GCN,手把手教你用PyTorch實現(xiàn)圖卷積網(wǎng)絡(luò)-AI.x社區(qū)

但是,還有一個問題:節(jié)點的鄰居數(shù)量可能不一樣。有的節(jié)點有幾百個鄰居,有的可能只有一兩個。為了公平起見,我們需要對總和進行歸一化。

一種方法是用每個節(jié)點的鄰居數(shù)(也就是節(jié)點的度)來除以這個總和。可以創(chuàng)建一個對角線上是節(jié)點度的對角度矩陣D,然后歸一化方程:

解密GCN,手把手教你用PyTorch實現(xiàn)圖卷積網(wǎng)絡(luò)-AI.x社區(qū)

這樣:

解密GCN,手把手教你用PyTorch實現(xiàn)圖卷積網(wǎng)絡(luò)-AI.x社區(qū)

直觀地說,行歸一化就是取鄰居特征的平均值,而列歸一化則考慮了鄰居的鄰居數(shù)。

為了兩者兼顧,采用對稱歸一化:

解密GCN,手把手教你用PyTorch實現(xiàn)圖卷積網(wǎng)絡(luò)-AI.x社區(qū)

這考慮了當前節(jié)點的鄰居數(shù)和鄰居的鄰居數(shù)。

這樣一來,我們的方程式就越來越完整了!

最后,我們需要一些參數(shù)來訓練機器學習模型,就像在線性回歸中那樣,可以簡單地插入一個權(quán)重矩陣。

解密GCN,手把手教你用PyTorch實現(xiàn)圖卷積網(wǎng)絡(luò)-AI.x社區(qū)

而且,我們知道添加非線性可以提供更好的特征表示,所以還可以在上面加一個ReLU激活函數(shù)。

最后:

解密GCN,手把手教你用PyTorch實現(xiàn)圖卷積網(wǎng)絡(luò)-AI.x社區(qū)

4 PyTorch 實現(xiàn)

接下來,看看如何在 PyTorch 中實現(xiàn)圖卷積網(wǎng)絡(luò)。

首先,在類的初始化方法__init__中,我們會設(shè)置好鄰接矩陣A、度矩陣D和權(quán)重矩陣W。

然后,在模型的前向傳播過程中,利用這些組件來構(gòu)建節(jié)點的新特征矩陣H。

import torch
import torch.nn as nn
import torch.nn.functional as F

class GCNLayer(nn.Module):
    """
        GCN 層

        參數(shù):
            input_dim (int): 輸入的維度
            output_dim (int): 輸出的維度(softmax 分布)
            A (torch.Tensor): 2D 鄰接矩陣
    """

    def __init__(self, input_dim: int, output_dim: int, A: torch.Tensor):
        super(GCNLayer, self).__init__()
        self.input_dim = input_dim
        self.output_dim = output_dim
        self.A = A

        # A_hat = A + I
        self.A_hat = self.A + torch.eye(self.A.size(0))

        # 創(chuàng)建對角度矩陣 D
        self.ones = torch.ones(input_dim, input_dim)
        self.D = torch.matmul(self.A.float(), self.ones.float())

        # 提取對角元素
        self.D = torch.diag(self.D)

        # 創(chuàng)建一個新張量,對角線上是元素,其他地方是零
        self.D = torch.diag_embed(self.D)
        
        # 創(chuàng)建 D^{-1/2}
        self.D_neg_sqrt = torch.diag_embed(torch.diag(torch.pow(self.D, -0.5)))
        
        # 初始化權(quán)重矩陣作為參數(shù)
        self.W = nn.Parameter(torch.rand(input_dim, output_dim))

    def forward(self, X: torch.Tensor):

        # D^-1/2 * (A_hat * D^-1/2)
        support_1 = torch.matmul(self.D_neg_sqrt, torch.matmul(self.A_hat, self.D_neg_sqrt))
        
        # (D^-1/2 * A_hat * D^-1/2) * (X * W)
        support_2 = torch.matmul(support_1, torch.matmul(X, self.W))
        
        # ReLU(D^-1/2 * A_hat * D^-1/2 * X * W)
        H = F.relu(support_2)

        return H

if __name__ == "__main__":

    # 示例用法
    input_dim = 3  # 假設(shè)輸入維度是 3
    output_dim = 2  # 假設(shè)輸出維度是 2

    # 示例鄰接矩陣
    A = torch.tensor([[1., 0., 0.],
                      [0., 1., 1.],
                      [0., 1., 1.]])  

    # 創(chuàng)建 GCN 層
    gcn_layer = GCNLayer(input_dim, output_dim, A)

    # 示例輸入特征矩陣
    X = torch.tensor([[1., 2., 3.],
                      [4., 5., 6.],
                      [7., 8., 9.]])

    # 前向傳遞
    output = gcn_layer(X)
    
    print(output)
    # tensor([[ 6.3438,  5.8004],
    #         [13.3558, 13.7459],
    #         [15.5052, 16.0948]], grad_fn=<ReluBackward0>)

本文轉(zhuǎn)載自 ??AI科技論談??,作者: AI科技論談

收藏
回復
舉報
回復
相關(guān)推薦
主站蜘蛛池模板: 91视频在线看 | 精品一区二区在线视频 | 天天综合网7799精品 | www.黄网| 一区二视频 | 91精品国产色综合久久不卡98 | av男人的天堂av | 天堂中文在线观看 | 精品国产欧美一区二区三区不卡 | 久久久无码精品亚洲日韩按摩 | 天天综合国产 | 中文字幕视频在线 | 中文字幕在线不卡 | 视频一二区| 久久一区二区视频 | 欧美中文在线 | 日日操日日干 | 欧洲毛片 | 免费看a| 一级做a毛片 | 中文字幕av在线 | av手机免费在线观看 | 一区二区三区国产精品 | 黄色在线观看国产 | 精品国产伦一区二区三区观看方式 | 国产成在线观看免费视频 | 日韩一区精品 | 国产欧美精品区一区二区三区 | 精品视频一区在线 | 99精品久久久久久 | 一级毛片观看 | 国产精品视频网 | 狠狠视频 | 亚洲综合激情 | 欧美精品久久久久 | 午夜视频一区二区 | 成人在线视频观看 | 做a网站 | 亚洲精品一区二区网址 | 一区| 欧美偷偷 |