يحتوي هذا الريبو على تطبيق Pytorch لورقة GAT الأصلية (: الرابط: Veličković et al.).
يهدف إلى تسهيل البدء في اللعب والتعلم عن GAT و GNNS بشكل عام.
الرسم البياني الشبكات العصبية هي عائلة من الشبكات العصبية التي تتعامل مع الإشارات المحددة على الرسوم البيانية!
يمكن أن تصمم الرسوم البيانية العديد من الظواهر الطبيعية المثيرة للاهتمام ، لذلك سترى أنها تستخدم في كل مكان من:
وصولاً إلى فيزياء الجسيمات في مصادم Hedron الكبير (LHC) ، والكشف عن الأخبار المزيفة والقائمة تطول وتطول!
GAT هو ممثل GNNs المكانية (التلافيفية). نظرًا لأن CNNs حققت نجاحًا هائلاً في مجال رؤية الكمبيوتر ، فقد قرر الباحثون تعميمه على الرسوم البيانية ، وهكذا نحن هنا! ؟
هنا مخطط لهيكل جات:

لا يمكنك فقط البدء في الحديث عن GNNS دون ذكر مجموعة بيانات الرسم البياني الأكثر شهرة - CORA .
تمثل العقد في CORA الأوراق البحثية والروابط ، كما تفكر في ذلك ، الاستشهادات بين تلك الأوراق.
لقد أضفت فائدة لتصور CORA والقيام بتحليل الشبكة الأساسي. إليكم كيف تبدو كورا:

يتوافق حجم العقدة مع شهادتها (أي عدد الحواف المنتهية ولايتها). يتوافق سماكة الحافة تقريبًا مع كيفية "شعبية" أو "متصلة" تلك الحافة ( الحافة بين الوضعية هي المصطلح nerdy تحقق من الرمز.)
وهنا مؤامرة توضح توزيع الدرجة على كورا:

المؤامرات داخل وخارج الدرجة هي نفسها لأننا نتعامل مع رسم بياني غير موجه.
في المؤامرة السفلية (توزيع الدرجة) ، يمكنك رؤية ذروة مثيرة للاهتمام تحدث في نطاق [2, 4] . هذا يعني أن غالبية العقد لديها عدد صغير من الحواف ولكن هناك عقدة واحدة تحتوي على 169 حواف! (العقدة الخضراء الكبيرة)
بمجرد أن يكون لدينا نموذج GAT المدربين بالكامل ، يمكننا تصور الانتباه الذي تعلمته بعض "العقد".
تستخدم العقد الانتباه لتحديد كيفية تجميع حيهم ، وتحدث ما يكفي من الحديث ، دعنا نراها:

هذه واحدة من العقد في كورا التي لديها معظم الحواف (الاستشهادات). تمثل الألوان العقد من نفس الفئة. يمكنك رؤية شيئين من هذه المؤامرة بوضوح:
قواعد مماثلة تحمل للأحياء الأصغر. لاحظ أيضًا الحواف الذاتية:


من ناحية أخرى ، يتعلم مؤشر أسعار المنتجين أنماط اهتمام أكثر إثارة للاهتمام:


على اليسار ، يمكننا أن نرى أن 6 جيران يتلقون قدراً من الاهتمام غير المؤهلين ، وعلى اليمين يمكننا أن نرى أن كل الاهتمام يركز على جار واحد .
أخيرًا ، أنماطان أكثر إثارة للاهتمام - حافة ذاتية قوية على اليسار وعلى اليمين يمكننا أن نرى أن أحد الجيران واحد يتلقى جزءًا من الاهتمام بينما يتم توزيع الباقي بالتساوي عبر بقية الحي:


ملاحظة مهمة: جميع تصورات PPI ممكنة فقط لطبقة GAT الأولى. لسبب ما ، تكون معاملات الانتباه للطبقات الثانية والثالثة تقريبًا 0s (على الرغم من أنني حققت النتائج المنشورة).
هناك طريقة أخرى لفهم أن GAT لا تتعلم أنماط الاهتمام المثيرة للاهتمام على CORA (أي أنها تعلم اهتمام الوافد) هي من خلال التعامل مع أوزان انتباه حي العقدة كتوزيع احتمال ، وحساب الانتروبيا ، وتجميع المعلومات عبر حي كل عقدة.
نحن نحب توزيعات انتباه جات أن تكون منحرفة. يمكنك أن ترى في Orange كيف يبدو الرسم البياني لتوزيعات موحدة مثالية ، ويمكنك رؤية التوزيعات الأزرق الفاتح - فهي متشابهة تمامًا!


لقد رسمت فقط رأس اهتمام واحد من الطبقة الأولى (من أصل 8) لأنهم كلهم متماثلون!
من ناحية أخرى ، يتعلم مؤشر أسعار المنتجين أنماط اهتمام أكثر إثارة للاهتمام:

كما هو متوقع ، فإن رسم بياني إنتروبيا التوزيع الموحد يقع على اليمين (البرتقالي) لأن التوزيعات الموحدة لها أعلى إنتروبيا.
حسنًا ، لقد رأينا الاهتمام! ماذا هناك لتصور؟ حسنًا ، دعنا نتصور التضمينات المستفادة من طبقة جات الأخيرة. إخراج GAT هو موتر الشكل = (2708 ، 7) حيث 2708 هو عدد العقد في CORA و 7 هو عدد الفئات. بمجرد أن نقوم بإعداد هذه المتجهات 7-DIM في ثنائية الأبعاد ، باستخدام T-SNE ، نحصل على هذا:

يمكننا أن نرى أن العقد ذات العلامة/الفئة نفسها يتم تجميعها معًا تقريبًا - مع هذه العروض ، من السهل تدريب مصنف بسيط في الأعلى الذي سيخبرنا بالفئة التي تنتمي إليها العقدة.
ملاحظة: لقد جربت UMAP أيضًا ولكن لم أحصل على نتائج أجمل + لديها الكثير من التبعيات إذا كنت ترغب في استخدام استخدام المؤامرة.
لذلك تحدثنا عن ماهية GNNs ، وما يمكنهم فعله من أجلك (من بين أشياء أخرى).
دعونا نجعل هذا الشيء يعمل! اتبع الخطوات التالية:
git clone https://github.com/gordicaleksa/pytorch-GATcd path_to_repoconda env create من Project Directory (سيؤدي ذلك إلى إنشاء بيئة جديدة تمامًا).activate pytorch-gat (لتشغيل البرامج النصية من وحدة التحكم الخاصة بك أو قم بإعداد المترجم المترجم في IDE) هذا كل شيء! يجب أن تعمل خارج البيئة المنفذة.
ستأتي حزمة Pytorch Pip مع بعض إصدار Cuda/Cudnn معها ، ولكن يوصى بشدة بتثبيت CUDA على مستوى النظام مسبقًا ، معظمها بسبب برامج تشغيل GPU. أوصي أيضًا باستخدام Miniconda Installer كوسيلة للحصول على كوندا على نظامك. تابع النقطتين 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 يجب إصلاحه!
تحتاج فقط إلى ربط بيئة بيثون التي أنشأتها في قسم الإعداد.
FYI ، يحقق تطبيق GAT النتائج المنشورة:
82-83% على عقد الاختبار0.973 كل ما هو مطلوب لتدريب 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 أكثر جهوماً ، لذا إذا لم يكن لديك وحدة معالجة الرسومات القوية مع 8 جيجابايت على الأقل ، فستحتاج إلى إضافة علامة- --force_cpu لتدريب GAT على وحدة المعالجة المركزية. يمكنك بدلاً من ذلك محاولة تقليل حجم الدُفعة إلى 1 أو جعل النموذج أقل حجماً.
يمكنك تصور المقاييس أثناء التدريب ، من خلال استدعاء tensorboard --logdir=runs من وحدة التحكم الخاصة بك ولصق http://localhost:6006/ url في متصفحك:


ملاحظة: يبدو أن تقسيم قطار كورا أصعب بكثير من انقسامات التحقق من الصحة واختبار النظر في مقاييس الخسارة والدقة.
بعد قولي هذا ، فإن معظم المرح يكمن فعليًا في نص playground.py .
لقد أضفت 3 تطبيقات GAT - بعضها أسهل من الناحية المفاهيمية لفهم بعضها أكثر كفاءة. الأكثر إثارة للاهتمام والأصعب لفهم هو التنفيذ 3. التنفيذ 1 والتنفيذ 2 يختلف في التفاصيل الدقيقة ولكن في الأساس يفعل نفس الشيء.
نصيحة حول كيفية التعامل مع الكود:
إذا كنت ترغب في الحصول على ملف تعريف 3 فقط قم بتعيين متغير playground_fn على PLAYGROUND.PROFILE_GAT في playground.py .
هناك 2 params قد تهتم به:
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.ATTENTIONVisualizationType.EMBEDDING .VisualizationType.ENTROPY . وستحصل على تصورات مجنونة مثل هذه (خيار VisualizationType.ATTENTION .


على اليسار يمكنك رؤية العقدة مع أعلى درجة في مجموعة بيانات CORA بأكملها.
إذا كنت تتساءل عن سبب ظهور هذه الدائرة ، فذلك لأنني استخدمت تصميم layout_reingold_tilford_circular الذي يناسب بشكل خاص للشجرة مثل الرسوم البيانية (نظرًا لأننا نتصور عقدة وجيرانها ، فإن هذه الفترات الفرعية هي شجرة m-ary بفعالية).
ولكن يمكنك أيضًا استخدام خوارزميات رسم مختلفة مثل kamada kawai (على اليمين) ، إلخ.
لا تتردد في الذهاب عبر الكود واللعب مع رسم الانتباه من طبقات GAT المختلفة ، أو رسم أحياء عقدة مختلفة أو رؤوس الاهتمام. يمكنك أيضًا تغيير عدد الطبقات الموجودة في GAT ، على الرغم من أن GNNs الضحلة تميل إلى أداء أفضل ما في عالم بيانات الرسم البياني الصغير.
إذا كنت ترغب في تصور CORA/PPI ، فقط قم بتعيين playground_fn على PLAYGROUND.VISUALIZE_DATASET وستحصل على نتائج من هذه القراءة.
تعتمد متطلبات HW بشكل كبير على بيانات الرسم البياني الذي ستستخدمه. إذا كنت ترغب فقط في اللعب مع Cora ، فأنت على ما يرام مع GPU GBS 2+ .
يستغرق (على شبكة الاقتباس cora):
قارن هذا بالأجهزة اللازمة حتى لأصغر المحولات!
من ناحية أخرى ، فإن مجموعة بيانات PPI أكثر بكثير من جدوى GPU. ستحتاج إلى GPU مع 8+ GBs من VRAM ، أو يمكنك تقليل حجم الدُفعة إلى 1 وجعل النموذج "أنحف" وبالتالي تحاول تقليل استهلاك VRAM.
sparse APIإذا كانت لديك فكرة عن كيفية تنفيذ GAT باستخدام واجهة برمجة تطبيقات Pytorch المتفرق ، فلا تتردد في تقديم العلاقات العامة. أنا شخصياً واجهت صعوبات في واجهة برمجة التطبيقات الخاصة بهم ، وهي في الإصدار التجريبي ، ومن المشكوك فيها ما إذا كان من الممكن على الإطلاق جعل التنفيذ فعالًا مثل تنفيذي 3 باستخدامه.
ثانياً ، ما زلت غير متأكد من سبب تحقيق نتائج GAT المبلغ عنها على مؤشر أسعار المنتجين في حين أن هناك بعض المشكلات الرقمية الواضحة في الطبقات الأعمق كما تتجلى جميع معاملات الاهتمام التي تساوي 0.
إذا كنت تواجه صعوبات في فهم GAT ، فقد فعلت نظرة عامة متعمقة على الورقة في هذا الفيديو:
لقد صنعت أيضًا مقطع فيديو للسير في هذا الريبو (مع التركيز على نقاط الألم المحتملة) ، ومدونة للبدء مع الرسم البياني ML بشكل عام! ❤
لدي المزيد من مقاطع الفيديو التي يمكن أن تساعدك على فهم GNNS:
لقد وجدت هذه الإعادة مفيدة (أثناء تطوير هذا واحد):
إذا وجدت هذا الرمز مفيدًا ، فيرجى الاستشهاد بما يلي:
@misc{Gordić2020PyTorchGAT,
author = {Gordić, Aleksa},
title = {pytorch-GAT},
year = {2020},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/gordicaleksa/pytorch-GAT}},
}