ืืื ื ืืืืืืชืืช 101
ืืื Gradient Descent?

מהו Gradient Descent?
אם קראתם על כיצד רשתות נוירונים מאומנות, כמעט בוודאות פגשתם את המונח “Gradient Descent” לפני כן. Gradient Descent הוא השיטה העיקרית לאופטימיזציה של ביצועי רשת נוירונים, והפחתת שיעור השגיאה/איבוד של הרשת. אולם, Gradient Descent יכול להיות קצת קשה להבנה עבור אלו שחדשים בלמידת מכונה, ומאמר זה ינסה לתת לכם הבנה סבירה של איך Gradient Descent פועל.
Gradient Descent הוא אלגוריתם אופטימיזציה. הוא משמש לשיפור הביצועים של רשת נוירונים על ידי עריכת שינויים בפרמטרים של הרשת כך שהפרש בין תחזיות הרשת לערכים האמיתיים/צפויים של הרשת (המכונה איבוד) יהיה קטן ככל האפשר. Gradient Descent לוקח את הערכים ההתחלתיים של הפרמטרים ומשתמש בפעולות המבוססות על חשבון אינפיניטסימלי לשנות את ערכיהם לכיוון הערכים שיגרמו לרשת להיות מדויקת ככל האפשר. אתם לא צריכים לדעת הרבה על חשבון אינפיניטסימלי כדי להבין איך Gradient Descent עובד, אבל אתם צריכים להיות מודעים למושג גרדיאנט.
מהו גרדיאנט?
נניח שיש גרף המייצג את כמות השגיאה שרשת נוירונים עושה. תחתית הגרף מייצגת את הנקודות עם השגיאה הנמוכה ביותר, בעוד שראש הגרף הוא היכן שהשגיאה היא הגבוהה ביותר. אנו רוצים לנוע מראש הגרף למטה. גרדיאנט הוא רק דרך לכמת את היחס בין שגיאה לבין משקלות הרשת הנוירונית. היחס בין שני הדברים יכול להיות מיוצג כשיפוע, עם משקלות לא נכונים המייצרים יותר שגיאות. תלולות השיפוע/גרדיאנט מייצגת כמה מהר המודל לומד.
שיפוע תלול יותר משמעו הפחתות גדולות בשגיאה, והמודל לומד מהר, בעוד שאם השיפוע הוא אפס, המודל נמצא על רמה ואינו לומד. אנו יכולים לנוע למטה במורד השיפוע לעבר פחות שגיאות על ידי חישוב גרדיאנט, כיוון תנועה (שינוי בפרמטרים של הרשת) עבור המודל שלנו.
בואו נשנה את המטאפורה במעט ונדמיין סדרה של גבעות ועמקים. אנו רוצים להגיע לתחתית הגבעה ולמצוא את החלק של העמק שמייצג את האיבוד הנמוך ביותר. כאשר אנו מתחילים בראש הגבעה, אנו יכולים לעשות צעדים גדולים למטה הגבעה ולהיות בטוחים שאנו הולכים לעבר הנקודה הנמוכה ביותר בעמק.
אולם, כאשר אנו מתקרבים לנקודה הנמוכה ביותר בעמק, צעדינו צריכים להיות קטנים יותר, אחרת אנו עלולים לעבור את הנקודה האמיתית של האיבוד הנמוך ביותר, ולהימצא בצד השני. באופן דומה, כאשר אנו מתאימים את משקלות הרשת, התאומים יכולים להרחיק את הרשת מנקודת האיבוד הנמוך ביותר, ולכן התאומים צריכים להיות קטנים יותר עם הזמן. בהקשר של ירידה לעבר נקודת האיבוד הנמוך ביותר, הגרדיאנט הוא וקטור/הוראות המפרטות את הנתיב שאנו צריכים ללכת בו וכמה גדולים צעדינו צריכים להיות.
עכשיו, כשאנו יודעים שגרדיאנטים הם הוראות שאומרות לנו באיזה כיוון לנוע (אילו מקדמים צריכים להיות מעודכנים) וכמה גדולים צעדינו צריכים להיות (כמה המקדמים צריכים להיות מעודכנים), אנו יכולים לחקור כיצד הגרדיאנט מחושב.
חישוב גרדיאנטים & Gradient Descent

