repo นี้มีการใช้งาน pytorch ของกระดาษ GAT ดั้งเดิม (: ลิงก์: Veličković et al.)
มันมีวัตถุประสงค์เพื่อทำให้ ง่ายต่อการเริ่มเล่นและเรียนรู้ เกี่ยวกับ GAT และ GNN โดยทั่วไป
กราฟประสาทเครือข่ายเป็นครอบครัวของเครือข่ายประสาทที่เกี่ยวข้องกับสัญญาณที่กำหนดไว้เหนือกราฟ!
กราฟสามารถจำลองปรากฏการณ์ธรรมชาติที่น่าสนใจมากมายดังนั้นคุณจะเห็นพวกเขาใช้ทุกที่จาก:
และไปจนถึงฟิสิกส์อนุภาคที่ Hedron Collider ขนาดใหญ่ (LHC), การตรวจจับข่าวปลอมและรายการดำเนินต่อไปเรื่อย ๆ !
GAT เป็นตัวแทนของ gnns เชิงพื้นที่ (convolutional) เนื่องจาก CNNS ประสบความสำเร็จอย่างมากในด้านวิสัยทัศน์คอมพิวเตอร์นักวิจัยจึงตัดสินใจพูดคุยกับกราฟและที่นี่เราอยู่ที่นี่! -
นี่คือแผนผังของโครงสร้างของ GAT:

คุณไม่สามารถเริ่มพูดคุยเกี่ยวกับ GNNs ได้โดยไม่ต้องพูดถึงชุดข้อมูลกราฟที่มีชื่อเสียงที่สุดเดียว - Cora
โหนดใน Cora เป็นตัวแทนของงานวิจัยและลิงก์คือคุณเดาได้ว่าการอ้างอิงระหว่างเอกสารเหล่านั้น
ฉันได้เพิ่มยูทิลิตี้เพื่อแสดงภาพ CORA และทำการวิเคราะห์เครือข่ายขั้นพื้นฐาน นี่คือลักษณะของ Cora:

ขนาดโหนดสอดคล้องกับระดับของมัน (เช่นจำนวนของขอบใน/ขาออก) ความหนาของขอบนั้นสอดคล้องกับวิธีการที่ "ยอดนิยม" หรือ "เชื่อมต่อ" ขอบนั้นคือ ( ขอบระหว่างความเป็นเทอม เป็นคำที่น่าเบื่อตรวจสอบรหัส)
และนี่คือพล็อตที่แสดงการกระจายปริญญาใน Cora:

พล็อตระดับเข้าและออกจะเหมือนกันเนื่องจากเรากำลังจัดการกับกราฟที่ไม่ได้บอกทิศทาง
ในพล็อตด้านล่าง (การกระจายปริญญา) คุณสามารถเห็นจุดสูงสุดที่น่าสนใจเกิดขึ้นในช่วง [2, 4] ซึ่งหมายความว่าโหนดส่วนใหญ่มีขอบจำนวนน้อย แต่มี 1 โหนดที่มี 169 ขอบ! (โหนดสีเขียวขนาดใหญ่)
เมื่อเรามีโมเดล GAT ที่ผ่านการฝึกอบรมอย่างเต็มที่เราสามารถมองเห็นความสนใจที่ "โหนด" บางอย่างได้เรียนรู้
โหนดใช้ความสนใจในการตัดสินใจว่าจะรวมพื้นที่ใกล้เคียงของพวกเขาอย่างไรพูดคุยกันมาดูกันเถอะ:

นี่คือหนึ่งในโหนดของ Cora ที่มีขอบมากที่สุด (การอ้างอิง) สีแสดงถึงโหนดของคลาสเดียวกัน คุณสามารถเห็น 2 สิ่งจากพล็อตนี้:
กฎที่คล้ายกันถือสำหรับละแวกใกล้เคียงขนาดเล็ก ยังสังเกตเห็นขอบของตนเอง:


ในทางกลับกัน PPI กำลังเรียนรู้รูปแบบความสนใจที่น่าสนใจมากขึ้น:


ทางด้านซ้ายเราจะเห็นได้ว่าเพื่อนบ้าน 6 คนกำลังได้รับความสนใจจำนวนหนึ่งที่ไม่ได้รับความสนใจและทางด้านขวาเราจะเห็นได้ว่าความสนใจทั้งหมด มุ่งเน้นไปที่เพื่อนบ้านคนเดียว
ในที่สุด 2 รูปแบบที่น่าสนใจยิ่งขึ้น - ขอบตัวเองที่แข็งแกร่ง ทางด้านซ้ายและทางด้านขวาเราจะเห็นได้ว่าเพื่อนบ้านคนเดียวได้รับความสนใจเป็นจำนวนมากในขณะที่ส่วนที่เหลือ กระจายอย่างเท่าเทียมกัน ทั่วทั้งพื้นที่ใกล้เคียง:


หมายเหตุสำคัญ: การสร้างภาพข้อมูล PPI ทั้งหมดเป็นไปได้สำหรับเลเยอร์ GAT แรกเท่านั้น ด้วยเหตุผลบางอย่างค่าสัมประสิทธิ์ความสนใจสำหรับชั้นที่สองและสามเกือบทั้งหมด 0s (แม้ว่าฉันจะได้ผลลัพธ์ที่เผยแพร่)
อีกวิธีหนึ่งที่จะเข้าใจว่า GAT ไม่ได้เรียนรู้รูปแบบความสนใจที่น่าสนใจเกี่ยวกับ CORA (เช่นการเรียนรู้ความสนใจของ Const) คือการรักษาน้ำหนักความสนใจของ Node Neighborhood เป็นการกระจายความน่าจะเป็นคำนวณเอนโทรปีและสะสมข้อมูลในละแวกของทุกย่าน
เราชอบการแจกแจงความสนใจของ Gat ที่จะเบ้ คุณสามารถเห็นได้ว่าฮิสโตแกรมมีลักษณะอย่างไรสำหรับการแจกแจงแบบสม่ำเสมอในอุดมคติและคุณสามารถเห็นการแจกแจงที่เรียนรู้ด้วยสีน้ำเงิน - มันเหมือนกันทุกประการ!


ฉันได้วางแผนเพียงหัวเดียวจากเลเยอร์แรก (จาก 8) เพราะมันเหมือนกันทั้งหมด!
ในทางกลับกัน PPI กำลังเรียนรู้รูปแบบความสนใจที่น่าสนใจมากขึ้น:

ตามที่คาดไว้ฮิสโตแกรมเอนโทรปีแบบกระจายอยู่ทางด้านขวา (สีส้ม) เนื่องจากการแจกแจงแบบสม่ำเสมอมีเอนโทรปีสูงสุด
โอเคเราเห็นความสนใจ! มีอะไรอีกบ้างที่จะเห็นภาพ? ลองนึกภาพการฝังตัวที่เรียนรู้จากเลเยอร์สุดท้ายของ GAT เอาต์พุตของ GAT เป็นเทนเซอร์ของรูปร่าง = (2708, 7) โดยที่ 2708 คือจำนวนโหนดใน Cora และ 7 คือจำนวนคลาส เมื่อเราคาดการณ์เวกเตอร์ 7-dim เหล่านั้นเป็น 2D โดยใช้ T-SNE เราจะได้รับสิ่งนี้:

เราจะเห็นได้ว่าโหนดที่มีฉลาก/คลาสเดียวกันนั้นจะ รวมกันเป็นกลุ่ม - ด้วยการเป็นตัวแทนเหล่านี้มันง่ายที่จะฝึกตัวจําแนกง่าย ๆ ด้านบนซึ่งจะบอกเราว่าคลาสใดที่โหนดเป็นของ
หมายเหตุ: ฉันได้ลองใช้ UMAP เช่นกัน แต่ไม่ได้ผลลัพธ์ที่ดีกว่า + มันมีการพึ่งพามากหากคุณต้องการใช้พล็อตของพวกเขา
ดังนั้นเราจึงพูดคุยเกี่ยวกับสิ่งที่ GNNS และสิ่งที่พวกเขาสามารถทำเพื่อคุณ (เหนือสิ่งอื่นใด)
มาทำสิ่งนี้กันเถอะ! ทำตามขั้นตอนถัดไป:
git clone https://github.com/gordicaleksa/pytorch-GATcd path_to_repoconda env create จาก Project Directory (จะสร้างสภาพแวดล้อม conda ใหม่ล่าสุด)activate pytorch-gat (สำหรับการรันสคริปต์จากคอนโซลของคุณหรือตั้งค่าล่ามใน IDE ของคุณ) แค่ไหน! มันควรทำงานนอกกรอบการดำเนินการ environment.yml ไฟล์ที่เกี่ยวข้องกับการพึ่งพา
แพ็คเกจ Pytorch Pip จะมาพร้อมกับ Cuda/Cudnn บางรุ่นกับมัน แต่ขอแนะนำให้คุณติดตั้ง Cuda ทั่วทั้งระบบล่วงหน้าส่วนใหญ่เป็นเพราะไดรเวอร์ GPU ฉันขอแนะนำให้ใช้ 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 ควรแก้ไข!
คุณเพียงแค่ต้องเชื่อมโยงสภาพแวดล้อม Python ที่คุณสร้างขึ้นในส่วนการตั้งค่า
FYI การใช้ GAT ของฉันได้รับผลลัพธ์ที่เผยแพร่:
82-83% ในโหนดทดสอบ0.973 micro-F1 (และสูงกว่าจริง) ทุกสิ่งที่จำเป็นในการฝึก GAT บน Cora นั้นได้รับการติดตั้งแล้ว เพื่อเรียกใช้ (จากคอนโซล) เพียงโทร:
python training_script_cora.py
คุณสามารถทำได้:
--should_visualize -เพื่อแสดงข้อมูลกราฟของคุณ--should_test -เพื่อประเมิน GAT ในส่วนทดสอบของข้อมูล--enable_tensorboard -เพื่อเริ่มบันทึกตัวชี้วัด (ความแม่นยำ, การสูญเสีย) รหัสได้รับการแสดงความคิดเห็นอย่างดีเพื่อให้คุณสามารถเข้าใจได้ว่าการฝึกอบรมนั้นทำงานอย่างไร
สคริปต์จะ:
models/checkpoints/models/binaries/runs/ เพียงแค่เรียกใช้ tensorboard --logdir=runs จาก Anaconda ของคุณเพื่อให้เห็นภาพ เช่นเดียวกันสำหรับการฝึกอบรมเกี่ยวกับ PPI เพียงเรียกใช้ python training_script_ppi.py PPI นั้นมี GPU หิวมากขึ้นดังนั้นหากคุณไม่มี GPU ที่แข็งแกร่งด้วยอย่างน้อย 8 GBS คุณจะต้องเพิ่มธง --force_cpu เพื่อฝึก GAT บน CPU คุณสามารถลองลดขนาดแบทช์เป็น 1 หรือทำให้แบบจำลองผอมลง
คุณสามารถเห็นภาพตัวชี้วัดในระหว่างการฝึกอบรมโดยการโทรหา tensorboard --logdir=runs จากคอนโซลของคุณและวาง http://localhost:6006/ url ลงในเบราว์เซอร์ของคุณ:


หมายเหตุ: การแยกรถไฟของ Cora ดูเหมือนจะยากกว่าการตรวจสอบความถูกต้องและการทดสอบแยกดูการสูญเสียและการวัดความแม่นยำ
ต้องบอกว่าความสนุกส่วนใหญ่อยู่ใน playground.py สคริปต์
ฉันได้เพิ่มการใช้งาน 3 GAT - บางส่วนมีแนวคิดง่ายกว่าที่จะเข้าใจว่าบางอย่างมีประสิทธิภาพมากขึ้น สิ่งที่น่าสนใจและยากที่สุดที่จะเข้าใจคือการใช้งาน 3. การใช้งาน 1 และการใช้งาน 2 แตกต่างกันในรายละเอียดที่ละเอียดอ่อน แต่โดยทั่วไปทำสิ่งเดียวกัน
คำแนะนำเกี่ยวกับวิธีการเข้าถึงรหัส:
หากคุณต้องการโปรไฟล์การใช้งาน 3 ครั้งเพียงแค่ตั้งค่าตัวแปร playground_fn เป็น PLAYGROUND.PROFILE_GAT ใน playground.py
มี 2 พารามิเตอร์ที่คุณอาจสนใจ:
store_cache - ตั้งค่าเป็น True หากคุณต้องการบันทึกผลลัพธ์การทำโปรไฟล์หน่วยความจำ/เวลาหลังจากที่คุณเรียกใช้skip_if_profiling_info_cached - ตั้งค่าเป็น True หากคุณต้องการดึงข้อมูลการทำโปรไฟล์จากแคช ผลลัพธ์จะถูกเก็บไว้ใน data/ ใน memory.dict และ timing.dict พจนานุกรม (ดอง)
หมายเหตุ: การใช้งาน #3 นั้นได้รับการปรับปรุงให้ดีที่สุด - คุณสามารถดูรายละเอียดในรหัสได้
ฉันยังได้เพิ่ม profile_sparse_matrix_formats หากคุณต้องการทำความคุ้นเคยกับรูปแบบเมทริกซ์ที่แตกต่างกันเช่น COO , CSR , CSC , LIL ฯลฯ
หากคุณต้องการเห็นภาพการฝัง 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 ที่แตกต่างกันวางแผนย่านโหนดที่แตกต่างกันหรือหัวความสนใจ นอกจากนี้คุณยังสามารถเปลี่ยนจำนวนเลเยอร์ใน GAT ของคุณได้อย่างง่ายดายแม้ว่า GNN แบบตื้นมักจะทำงานได้ดีที่สุดในชุดข้อมูลกราฟที่มีความเป็น homophilic
หากคุณต้องการเห็นภาพ Cora/PPI เพียงตั้งค่า playground_fn เป็น PLAYGROUND.VISUALIZE_DATASET และคุณจะได้รับผลลัพธ์จาก readme นี้
ข้อกำหนดของ HW ขึ้นอยู่กับข้อมูลกราฟที่คุณใช้ หากคุณแค่ต้องการเล่นกับ Cora คุณก็พร้อมที่จะไปกับ GPU 2+ GBS
ใช้เวลา (บนเครือข่าย Cora Citation):
เปรียบเทียบสิ่งนี้กับฮาร์ดแวร์ที่จำเป็นแม้กระทั่งสำหรับหม้อแปลงที่เล็กที่สุด!
ในทางกลับกันชุดข้อมูล PPI นั้นมี GPU หิวมากขึ้น คุณจะต้องใช้ GPU ที่มี VRAM 8+ GBS หรือคุณสามารถลดขนาดแบทช์เป็น 1 และทำให้แบบจำลอง "ผอม" และพยายามลดการใช้ VRAM
sparse API ของ Pytorchหากคุณมีความคิดเกี่ยวกับวิธีการใช้ GAT โดยใช้ API Sparse ของ Pytorch โปรดส่ง PR โดยส่วนตัวแล้วฉันมีปัญหากับ API ของพวกเขามันอยู่ในเบต้าและเป็นที่น่าสงสัยว่ามันเป็นไปได้หรือไม่ที่จะทำให้การใช้งานมีประสิทธิภาพเช่นเดียวกับการใช้งานของฉัน 3 โดยใช้มัน
ประการที่สองฉันยังไม่แน่ใจว่าทำไม GAT ถึงได้รับรายงานผลการรายงานเกี่ยวกับ PPI ในขณะที่มีปัญหาตัวเลขที่ชัดเจนในเลเยอร์ที่ลึกกว่าตามที่ประจักษ์โดยสัมประสิทธิ์ความสนใจทั้งหมดเท่ากับ 0
หากคุณมีปัญหาในการทำความเข้าใจ GAT ฉันได้ทำภาพรวมเชิงลึกของกระดาษในวิดีโอนี้:
ฉันยังทำวิดีโอการเดินผ่านของ repo นี้ (มุ่งเน้นไปที่จุดปวดที่อาจเกิดขึ้น) และบล็อกสำหรับการเริ่มต้นด้วยกราฟ ML โดยทั่วไป!
ฉันมีวิดีโอเพิ่มเติมที่อาจช่วยให้คุณเข้าใจ GNNs:
ฉันพบว่า repos เหล่านี้มีประโยชน์ (ในขณะที่พัฒนาสิ่งนี้):
หากคุณพบว่ารหัสนี้มีประโยชน์โปรดอ้างอิงสิ่งต่อไปนี้:
@misc{Gordić2020PyTorchGAT,
author = {Gordić, Aleksa},
title = {pytorch-GAT},
year = {2020},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/gordicaleksa/pytorch-GAT}},
}