이 repo에는 원래 GAT 용지 (: Link : Veličković et al.)의 Pytorch 구현이 포함되어 있습니다.
그것은 GAT와 GNN에 대해 쉽게 연주하고 배우는 것을 목표로하고 있습니다.
그래프 신경망은 그래프를 통해 정의 된 신호를 다루는 신경망의 패밀리입니다!
그래프는 많은 흥미로운 자연 현상을 모델링 할 수 있으므로 모든 곳에서 사용되는 것을 볼 수 있습니다.
그리고 LHC (Large Hedron Collider)에서 입자 물리학의 모든 길은 가짜 뉴스 탐지 및 목록이 계속됩니다!
GAT는 공간 (컨볼 루션) GNNS의 대표입니다. CNN은 컴퓨터 비전 분야에서 엄청난 성공을 거두었 기 때문에 연구원들은이를 그래프로 일반화하기로 결정했습니다. ?
GAT의 구조의 개략도는 다음과 같습니다.

가장 유명한 그래프 데이터 세트 인 Cora를 언급하지 않고 GNN에 대해 이야기하기 시작할 수는 없습니다.
Cora의 노드는 연구 논문을 나타내며 링크는 해당 논문 사이의 인용입니다.
Cora를 시각화하고 기본 네트워크 분석을 수행하는 유틸리티를 추가했습니다. Cora의 모습은 다음과 같습니다.

노드 크기는 학위에 해당합니다 (예 : 내부/나가는 가장자리 수). 가장자리 두께는 대략 가장자리가있는 "인기있는"또는 "연결된"방법에 대략적으로 해당합니다 ( 가장자리 중에서 가장자리는 코드를 확인하십시오.)
그리고 여기 Cora의 학위 분포를 보여주는 음모가 있습니다.

우리가 방정 된 그래프를 다루고 있기 때문에 학위 도표는 동일합니다.
하단 플롯 (학위 분포)에서 [2, 4] 범위에서 흥미로운 피크가 발생하는 것을 볼 수 있습니다. 이것은 대부분의 노드에 가장자리가 적지 만 169 개의 모서리가있는 1 개의 노드가 있음을 의미합니다! (큰 녹색 노드)
완전 훈련 된 GAT 모델이 있으면 특정 "노드"가 배운주의를 시각화 할 수 있습니다.
노드는주의를 기울여 이웃을 집계하는 방법을 결정하고 충분한 대화를 나누는 방법을 결정합니다.

이것은 가장자리 (인용)가 가장 많은 Cora의 노드 중 하나입니다. 색상은 동일한 클래스의 노드를 나타냅니다. 이 플롯에서 두 가지를 명확하게 볼 수 있습니다.
소규모 이웃에 대해서도 비슷한 규칙이 적용됩니다. 또한 자체 가장자리에 주목하십시오.


반면에 PPI는 훨씬 더 흥미로운 관심 패턴을 배우고 있습니다.


왼쪽에서 우리는 6 명의 이웃이 무시할 수없는 관심을 받고 있음을 알 수 있으며 오른쪽에서는 모든주의가 단일 이웃에 초점을 맞추고 있음을 알 수 있습니다.
마지막으로 2 개의 더 흥미로운 패턴 - 왼쪽과 오른쪽의 강한 자기 가장자리는 한 이웃이 많은주의를 기울이는 반면 나머지는 나머지 지역에 똑같이 분포되어 있음을 알 수 있습니다.


중요한 참고 사항 : 모든 PPI 시각화는 첫 번째 GAT 레이어에 대해서만 가능합니다. 어떤 이유로 든 두 번째 및 세 번째 층의주의 계수는 거의 모든 0 초입니다 (게시 된 결과를 달성하더라도).
GAT가 CORA에서 흥미로운주의 패턴을 배우지 않는다는 것을 이해하는 또 다른 방법 (즉, Cont Contection을 배우고 있음)은 노드 이웃의주의 가중치를 확률 분포로 취급하고 엔트로피를 계산하며 모든 노드의 이웃에서 정보를 축적하는 것입니다.
우리는 GAT의 관심 분배가 왜곡되는 것을 좋아합니다. 이상적인 균일 한 분포의 히스토그램의 모습을 주황색으로 볼 수 있으며 학습 된 분포를 밝은 파란색으로 볼 수 있습니다. 정확히 동일합니다!


나는 모두 동일하기 때문에 첫 번째 레이어 (8 개 중)에서 하나의주의 헤드 만 그렸습니다!
반면에 PPI는 훨씬 더 흥미로운 관심 패턴을 배우고 있습니다.

예상 한 바와 같이, 균일 분포 엔트로피 히스토그램은 균일 한 분포가 가장 높은 엔트로피를 가지기 때문에 오른쪽 (오렌지)에있다.
좋아, 우리는 관심을 보았다! 시각화해야 할 것이 무엇입니까? GAT의 마지막 층에서 배운 임베딩을 시각화합시다. GAT의 출력은 Shape = (2708, 7)의 텐서입니다. 여기서 2708은 Cora의 노드 수이고 7은 클래스 수입니다. T-SNE를 사용 하여이 7-DIM 벡터를 2D로 투사하면 다음을 얻습니다.

우리는 동일한 레이블/클래스를 가진 노드가 대략 클러스터링되어 있음을 알 수 있습니다. 이러한 표현과 함께 노드가 어떤 클래스에 속하는 클래스를 알려주는 간단한 분류기를 쉽게 훈련시키는 것이 쉽습니다.
참고 : UMAP도 시도했지만 더 좋은 결과를 얻지 못했습니다. + 플롯 유틸리티를 사용하려면 많은 종속성이 있습니다.
그래서 우리는 GNN이 무엇인지, 그리고 그들이 당신을 위해 무엇을 할 수 있는지에 대해 이야기했습니다.
이 일을 실행합시다! 다음 단계를 따르십시오.
git clone https://github.com/gordicaleksa/pytorch-GATcd path_to_repo 로 탐색하십시오.conda env create 실행하십시오 (이는 새로운 콘다 환경을 생성 할 것입니다).activate pytorch-gat (콘솔에서 스크립트를 실행하거나 IDE에서 통역사를 설정하기 위해) 그게 다야! 의존성을 다루는 환경에서 실행되는 환경에서 작동해야합니다.
Pytorch Pip 패키지에는 Cuda/Cudnn의 일부 버전이 번들로 제공되지만 대부분 GPU 드라이버로 인해 시스템 전체 Cuda를 미리 설치하는 것이 좋습니다. 또한 Miniconda Installer를 시스템에서 Conda를 얻는 방법으로 사용하는 것이 좋습니다. 이 설정의 1과 2 포인트를 따르고 시스템에 가장 최신 버전의 Miniconda 및 Cuda/Cudnn을 사용하십시오.
jupyter notebook 에서 Anaconda Console에서 실행하면 기본 브라우저에서 세션이 열립니다.
The Annotated GAT.ipynb 열면 플레이 할 준비가되었습니다!
참고 : DLL load failed while importing win32api: The specified module could not be found
pip uninstall pywin32 다음 pip install pywin32 또는 conda install pywin32 수정해야합니다!
설정 섹션에서 만든 파이썬 환경을 연결하면됩니다.
참고로, GAT 구현은 게시 된 결과를 달성합니다.
82-83% 정확도를 얻습니다.0.973 Micro-F1 점수를 달성했습니다. Cora에서 GAT를 훈련시키는 데 필요한 모든 것이 이미 설정되어 있습니다. (콘솔에서) 실행하려면 다음과 같이 전화하십시오.
python training_script_cora.py
당신은 또한 잠재적으로 :
--should_visualize 를 추가하십시오--should_test 추가하십시오.--enable_tensorboard 추가하십시오 (정확도, 손실) 코드는 잘 댓글을 달 수 있으므로 교육 자체가 어떻게 작동하는지 (희망적으로) 이해할 수 있습니다.
스크립트는 다음과 같습니다.
models/checkpoints/models/binaries/runs/ , 그냥 실행 텐서 tensorboard --logdir=runs 시각화하십시오. PPI에 대한 교육 python training_script_ppi.py 마찬가지입니다. PPI는 훨씬 더 GPU 헝가리이므로 8GB 이상의 강한 GPU가 없으면 CPU에서 GAT를 훈련시키기 위해 --force_cpu 플래그를 추가해야합니다. 대안으로 배치 크기를 1로 줄이거 나 모델을 더 얇게 만들 수 있습니다.
tensorboard --logdir=runs http://localhost:6006/ url을 브라우저에 붙여 넣어 훈련 중에 메트릭을 시각화 할 수 있습니다.


참고 : Cora의 열차 분할은 손실과 정확도 메트릭을 보는 검증 및 테스트 분할보다 훨씬 어려운 것 같습니다.
대부분의 재미는 실제로 playground.py 에 있습니다.
3 개의 GAT 구현을 추가했습니다. 일부는 개념적으로 더 효율적이라는 것을 이해하기 쉽습니다. 가장 흥미롭고 가장 어려운 것은 구현 3입니다. 구현 1과 구현 2는 미묘한 세부 사항이 다르지만 기본적으로 동일한 작업을 수행합니다.
코드 접근 방법에 대한 조언 :
3 개의 구현을 프로파일 링하려면 playground_fn 변수를 playground.py 에서 PLAYGROUND.PROFILE_GAT 로 설정하십시오.
관심을 가질 수있는 두 가지 매개 변수가 있습니다.
store_cache 메모리/시간 프로파일 링 결과를 저장하려면 True 로 설정합니다.skip_if_profiling_info_cached 캐시에서 프로파일 링 정보를 가져 오려면 True 로 설정 결과는 data/ In memory.dict 및 timing.dict 사전 (피클)에 저장됩니다.
참고 : 구현 #3은 지금까지 가장 최적화 된 것입니다. 코드의 세부 사항을 볼 수 있습니다.
COO , CSR , CSC , LIL 등과 같은 다른 행렬 스파 스 형식에 익숙해 지려면 profile_sparse_matrix_formats 도 추가했습니다.
t-sne 임베딩을 시각화하려면 주의력 또는 임베딩을 playground_fn 변수를 PLAYGROUND.VISUALIZE_GAT 로 설정하고 visualization_type 다음으로 설정하십시오.
VisualizationType.ATTENTION 노드 이웃에서주의를 시각화하려면VisualizationType.EMBEDDING 임베딩을 시각화하려면 (T -SNE를 통해)VisualizationType.ENTROPY 엔트로피 히스토그램을 시각화하려면 그리고 당신은 이들과 같은 미친 시각화를 얻을 수 있습니다 ( VisualizationType.ATTENTION 옵션) :


왼쪽에서는 전체 CORA 데이터 세트에서 가장 높은 노드를 볼 수 있습니다.
왜 이것이 원처럼 보이는지 궁금하다면, 그래프와 같은 트리에 특히 적합한 layout_reingold_tilford_circular m-ary 을 사용했기 때문입니다.
그러나 kamada kawai (오른쪽) 등과 같은 다른 도면 알고리즘을 사용할 수도 있습니다.
코드를 살펴보고 다른 GAT 레이어에서주의를 기울이면서 다른 노드 이웃이나주의 헤드를 플로팅하십시오. 얕은 GNN은 소규모 세상의 동성애 적 그래프 데이터 세트에서 가장 잘 수행하는 경향이 있지만 GAT의 층 수를 쉽게 변경할 수 있습니다.
Cora/PPI를 시각화하려면 playground_fn 을 PLAYGROUND.VISUALIZE_DATASET 으로 설정하면이 readme에서 결과를 얻을 수 있습니다.
HW 요구 사항은 사용할 그래프 데이터에 크게 의존합니다. Cora 와 함께 플레이하고 싶다면 2+ GBS GPU를 사용하는 것이 좋습니다.
(Cora Citation Network에서) :
이것을 가장 작은 변압기에도 필요한 하드웨어와 비교하십시오!
반면에 PPI 데이터 세트는 훨씬 더 gpu 헝가리합니다. 8+ GBS 의 VRAM이있는 GPU가 필요하거나 배치 크기를 1로 줄이고 모델을 "더 얇게 만들어"VRAM 소비를 줄이려고 노력할 수 있습니다.
sparse API 활용하는 구현을 잠재적으로 추가하십시오Pytorch의 Sparse API를 사용하여 GAT를 구현하는 방법에 대한 아이디어가 있다면 PR을 제출하십시오. 나는 개인적으로 그들의 API에 어려움을 겪었고, 베타 버전에 있으며, 구현 3을 사용하는 것만 큼 효율적으로 구현할 수 있는지 의심의 여지가 있습니다.
둘째, GAT가 PPI에서보고 된 결과를 달성하는 이유는 확실하지 않지만 모든주의 계수가 0과 동일한 모든주의 계수에 의해 나타나는 더 깊은 층에 명백한 숫자 문제가 있습니다.
GAT를 이해하는 데 어려움이 있다면이 비디오에서 논문에 대한 심층적 인 개요를 수행했습니다.
또한이 리포지토리 (잠재적 진통제에 중점을 둔)의 연습 비디오와 일반적으로 그래프 ML을 시작하기위한 블로그를 만들었습니다! ❤️
GNN을 이해하는 데 도움이 될 수있는 더 많은 비디오가 있습니다.
이 저장소가 유용하다는 것을 알았습니다 (이것을 개발하는 동안).
이 코드가 유용하다고 생각되면 다음을 인용하십시오.
@misc{Gordić2020PyTorchGAT,
author = {Gordić, Aleksa},
title = {pytorch-GAT},
year = {2020},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/gordicaleksa/pytorch-GAT}},
}