GNN לגרפים חברתיים: בוטים, קהילות, חיזוי קשרים

קהילות שוקעות בבוטים ובניפוח מלאכותי, והקשרים בין המשתתפים נשארים בלתי נראים לדוחות רגילים. אנו מפתחים מודלים על גרפי קשרים מקצה לקצה: מתייגים בוטים, מאתרים קהילות, חוזים קשרים עתידיים. ניתוח ידני מצטמצם פי כמה, ואיכות הקשרים הופכת למדידה.

תחומי פיתוח AI

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1365
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

גרף חברתי GNN: היכן נשבר חיזוי קשרים

מודל על גרף חברתי טועה לא במקרה: כשלים מתקבצים באזורים מסוימים. איכות הקשרים שם יורדת באופן צפוי — לפי דרגת הצומת, קצב גידול הקהילה וותק התיוג. לכן מדד ממוצע על כל המערך לא אומר דבר על איך הפתרון יתנהג עם משתמשים חדשים.

קשרים נדירים — הכשל הראשון. אצל צומת בדרגה אחת-שתיים, אגרגציה של שכנים הופכת רעש לבסיס התחזית: יש פחות אות מאשר שונות. זוגות כאלה המודל או מזלזל בהם, או מושך אותם לממוצע האוכלוסייה — והם בדיוק אלה שלרוב מהווים את המטרה.

האזור השני — תיוג בוטים. חשבונות אוטומטיים יוצרים קליקות צפופות עם מאפיינים כמעט זהים, והמודל לומד מהר אותם כאות קשר חזק. לאחר מכן חיזוי קשרים משחזר את פעילות הבוטים כנורמה, וקשרים חיים חלשים יורדים בדירוג.

חיפוש קהילות נשבר בגידול מהיר: בתוך שבועות ספורים הרכב הקבוצה משתנה עד כדי כך שהייצוגים שנלמדו מתארים מבנה שכבר אינו קיים. לכך מתווסף תיוג מיושן — קשרים שסומנו כמשמעותיים כבר התפרקו, ואת החדשים איש לא סימן.

אנחנו מפרקים את הגרף לפי האזורים האלה בנפרד, ולא לפי מספר אחד על כל המערך: קודם צריך למקם את הרעש בגרף החברתי, אחרת כל מודל מאומן מחדש פשוט מעביר את השגיאה לאזור אחר. להלן — איך זה בנוי.

מה משתנה לאחר ההטמעה: איכות, מהירות, כשלים

דיוק ממוצע על הגרף מטעה: הוא נשען על צמתים פופולריים, בעוד שהחלטות מתקבלות לפי קשרים נדירים. לכן מדד האיכות מחושב בנפרד בזנב ההתפלגות — שיעור התחזיות הנכונות לזוגות עם קשר משותף אחד-שניים, ושם בדיוק המודל נותן את עיקר השיפור.

את האימון מבצעים על רשתות גרפיות ב-PyTorch Geometric: אות משכנים מסדר שני ושלישי עובד היכן שמאפיינים תדירותיים שותקים.

טריות הקשרים — המדד השני. במקום חישוב מלא מחדש של אמבדינגים על כל הגרף, מחשבים אינקרמנטלית: מעדכנים צמתים שנפגעו ואת סביבתם, ואת הריצה המלאה משאירים לפי לוח זמנים כדי לנקות סחיפה שהצטברה. קצה חדש נכנס למודל בתוך חלון קצר, ולא בייצוא הבא.

ניפוח מזוהה לפי המבנה, לא לפי מונים: קליקות צפופות של חשבונות חדשים, גידול חריג בדרגה, תבניות קשרים חופפות. ריבוי מנויים משנה את המספרים, אך מעוות את הטופולוגיה המקומית — זה נראה לפני שהסכימה הספיקה לפעול.

המודל מחזיר ציון ודאות, לא תווית, ולכן לבדיקה ידנית מגיע רק אזור הגבול — שיעור הבדיקות מצטמצם, ומקרים שנויים במחלוקת נשארים אצל האנליסט. תיוג מבדיקות חוזר לאימון, והחישוב הבא מסיר חלק מהעומס מהאנשים.

נעלם סוג כשל נפרד שבו הגרף נבנה מתמונת מצב והמודל הכריע לפי קשרים של אתמול: בקרת סחיפה מראה ירידה בשלמות ובדיוק לפני שהיא מגיעה להחלטות.

השוואת גישות: כללים, אמבדינגים, מודלים על קשרים

הבחירה בין גישות היא לא על הפתרון "החזק ביותר", אלא על מה שנותן דיוק מקובל על הנתונים שלכם ושורד את השינוי הבא בהתנהגות הקהל. בהתחלה כמעט תמיד מנסים לסגור את המשימה בכללים: פעילות בחלון, שיעור שכנים משותפים, סף למספר הודעות.

