ãã®èšäºã¯ã NTTã³ãã¥ãã±ãŒã·ã§ã³ãº Advent Calendar 2023 11æ¥ç®ã®èšäºã§ãã ã¯ããã« ããã«ã¡ã¯ãã³ãã¥ãã±ãŒã·ã§ã³&ã¢ããªã±ãŒã·ã§ã³ãµãŒãã¹éšã®ç³äºã§ãã ä»å¹Žã¯AIåéã«ãããŠã¯ LLM 1 ã®è©±é¡ã§æã¡ããã®äžå¹Žã§ãããããã㪠LLM ãšã¯å
šãé¢ä¿ã®ãªãã°ã©ããã¥ãŒã©ã«ãããã¯ãŒã¯ïŒä»¥äžãGNNïŒã®èª¬ææ§ã«é¢ããææ³ã§ãã GNNExplainer ãé¡æã«æ±ã£ãŠããããšæããŸãã GNN 2 ãšã¯ã°ã©ãã§è¡šçŸãããæ§é åããŒã¿ã深局åŠç¿ã§æ±ãããã®ãã¥ãŒã©ã«ãããã¯ãŒã¯ææ³ã®ç·ç§°ã§ããã°ã©ãããŒã¿ã¯ããŸããŸãªäºè±¡ã衚çŸã§ããå¯èœæ§ãç§ããŠããŠãGNN ã®äºæž¬çµæãè§£éã§ããã°ã人ãšã®é¢ä¿æ§ææ¡ãããŒã±ãã£ã³ã°ãžã®å¿çšãªã©å¹
åºã掻çšãæåŸ
ã§ãããšæã£ãŠããŸããGNN ã«èå³ããªãæ¹ããããªæè¡ãããã®ããšæ·±ãèããã«èªãã§ããããã°ãšæããŸãã æ¬èšäºã§æ±ãå
容 æ¬èšäºã§ã¯ä»¥äžã®å
容ã«ã€ããŠæ±ããŸãã 説æå¯èœãª AIïŒXAIïŒã«ã€ã㊠GNNExplainer ãšã¯ GNNExplainer ã®å®è·µ 説æå¯èœãª AIïŒXAIïŒã GNNExplainer ã«é¢ããŠã®ç°¡åãªæŠèŠèª¬æãããåŸã«ããµã³ãã«ããŒã¿ãçšããŠæ§ç¯ããã¢ãã«ã« GNNExplainer ãåœãŠã¯ããŠã¿ãçµæã«ã€ããŠã³ãŒããšäœµããŠè§£èª¬ãããŠãããŸãã説æå¯èœãªAIïŒXAIïŒã GNNExplainer ã®æŠèŠã«ã€ããŠã¯ãã§ã«ç¥ã£ãŠãããšããæ¹ã¯èšäºåŸåã®ãGNNExplainer ã®å®è·µããŸã§é£ã°ããŠèŠãŠãã ããã 説æå¯èœãªAIïŒXAIïŒã«ã€ããŠ æ©æ¢°åŠç¿ã¢ãã«ã«ãããæææ±ºå®ãè¡ãéã«ããã®ã¢ãã«ãäžãã倿ã人éãçè§£ã§ããããã«èª¬æããããšãç®çãšããæè¡ã®ç·ç§°ãã説æå¯èœãªAIïŒXAIïŒ 3 ããšèšããŸããæšä»ã®æè¡çºå±ã¯ããã£ãŒãã©ãŒãã³ã°ãç®åãã«ããé«ãäºæž¬ç²ŸåºŠãéæããŠããäžæ¹ã§ãäºæž¬ã«ããã説æå¯èœæ§ãšããã®ã¯è€éåãã颿°è¿äŒŒã«ãã£ãŠç ç²ã«ãªã£ãŠããŸããã€ãŸããäºæž¬ç²ŸåºŠãšèª¬æå¯èœæ§ã®éã«ã¯ãã¬ãŒããªãã®é¢ä¿ããããæšä»ã§ã¯æ©æ¢°åŠç¿ã¢ãã«ã人éãçè§£ããããšã¯æ¥µããŠé£ãããªã£ãŠããŸãã ã§ã¯ããªã説æå¯èœãªAIïŒXAIïŒã倧äºãªã®ããšãããšãããã¯çŸå®äžçãããžãã¹é åã§ã¯æææ±ºå®ã«ãããéææ§ãäžåæ§ãèŠæ±ãããããã§ããäŸãã°ãå»çåéã§ãã人ã®ç
æ°ã®çºçãªã¹ã¯ãäºæž¬ããå€å®ãæ©æ¢°åŠç¿ã¢ãã«ã§è¡ããäºæž¬çµæãšããŠçºçãªã¹ã¯ãé«ããšã®å€æãããå Žåã«ã¯ããã®çµæãšæ ¹æ çç±ã瀺ããªããã°çŽåŸãåŸãããä¿¡çšãæãªãå¯èœæ§ããããŸãã ãã®ããã«èª¬æå¯èœæ§ã¯çŸå®äžçã§ã¯æ¥µããŠéèŠãªèŠçŽ ã®1ã€ãšãªã£ãŠãããäžè¬çã«äººéã¯èªåãè§£éãããçè§£ã§ããªããã®ãæ¡çšããªãåŸåããããããæ©æ¢°åŠç¿ã¢ãã«ã®èª¬æå¯èœæ§ã¯ããããã·ãŒã³ã«ãããŠç¡èŠã§ããªããã®ãšãªã£ãŠããŸãããã®ããã GNN ã«ãããŠãåæ§ã«ã¢ãã«ã®èª¬æå¯èœæ§ã¯èŠæ±ãããããšããã GNN ã«ãããèª¬ææ§ã«çŠç¹ãåœãŠãæè¡ãéçºãããŠããŠããŸãã GNNExplainer ãšã¯ GNNExplainer 4 ãšã¯ã2019幎㫠NeurIPS 5 ã§æ¡æãããè«æã§ããã GNNExplainer: Generating Explanations for Graph Neural Networks ãã®äžã§ææ¡ããã GNN ã®èª¬ææ§ã«é¢ããææ³ã§ãã GNNExplainer ã¯åŠç¿æžã¿ã® GNN ã¢ãã«ãšäºæž¬çµæãå
¥åãšããŠäžãããšãåºåãšããŠäºæž¬ã«åœ±é¿ãäžããããŒãã®ç¹åŸŽéãšäºæž¬ã説æãããµãã°ã©ããè¿ãããšã§äºæž¬çµæã説æããããšãå¯èœã«ããŸãã ãŸããmodel-agnostic ãªææ³ã§ãããããç¹å®ã®ã¢ãã«ã«äŸåããããšãªãæ±ãããšãã§ããŸããå ããŠãGNN ã§æ±ãåé¡èšå®ã«ã¯ããã€ãã®çš®é¡ããããŸãããããŒãåé¡ããªã³ã¯äºæž¬ãã°ã©ãåé¡ãªã©äžè¬çãªã°ã©ãã®åé¡èšå®ã«å¯Ÿå¿ããŠããããé©çšç¯å²ãåºãããšãèšããŸãã è«æå
ã§ã¯ãå®äžçã®ããŒã¿ã»ãããçšããŠãGNNExplainer ã®èª¬ææ§ã«ãããåŠ¥åœæ§ãå®éåæãšå®æ§åæã®äž¡åŽé¢ããè©äŸ¡ããŠã©ããããæå¹ã§ããããè¿°ã¹ãŠããŸããèå³ãããæ¹ã¯ãè«æãåç
§ããŠè©³ããå®éšå
容ã«ã€ããŠèŠãŠãã ããã GNNExplainer ã®ã¢ã«ãŽãªãºã ã¯ãããŒã ãäžããããéã«äºæž¬æ ¹æ ããã説æãããããªãµãã°ã©ã ãšããŒãã®ç¹åŸŽé ãç¹å®ããããšãç®æããŠãããŸãããããŠãããã§è¿°ã¹ãŠãããã説æãã§ããŠãããµãã°ã©ã ããåœè©²ã¢ã«ãŽãªãºã ã§ã¯çžäºæ
å ±é ãæå€§åãããã㪠ãšå®çŸ©ããŠããŸãã äžèšã®å®åŒã¯ããšã³ããããŒ ãšæ¡ä»¶ä»ããšã³ããã㌠ã®å·®åãæå€§åããããšãæå³ããŠãããåŠç¿æžã¿ã® GNN ã§ã¯äºæž¬ç¢ºçã¯åºå®ã§ããããšãããšã³ããã㌠ã®é
ã¯äžå®ãšãªããããæ¡ä»¶ä»ããšã³ããã㌠ã®é
ãæå°åãããããªãµãã°ã©ã ãæ¢çŽ¢ããŠããããšãå®è³ªçã«è¡ããŸãã ããå°ãç°¡åã«èª¬æãããšãå
šäœã®ã°ã©ããã察象ããŒã ãšã¯å¥ã®ããŒãã§ãã ãé€å€ããéã®äºæž¬ç¢ºç ã®å¢æžãèŠãŠãäºæž¬ç¢ºçã倧ããæžå°ããå Žåã¯ããŒã ã¯äºæž¬ã«è¯ã圱é¿ãäžãããšå€æããŠãäºæž¬ã«å€§ããå¯äžãããšããžã®ã¿ãéžæããŠããããšã§æå¹ãªãµãã°ã©ãã®ç²åŸãç®æããŠãããŸãã å®éã«ã¯ããã®ãµãã°ã©ãã®éžå®ã®éã«ã¯å
šæ¢çŽ¢ãããšèšç®ã³ã¹ããèšå€§ãšãªããããçŽæ¥æé©ååé¡ãè§£ãããšã¯ããã«æ¡ä»¶ä»ããšã³ããããŒã®åŒãã€ã§ã³ã»ã³ã®äžçåŒãå¹³åå Žè¿äŒŒãçšããŠãšããžã®ååšæç¡ã瀺ãæåŸ
å€ã«å€æããŠããµãã°ã©ãã®é£æ¥è¡åãèšç®ããŠæ±ããŠããããšã§å®çŸããŸãããã®èŸºãã®è©³çްãªèª¬æã«ã€ããŠã¯ å
ã®è«æ ãåç
§ãã ããã GNNExplainer ã®äœ¿ãæ¹ GNNExplainer 㯠PyTorch Geometric 6 å
ã®ã¢ãžã¥ãŒã«ãšããŠãã§ã«å®è£
æžã§ãããã®ãããåœè©²ãã¬ãŒã ã¯ãŒã¯ãå©çšããããšã§ç°¡åã« GNNExplainer ã®åŠçãåçŸã§ããŸãã PyTorch Geometric ã§ã¯ããŒãžã§ã³2.2ããèª¬ææ§ã®ãã¬ãŒã ã¯ãŒã¯ãšã㊠explain ã¢ãžã¥ãŒã«ãæäŸããŠãããããŸããŸãªã¢ã«ãŽãªãºã ãçšã㊠GNN ã®èª¬ææ§çæãå¯èŠåã®ããã®æè»ãªã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŠããŸãã PyTorch Geometric ã§ã¯ GNNExplainer 以å€ã®ã¢ã«ãŽãªãºã ãšããŠãCaptumExplainer ã PGExplainer 7 ã AttentionExplainer 8 ãªã©ã®ã¢ã«ãŽãªãºã ãçšæãããŠããå©çšããããšãå¯èœã§ãã以äžã«ããããã®ç¹åŸŽããŸãšããŸãã GNNExplainer ã¯ããŒãã®éèŠç¹åŸŽéã ãã§ãªãã°ã©ãããããžã«åºã¥ããéèŠãªãµãã°ã©ããåæã«æããã«ãã GNN ã«å¯ŸããŠæå¹ãªèª¬æææ³ãææ¡ããæåã®æè¡ã§ããåäžã®ã€ã³ã¹ã¿ã³ã¹ïŒäºæž¬å¯Ÿè±¡ã§ããã°ã©ããããŒãã®åäœïŒã«å¯ŸããŠãç¬ç«ããèª¬ææ§ã«é¢ããç¹åŸŽéããµãã°ã©ããçæããããããã®èª¬ææ§ã察象ãšããŠããªãå¥ã®ã€ã³ã¹ã¿ã³ã¹ã«äžè¬åããããšãå°é£ã§ãããšãã課é¡ããããŸããããããè€é㪠GNN ã®çè§£ã«éããŠè§£éãäžå©ããããšã¯ééããªããããé©åãªç¶æ³äžã§ã®å©çšãä»ã®ææ³ãšçµã¿åãããŠè§£éãè£ãããšãå¯èœã§ãã CaptumExplainer 㯠Integrated Gradients 9 ãšåŒã°ããåŸé
ç©åæ³ã®å
¬çã«åºã¥ããŠå次å
ã«ãããç¹åŸŽéã®å¯äžåºŠãç®åºããææ³ã§ãç®åºéçšãã¢ãã«å®è£
ã«äŸåããªããããmodel-agnostic ãªææ³ã«åé¡ãããŠããŸãããŸããIntegrated Gradients ã¯ãããã埮åå¯èœã¢ãã«ãžã®é©çšãå¯èœãªãããGNN ã«éããããŸããŸãªã¢ãã«ã§èª¬ææ§ã®æè¡ãšããŠé©çšãããŠããŸããäžæ¹ã§ãIntegrated Gradients ã¯ã°ã©ãã«ç¹åããææ³ã§ã¯ãªãããšãããããŒãéãªã©ã®çžäºäœçšãªã©ãèæ
®ãããªããããèª¬ææ§ã«ã€ããŠãåœç¶ã«çžäºäœçšãèæ
®ãããªã圢ã§åºåããããšãã£ã課é¡ããããŸãã PGExplainer 㯠GNNExplainer ã§èª²é¡ãšãªãåäžã€ã³ã¹ã¿ã³ã¹ã«å¶éããã課é¡ããèª¬ææ§ã®çæéçšããã¥ãŒã©ã«ãããã¯ãŒã¯ãããã©ã¡ãŒã¿åããããšã§ãäžé£ã®ã€ã³ã¹ã¿ã³ã¹ã®äºæž¬ããŸãšããŠã¢ãã«å
šäœãšããŠã®èª¬ææ§ãååŸããããšãå¯èœã«ããææ³ã§ãããã¡ãã model-agnostic ãªææ³ãšãªã£ãŠããŸãããŸããäžé£ã®ã€ã³ã¹ã¿ã³ã¹ãäºæž¬ããéã« GNNExplainer ã§ã¯æ°ããã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠååŠç¿ãèŠããããPGExplainer ã§ã¯äžåºŠåŠç¿ãã説æåšã®ã¢ãã«ãåž°çŽçãªèšå®ã®ã¿ã§æ°ããã€ã³ã¹ã¿ã³ã¹ã説æå¯èœãšãªãããšãããååŠç¿ãå¿
èŠãšããå€§èŠæš¡ãªããŒã¿ã»ããã«å¯ŸããŠãææ³é©çšãå¯èœãšãããŠããŸãã ã¡ãªã¿ã«äœè«ã«ã¯ãªããŸãããPyTorch Geometric ãšåæ§ã« GNN ãæ±ããã¬ãŒã ã¯ãŒã¯ã§ãã DGL 10 ã§ãããŒãžã§ã³ 1.0.0 以éã§ GNNExplainer çããµããŒãããŠããŸããã©ã¡ãã®ãã¬ãŒã ã¯ãŒã¯ã§ã GNNExplainer ãæ±ãããšãã§ããããããèªèº«ã§ãã§ã«äœ¿ãæ
£ããŠãããã¬ãŒã ã¯ãŒã¯ã«åãããŠéžæããããšè¯ãããšæããŸãã GNNExplainer ã®å®è·µ ããããã¯å®éã«ãµã³ãã«ããŒã¿ãçšããŠãæ§ç¯ãã GNN ã¢ãã«ã« GNNExplainer ãé©çšããŠäºæž¬ãè§£éããããšã詊ããŠããããšæããŸãã å®è¡ç°å¢ã»ã€ã³ã¹ããŒã« ãŸãã¯å®è¡ç°å¢ã§ãã ä»åã¯ä»¥äžã®å
容㧠PyTorch Geometric ãæ±ããç°å¢ãçšæããŸããã # cat /etc/os-release NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" # pip list | egrep "(torch)" torch 2.1.1 torch-cluster 1.6.3+pt21cpu torch_geometric 2.4.0 torch-scatter 2.1.2+pt21cpu torch-sparse 0.6.18+pt21cpu torch-spline-conv 1.2.2+pt21cpu torchaudio 2.1.1 torchvision 0.16.1 PyTorch ã PyTorch Geometric ã®ã€ã³ã¹ããŒã«ã¯å
¬åŒãµã€ãã«åãããããèšèŒããŠããŸãã®ã§ãã¡ããåç
§ããŠã³ãã³ããå®è¡ããŠã¿ãŠãã ããã ããŒã¿æºå ä»åã¯ãã³ãããŒã¯ãšããŠãå©çšãããŠãããªãŒãã³ããŒã¿ã§ãã Amazon Dataset 11 ãå©çšããŸãã ãã®ããŒã¿ã»ããã¯ããŒããååã瀺ãããšããžã¯å
±å賌å
¥ãããããšã衚ããã°ã©ãããŒã¿ã§ãã ããŒãç¹åŸŽéã¯ååã¬ãã¥ãŒã bag-of-words 12 ã«ãããã¯ãã«å€æããããŒã¿ãšãªã£ãŠããã745次å
ã®ç¹åŸŽéãæã£ãŠããŸãããŸããããŒãã®ã¿ãŒã²ããã©ãã«ã¯ååã«ããŽãªã瀺ããŠããã8ã€ã®ååã«ããŽãªã®ããããã«è©²åœããŸãã é
ç® å
容 ããŒãæ° 7,650 ãšããžæ° 238,162 ããŒãç¹åŸŽéïŒæ¬¡å
æ°ïŒ 745 ã¯ã©ã¹æ° 8 æç« ã§ã¯å°ãåããã¥ããéšåãããããšæããŸãã®ã§ãããŒããšãšããžã®é¢ä¿æ§ãç°¡æã«ç€ºããå³ãšå®éã®ããŒã¿ã NetworkX 13 ã«ãŠå¯èŠåããã°ã©ããèŒããŠãããŸãã åé¡èšå® åé¡èšå®ã¯ã·ã³ãã«ã«ãã«ãã¯ã©ã¹ã®ããŒãåé¡åé¡ãèããŸãã以äžã«æŠèŠã瀺ããŸãã äºæž¬å¯Ÿè±¡ãšãªãååããŒãã8ã€ã®ååã«ããŽãªã®ã©ãã«åœãŠã¯ãŸãã®ããäºæž¬ãã GNN ã¢ãã«ãæ§ç¯ããããšãç®æããŸãã å ããŠãä»åã¯èª¬ææ§ãç²åŸãããã®ã§æ§ç¯ãã GNN ã¢ãã«ã«å¯ŸããŠãGNNExplainer ãé©çšããŠãã®åŸãããèª¬ææ§ã«ã€ããŠç¢ºèªããŠããããšæããŸãã ã¢ãã«è§£é æ¬é¡ã®ã¢ãã«æ§ç¯ãš GNNExplainer ã«ããèª¬ææ§ã®ç²åŸã«ã€ããŠã³ãŒããèŒããªããè¿°ã¹ãŠãããŸãããŸãã¯ãGNN ã¢ãã«ãäœæããŸãã import random from math import sqrt from collections import Counter import networkx as nx import torch import torch.nn as nn import torch.nn.functional as F import torch_geometric.transforms as T from torch_geometric.explain import Explainer, GNNExplainer from torch_geometric.explain.metric import fidelity from torch_geometric.explain.metric import groundtruth_metrics from torch_geometric.nn import GCNConv from torch_geometric.utils import to_networkx from torch_geometric.datasets import Amazon # ãã©ã¡ãŒã¿æå® DIM = 16 # ããŒã¿èªã¿èŸŒã¿ dataset = Amazon(root= '../data' , name= 'Photo' ) data = dataset[ 0 ] # ããŒã¿åå²ïŒåŠç¿ããŒã¿:ãã¹ãããŒã¿:ããªããŒã·ã§ã³ããŒã¿ïŒ7:2:1ïŒ split = T.RandomNodeSplit(num_val= 0.1 , num_test= 0.2 ) data = split(data) # ã¢ãã«å®çŸ© class Model (nn.Module): def __init__ (self, num_features, dim= 16 , num_classes= 8 ): super ().__init__() self.conv1 = GCNConv(dataset.num_node_features, dim) self.conv2 = GCNConv(dim, num_classes) def forward (self, x, edge_index): x = self.conv1(x, edge_index) x = F.relu(x) out = self.conv2(x, edge_index) return F.log_softmax(out, dim= 1 ) def train (model, data, optimizer, criterion, epochs= 100 ): for epoch in range ( 1 , epochs + 1 ): model.train() optimizer.zero_grad() out = model(data.x, data.edge_index) loss = criterion(out[data.train_mask], data.y[data.train_mask]) loss.backward() optimizer.step() pred = out.argmax(dim= 1 ) acc_train = int ((pred[data.train_mask] == data.y[data.train_mask]).sum()) / int (data.train_mask.sum()) acc_val = eval_acc(model, data, data.val_mask) if epoch % 10 == 0 : print (f 'Epoch: {epoch:03d}, Train Loss: {loss:.3f}, Train Loss: {acc_train:.3f} ,Val Acc: {acc_val:.3f}' ) return model def eval_acc (model, data, mask): model.eval() pred = model(data.x, data.edge_index).argmax(dim= 1 ) correct = (pred[mask] == data.y[mask]).sum() acc = int (correct) / int (mask.sum()) return acc # ãã©ã¡ãŒã¿ã»ãã device = torch.device( 'cuda' if torch.cuda.is_available() else 'cpu' ) data = data.to(device) model = Model(dataset.num_node_features, dim=DIM, num_classes=dataset.num_classes).to(device) optimizer = torch.optim.Adam(model.parameters(), lr= 0.005 , weight_decay= 5e-3 ) criterion = nn.CrossEntropyLoss() # ã¢ãã«åŠç¿ãšãã¹ãããŒã¿ã«ãã粟床è©äŸ¡ model_gnn = train(model, data, optimizer, criterion, 300 ) acc_test = eval_acc(model_gnn, data, data.test_mask) print (f 'Test Acc: {acc_test:.3f}' ) äžèšã®ã³ãŒãã§ã¯ Amazon Dataset ã®ããŒã¿èªã¿èŸŒã¿ããã¢ãã«åŠç¿ãè©äŸ¡ãŸã§ãå®è£
ããŠããŸãã åŠç¿çµæã¯ãã¹ãããŒã¿ã§ã® accuracy ã 93.7% ã§æ£ããåŠç¿ã§ããŠããæ§åã䌺ããŸãããªããªãã®é«ç²ŸåºŠã§ãããåã«ããŽãªå¥ã®æ£çäžèŽæ°ãæ··åè¡åãã確èªããŠã¿ãŠããã»ãšãã©ã®ã«ããŽãªã§æ£ããäºæž¬ãåºæ¥ãŠããããšãèŠãŠããããŸãã ããŠããããŸã§ã§æ§ç¯ããã GNN ã¢ãã«ãçšããŠãããããæ¬é¡ã® GNNExplainer ã®å®è£
ã«ç§»ã£ãŠãããŸãã å
ã»ã©åŠç¿ããã¢ãã«ïŒ model_gnn ïŒã Explainer ã¯ã©ã¹ã®ãã©ã¡ãŒã¿ãšããŠæž¡ããŠèª¬ææ§ãååŸããŠãããŸãã # ãµãã°ã©ããå¯èŠåãã颿° def viz_subgraph (edge_index, edge_weight, target, node_index): target_color = '#FFFFFF' color_list = [ '#FCFFA4' , '#F7E425' , '#FEBA2C' , '#F89540' , '#F2844B' , '#E16462' , '#CC4778' , '#B12A90' ] if edge_weight is not None : edge_weight = edge_weight - edge_weight.min() edge_weight = edge_weight / edge_weight.max() if edge_weight is not None : mask = edge_weight > 1e-7 edge_index = edge_index[:, mask] edge_weight = edge_weight[mask] if edge_weight is None : edge_weight = torch.ones(edge_index.size( 1 )) subgraph_idx = np.unique(explanation.edge_index[:, mask][ 0 ]) target_idx = np.where(subgraph_idx == node_index)[ 0 ] target = [color_list[idx] for idx in target[subgraph_idx]] target[target_idx[ 0 ]] = target_color g = nx.DiGraph() node_size = 800 for node in edge_index.view(- 1 ).unique().tolist(): g.add_node(node) for (src, dst), w in zip (edge_index.t().tolist(), edge_weight.tolist()): g.add_edge(src, dst, alpha=w) plt.figure(figsize=( 15 , 8 )) ax = plt.gca() pos = nx.spring_layout(g) for src, dst, data in g.edges(data= True ): ax.annotate( '' , xy=pos[src], xytext=pos[dst], arrowprops= dict ( arrowstyle= "->" , alpha=data[ 'alpha' ], shrinkA=sqrt(node_size) / 2.0 , shrinkB=sqrt(node_size) / 2.0 , connectionstyle= "arc3,rad=0.1" , ), ) nodes = nx.draw_networkx_nodes(g, pos, node_size=node_size, node_color=target, margins= 0.1 ,) nodes.set_edgecolor( 'black' ) nx.draw_networkx_labels(g, pos, font_size= 10 ) plt.show() plt.close() # explainerã€ã³ã¹ã¿ã³ã¹ã®å®çŸ© explainer = Explainer( model=model_gnn, algorithm=GNNExplainer(epochs= 200 ), explanation_type= 'model' , node_mask_type= 'attributes' , edge_mask_type= 'object' , model_config= dict ( mode= 'multiclass_classification' , task_level= 'node' , return_type= 'log_probs' , ), ) # èª¬ææ§ã«é¢ããããŒãæå®ãšæŒç®åŠç node_index = 700 explanation = explainer(data.x, data.edge_index, index=node_index) # ããŒãç¹åŸŽéã«ãããéèŠå€æ°ã®å¯èŠå explanation.visualize_feature_importance( "feature_importance.png" ,feat_labels= None , top_k= 10 ) # æå®ããããŒãã«é¢ä¿ãããµãã°ã©ãå¯èŠå viz_subgraph(explanation.edge_index, explanation.edge_mask, explanation.target, node_index) åãã«å®çŸ©ããŠãã viz_subgraph 颿°ã¯ GNNExplainer ããåŸãããçµæã®ãšããžæ
å ±åã³ãã¹ã¯æ
å ±ãå
ã«ãµãã°ã©ããå¯èŠåããåŠçãå®çŸ©ããŠããŸãã æ¬¡ãã§ãExplainer ã¯ã©ã¹ãçšããŠã€ã³ã¹ã¿ã³ã¹ãäœæããããšã§ãããŒãã®éèŠå€æ°ãšãµãã°ã©ãååŸãªã©ã®èª¬ææ§ã®ç²åŸãè¡ãªã£ãŠããŸãããã® Explainer ã¯ã©ã¹ã¯å
šãŠã®èª¬ææ§ã«é¢ãããã©ã¡ãŒã¿ãæ±ãããã«ãã¶ã€ã³ãããã¯ã©ã¹ã§ããã¬ãŒã ã¯ãŒã¯å©çšè
ã¯ãã®ã¯ã©ã¹ã®ãã©ã¡ãŒã¿ã倿Žããããšã§å
±éåŠçã®ãŸãŸã§è€æ°ã®ã¢ã«ãŽãªãºã ãæäœããããšå¯èœã«ããŠããŸããä»å㯠GNNExplainer ãå©çšããããã algorithm ã® GNNExplainer ãæå®ããŠã model_config ã« GNN ã¢ãã«ã®ã¿ã¹ã¯ã«åãããŠé©åãªãã©ã¡ãŒã¿ãèšå®ããŠããŸãã Explainer ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããåŸã¯ãå
¥åããŒã¿ãšèª¬ææ§ã®å¯Ÿè±¡ãšããã€ã³ã¹ã¿ã³ã¹ïŒä»åã¯ããŒãïŒã®ã€ã³ããã¯ã¹çªå·ãäžããããšã§äºæž¬ã«ãããèª¬ææ§æ
å ±ãååŸããŸããã€ã³ã¹ã¿ã³ã¹ã®ã€ã³ããã¯ã¹çªå·ãé©åœã« 700 ãšããå Žåã®çµæã¯ä»¥äžã®ããã«ãªããŸããã ãŸãã¯ãããŒãã«ãããéèŠå€æ°ïŒFeature ImportanceïŒã§ãããéèŠåºŠãé«ãæ¹ãã top_k ã§æå®ããæ°ã ãç¹åŸŽéãæ£ã°ã©ãã§å¯èŠåããŠããŸããä»åã®ããŒã¿ã»ããã§ã¯ããŒãç¹åŸŽé㯠bag-of-words ã«ãã£ãŠãã¯ãã«åããæ
å ±ã®ãããã©ã®ãããªã¯ãŒããéèŠã§ããããåœè©²ããŒã¿ããå€å¥ã¯ã§ããŸããããæå³ã®ããã©ãã«ä»ãã®æ
å ±ã§ãã£ãå Žåã¯äœãäºæž¬ã«å¹ããŠããã®ããææ¡ããã®ã«æå¹ãªæ¹æ³ã ãšæããŸãã æåŸã«ãããŒãã€ã³ããã¯ã¹ã 700 ã®äºæž¬ã«å¯äžããŠãããµãã°ã©ããå¯èŠåããŠèŠãŠã¿ããšã 700 ã®ååããŒãïŒçœãäžžïŒã«ã¯ 2008 ãš 6347 ã®ååããŒããäºæž¬ã«å¯æ¥ã«é¢ä¿ããŠãããšããçµæãèŠãããŸãããŸããäºæž¬ã«å¯äžããŠãããµãã°ã©ãã®ååããŒãã¯ãã»ãšãã©ãåäžã«ããŽãªïŒèµ€äžžã®ããŒãïŒã§ããããšãããåäžã«ããŽãªã®ååãšäžç·ã«è³Œè²·ãããŠããŠããããšãåãããŸããç¹ã« 2008 ã¯åç¬ã§åæã«è³Œè²·ãããŠãããã 6347 ã¯ãã®ä»ã®é¢é£ããååãšåæã«è³Œè²·ãããŠããããšãèšãããã§ãã GNNExplainer ã§ã¯ç¹å®ã®ããŒãã«çŠç¹ãåœãŠãŠãããããã°ã©ãããŒã¿å
šäœãšããŠã®èª¬ææ§ãæèšããããšã¯é£ããã§ããããã®ããã«åäžã®ããŒããèµ·ç¹ã«ããèª¬ææ§ã®çè§£ãã倧ãŸããªå
šäœåŸåãæŽããªã©ã®æŽ»çšã«æåŸ
ã¯ã§ãããã§ããã çµããã« ä»å㯠GNNExplainer ã®æŠèŠãšã¢ãã«ã«å¯ŸããŠã®é©ç𿹿³ã«ã€ããŠç޹ä»ããŸããã GNN ã«ãã£ãŠã°ã©ãæ§é ããã¥ãŒã©ã«ãããã¯ãŒã¯ã§æ±ããããã«ãªããŸããããã°ã©ãæ§é èªäœã®è€éæ§ãçžãŸã£ãŠèª¬ææ§ã»è§£éæ§ã¯éåžžã«é«ãããã§ã¯ãããŸããã ãã®ãããä»å玹ä»ãã GNNExplainer ãªã©ã«ãã GNN ã®äºæž¬æ ¹æ ã®èª¬ææ§åäžã¯ã远å ç¹åŸŽéã®æ€èšãäºæž¬æ ¹æ ã«ããããŒã±ãã£ã³ã°æŽ»çšãªã©å¹
åºãå¿çšãå¹ããã®ã«ãªãããšæããŸãã ãŸã ãŸã ãçºå±éäžã®åéã§ã¯ãããŸãããä»åŸãXAIé åã®çºå±ã«ã¯æåŸ
ãããã§ããã ããã§ã¯ãææ¥ã®èšäºããæ¥œãã¿ã«ïŒ Large Language Model ã®ç¥ã§ã極ããŠå€§éã®ããŒã¿ã𿷱局åŠç¿æè¡ã«ãã£ãŠæ§ç¯ãããèšèªã¢ãã«ã§ãã ↩ ãã¡ã ã§ GNN ã«ã€ããŠã®è§£èª¬ã詳ããèšèŒãããŠããŸãã ↩ https://www.darpa.mil/program/explainable-artificial-intelligence ↩ https://arxiv.org/pdf/1903.03894.pdf ↩ https://nips.cc/ ↩ https://pytorch-geometric.readthedocs.io/en/latest/ ↩ https://arxiv.org/pdf/2011.04573.pdf ↩ Attention ããŒã¹ã® GNN ã«ãã Attention ä¿æ°ããšããžã®èª¬æã«å¿çšããè§£éæ§ã®ææ³ã§ããAttention æ©æ§ãæ±ã£ãç¹å®ã®ã¢ã«ãŽãªãºã ã§åŠç¿ããGNNã¢ãã«ã®ã¿ãå©çšå¯èœãšãªããŸãã ↩ https://arxiv.org/pdf/1703.01365.pdf ↩ https://www.dgl.ai/ ↩ https://arxiv.org/pdf/1811.05868.pdf ↩ æç« äžã«åºçŸããåèªã®é çªã¯èæ
®ããã«ãåèªã®åºçŸåæ°ã®ã¿ãããã¯ãã«ã衚çŸããææ³ãæããŸãã ↩ https://networkx.org/ ↩