סדירה של גמישות: רגולציית L1

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

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

לדוגמה, נניח שמערך נתוני הדיור מכסה לא רק את קליפורניה, אלא גם את כדור הארץ כולו. חלוקת קו הרוחב העולמי ברמת הדקות (60 דקות במעלות) יוצרת כ-10,000 מאפיינים בקידוד מצומצם. קו האורך הגלובלי ברמת הדקות יוצר כ-20,000 מאפיינים. שילוב התכונות של שתי התכונות האלה יכול ליצור בערך 200,000,000 מאפיינים. רבים מ-200,000,000 המאפיינים האלה מייצגים אזורים של מגורים מוגבלים כאלה (למשל, מרכז האוקיינוס), שקשה להשתמש בהם כדי להכליל בצורה יעילה את הנתונים האלה. זה יהיה טיפשי לשלם את עלות ה-RAM של אחסון המאפיינים המיותרים האלה. לכן, כדאי לעודד את המשקולות של המאפיינים חסרי המשמעות לרדת ל-0 בדיוק, וכך להימנע מתשלום עלות האחסון של מקדמי המודל האלה בזמן ההסקה.

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

האם הרגולציה של L2 יכולה לבצע את המשימה הזו? לצערנו, לא. הר2 מעודד את המשקולות להיות קטנות, אבל לא מאלצת אותן להגיע בדיוק ל-0.0.

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

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

רגולציית L1 לעומת L2.

L2 ו-L1 עונשים על משקולות באופן שונה:

  • L2 נענש על ידי משקל2.
  • טרנזקציית L1 כוללת עונש |משקל|.

כלומר, ל-L2 ול-L1 יש נגזרות שונות:

  • הנגזרת של L2 היא 2 * weight.
  • הנגזרת של L1 היא k (קבוע, שהערך שלו אינו תלוי במשקל).

הנגזרת של L2 היא כוח שמסיר x% מהמשקל בכל פעם. כפי ש-Zeno ידע, גם אם מסירים x אחוזים ממספר מיליארדי פעמים, המספר המוקטן עדיין לא יגיע לאפס. (Zeno הכי פחות הכיר את מגבלות הדיוק בנקודה צפה (floating-point), שיכול להיות שהתוצאה הייתה אפס בדיוק.) בכל מקרה, L2 בדרך כלל לא מעלה את המשקולות לאפס.

אפשר לחשוב על הנגזרת של L1 ככוח שמפחית קבוע מהמשקל בכל פעם. עם זאת, הודות לערכים המוחלטים, ב-L1 יש אי-רציפות ב-0, וכתוצאה מכך תוצאות חיסור שחוצה את 0 הופכות למאפסים. לדוגמה, אם החיסור היה צריך לאלץ משקל מ-0.1+ ל-0.2-, אז L1 יגדיר את המשקל כ-0 בדיוק. Eureka, L1 אפס את המשקל.

הרגולטור של L1 - ענישה של הערך המוחלט של כל המשקולות - מתגלה כיעילות למדי במודלים רחבים.

לתשומת ליבכם, תיאור זה רלוונטי למודל חד-ממדי.

אפשר ללחוץ על לחצן ההפעלה () למטה כדי להשוות את ההשפעה של רנדומליזציה של L1 ו-L2 על רשת של משקולות.