כללים והיוריסטיקות קריאים, ניתנים להסבר ועובדים בלי תיוג — אבל כל כלל חדש מתנגש בקודמו, ואת הספים צריך לכוונן מחדש בכל תזוזה בפעילות.

גישה מתי מתאימה מגבלות
כללים נוקשים והיוריסטיקות צריך תוצאה מהירה ומוסברת, אין תיוג מספר הכללים גדל מהר מהדיוק, אזעקות שווא מצטברות
מאפיינים סטטיסטיים של צומת יש אגרגטים לפי פרופיל: פעילות, הרכב קשרים מתעלם מהמבנה — הערכת הצומת אינה תלויה בסביבה
ייצוגים וקטוריים של צמתים צריך להשוות צמתים ולחפש דומים מכווץ הקשר: הייצוג לא משתנה יחד עם השכנים
מודל על קשרים חשובים מסלולים, קהילות וחיזוי קשרים צריך נתונים ותיוג, יקר יותר בתמיכה ובהסבר ההחלטה

מאפיינים סטטיסטיים וייצוגים וקטוריים של צמתים ממלאים את האמצע: הראשונים זולים וצפויים, השניים נותנים השוואה בין משתתפים מאותו סוג, אבל שתי הסכמות מסתכלות על הצומת בנפרד מהגרף. מודל על קשרים קורא את הסביבה כולה, ולכן עובד טוב יותר היכן שאופי הקשרים עצמו חשוב.

בפועל הבחירה בגישה הופכת לרוב למפל: כללים מסננים מקרים ברורים, ייצוגים וקטוריים נותנים מועמדים, ומודל על קשרים מדרג אותם לפי הסתברות. אשכול קהילות מוסיף רמת קבוצה — חוות בוטים נראית לא לפי צומת בודד, אלא לפי קישוריות צפופה בין אשכולות שאמורים להיות כמעט לא מחוברים.

איך אנחנו בונים מודל: שלבי עבודת הנדסה

פיתוח רשת גרפית נוירונית (GNN) על גרף חברתי מתבצע כשרשרת של צעדים, שכל אחד נשען על תוצאה קבועה של הקודם. הסדר עקרוני: אם מאפיינים וחלוקת הנתונים נאספים "לפי העין", המודל מציג מדדים יפים באימון ומתפרק על נתונים חיים. לכן את הסכמה והכללים מקבעים לפני תחילת האימון.

  1. ביקורת נתונים. בודקים אילו קשרים ומאפיינים יש בגרף: מנויים, היסטוריית אינטראקציות, תוויות בוטים וקהילות. בודקים כפילויות, חסרים והגבול שממנו הנתונים מתאימים לאימון.
  2. סכימת מאפיינים. מתארים מה מוזן לצומת ולקצה: דרגה, גיל החשבון, חפיפת סביבות, פעילות בקהילות. הסכימה קובעת אילו נתונים לאסוף בהמשך.
  3. הרכבת סט אימון. מחלקים את ההיסטוריה לפי זמן, לא באקראי, אחרת המודל יציץ לעתיד. תוויות מקבעים ברגע החלוקה, ודוגמאות שליליות לוקחים מזוגות בלי קשר.
  4. כיול המודל. בוחרים עומק מעבר שכנים, שיעור קשרים שנזרקים וכללים לצמתים נדירים. בנפרד בודקים אם אין התאמת יתר למשתתפים הפעילים ביותר.
  5. ולידציה על תקופה נפרדת. מחשבים שיעור תחזיות קשרים נכונות, שלמות בבוטים ויציבות בקהילות על קטע שהמודל לא ראה.
  6. מסירת הפתרון. מוסרים את המודל, קוד הכנת המאפיינים, הסכמה המקובעת והוראות לחישוב מחדש — צוות הלקוח מריץ הכול בעצמו.
  7. נוהל עדכון. הגרף החברתי משתנה מדי יום: קובעים תקופת אימון מחדש, מדדי בקרה וכללי נסיגה לגרסה הקודמת.

ארטיפקטים של הטמעה: סכמות, קונפיגורציות, נהלים

