אמ;לק – Pruning neural networks without any data by iteratively conserving synaptic flow (כולל קוד)

הבלוג פוסט נכתב במקור כפוסט על ידי יואב רמון בקבוצת Machine & Deep learning Israel
Pruning neural networks without any data by iteratively conserving synaptic flow
H. TANAKA, D. KUNIN, D. YAMINS, S. GANGULI (NTT + STANFORD)
מאמר שלדעתי הוא סופר משפיע, שילוב של עבודה מתמטית טובה, נושא עם חשיבות סופר פרקטית ובסוף גם קוד פתוח. יש פה הקדמה תיאורטית שלדעתי עוזרת להבין למה המאמר חשוב, ממליץ לקרוא אותה לכל מי שלא שוחה ממש בתחום של PRUNING.
הקדמה:
אנחנו יודעים מאז 2018 (The lottery ticket hypothesis) שלהרבה מהרשתות שאנחנו משתמשים בהן, יש תת-רשתות שמכילות פחות פרמטרים ובכל זאת יודעות לשמור על דיוק דומה. מובן שלמצוא את התת-רשתת האלה היא משימה קשה במיוחד, אבל מאז נעשו מחקרים רבים על שיטות שונות לעשות זאת (שיטות הנקראות pruning) וישנם עשרות מאמרים שלקחו גישות שונות כדי לנסות לעשות את התהליך בצורה טובה.
במאמר One ticket to win them all: generalizing lottery ticket initializations across datasets and optimizers הראו ש"הכרטיס המנצח", כלומר התת-רשת האפקטיבית יותר, היא תת-רשת שנשארת אפקטיבית יותר גם כשמחליפים את ה-Dataset או את ה-Optimizer ומאז לדעתי הם הציבו רף לשלושה תנאים תיאורטיים שיכלו להפוך פתרון Pruning למושלם מבחינת שימוש:
במאמר One ticket to win them all: generalizing lottery ticket initializations across datasets and optimizers הראו ש"הכרטיס המנצח", כלומר התת-רשת האפקטיבית יותר, היא תת-רשת שנשארת אפקטיבית יותר גם כשמחליפים את ה-Dataset או את ה-Optimizer ומאז לדעתי הם הציבו רף לשלושה תנאים תיאורטיים שיכלו להפוך פתרון Pruning למושלם מבחינת שימוש:
א. לא צריך לעבור הרבה תהליכים של אימון מחדש – מסיבה פרקטית כי אימונים יכולים להיות יקרים.
ב. התהליך נעשה לפני האימון – ככה אנחנו חוסכים בזמן אימון ולא מאמנים סתם חלקים של הרשת שבמילא נזרוק אחר כך.
ג. לא צריך לדעת מה הדאטא (כלומר, לא צריך להבין איזה בעייה מהותית הרשת מנסה לפתור)
בהתחלה הפתרונות הראשונים (לדוגמא MorphNet של גוגל שהייתה בזמנו מאוד בולטת) לא קיימו אף אחד מהתנאים האלה וכללו בעיקר תהליכים איטרטיביים שכללו חיפושים על תת-רשתות תוך כדי תהליך אימון מאוד ארוך ומסובך. אחר כך באו פתרונות שפתרו את שלב א או שצמצמו אותו מאוד.
לאחרונה, התחילו להפציע עבודות שנוגעות בנקודה ב ומנסות לעשות את התהליך לפני האימון והבולטת בהן הייתה SNIP פתרון Single shot שהיה מצמצם את הרשת אבל היה לו חסרון מרכזי אחד, הוא הצריך בתור Input ידע מוקדם על כל ה-Training data ועל ה-Loss שבו משתמשים, ידע שלכאורה חשבנו שאנחנו לא צריכים, אם מקבלים את התיאוריה מ-2019 ושגם גרם לפתרון לעבוד פחות טוב בסיטואציה אמיתית שבה הדאטא משתנה לפעמים.
לאחרונה, התחילו להפציע עבודות שנוגעות בנקודה ב ומנסות לעשות את התהליך לפני האימון והבולטת בהן הייתה SNIP פתרון Single shot שהיה מצמצם את הרשת אבל היה לו חסרון מרכזי אחד, הוא הצריך בתור Input ידע מוקדם על כל ה-Training data ועל ה-Loss שבו משתמשים, ידע שלכאורה חשבנו שאנחנו לא צריכים, אם מקבלים את התיאוריה מ-2019 ושגם גרם לפתרון לעבוד פחות טוב בסיטואציה אמיתית שבה הדאטא משתנה לפעמים.
(כמובן שיש לפני אחרי ובין לבין עוד מלא מאמרים חשובים, המטרה כאן רק לתת תחושה ובסיס ולא לצטט סיפור היסטורי מדוייק)
המאמר:
כאן נכנס המאמר מסטנפורד ו-NTT שבעצם מדגים אלגוריתם חדש ל-Pruning בשם SynFlow. כמו שבטח כבר ניחשתם – Synflow הוא הגביע הקדוש שחיכיתי אליו מאז 2018 (בלי להגזים). זה אלגוריתם שיודע לצמצם רשתות לפני האימון, שיודע לעשות רשת שטובה לבעיות שונות, ושיודע לעשות זאת בלי לדעת שום דבר על העולם שבו האלגוריתים עובד (שמיוצג ע"י הדאטא) ובלי לדעת שום דבר על הבעייה שהאלגוריתם מנסה לפתור (פונקציית ה-Loss).
במאמר הם בעצם בודקים את התשתית התיאורטית של אלגוריתמים שעושים Pruning ומבינים מה הבעיות שלהם, בעיקר בעייה בשם Layer Collapse שגורמת לרשתות עמוקות יותר (הרשתות שמשתמשים בהם בפרקטיקה) להפגע יותר משיטות כאלה. הם גם מדגימים למה לדעתם התהליך צריך להיות איטרטיבי, ובאופן כללי איזה חלקים צריך לשמר.
אחרי כל זה הם נסחו אלגוריתם (מאוד פשוט יחסית) שמדגים את שיטות ה-Pruning שלהם, ובצורה מדהימה – הוא עובד יותר טוב משיטות אחרות שמכירות את הדאטא ואת ה-Loss (הדגמה פרקטית למאמר מ-2019 שהזכרתי מקודם) ומדגים טוב גם עד כמה תת-הרשת שנוצרה מתאימה למגוון משימות ואתגרים (הוספתי גרף שמראה את זה מהמאמר) ועד כמה האלגוריתם עובד על מגוון של ארכיטקטורות שונות.
אחרי כל זה הם נסחו אלגוריתם (מאוד פשוט יחסית) שמדגים את שיטות ה-Pruning שלהם, ובצורה מדהימה – הוא עובד יותר טוב משיטות אחרות שמכירות את הדאטא ואת ה-Loss (הדגמה פרקטית למאמר מ-2019 שהזכרתי מקודם) ומדגים טוב גם עד כמה תת-הרשת שנוצרה מתאימה למגוון משימות ואתגרים (הוספתי גרף שמראה את זה מהמאמר) ועד כמה האלגוריתם עובד על מגוון של ארכיטקטורות שונות.
למה זה חשוב:
בתור התחלה, זה בסיס לכלים שבטח יפציעו שיעזרו לצמצם מראש ארכיטקטורות מוכרות. אם אתם משתמשים ב-Resnet למשהו אתם יכולים להתחיל להשתמש בה כבר היום. Pruning הוא תחום שכל חברות הענק חוקרות בגלל ההשלכות הכלכליות האדירות שיש לכל צמצום ברשתות.
בנוסף, אני חושב שזה עוד חתיכה בפאזל שעוזרת להבין בצורה יותר טובה את התיאוריה של רשתות, עבודות ההמשך של העבודה הזאת בטח יהיו מרתקות לא פחות.
בתור התחלה, זה בסיס לכלים שבטח יפציעו שיעזרו לצמצם מראש ארכיטקטורות מוכרות. אם אתם משתמשים ב-Resnet למשהו אתם יכולים להתחיל להשתמש בה כבר היום. Pruning הוא תחום שכל חברות הענק חוקרות בגלל ההשלכות הכלכליות האדירות שיש לכל צמצום ברשתות.
בנוסף, אני חושב שזה עוד חתיכה בפאזל שעוזרת להבין בצורה יותר טובה את התיאוריה של רשתות, עבודות ההמשך של העבודה הזאת בטח יהיו מרתקות לא פחות.
מאמר:
https://arxiv.org/abs/2006.05467
קוד פתוח:
https://github.com/ganguli-lab/Synaptic-Flow
ד"א, פשוט מופת לאיך לשחרר קוד פתוח. הקוד ב-Pytorch ויש ממש סקריפט שמשחזר בנפרד כל אחד מהגרפים במאמר. הקוד קריא, יש תהליך התקנה מסודר ופשוט כיף להסתכל על זה.
המימוש עצמו של השיטת Pruning נמצא כאן. כאמור, מימוש מאוד פשוט.