Gradient Descent מתחיל בנקודה של איבוד גבוה ובאמצעות מספר רב של איטרציות, עושה צעדים בכיוון של איבוד נמוך, במטרה למצוא את הקונפיגורציה האופטימלית של משקל. תמונה: Роман Сузи via Wikimedia Commons, CCY BY SA 3.0 (https://commons.wikimedia.org/wiki/File:Gradient_descent_method.png)
כדי לבצע Gradient Descent, ראשית צריך לחשב את הגרדיאנטים. כדי לחשב את הגרדיאנט, אנו צריכים לדעת את פונקציית האיבוד/עלות. אנו נשתמש בפונקציית העלות כדי לקבוע את הנגזרת. בחשבון אינפיניטסימלי, הנגזרת רק מתייחסת לשיפוע של פונקציה בנקודה נתונה, כך שבעצם אנו רק מחשבים את השיפוע של הגבעה על בסיס פונקציית האיבוד. אנו קובעים את האיבוד על ידי הרצת המקדמים דרך פונקציית האיבוד. אם נייצג את פונקציית האיבוד כ-“f”, אז אנו יכולים לומר שהנוסחה לחישוב האיבוד היא כדלקמן (אנו רק מריצים את המקדמים דרך פונקציית העלות שנבחר):
איבוד = f(מקדם)
אנו אז מחשבים את הנגזרת, או קובעים את השיפוע. קבלת הנגזרת של האיבוד תגיד לנו באיזה כיוון הוא “למעלה” או “למטה” בשיפוע, על ידי מתן לנו את הסימן המתאים לשנות את המקדמים. אנו נייצג את הכיוון המתאים כ-“delta”.
delta = derivative_function(איבוד)
אנו קבענו עכשיו את הכיוון שהוא “למטה” לעבר נקודת האיבוד הנמוך. זה אומר שאנו יכולים לעדכן את המקדמים בפרמטרים של הרשת הנוירונית ולהוריד את האיבוד. אנו נעדכן את המקדמים על בסיס המקדמים הקודמים פחות השינוי המתאים בערך כפי שנקבע על ידי הכיוון (delta) וטיעון ששולט בגודל השינוי (גודל הצעד). הטיעון ששולט בגודל העדכון נקרא “שיעור למידה” ואנו נייצג אותו כ-“alpha”.
מקדם = מקדם – (alpha * delta)
אנו אז רק חוזרים על תהליך זה עד שהרשת התכנסה סביב נקודת האיבוד הנמוך, שצריכה להיות קרובה לאפס.
זה חשוב מאוד לבחור את הערך הנכון עבור שיעור הלמידה (alpha). שיעור הלמידה הנבחר צריך להיות גם לא קטן מדי וגם לא גדול מדי. זכור שכאשר אנו מתקרבים לנקודת האיבוד הנמוך, צעדינו צריכים להיות קטנים יותר, או שאנו עלולים לעבור את נקודת האיבוד הנמוך ולהימצא בצד השני. נקודת האיבוד הקטנה ביותר היא קטנה, ואם קצב השינוי שלנו גדול מדי, השגיאה עלולה לגדול שוב. אם גודל הצעדים גדול מדי, ביצועי הרשת ימשיכו לנוע סביב נקודת האיבוד הנמוך, עוברים אותה בצד אחד ואז בצד השני. אם זה קורה, הרשת לעולם לא תתכנס על הקונפיגורציה האופטימלית של משקל.
לעומת זאת, אם שיעור הלמידה קטן מדי, הרשת עלולה להידרש לזמן ארוך במיוחד כדי להתכנס על המשקלים האופטימליים.
סוגים של Gradient Descent
עכשיו שאנו מבינים כיצד Gradient Descent עובד בכלל, בואו ניקח מבט על כמה מהסוגים השונים של Gradient Descent.
Batch Gradient Descent: צורה זו של Gradient Descent עוברת דרך כל הדוגמאות האימון לפני עדכון המקדמים. סוג זה של Gradient Descent כנראה הוא הצורה היעילה ביותר מבחינה חישובית, שכן המשקלים מעודכנים רק פעם אחת לאחר שכל הבאטץ’ הועבר, מה שאומר שיש פחות עדכונים בסך הכל. אולם, אם המאגר המקורי מכיל מספר גדול של דוגמאות אימון, אז Batch Gradient Descent יכול להפוך את האימון לאיטי.
Stochastic Gradient Descent: ב-Stochastic Gradient Descent, רק דוגמה אימון אחת מעובדת עבור כל איטרציה של Gradient Descent ועדכון פרמטר. זה קורה עבור כל דוגמת אימון. מכיוון שרק דוגמה אימון אחת מעובדת לפני שהפרמטרים מעודכנים, היא נוטה להתכנס מהר יותר מ-Batch Gradient Descent, שכן עדכונים מבוצעים מוקדם יותר. אולם, מכיוון שהתהליך חייב להתבצע על כל פריט בקבוצת האימון, זה יכול ל