לאחר ההטמעה אצל הלקוח נשארים לא רק מודל עובד, אלא גם ארטיפקטים הנדסיים: לפיהם הפתרון מתפתח בכוחות עצמאיים או מועבר לצוות אחר בלי הנדסה הפוכה. כל מסמך משויך לשלב מסוים בעיבוד הגרף ומתעדכן יחד עם המודל.

  • סכמות עיבוד נתונים. המסלול מהמקורות עד הגרף: איך נוצרים קודקודים וקצוות, היכן מנרמלים מזהים ומסננים כפילויות, אילו מאפיינים נכנסים לייצוג. חיבור מקור חדש — תיקון של צומת אחד בסכמה.
  • קונפיגורציות המודל. שכבות אגרגציה לפי שכנים, גודל סביבה, משקלי מחלקות, חלוקת מדגם לפי זמן. חלוקה אקראית בגרף עם קשרים זמניים מנפחת מדדים ולא עוברת לעבודה.
  • כללי תיוג. מה נחשב בוט ומה משתתף פעיל, איך מסמנים קשרים וקהילות חשודים, איך בודקים הסכמה בין מתייגים. אחרת המודל לומד על סתירות.
  • מדיניות גישה. למי זמין הגרף המלא, למי רק אגרגטים, אילו שדות מוסרים מזהות בכניסה, מי יכול לייצא תת-גרף. יומן בקשות סוגר שאלות של שירות הביטחון.
  • נוהל אימון מחדש. טריגרים — סחיפת מבנה הגרף, ירידת מדדים מתחת לסף, הופעת סוג קשרים חדש; תדירות, בדיקה על תקופה נפרדת, סדר נסיגה לגרסה הקודמת.
  • תיעוד ושחזור. מפת מאפיינים, מילון מדדים עם ערכי יעד, הוראות להרצת אימון והפקת תחזיות. התהליך משוחזר מאפס על נתונים נקיים.

מקרה בוחן: תיוג בוטים בקהילה, מדדים לפני ואחרי

איך היה

קהילה ב-Discord גדלה לעשרות אלפי חשבונות, ותיוג ידני הפסיק להספיק: שני מנהלים בדקו תלונות פרופיל אחר פרופיל, והבוטים הגיעו בקבוצות קשורות. בזמן שפירקו אחד, הופיעו עוד כמה — התור גדל מהר יותר מאשר טופל.

דיוק על קשרים נדירים ירד: בוט בודד כמעט לא נבדל ממשתמש חדש, ואילו קבוצה קשורה מסגירה את עצמה במבנה. חסמו פעילים — ליבת הקבוצה נשארה ושיקמה את הרשת בתוך כמה ימים.

מה שינו

העברנו את התיוג מחשבונות בודדים לגרף אינטראקציות: צמתים — פרופילים וערוצים, קצוות — תגובות, ריאקציות והופעות משותפות בשרשורים. מודל על קשרים מפיץ מאפיינים בסביבה ומתייג אשכול שלם, ולכן אותות חלשים של פרופיל אחד מתחזקים על ידי אותות של שכנים. לזוגות נדירים אך חוזרים ניתנה משקל נפרד.

דיוק התיוג עלה מ-0.62 ל-0.89, השלמות על קשרים נדירים — מ-0.41 ל-0.78. שיעור הקבוצות שאותרו במלואן לפני הפרץ עלה משליש ל-85%, והתור לבדיקה ידנית הצטמצם פי ארבעה: מנהל מאשר החלטה לפי אשכול, ולא לפי כל פרופיל.

הדינמיקה של הקהילות השתנתה: שיעור הרישומים מחדש לאחר חסימה ירד בערך פי שלושה — יחד עם הפעילים עוזבת ליבת הקבוצה. המודל רק מדרג מועמדים, ההחלטה הסופית נשארת בידי המנהל, ולכן נסיגה לתיוג ידני לא שוברת את התהליך.

מה לעשות אם הגרף כבר בנוי, אבל איכות הקשרים נמוכה

איכות ירודה ב-GNN מוסברת לעתים רחוקות בארכיטקטורה — ברוב המקרים הסיבה בנתונים. לפני שמשנים עומק אגרגציה, שוללים שלושה דברים: דליפת קצוות מטרה למאפיינים, רעש בתיוג וחוסר סנכרון בין סט האימון לסט הבדיקה לפי זמן.

האבחון הולך מהסימפטום לסיבה:

סימפטום סיבה סבירה צעד בדיקה ראשון
באימון המדדים עולים, בבדיקה יורדים התאמת יתר למבנה לקצץ עומק מעבר, להוסיף רגולריזציה לקצוות
האיכות מדרדרת בהדרגה עם הזמן סחיפת התפלגות לבדוק סחיפת מאפיינים וסוגי קשרים חדשים לפי חלונות
משתתפים חדשים מנובאים גרוע יותר מוותיקים התחלה קרה של צמתים לחשב שיעור צמתים בדרגה קטנה משתיים
המודל טועה בביטחון רעש בתיוג לבדוק מחדש קצוות שנויים במחלוקת והסכמת מתייגים

