تعلم الرسوم البيانية2017متوسط9 دقيقة قراءة
تعلُّم التمثيلات بأسلوب استقرائي على البيانات البيانية الضخمة
Inductive Representation Learning on Large Graphs
Hamilton, W. L. · Ying, Z. · Leskovec, J. — NeurIPS
المشكلة
قبل GraphSAGE، كانت الأساليب السائدة البيانات البيانية — مثل DeepWalk وnode2vec وLINE — تعمل بمنطق استنتاجي تحويلي (Transductive): تحفظ تضمين ثابتاً لكل عقدة أثناء ، ولا تملك طريقة للتعامل مع عُقد جديدة لم تكن موجودة وقت التدريب. عملياً هذا يعني أنه إذا انضم مستخدم جديد إلى شبكة اجتماعية أو اكتُشف بروتين لم يكن معروفاً، فلا مفرّ من إعادة تدريب من الصفر. والمشكلة أن البيانات البيانية في الواقع تنمو باستمرار، وهذا يجعل الأساليب التحويلية غير قابلة للاستخدام على نطاق واسع.
الإسهام
يقدّم البحث GraphSAGE (اختصاراً لـ SAmple and aggreGatE أي «عيِّن واجمع»): إطار عمل استقرائي يتعلّم كيف يبني تضمين أي عقدة انطلاقاً من جوارها المحلي، بدلاً من تخزين تضمين منفصل لكل عقدة. الآلية بسيطة: في كل طبقة تُسحب عيّنة بحجم ثابت من الجيران، ثم تُجمَّع سماتهم بدالة قابلة للتعلُّم (متوسط، أو LSTM، أو تجميع بالقيمة العظمى)، ويُدمج الناتج مع تمثيل العقدة نفسها. الفكرة المفتاحية أنّ الذي يُدرَّب هنا هو دالة التجميع وليس التضمينات ذاتها، وهذا ما يجعل النموذج قادراً على التعميم على عُقد لم يرها أبداً عند .
الأثر
كان GraphSAGE أول إطار عمل للشبكات العصبية البيانية يُثبت عملياً أنّ التعلّم الاستقرائي يمكن أن يتوسّع ليشمل بيانات بيانية بملايين العُقد. أتاح مباشرةً بناء PinSage في Pinterest — أول تطبيق صناعي حقيقي لشبكة عصبية بيانية — وأسّس القاعدة التي بُنيت عليها معظم الأطر الحديثة في هذا المجال. مبدأ «عيِّن واجمع» الذي قدّمه لا يزال هو النمط التصميمي المهيمن في التعلّم على البيانات البيانية حتى اليوم.
تخيّل أنك دخلت مؤتمراً كبيراً. الطريقة القديمة كانت تطبع بطاقة تعريف جاهزة لكل حاضر مسبقاً — لكن إن ظهر شخص جديد لم يكن في القائمة، فلا بطاقة له، ولا حلّ إلا إعادة طباعة كل البطاقات من جديد.
GraphSAGE يعمل بمنطق مختلف تماماً: بدلاً من البطاقات الجاهزة، يُعلّمك وصفة — «انظر إلى الأشخاص الخمسة الذين يتحدث معهم هذا الشخص، لاحظ ماذا يرتدون وعمّ يتحاورون، ومن هذا كلّه كوّن صورة عنه». الوصفة تعمل مع أيّ شخص، حتى لو دخل القاعة هذه اللحظة.
المشكلة: التضمينات التحويلية لا تنمو مع البيانات
بحلول عام 2017، كانت أساليب مثل DeepWalk وnode2vec قد أثبتت أنّ تحويل بنية البيانات البيانية إلى تضمينات منخفضة الأبعاد يفتح الباب لمهام قوية — كالتنبؤ بالروابط و واكتشاف المجتمعات. لكن هذه الأساليب جميعها كانت تعاني من ثلاث مشكلات جوهرية:
-
تحويلية بالكامل. كل عقدة تحصل على متجه تضمين خاص بها مخزَّن في جدول بحث. عند الاستدلال، أيّ عقدة لم تكن موجودة أثناء التدريب لن يكون لها تضمين — ولا حلّ إلا إعادة التدريب من الصفر.
-
تجاهل السمات. هذه الأساليب تتعلم حصرياً من هيكل الروابط وتتجاهل العُقد (كالنصوص أو الخصائص الجزيئية أو البيانات الوصفية)، فتُهدر معلومات ثرية كان يمكن الاستفادة منها.
-
لا مشاركة في . عدد المعاملات يتناسب خطياً مع عدد العُقد — بيانات بيانية بمئة مليون عقدة تحتاج مئة مليون متجه تضمين. هذا مكلف من حيث الذاكرة ولا يسمح بالتعميم.
ما كان ينقص الميدان هو نموذج يتعلم كيف يبني التضمينات من البنية المحلية والسمات — دالة مشتركة وليس جدولاً ضخماً.
الفكرة المحورية: اختر عيّنة من الجيران واجمع سماتهم
الفكرة الأساسية في GraphSAGE بسيطة وقوية في آن: هوية أي عقدة تتشكّل إلى حدّ كبير من جوارها. بدلاً من جدول بحث، نتعلّم دالة تأخذ سمات العقدة نفسها وسمات عيّنة من جيرانها، وتُنتج تضميناً. الجوهري هنا أنّ ما يُدرَّب هو الدالة ذاتها وليس التضمينات.
عمل واحدة في التمرير الأمامي يمرّ بثلاث مراحل:
- اختر عيّنة بحجم ثابت من جيران كل عقدة (مثلاً 25 جاراً في القفزة الأولى و10 في الثانية).
- اجمع الجيران المُختارين باستخدام دالة تجميع قابلة للتعلّم (متوسط، أو LSTM، أو بالقيمة العظمى).
- ادمج ناتج التجميع مع تمثيل العقدة نفسها، ثم طبّق و غير خطية، وأخيراً سوِّ الناتج.
بتكديس طبقات من هذا النوع، يحمل التضمين النهائي لكل عقدة معلومات من جوارها حتى عمق قفزات — لكنه محسوب بدالة مشتركة بين جميع العُقد، لا من جدول محفوظ.
صيغة التجميع
قبل الدخول في الصيغة الرياضية، لنفهم ما تفعله كل طبقة بالكلمات. تأخذ الطبقة التمثيل الحالي للعقدة وتمثيلات جيرانها المُختارين، ثم تضغط الجيران في متجه ملخّص واحد. بعد ذلك تربط هذا الملخّص بمتجه العقدة نفسها، وتضرب الناتج في مصفوفة أوزان قابلة للتعلّم، وتمرّره عبر دالة تفعيل غير خطية، وأخيراً تُسوّيه ليصبح بطول واحد. الناتج هو التمثيل المُحدَّث للعقدة الذي ينتقل إلى الطبقة التالية.
لاحظ عملية الربط (CONCAT) — هذا قرار تصميمي مدروس وليس عشوائياً. في بنيات مثل GCN، تُمزج إشارة العقدة مع إشارة جيرانها في متوسط واحد، فتضيع ملامح العقدة الأصلية وسط الجوار. GraphSAGE يتجنّب ذلك بفصلهما تماماً: سمات العقدة تسلك دائماً مساراً مستقلاً يحفظ هويتها الذاتية. ثم بعد كل طبقة، يُسوَّى التمثيل بتسوية حتى تبقى التضمينات على كرة الوحدة وتُمنع مشكلات عدم استقرار .
لماذا نأخذ عيّنات؟ ترويض الانفجار الأُسّي في الجوار
في البيانات البيانية الحقيقية قد يكون لعقدة واحدة مئات أو حتى آلاف الجيران. لو حاولنا التجميع على الجوار الكامل في كل طبقة، ستنفجر التكلفة الحسابية: مع طبقة ينمو بمعدّل حيث متوسط الدرجة. بمعنى أوضح، نموذج من طبقتين على بيانات بيانية بمتوسط درجة 100 سيحتاج إلى المرور على 10,000 عقدة لكل عقدة هدف واحدة.
الحلّ الذي يقدّمه GraphSAGE هو أخذ عيّنات عشوائية منتظمة: في الطبقة تسحب كل عقدة بالضبط جاراً. البحث الأصلي يستخدم في القفزة الأولى و في الثانية، فيصبح حقل الاستقبال محدوداً بـ عقدة لكل عيّنة تدريب — بصرف النظر عن الحجم الحقيقي للجوار. هذا التحويل من تكلفة متغيّرة إلى ثابتة هو ما يتيح التدريب بالدُّفعات الصغيرة على بيانات بيانية بملايين العُقد.
ثلاثة تصميمات لدالة التجميع
دالة التجميع (AGG) هي قلب GraphSAGE — مهمتها ضغط مجموعة متغيّرة الحجم من تمثيلات الجيران في متجه واحد بحجم ثابت. يقترح البحث ثلاثة تصميمات:
مُجمِّع المتوسط — يحسب المتوسط العنصري لتمثيلات الجيران المُختارين. بسيط وسريع. ملاحظة مهمة: لو تخطّينا خطوة الربط وحسبنا متوسط العقدة مع جيرانها مباشرة، نحصل على شيء قريب جداً من GCN. بمعنى آخر، مُجمِّع المتوسط مع الربط هو تعميم لـ GCN — لكنه استقرائي ويحتفظ بتمثيل العقدة الذاتي منفصلاً.
مُجمِّع — يُطبَّق LSTM على ترتيب عشوائي لمجموعة الجيران. القدرة التعبيرية لـ LSTM أعلى من المتوسط البسيط، لكن بما أنّ مجموعة الجيران ليس لها ترتيب طبيعي، يُختار الترتيب عشوائياً. رغم ذلك يتفوّق هذا المُجمِّع على المتوسط في بعض المهام.
مُجمِّع القيمة العظمى () — يُمرَّر كل جار أولاً عبر ، ثم يُؤخذ الحدّ الأقصى عنصرياً. التحويل الخطي قبل التجميع يسمح لكل جار بإبراز أكثر سماته صلة بالمهمة، ثم تلتقط القيمة العظمى أقوى إشارة من مجمل الجيران. في التجارب، كان هذا المُجمِّع هو الأفضل أداءً في أغلب الحالات.
التدريب: وضعان — مُوجَّه وغير مُوجَّه
يدعم GraphSAGE وضعين مختلفين لـالتدريب. في الوضع تُستخدم دالة على العُقد الموسومة لقيادة التدريب من البداية إلى النهاية. أما في الوضع فتُستخدم دالة مبنية على بنية البيانات البيانية: تدفع العُقد المتجاورة (التي تظهر معاً في جولات عشوائية) لتكون تضميناتها متقاربة، وتبعد العُقد غير المترابطة عن بعضها. الفكرة في جوهرها تكييف لمبدأ من node2vec ليعمل في الإطار الاستقرائي.
الفكرة ذاتها في شيفرة برمجية
مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.
import numpy as np
def relu(x):
return np.maximum(0, x)
def sample_neighbors(adj, node, S):
"""عيِّن S جاراً عشوائياً بانتظام من جيران العقدة."""
neighbors = adj[node]
if len(neighbors) >= S:
return np.random.choice(neighbors, S, replace=False)
return np.random.choice(neighbors, S, replace=True) # فرط أخذ العيّنات
def pool_aggregate(neighbor_embeds, W_pool, b_pool):
"""حوِّل كل جار، ثم خذ القيمة العظمى عنصرياً."""
transformed = relu(neighbor_embeds @ W_pool + b_pool) # (S, d')
return transformed.max(axis=0) # (d',)
def graphsage_layer(h, adj, nodes, W, W_pool, b_pool, S):
"""طبقة GraphSAGE واحدة: عيِّن ← اجمع ← ادمج ← سوِّ."""
new_h = {}
for v in nodes:
# 1. عيِّن الجيران
sampled = sample_neighbors(adj, v, S)
neighbor_embeds = np.stack([h[u] for u in sampled])
# 2. اجمع
agg = pool_aggregate(neighbor_embeds, W_pool, b_pool)
# 3. ادمج: اربط الذات مع الجوار، طبّق W
combined = np.concatenate([h[v], agg])
out = relu(W @ combined)
# 4. سوِّ إلى طول الوحدة
new_h[v] = out / (np.linalg.norm(out) + 1e-6)
return new_h
# كدِّس K طبقة: كل واحدة توسّع حقل الاستقبال بقفزة واحدة.
# الأوزان المُتعلَّمة W وW_pool مشتركة بين جميع العُقد.النتائج: التعلم الاستقرائي يعمل
قُيِّم GraphSAGE على ثلاث مهام مختلفة:
شبكات الاستشهاد (Cora/Citeseer): تصنيف العُقد في شبكات الأوراق الأكاديمية. حقق GraphSAGE-pool درجة F1 بلغت 93.0%، وهي نتيجة تنافس الأساليب التحويلية التي تطّلع على جميع العُقد أثناء التدريب.
منشورات Reddit: تصنيف المنشورات إلى مجتمعاتها. مع 232 ألف عقدة، حقق GraphSAGE-LSTM درجة F1 بلغت 95.4%، متفوقاً بفارق واضح على الأساليب التحويلية.
تفاعل البروتينات (PPI): وهذا هو الاختبار الاستقرائي الحاسم — لأنّ بيانات الاختبار تحتوي بروتينات من سياقات بيولوجية مختلفة لم يرَها النموذج أثناء التدريب إطلاقاً. حقق GraphSAGE-pool درجة F1 بلغت 61.2%، في مقابل 50% للأساليب التحويلية التي لم تملك آلية للتعميم على بيانات بيانية جديدة. أما الأساليب المبنية على السمات فقط دون بنية البيانات البيانية فسجّلت نحو 40%.
لماذا أحدث فرقاً
2016
GCN (كيبف ووِلينغ)
تصنيف شبه مُوجَّه على البيانات البيانية باستخدام التفافات طيفية. يعمل بأسلوب تحويلي — يشترط وجود جميع العُقد أثناء التدريب.
2017
GraphSAGE
أول إطار استقرائي للشبكات العصبية البيانية. مبدأ «عيِّن واجمع» يتيح التدريب بالدُّفعات والتعميم على عُقد لم تُشاهَد من قبل.
2018
GAT (فيليتشكوفيتش وآخرون)
شبكات الانتباه البيانية تُدخل أوزان انتباه مُتعلَّمة على عملية التجميع — فيحصل كل جار على وزن أهمية مختلف يُحسب من سماته.
2018
PinSage (يينغ وآخرون)
تطبيق GraphSAGE على نطاق Pinterest — 3 مليارات عقدة و18 مليار حافة. أول نشر صناعي حقيقي لشبكة عصبية بيانية، يُشغّل نظام التوصيات لمئات الملايين من المستخدمين.
2019
نضوج أطر الشبكات العصبية البيانية
كلتا المكتبتين PyTorch Geometric وDGL تضمّان SAGEConv كطبقة أساسية. يصبح GraphSAGE نقطة الانطلاق المعتادة لأي مشروع شبكات عصبية بيانية جديد.
أجاب GraphSAGE على سؤال جوهري ظلّ معلّقاً بعد GCN: كيف نجعل التعلّم على البيانات البيانية يعمل حين تتغيّر هذه البيانات باستمرار؟ بالانتقال من جداول البحث الثابتة إلى دوال مُتعلَّمة مشتركة، فتح GraphSAGE الباب أمام كل نظام إنتاجي بُني بعده — من PinSage إلى أنظمة اكتشاف الأدوية الحديثة.
المرجعHamilton, Ying, Leskovec. Inductive Representation Learning on Large Graphs. NeurIPS, 2017.
مصطلحات هذه الورقة
- الشبكات العصبية الرسومية (البيانية)Graph Neural Network (GNN)
- تمرير الرسائلMessage Passing
- تصنيف العُقدNode Classification
- الانحياز الاستقرائي المسبقInductive Bias
- تعلم التمثيلات الرقميةRepresentation Learning
- التضمينEmbedding
- مصفوفة التجاورAdjacency Matrix
- التعيين السلبيNegative Sampling
- التجميع المكانيPooling
- اختيار العينات الاحتماليةSampling