Hlbšie ponorenie do grafových neurónových sietí
Grafové neurónové siete (GNN) sa stali výkonnou architektúrou hlbokého učenia na porozumenie komplexných, prepojených dát. Na rozdiel od tradičných neurónových sietí, ktoré pracujú s pevne veľkými vstupmi ako sú obrázky alebo sekvencie, GNN sú navrhnuté tak, aby rozumeli vzťahom zachytávajúcim, ako sa entity spájajú, ovplyvňujú a interagujú v rámci grafu. To ich robí obzvlášť cennými v oblastiach, kde na štruktúre záleží, od sociálnych sietí a molekulárnej chémie až po odporúčacie systémy a detekciu podvodov.
V tomto článku rozoberieme základné myšlienky GNN, preskúmame, ako sa vyvinuli, a zdôrazníme reálne problémy, ktoré pomáhajú riešiť. Tiež sa dozviete, ako sa GNN implementujú v praxi, s praktickým príkladom vytvoreným pomocou knižnice PyTorch.
Hlavné body
- Grafové neurónové siete (GNN) sú vynikajúce na modelovanie vzťahov v prepojených dátach, čo ich robí ideálnymi pre úlohy, kde záleží na štruktúre a závislostiach.
- GNN rozširujú tradičné hlboké učenie na grafové formáty, čo umožňuje učenie z uzlov, hrán a ich prepojení.
- Populárne architektúry GNN, ako sú Graph Convolutional Networks (GCN), Graph Attention Networks (GAT) a GraphSAGE, ponúkajú rôzne spôsoby zberu a šírenia informácií medzi uzlami.
- Skutočné aplikácie GNN zahŕňajú analýzu sociálnych sietí, predpovedanie molekulárnych vlastností, odporúčacie systémy, odhaľovanie podvodov a znalostné grafy.
- Implementácia GNN je dostupná vďaka moderným rámcom ako PyTorch Geometric, ktorý zjednodušuje spracovanie dát, prenos správ a tvorbu modelov.
- Praktická implementácia demonštruje pracovný tok GNN, vrátane načítania grafových dát, definovania modelu, tréningu a vyhodnocovania výsledkov.
- GNN sa naďalej rýchlo vyvíjajú, pričom pokroky zlepšujú škálovateľnosť, efektivitu a výkon pri spracovaní stále väčších a zložitejších grafov.
Čo sú grafové neurónové siete?
Grafové neurónové siete, alebo skrátene GNN, sú relatívne nový typ neurónovej siete, ktorá dokáže pracovať s dátami štruktúrovanými ako grafy. Grafy sú v podstate množina objektov, predstavovaných ako uzly, a vzťahov medzi týmito objektmi, reprezentovaných hranami spájajúcimi uzly, a GNN dokážu pracovať s oboma typmi grafov – orientovanými grafmi, kde majú hrany smer, a neorientovanými grafmi, kde hrany nemajú konkrétny smer. Tieto grafy sa môžu výrazne líšiť aj veľkosťou a tvarom. Architektúra GNN pozostáva z viacerých vrstiev, z ktorých každá preberá informácie z predchádzajúcej vrstvy. GNN napájame grafom, ktorý je reprezentovaný súborom uzlov a hrán spolu s ich priradenými vlastnosťami. To, čo dostaneme, je množina vložení uzlov pre každý uzol v vstupnom grafe. Tieto vloženia predstavujú vlastnosti, ktoré sieť pre každý uzol naučila. Namiesto toho, aby sa pracovalo len s vektormi, maticami alebo tenzormi ako v bežnej neurónovej sieti, GNN dokážu pracovať s údajmi štruktúrovanými ako kompletné grafy. To ich robí veľmi flexibilnými pri práci so sieťovými údajmi, ako sú sociálne siete, molekulárne štruktúry alebo dopravné systémy. Matematiká, ktorá sa používa, je zložitá, ale základná myšlienka je, že prechádzajú grafom, odosielajú správy medzi uzlami a učia sa užitočné reprezentácie.
Ako fungujú grafové neurónové siete?
Grafové neurónové siete, alebo skrátene GNN, sú zamerané na učenie sa vzorov medzi uzlami v sieti. Hlavná myšlienka je, že každý uzol posiela správy svojim susedným uzlom a zdieľa o sebe informácie.
- V GNN si každý uzol vymieňa informácie s uzlami, s ktorými je spojený, čo modelu postupne pomáha porozumieť celej štruktúre grafu.
- Každý uzol vytvára „správu“ pomocou vlastných vlastností a vlastností svojich susedných uzlov.
- Zároveň susedné uzly generujú a odosielajú svoje vlastné správy späť.
- Keď uzol prijme tieto správy, aktualizuje svoj vnútorný stav zhromažďovaním všetkých prichádzajúcich informácií.
- Toto opakované odosielanie správ umožňuje, aby sa vedomosti šírili cez graf, čo umožňuje uzlom učiť sa o častiach grafu mimo ich bezprostredných susedov.
- Tým, že sa tieto procesy vrstvia do viacerých úrovní, môžu GNN učiť sa zložitejšie a hlbšie vzťahy.
- S každou pridanou vrstvou model vytvára bohatšie a zmysluplnejšie reprezentácie vlastností grafu.
Implementácia grafovej neurónovej siete v PyTorch
Dataset Cora
Dátová sada Cora je populárny benchmark, ktorý používajú výskumníci pracujúci na učení reprezentácií grafov. Táto dátová sada obsahuje množstvo vedeckých publikácií rozdelených do siedmich kategórií, ako sú „Case Based“, „Genetic Algorithms“, „Neural Networks“, „Probabilistic Methods“, „Reinforcement Learning“ a „Rule Learning“. Dátová sada Cora existuje už nejaký čas a zostáva často používaným zdrojom pre mnoho projektov v tejto oblasti. Poskytuje spôsob, ako zhodnotiť, ako efektívne môže váš model analyzovať textový obsah dokumentov aj vzájomne prepojenú sieť citácií medzi nimi. Mnohé významné články o grafových neurónových sieťach využili dataset Cora na hodnotenie výkonu v týchto dvoch úlohách. Je vytvorený ako graf, kde publikácie sú uzly a citácie medzi nimi tvoria hrany spájajúce uzly. Každý dokument je spojený s vektorom vlastností, ktorý reprezentuje jeho obsah. Výzvou je tu vyvinúť model, ktorý dokáže analyzovať citačný graf, obsahové vektory a vzťahy medzi nimi, aby predpovedal, do ktorej zo siedmich tried patrí daná publikácia.
Predspracovanie údajov
Knižnicu PyTorch Geometric nainštalujeme príkazom:
pip install torch_geometricPotom môžeme použiť knižnicu PyTorch Geometric na načítanie a predspracovanie dátovej sady.
from torch_geometric.datasets import Planetoid
import torch_geometric.transforms as T
dataset = Planetoid(root='data/Cora', name='Cora', transform=T.NormalizeFeatures())Trieda Planetoid načíta dataset Cora a normalizuje vektorové znaky. Môžeme získať predspracované dáta pomocou datasetu, ktorý nám poskytne objekt Data s týmito atribútmi:
- x: matica vlastností uzlov tvaru '(num_nodes, num_features )'
- edge_index: matica prepojení hrán s rozmermi ‘(2, num_edges)’
- y: vektor označení uzlov s tvarom ‘(num_nodes)’
- train_mask, val_mask, test_mask: logické masky ukazujúce, ktoré uzly sú určené na trénovanie, validáciu a testovanie.
Architektúra modelu
Pri tvorbe grafovej neurónovej siete je veľmi dôležité vybrať správnu architektúru modelu. Prejdeme si základnú implementáciu pomocou knižnice torch_geometric v PyTorchi. Využijeme grafovú konvolučnú sieť, ktorá slúži ako pevný východiskový bod pre rôzne úlohy učenia grafov.
import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
class GNN(torch.nn.Module):
def __init__(self, in_channels, hidden_channels, out_channels):
super(GNN, self).__init__()
# Define the first graph convolutional layer
self.conv1 = GCNConv(in_channels, hidden_channels)
# Define the second graph convolutional layer
self.conv2 = GCNConv(hidden_channels, out_channels)
# Define the linear layer
self.linear = torch.nn.Linear(out_channels, out_channels)
def forward(self, x, edge_index):
# Apply the first graph convolutional layer
x = self.conv1(x, edge_index)
# Apply the ReLU activation function
x = F.relu(x)
# Apply the second graph convolutional layer
x = self.conv2(x, edge_index)
# Apply the ReLU activation function
x = F.relu(x)
# Apply the linear layer
x = self.linear(x)
# Apply the log softmax activation function
return F.log_softmax(x, dim=1)- V uvedenom kóde sme importovali torch a torch.nn.functional, aby sme získali prístup k niektorým užitočným modulom a funkciám neurónových sietí. Potom sme definovali triedu GNN, ktorá dedí z torch a nn.Module.
- V metóde init sme definovali dve konvolučné vrstvy pomocou modulu GCNConv z PyTorch Geometric. To umožňuje jednoduchú implementáciu grafových konvolúcií. Pridali sme aj jednoduchú lineárnu vrstvu.
- Pri doprednom priechode sa najskôr vstup preposiela cez dve konvolučné vrstvy, pričom sa zakaždým aplikuje ReLU aktivácia. Potom prechádza cez lineárnu vrstvu a nakoniec cez log softmax, aby sa výstupy zmenšili.
V niekoľkých riadkoch kódu môžeme vytvoriť peknú malú grafovú neurónovú sieť!
Samozrejme, toto je jednoduchý príklad, ale môžeme vidieť, ako nám PyTorch a PyTorch Geometric umožňujú rýchlo prototypovať a iterovať na architektúrach grafových neurónových sietí. Vrstvy GCNConv veľmi uľahčujú začlenenie grafovej štruktúry do našich modelov.
Školenie
Na trénovanie budeme používať cross-entropy stratu a optimalizátor Adam. Dáta môžeme rozdeliť na tréningovú, validačnú a testovaciu sadu pomocou týchto maskovacích atribútov na objekte Data.
# Set the device to CUDA if available, otherwise use CPU
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# Define the GNN model with the specified input, hidden, and output dimensions, and move it to the device
model = GNN(dataset.num_features, 16, dataset.num_classes).to(device)
# Define the Adam optimizer with the specified learning rate and weight decay
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)
# Define the training function
def train():
# Set the model to training mode
model.train()
# Zero the gradients of the optimizer
optimizer.zero_grad()
# Perform a forward pass of the model on the training nodes
out = model(dataset.x.to(device), dataset.edge_index.to(device))
# Compute the negative log-likelihood loss on the training nodes
loss = F.nll_loss(out[dataset.train_mask], dataset.y[dataset.train_mask])
# Compute the gradients of the loss with respect to the model parameters
loss.backward()
# Update the model parameters using the optimizer
optimizer.step()
# Return the loss as a scalar value
return loss.item()
# Define the testing function
@torch.no_grad()
def test():
# Set the model to evaluation mode
model.eval()
# Perform a forward pass of the model on all nodes
out = model(dataset.x.to(device), dataset.edge_index.to(device))
# Compute the predicted labels by taking the argmax of the output scores
pred = out.argmax(dim=1)
# Compute the training, validation, and testing accuracies
train_acc = pred[dataset.train_mask].eq(dataset.y[dataset.train_mask]).sum().item() / dataset.train_mask.sum().item()
val_acc = pred[dataset.val_mask].eq(dataset.y[dataset.val_mask]).sum().item() / dataset.val_mask.sum().item()
test_acc = pred[dataset.test_mask].eq(dataset.y[dataset.test_mask]).sum().item() / dataset.test_mask.sum().item()
# Return the accuracies as a tuple
return train_acc, val_acc, test_acc
# Train the model for 500 epochs
for epoch in range(1, 500):
# Perform a single training iteration and get the loss
loss = train()
# Evaluate the model on the training, validation, and testing sets and get the accuracies
train_acc, val_acc, test_acc = test()
# Print the epoch number, loss, and accuracies
print(f'Epoch: {epoch:03d}, Loss: {loss:.4f}, Train Acc: {train_acc:.4f}, Val Acc: {val_acc:.4f}, Test Acc: {test_acc:.4f}')
Funkcia train vykoná jedno kolo tréningu a vráti stratu. Funkcia test kontroluje, ako model funguje na tréningových, validačných a testovacích množinách, a vráti presnosť. Model sme trénovali 500 epizód a na každej epizóde sme vypisovali presnosť tréningu a testovania.
Vypočítajte presnosť modelu GNN
Kód nižšie definuje funkciu na výpočet presnosti modelu na celom dátovom súbore. Funkcia compute_accuracy() prepne model do hodnotiaceho režimu, vykoná prednú propagáciu a predpovie štítky pre každý uzol. Tieto predikované štítky porovná s pravdivými štítkami a vypočíta počet správnych predikcií. Potom vydelí počet správnych predikcií celkovým počtom uzlov v dátovom súbore, aby získal percento presnosti.
@torch.no_grad()
def compute_accuracy():
model.eval()
out = model(dataset.x.to(device), dataset.edge_index.to(device))
pred = out.argmax(dim=1)
correct = pred.eq(dataset.y.to(device)).sum().item()
total = dataset.y.shape[0]
accuracy = correct / total
return accuracy
accuracy = compute_accuracy()
print(f"Accuracy: {accuracy:.4f}")V tomto prípade bola presnosť modelu na datasete Cora 0,8006. To znamená, že približne 80 % času bol model schopný správne predpovedať triedu. To je celkom dobré, ale nie dokonalé. Presnosť nám poskytuje rýchly, všeobecný pohľad na to, ako dobre model celkovo funguje. Ale aby ste naozaj pochopili, kde je úspešný a kde má problémy, musíte ísť do hĺbky.
Aby sme získali hlbšie porozumenie účinnosti modelu, odporúča sa zvážiť aj ďalšie evaluačné metriky, ako sú presnosť, úplnosť, F1 skóre a matica zámien. Tieto metriky poskytujú pohľad na výkonnosť modelu z rôznych aspektov, ako napríklad správne rozpoznávanie pozitívnych a negatívnych prípadov a spracovanie nevyvážených dátových súborov. Hoci presnosť 80 % je solídna, pred vyhlásením tohto modelu za veľký úspech by sme chceli viac kontextu. Sama metrika presnosti neposkytuje úplný obraz toho, čo sa deje vo vnútri modelu. Ale je dobrým východiskovým bodom na posúdenie výkonnosti.
Hodnotenie
Výkon GNN môžeme hodnotiť pomocou ukazovateľov ako presnosť, precíznosť, odvolanie a F1 skóre. Môžeme však tiež vizualizovať uzlové vektory, ktoré sa model naučí, pomocou t-SNE. Tento nástroj vezme vysokodimenzionálne vektory a premietne ich do 2D, čo nám umožní ich vizualizáciu.
# Import the necessary libraries
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
# Set the model to evaluation mode
model.eval()
# Perform a forward pass of the model on the dataset
out = model(dataset.x.to(device), dataset.edge_index.to(device))
# Apply t-SNE to the output feature matrix to obtain a 2D embedding
emb = TSNE(n_components=2).fit_transform(out.cpu().detach().numpy())
# Create a figure with a specified size
plt.figure(figsize=(10,10))
# Create a scatter plot of the embeddings, color-coded by the true labels
plt.scatter(emb[:,0], emb[:,1], c=dataset.y, cmap='jet')
# Display the plot
plt.show()Poznámka: Čitateľ môže spustiť kód vyššie. Zobrazí sa bodový graf, ktorý je možné interpretovať. Kód používa t-SNE na zobrazenie naučených vložení uzlov v 2D bodovom grafe, čo je chytrý spôsob, ako vizualizovať vysokorozmerné dáta. Poďme si prejsť, čo sa deje:
- Každý bod na grafe predstavuje uzol v dátovej sade. Osi x a y sú dve dimenzie, do ktorých t-SNE stlačilo vloženia. Farba každého bodu predstavuje skutočnú triedu zodpovedajúceho uzla v dátovej sade.
- Uzly, ktoré majú podobné vektory, by mali mať podobné označenia, takže sa na grafe zoskupia. Naopak, uzly s veľmi odlišnými vektormi pravdepodobne budú mať odlišné označenia, takže budú ďalej od seba.
- Celkovo príbeh poskytuje jasné znázornenie vzťahov medzi uzlami na základe ich naučených embeddingov. Môžete vidieť, ako sa tvoria skupiny, ktoré musia zdieľať nejakú základnú podobnosť. Je to užitočný spôsob, ako nazrieť do modelu a pochopiť, ako organizuje pojmy.
Potenciálne výzvy a úvahy
- S 2708 uzlami a 5429 hranami sa dataset Cora považuje za menší. To môže brániť efektívnosti GNN, čo si vyžaduje použitie pokročilejších metód, ako je augmentácia dát a transferové učenie.
- Dátová sada Cora pozostáva z jedného typu uzla a jedného typu hrany, čo ju robí homogénnou sieťou. To môže obmedziť aplikovateľnosť GNN pri použití na zložitejšie siete, ktoré zahŕňajú rôzne typy uzlov a hrán.
- Výber vhodných hodnôt pre hyperparametre, ako je počet skrytých vrstiev, počet skrytých jednotiek a rýchlosť učenia, môže výrazne ovplyvniť výkon GNN a vyžaduje si starostlivé ladenie.
Často kladené otázky
- 1. Čo je to grafová neurónová sieť (GNN)?
GNN je neurónová sieť navrhnutá na prácu s grafovo štruktúrovanými údajmi. Učí sa reprezentácie uzlov, hrán alebo celých grafov agregovaním informácií od susedných uzlov.
- 2. Čím sa GNN líši od tradičnej neurónovej siete?
Tradičné siete spracúvajú dáta v mriežkovej forme (obrázky, sekvencie), zatiaľ čo GNN môžu modelovať nepravidelné, prepojené štruktúry, ako sú sociálne siete alebo molekulárne grafy.
- 3. Na aké typy problémov sa používajú GNN?
Bežne sa používajú na klasifikáciu uzlov, predikciu spojení, klasifikáciu grafov, odporúčania, detekciu podvodov a predikciu molekulárnych vlastností.
- 4. Čo je prenášanie správ v GNN?
Prenos správ je základný mechanizmus, pri ktorom si uzly vymieňajú informácie so svojimi susedmi, aktualizujú vektorové reprezentácie a učia sa kontextové vzťahy.
- 5. Dokážu GNN efektívne fungovať pri veľmi veľkých grafoch?
Škálovanie môže byť náročné kvôli rozšíreniu pamäte a susedstva. Pomáhajú techniky ako vzorkovanie (GraphSAGE), mini-batching a distribuované učenie.
- 6. Aké programovacie knižnice sú najlepšie na implementáciu GNN?
Medzi populárne rámce patrí PyTorch Geometric (PyG) a Deep Graph Library (DGL), ktoré oba ponúkajú hotové vrstvy a nástroje na tvorbu modelov GNN.
- 7. Sú GNN vhodné pre aplikácie v reálnom čase?
Áno, v závislosti od zložitosti modelu. Ľahké architektúry a metódy založené na vzorkovaní pomáhajú dosiahnuť takmer výkon v reálnom čase.
- 8. Dokážu GNN spracovať dynamické alebo vyvíjajúce sa grafy?
Áno, dynamické varianty GNN môžu spracovávať grafy, ktoré sa menia v čase, čo je užitočné pri predpovedaní dopravy, časových odporúčaniach a detekcii anomálií.
- 9. Aké predspracovanie údajov je potrebné pre GNN?
Zvyčajne je potrebné pripraviť informácie o susednosti, vlastnosti uzlov/hrán a zabezpečiť, aby bol graf správne naformátovaný pre zvolenú knižnicu.
- 10. Sú GNN interpretovateľné?
Interpretovateľnosť sa zlepšuje vďaka nástrojom ako mechanizmy pozornosti a GNNExplainer, ktoré zvýrazňujú vplyvné uzly a hrany.
Záver
V tomto článku sme prešli základnými konceptmi grafových neurónových sietí (GNN) a preskúmali sme, ako sa dajú aplikovať v rôznych oblastiach. GNN sú jedinečne vhodné na prácu s údajmi štruktúrovanými vo forme grafov, čo umožňuje modelom uvažovať o zložitých vzťahoch nachádzajúcich sa v sociálnych sieťach, molekulárnych grafoch, dopravných systémoch a ďalších oblastiach.
Aby sme tieto myšlienky ukázali v praxi, použili sme populárny dataset Cora – referenčný bod pre učenie na grafoch. V tomto datasete je každá publikácia reprezentovaná ako uzol a citácie medzi nimi tvoria hrany. Naším cieľom bolo využiť textové vlastnosti každého článku aj citácie medzi nimi na predikciu jeho kategórie.
Dátovú sadu sme pripravili pomocou knižnice PyTorch Geometric, normalizovali sme vektorové vlastnosti a rozdelili údaje na trénovacie, validačné a testovacie sady. Potom sme postavili jednoduchú GNN pomocou vrstiev grafovej konvolúcie, nasledovanú lineárnym klasifikátorom, a trénovali ju použitím cross-entropy loss s optimalizátorom Adam. Nakoniec sme vyhodnotili výkon modelu meraním jeho presnosti.
Hoci existuje mnoho ďalších techník a vylepšení, ktoré by bolo možné preskúmať, tento projekt ponúka pevný úvod do toho, ako GNN fungujú a aké účinné môžu byť pri učení sa z komplexných relačných údajov.
Zdroje
- Vytváranie neurónových sietí od nuly: Časť 1
- Čo je hlboké učenie? Sprievodca pre začiatočníkov po neurónových sieťach
- Vysvetlenie architektúr hlbokého učenia: ResNet, InceptionV3, SqueezeNet
- PyTorch 101: Naučte sa hlboké učenie s PyTorch
Ďakujeme, že sa učíte s komunitou Linux-Console.net.