סדר האבחון הפוך מהרגיל — מהנתונים למודל. קודם בדיקת תיוג על תת-מדגם של קשרים והסכמה בין מתייגים, אחר כך מדדים בחתך חלונות זמן, ורק לבסוף ארכיטקטורה: עומק אגרגציה, משקלי מחלקות, בחירת דוגמאות שליליות. ספריות כמו PyTorch Geometric נותנות שכבות וטועני גרפים מוכנים, אבל רצף הבדיקות נשאר בידי המהנדס.

התחלה קרה נסגרת בנפרד. עבור צמתים בדרגה קטנה משתיים, מאפיינים נלקחים מהפרופיל ולא מהסביבה, וצמתים כאלה מוסתרים בפונקציית ההפסד כדי לא לטשטש את הגרדיאנט.

סחיפת התפלגות נתפסת בחלון אימון מחדש מתגלגל — כששיעור סוגי הקשרים החדשים עובר את הסף, המודל מתאמן מחדש, ולא מכוונן על נתונים מיושנים.

סימן שהסדר עבד: הפער בין אימון לבדיקה מפסיק לגדול, והאיכות על צמתים חדשים מתקרבת לממוצע בגרף.

ספקות לגבי הטמעה: קנה מידה, תיוג, פרטיות

ספקות בכניסה הם כמעט תמיד אותם ספקות: נתונים מעט או הרבה, תיוג יקר, פרטיות בסימן שאלה, והתוצאה נדרשת לא מיד. נבחן חמש שאלות טכניות שתלויות בהן תוכנית העבודה.

כמה קשרים יהיה צריך לתייג ידנית?

פחות ממה שנדמה: האות העיקרי המודל לוקח מהמבנה של הגרף, לא מתוויות ידניות. ידנית מתייגים רק את סט הוולידציה ומקרים שנויים במחלוקת — מאות קשרים, מאוזנים לפי סוגי צמתים.

מה יקרה כשהגרף יגדל פי עשרה?

האימון מתבצע לא על כל הגרף, אלא על סביבות של צמתים: נפח הנתונים גדל, לא זמן החישוב. המודל מאומן מחדש אינקרמנטלית, והאחסון מופרד מהחישוב.

איך זה משתלב עם פרטיות?

המודל רואה מזהים לא מזוהים וטופולוגיה של קשרים; מאפיינים אישיים לא נכנסים לאימון. אגרגטים, בעת הצורך, מחושבים בתוך המתחם שלכם, והתוצאה יוצאת החוצה.

אפשר להטמיע בשלבים?

כן, וזו הדרך המועדפת. קודם בדיקה על היסטוריה מצטברת, אחר כך מצב צל — תחזיות מחושבות, אבל החלטות מתקבלות לפי הלוגיקה הנוכחית — ורק לאחר מכן מתחם מוגבל.

איך להשתכנע שאפשר לסמוך על התחזיות?

מסתכלים לא רק על מדדי איכות, אלא גם על כיול הוודאות; קשרים שנויים במחלוקת נבדקים ידנית. קובעים סף כך שעל קשרים דו-משמעיים המודל שותק, ונסיגה לכללים נשארת בפקודה אחת.

נדון במשימה: מה לשלוח להערכה ראשונית

כדי לחזור עם הערכת לוחות זמנים ותוכנית עבודה, ולא עם מילים כלליות, די בכמה נתוני מקור. אין צורך להכין מפרט טכני מלא בשלב הזה — היקף העבודה מוערך לפי תיאור התרחיש ושבר גרף אמיתי אחד.

  • תרחיש שימוש: מי מקבל את התוצאה ואיזו החלטה מתקבלת — חסימת בוט, המלצת קשר או מודרציה של קהילה.
  • דוגמת ייצוא: שבר גרף לא מזוהה — קודקודים, קצוות, סוגי קשרים ומאפיינים, נפח ותקופת תצפית.
  • כללים נוכחיים: היוריסטיקות וספים שלפיהם ההחלטה מתקבלת כעת, והיכן הם טועים.
  • מדד איכות: מה נחשב תשובה נכונה ובאיזה שיעור הפעלות נכונות אתם מעריכים את הפתרון הנוכחי.
  • תיוג: האם יש דוגמאות מאושרות — בוטים ידועים, קשרים מאושרים, קהילות מתויגות.
  • מגבלות: דרישות לפרטיות, זמני אחסון, הרשאות ואנונימיזציה של נתונים.
  • אפקט צפוי: מה צריך להשתנות לאחר ההטמעה ובאילו מספרים אתם מודדים זאת.

מהסט הזה נבנית הצבת המשימה: בוחרים מאפיינים לקודקודים ולקשרים, מתכננים בדיקה על תקופה נפרדת ומקבעים מדד קבלה. תארו את התרחיש בצורה חופשית — נחזור עם הערכת לוחות זמנים ותוכנית עבודה לפי שלבים.