דחיסת רשתות נוירונים באופן חכם ויעיל באמצעות MATLAB

עולם הבינה המלאכותית מדבר על שימוש במודלים מהעולם של Machine Learning וDeep Learning כדי ללמוד תבניות סטטיסטיות בדאטה ולאחר מכן להשתמש במודלים אלו כדי להסיק מסקנות בזמן אמת לגבי דאטה חדש שהמודלים לא ראו מעולם.
רשתות נוירונים (Deep Learning) הם מודלים מורכבים שבנויים ממערך של שכבות כך שבכל שכבה יש מספר נוירונים (מודלים). מודלים אלו עלולים לתפוס כמויות גדולות של זיכרון.
במידה ונרצה לחסוך במקום אחסון, להפוך את תהליך הלמידה או את תהליך הסקת המסקנות למהיר יותר, או להטמיע את הרשתות נוירונים שלנו בחומרה שיש בה הרבה דרישות ומאידך אין בה הרבה זיכרון – ניאלץ לעיתים לדחוס את המודל המאומן שאיתו אנחנו עובדים.
בבלוג זה נתאר כיצד ניתן להשתמש ב- MATLAB, כדי לדחוס את המודל Deep Learning המאומן שאיתו אנחנו עובדים מבלי לוותר על הדיוק שלו, וגם לבחון את ביצועיו ומשקלו בסוף התהליך.
נוכל לדחוס רשת נוירונים באחת משתי שיטות עיקריות:
- דחיסה מבנית – מפחיתה את מספר המצבים והפרמטרים הניתנים ללמידה.
ל-MATLAB שתי טכניקות דחיסה מבניות, Pruning ושיטה נוספת שנקראת Projection. - שיטה נוספת נקראית Quantization ובה נמיר את את הפרמטרים הנלמדים לסוגי נתונים בעלי דיוק נמוך יותר אך ברווח של משקל נמוך יותר לרשת.
נפרט על כל אחת מהשיטות קצת יותר:
Pruning
גיזום (Pruning) רשת עצבית פירושו הסרת הפרמטרים הפחות חשובים ברשת (קישורים בין נוירונים) כדי להקטין את גודל הרשת תוך שמירה על איכות התחזיות שלה.

ניתן למדוד את החשיבות של סט פרמטרים לפי השינוי בerror (loss) לאחר הסרת הפרמטרים הללו מהרשת. אם ה-loss משתנה באופן משמעותי, אז הפרמטרים חשובים. אם ה-loss לא משתנה באופן משמעותי, אז הפרמטרים אינם חשובים וניתן למחוק אותם.
כאשר יש לנו מספר רב של פרמטרים ברשת, לא נוכל לחשב את השינוי בloss עבור כל שילובי הפרמטרים האפשריים. במקום זאת, נבצע פעולה איטרטיבית:
- נשתמש בקירוב כדי למצוא ולהסיר את הפרמטרים הפחות חשובים.
- נחזק את החיזוי של הרשת החדשה והקטנה יותר על ידי אימון מחדש (fine tuning) עם הדאטה שלנו שמיועד לאימון בכמה איטרציות.
- נחזור על שלבים 1 ו-2 עד שנגיע לצמצום הזיכרון הרצוי או עד שלא נוכל לשחזר את ירידת הaccuracy של הרשת באמצעות fine tuning.
- אפשרות אחת לקירוב בשלב 1 היא לחשב את הרחבת טיילור של ההפסד כפונקציה של פרמטרי הרשת הבודדים. שיטה זו נקראת גיזום טיילור.
נוכל להשתמש במספר פונקציות שיבצעו את העבודה עבורנו באופן קל ונוח כך שנוכל לבחון את הרשתות הגזומות מבחינת הביצועים שלהן והמשקל שלהן בכל רגע שנרצה.
Projection
בשיטה זו נחליף שכבה גדולה של נוירונים במספר שכבות קטנות עם פחות פרמטרים ובכך נשמור על איכות הרשת והביצועים שלה אך נקטין את הגודל שלה.
שיטת Principal-component analysis (PCA) מאפשר לנו לבטא את הדאטה שלנו בממדים ממוינים לפי חשיבות.
בביצוע Projection על רשת נוירונים נשתמש ב- PCA כדי להקטין את גודלה של שכבה ברשת באופן הבא:
- נזהה את תת-המרחב של פרמטרים הניתנים ללמידה שגורמים לשונות הגבוהה ביותר בהפעלת נוירון על ידי ניתוח הפעלות הרשת באמצעות מערך נתונים המייצג את הדאטה סט של האימון.
- נמיר את האינפוט של השכבה על הממד התחתון ביותר המתפרש על ידי N הכיוונים החשובים ביותר.
- נבצע את פעולת השכבה הרצויה בתוך המרחב התחתון שבו אנו מבצעים את הפעולה.
- נחזור למרחב הממדים הגבוה ביותר (ההתחלתי) על ידי הוספת המספר הנדרש של אפסים לסוף הפלט ונמיר חזרה למרחב המקורי. וכך קיבלנו רשת עם שכבה פונקציונאלית ופחות עמודה, שפעולתה מתבצעת על ידי מספר שכבות גדול יותר אך קל יותר.

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

Quantization
קוונטיזציה (כימות) היא טכניקת דחיסה שאינה משפיעה על ארכיטקטורת הרשת, אלא מפחיתה את הדיוק של הפרמטרים הניתנים ללמידה שנמצאים בתוכה כמו weights, biases, ו activations.

קוונטיזציה מורכבת משני שלבים עיקריים:
- נמצא את הטווחים של הפרמטרים ברשת שלנו. לשם כך, נאמן את הרשת עם דאטה לאימון, נחלץ את ערכי המינימום והמקסימום של הפרמטרים הניתנים ללמידה בכל שכבה (Fully connected layer).
- נמיר את הפרמטרים למספרים שלמים (integers) המייצגים את הטווח הדינמי שחושב בשלב הקודם. כלומר נמיר את הערכים המספריים בערכים מאוד דומים עם פחות משקל (לרוב המרה של 32 ביט ל8 ביט).

כדי לכמת מודלים של למידה עמוקה ב- MATLAB, נוכל להשתמש ב2 גישות:
- קוד: נוכל להשתמש בפונקציות כמו dlquantizer ו- calibrate אשר יאפשרו לנו לבצע את התהליך ואז נבחן את המשתנים המתקבלים ולהסיק את המסקנות המתבקשות.
ניתן לראות דוגמא לכך בלינק הבא. - אפליקציה אינטרקטיבית: נוכל להשתמש באפליקציה שלא דורשת שימוש בקוד ונקראת Deep Network Quantizer.
באמצעות אפליקציה זו נוכל לבצע מספר דברים באופן אינטרקטיבי:

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

במידה ותרצו לשמוע עוד – אתם מוזמנים ליצור איתנו קשר!
בינתיים, תוכלו לקבל מידע נוסף על האפליקציה בלינקים הבאים: