בדומה לתיקוני נשיאה ולהגדלת המשקל, הגדלת הדרגתית היא מתודולוגיה שמיושמת מעל אלגוריתם אחר של למידת מכונה. באופן לא רשמי, שיפור הדרגתי כולל שני סוגי מודלים:
- "חלש" של למידת מכונה, שהוא בדרך כלל עץ החלטות.
- 'חזק' של למידת מכונה, שמורכב מכמה למשימות ספציפיות.
בהגדלה הדרגתית, בכל שלב מודל חלש חדש מאומן לחזות "שגיאה" של המודל החזקה הנוכחי (שנקרא פסאודו תגובה). נפרט את המונח "שגיאה" מאוחר יותר. בינתיים, מניחים "שגיאה" הוא ההבדל את החיזוי ותווית רגרסיבית. המודל החלש (כלומר ה"שגיאה") הוא מוסיפים למודל החזקה עם סימן שלילי כדי לצמצם את השגיאה מודל חזק.
הגדלה הדרגתית היא פעולה איטרטיבית. כל איטרציה מפעילה את הנוסחה הבאה:
\[ F_{i+1} = F_i - f_i \]
איפה:
- $F_i$ הוא המודל החזקה ביותר בשלב $i$.
- $f_i$ הוא המודל החלש בשלב $i$.
הפעולה הזו חוזרת על עצמה עד שמתקיים קריטריון לעצירה, כמו ערך מקסימלי או אם המודל (החזק) מתחיל לגבור על הערכים שנמדדים מערך נתונים נפרד לאימות.
נמחיש את הגדלת הדרגתית במערך נתונים פשוט של רגרסיה, שבו:
- המטרה היא לחזות את הערך של $y$ ביחס ל-$x$.
- המודל החזק מאותחל כקבוע אפס: $F_0(x) = 0$.
# Simplified example of regressive gradient boosting.
y = ... # the labels
x = ... # the features
strong_model = []
strong_predictions = np.zeros_like(y) # Initially, the strong model is empty.
for i in range(num_iters):
# Error of the strong model
error = strong_predictions - y
# The weak model is a decision tree (see CART chapter)
# without pruning and a maximum depth of 3.
weak_model = tfdf.keras.CartModel(
task=tfdf.keras.Task.REGRESSION,
validation_ratio=0.0,
max_depth=3)
weak_model.fit(x=x, y=error)
strong_model.append(weak_model)
weak_predictions = weak_model.predict(x)[:,0]
strong_predictions -= weak_predictions
נחיל את הקוד הזה על מערך הנתונים הבא:
איור 25. מערך נתונים רגרסיבי סינתטי עם תכונה מספרית אחת.
הנה שלוש גרפים אחרי האיטרציה הראשונה של הגדלת ההדרגתיות אלגוריתם:
איור 26. שלושה תרשימים אחרי האיטרציה הראשונה.
שימו לב לנקודות הבאות באיור 26:
- בתרשים הראשון מוצגות החיזויים של המודל החזקה, ובשלב הזה הוא תמיד 0.
- בתרשים השני מוצגת השגיאה, שהיא התווית של המודל החלש.
- בתרשים השלישי מוצג המודל החלש.
המודל הראשון והחלש ביותר הוא למידה של ייצוג גס של התווית, ובדרך כלל מתמקד בחלק השמאלי של מרחב הישות (החלק עם הכי הרבה וריאציות, ולכן את רוב השגיאה עבור המודל הלא נכון הקבוע).
בהמשך מוצגות אותן תרשימים לאיטרציה נוספת של האלגוריתם:
איור 27. שלושה תרשימים אחרי האיטרציה השנייה.
שימו לב לנקודות הבאות באיור 27:
- המודל החזקה מכיל עכשיו חיזוי של המודל החלש בחזרה הקודמת.
- השגיאה החדשה של המודל החזקה קצת קטנה יותר.
- החיזוי החדש של המודל החלש מתמקד עכשיו בחלק הימני למרחב המשותף.
אנחנו מפעילים את האלגוריתם למשך 8 איטרציות נוספות:
איור 28. שלושה גרפים אחרי האיטרציה השלישית והאיטרציה העשירית.
באיור 28, שימו לב שהחיזוי של מודל חזק מתחיל להיראות כמו התרשים של מערך הנתונים.
הנתונים האלה ממחישים את האלגוריתם להגדלת ההדרגתיות באמצעות עצי החלטות, ללמידה חלשה. השילוב הזה נקרא עצים מוגברים הדרגתיים (החלטה).
התרשים הקודם מרמז על המהות של הגדלת הדרגתיות. אבל חסרות שתי הפעולות הבאות בעולם האמיתי:
- הכיווץ
- אופטימיזציה של ערכי עלים עם שלב אחד בשיטת ניוטון
כיווץ
המודל החלש $f_i$ מוכפל בערך קטן $\nu$ (לדוגמה, $\nu = 0.1$) לפני שמוסיפים אותו למודל החזקה $F_i$. הערך הקטן הזה נקרא הכיווץ. במילים אחרות, במקום שכל איטרציה תסתמך על נוסחה:
\[ F_{i+1} = F_i - f_i \]
כל איטרציה משתמשת בנוסחה הבאה:
\[ F_{i+1} = F_i - \nu f_i \]
התכווצות בהגדלה הדרגתית מקבילה לקצב הלמידה ברשתות נוירונים. התכונה 'כיווץ' קובעת את מהירות הלמידה של המודל החזק, וכך עוזרת להגביל התאמת יתר. כלומר, ערך הכיווץ הקרוב יותר ל-0.0 מפחית את ההתאמה ליותר מדי כערך כיווץ שקרוב ל-1.0.
בקוד שלנו שלמעלה, הכיווץ תיושם באופן הבא:
shrinkage = 0.1 # 0.1 is a common shrinkage value.
strong_predictions -= shrinkage * weak_predictions