לגרום לה להתאמן, ולגרום לה להכליל
רשת בת שש שכבות שה-loss שלה לא זז מ-ln 2, מתוקנת מדידה אחר מדידה. ואז double descent: 5,000 פרמטרים על 40 נקודות.
בעמוד הזה
הרשת מפרק 5 עובדת. יש לה תשעה פרמטרים, היא לומדת XOR, והגרדיאנטים שלה תואמים ל-PyTorch עד שש-עשרה ספרות אחרי הנקודה.
הפכו אותה לעמוקה בת שש שכבות והיא מפסיקה ללמוד לגמרי. לא לאט — לגמרי. הנה רשת בת שש שכבות לבעיית סיווג של שתי ספירלות, שאומנה במשך 5000 צעדים:
step 1: loss 0.693147
step 5000: loss 0.693147
accuracy: 50.0 %המספר הזה לא שרירותי. הוא ה-binary cross-entropy של מודל שמוציא הסתברות לכל דבר, ו-50 % היא הטלת מטבע על dataset מאוזן. אחרי חמשת אלפים צעדים הרשת לא הזיזה אפילו ספרה אחת. שום דבר לא קרס, שום אזהרה לא הופיעה, והגרדיאנטים עדיין נכונים בדיוק.
הפרק הזה עוסק בפער בין רשת שרצה לבין רשת שעובדת. יש לו שני חצאים שנראים כמו נושאים שונים אבל הם אותה עבודה: לגרום ל-loss לרדת למטה, ולגרום לו לרדת גם על data שהמודל מעולם לא ראה.
למה הרשת בת שש השכבות מתה
קישור למקטע: למה הרשת בת שש השכבות מתההתחילו בהסתכלות, במקום בניחוש. העבירו batch של קלטים דרך הרשת והדפיסו את סטיית התקן של האקטיבציות בכל שכבה, ואז את סטיית התקן של גרדיאנטי המשקלים:
def profile(model, x):
h = x
for layer in model:
h = layer(h)
if isinstance(layer, (nn.Tanh, nn.ReLU)):
print(f"activation std: {h.std().item():.4f}")
model(x).sum().backward()
for p in model.parameters():
if p.dim() == 2:
print(f"gradient std: {p.grad.std().item():.2e}")שלושה אתחולים, אותה ארכיטקטורה, שש שכבות של :
| אתחול | סטיית תקן של אקטיבציות, שכבות 1→6 |
|---|---|
| normal, std | 0.0145 · 0.0016 · 0.0002 · 0.0000 · 0.0000 · 0.0000 |
| normal, std | 0.6573 · 0.9296 · 0.9585 · 0.9634 · 0.9637 · 0.9625 |
| Xavier | 0.1579 · 0.1493 · 0.1353 · 0.1333 · 0.1325 · 0.1403 |
| אתחול | סטיית תקן של גרדיאנטים, שכבה ראשונה → אחרונה |
|---|---|
| normal, std | 3.20e-06 · 4.97e-07 · … · 6.40e-06 |
| normal, std | 1.94e+03 · 2.28e+02 · 1.22e+02 · 4.43e+01 · 1.85e+01 · 7.30e+00 |
| Xavier | 2.31e+00 · 4.50e-01 · 4.26e-01 · 3.89e-01 · 4.39e-01 · 4.73e-01 |
השורה הראשונה היא הרשת שלמעלה, והיא לא לומדת לאט — לא נשאר לה שום סיגנל. עד שכבה ארבע סטיית התקן של האקטיבציות ירדה לאפס בארבע ספרות אחרי הנקודה. כל קלט מייצר אותו פלט, הפלט הוא קבוע, והגרדיאנט של קבוע הוא כלום. המשקלים אותחלו קטנים ״כדי להיות בטוחים״, והקטן היה קטלני.
השורה השנייה היא הכשל ההפוך, ושווה להבין אותה כי היא לא אינטואיטיבית. האקטיבציות נראות בריאות — סביב 0.96 — אבל זה רווי, מוצמד קרוב לגבול שלו, בדיוק המשטר שפרק 5 מדד כמאבד פקטור של כמעט עשרת אלפים בגרדיאנט. ועדיין הגרדיאנטים עצומים: 1940 בשכבה הראשונה. שני הדברים נכונים באותו זמן. כל צעד אחורה מכפיל ב-, ועם 128 קלטים בשונות יחידה לפקטור הזה יש הגבר של בערך , שמכריע את ההתכווצות מה- הרווי. הגרדיאנטים גדלים גאומטרית בדרך חזרה. זהו גרדיאנט מתפוצץ, והוא מייצר ערכי loss של nan בתוך כמה צעדים בכל ריצת אימון אמיתית.
השורה השלישית היא מה שאתם רוצים: אקטיבציות בערך באותו קנה מידה לאורך העומק, גרדיאנטים בערך באותו קנה מידה לאורך העומק. שום דבר לא מת, שום דבר לא מתפוצץ.
נרמול, ומי שרד
קישור למקטע: נרמול, ומי שרדאתחול טוב מתקן את קנה המידה בצעד אפס. הוא לא שומר עליו קבוע: המשקלים זזים, ועד צעד חמשת אלפים טיעון השונות הזהיר כבר לא חל.
שכבות נרמול אוכפות את קנה המידה ברציפות. בהינתן וקטור של אקטיבציות, מחסירים ממוצע, מחלקים בסטיית תקן, ואז מפעילים קנה מידה נלמד והזחה כדי שהשכבה תוכל לבטל את הנרמול אם יתברר שזה מה שהיא רוצה:
השאלה האמיתית היחידה היא על מה עושים ממוצע. Batch normalization3 לוקח ו- לאורך ממד ה-batch, סטטיסטיקה אחת לכל feature. Layer normalization4 לוקח אותם לאורך ה-features, סטטיסטיקה אחת לכל דוגמה.
הבחירה הזו נראית קטנה וקובעת כמעט כל מה שבא אחר כך:
BatchNorm גורם לפלט של כל דוגמה להיות תלוי בדוגמאות האחרות שבמקרה היו ב-batch שלה. בזמן אימון זה רגולרייזר מתון. בזמן inference אין batch, לכן הוא צריך לשמור ממוצע רץ של הסטטיסטיקות שנאספו בזמן האימון — כלומר השכבה מתנהגת אחרת במצב אימון ובמצב הערכה, ולשכוח להחליף מצבים הוא אחד הבאגים הנפוצים ביותר בתחום. הוא גם מדרדר עם batches קטנים, ומסורבל עם רצפים באורך משתנה, כי ״הממוצע על ה-batch במיקום 40״ מחושב מכמה רצפים שבמקרה ארוכים עד שם.
LayerNorm מנרמל כל דוגמה בפני עצמה. אין תלות ב-batch, אין סטטיסטיקות רצות, התנהגות זהה באימון וב-inference, אדיש לגודל batch, אדיש לאורך רצף. כל אחת מהתכונות האלה היא דרישה ולא מותרות ברגע שמייצרים token אחד בכל פעם למשתמש אחד, וזה המקום שאליו פרק 13 מגיע.
לכן LayerNorm הוא זה שתפגשו שוב בפרק 9 בלי שינוי: בלוק ה-transformer משתמש בו, והוא משתמש בו בגלל הסיבות בעמודה הימנית, לא כי הוא עובד טוב יותר באופן מופשט.
לתקן דבר אחד בכל פעם, שזו ה-skill האמיתית
קישור למקטע: לתקן דבר אחד בכל פעם, שזו ה-skill האמיתיתארבעה תיקונים אפשריים לרשת המתה: אתחול Xavier, LayerNorm, חיבורים שיוריים, ו-Adam במקום SGD. הפיתוי הוא להחיל את ארבעתם ולהמשיך הלאה. עשו את זה ולעולם לא תדעו מי מהם היה חשוב, ובפעם הבאה שזה יקרה לא תהיה לכם שיטה — רק טקס.
אז מחילים אותם אחד בכל פעם. אותו seed, אותו data, אותה ארכיטקטורה, 800 צעדים:
| מה נוסף | loss סופי | דיוק |
|---|---|---|
| כלום | 0.6931 | 50.0 % |
| אתחול Xavier | 0.5692 | 60.4 % |
| LayerNorm | 0.6230 | 61.5 % |
| חיבורים שיוריים | 0.6651 | 56.6 % |
| Adam | 0.6787 | 58.7 % |
| כל הארבעה | 0.0000 | 100.0 % |
קראו את הטבלה הזו כמו שהייתם קוראים אותה ב-2 בלילה והמסקנה היא: שום דבר לא עובד לבד, הכול עובד יחד, ולכן deep learning היא אלכימיה. המסקנה הזו שגויה, ולגלות למה זה הדבר הכי שימושי בפרק הזה.
תנו לכל ריצה פי שישה תקציב — 5000 צעדים במקום 800 — והיא משתנה לחלוטין:
| מה נוסף | loss סופי @ 5000 | דיוק |
|---|---|---|
| כלום | 0.6931 | 50.0 % |
| אתחול Xavier | 0.0007 | 100.0 % |
| LayerNorm | 0.0002 | 100.0 % |
| חיבורים שיוריים | 0.6653 | 56.7 % |
| Adam | 0.6908 | 53.4 % |
| Xavier + Adam | 0.0000 | 100.0 % |
| Xavier + LayerNorm | 0.0001 | 100.0 % |
עכשיו התמונה חדה, וזו אבחנה ולא טקס.
אתחול לבדו מתקן את זה. נרמול לבדו מתקן את זה. כל אחד מהם מטפל במחלה האמיתית — קריסת הסיגנל הקדמי לאפס — וכל אחד מספיק. ב-800 צעדים הם רק נראו כמו קרדיט חלקי, כי הם פתרו את הבעיה ועדיין טיפסו החוצה.
חיבורים שיוריים ו-Adam לא מתקנים את זה, בשום תקציב. לא כי הם רעים, אלא כי הם מטפלים במחלה אחרת. חיבור שיורי נותן לגרדיאנט נתיב סביב שכבה חוסמת; זה שווה הרבה כשהגרדיאנט הוא הבעיה, ולא שווה כלום כשהסיגנל הקדמי כבר אפס, כי קיצור דרך סביב שכבה מתה עדיין נושא ערך מת. Adam משנה את קנה המידה של הצעד של כל פרמטר לפי היסטוריית הגרדיאנטים שלו; זה עוזר כשיש לגרדיאנטים גדלים שונים מאוד, ולא יכול להחיות רשת שהפלט שלה לא תלוי בקלט.
ו״כלום״ עדיין בדיוק 0.6931 אחרי חמשת אלפים צעדים. לא 0.6929. זה לא איטי; זה מת, וההבחנה הזו נראית עכשיו באופן שלא נראתה קודם, כי יש לכם שורה שאומרת שתיקון עובד להשוואה.
להרוויח את PyTorch
קישור למקטע: להרוויח את PyTorchמכאן ואילך הקורס הזה משתמש ב-PyTorch. צריך להרוויח את זה ולא רק להכריז על זה, אז הנה בדיוק מה הוא עושה שכבר יודעים לעשות.
אופטימייזר הוא כלל להפיכת גרדיאנטים לעדכוני פרמטרים. gradient descent פשוט משתמש בגרדיאנט. Momentum משתמש בממוצע רץ שלו, שמחליק את הרעש ובונה מהירות בכיוונים שנשארים עקביים:
v = beta * v + p.grad
p -= lr * v Adam5 שומר שני ממוצעים רצים — של הגרדיאנט ושל הגרדיאנט בריבוע — ומחלק אחד בשורש הריבועי של השני, כך שכל פרמטר מקבל צעד בקנה מידה שמתאים לגודל הגרדיאנט האחרון שלו:
m = b1 * m + (1 - b1) * g # mean of the gradient
v = b2 * v + (1 - b2) * g * g # mean of the squared gradient
m_hat = m / (1 - b1 ** t) # bias correction: both averages start at zero
v_hat = v / (1 - b2 ** t)
p -= lr * m_hat / (v_hat.sqrt() + eps) עשר שורות. הריצו את שניהם מול torch.optim על אותה בעיה במשך 50 צעדים:
SGD+momentum by hand [2.7781870365142822, -1.0304985046386719]
torch [2.7781870365142822, -1.0304983854293823] max |diff| = 1.19e-07
Adam by hand [0.4893140196800232, -0.46317872405052185]
torch [0.48931416869163513, -0.46317875385284424] max |diff| = 1.49e-07זהה עד דיוק float32. torch.optim.Adam הוא חמש השורות האלה, בתוספת עשרות שנים של טיפול במקרי קצה ו-kernel ב-C++. זו העסקה שאתם עושים מכאן ואילך: לא קסם תמורת הבנה, אלא מהירות תמורת שורות שכבר כתבתם.
למה Adam קיים: עקמומיות
קישור למקטע: למה Adam קיים: עקמומיותההסבר הרגיל ל-Adam הוא ״learning rates אדפטיביים לכל פרמטר״, שזה תיאור ולא סיבה. הסיבה היא גאומטריה, ואפשר למדוד אותה.
קחו loss שהעקמומיות שלו שונה בין כיוונים: תלולה באחד, רדודה באחר. ל-SGD יש learning rate גלובלי אחד, ולכן הוא חייב לבחור ערך קטן מספיק כדי להיות יציב בכיוון התלול ביותר — והערך הזה אז קטן מדי בהרבה לכיוון הרדוד, שבו ההתקדמות זוחלת. זה מה שיוצר את התמונה הקלאסית של gradient descent המזגזג במורד עמק צר.
שני יחסי עקמומיות, שלושה אופטימייזרים, 300 צעדים, וכל אופטימייזר מקבל את ה-learning rate הטוב ביותר מסריקה כדי שאף אחד לא יתחיל בנחיתות:
| יחס עקמומיות | SGD | SGD + momentum | Adam |
|---|---|---|---|
| 10 : 1 | error 0.000002 | error 0.000000 | error 0.000000 |
| 1000 : 1 | error 1.925485 | error 0.001432 | error 0.000000 |
| התבדר ב-(1000:1) | 4 מתוך 8 rates | 4 מתוך 8 rates | 0 מתוך 6 rates |
ביחס של עשר, הכול עובד ואין על מה לדבר. באלף, SGD פשוט לא מצליח להגיע לתשובה באף learning rate שנוסה — התוצאה הטובה ביותר שלו היא עדיין error של 1.93 — והוא ממש מתבדר במחצית מה-rates. Adam נוחת בדיוק על היעד ולא מתבדר באף אחד מהם.
העמודה האחרונה הזו היא הסיבה המעשית ש-Adam הוא ברירת המחדל. זה לא ש-Adam מוצא פתרונות טובים יותר; בבעיות ממוזגות היטב SGD מכוונן לעיתים קרובות משתווה אליו או מנצח אותו. זה ש-Adam הרבה פחות רגיש ל-learning rate שבחרתם, ולרשתות אמיתיות יש יחסי עקמומיות גרועים בהרבה מאלף על פני מיליוני הפרמטרים שלהן.
שני חלקים נוספים שייכים לכאן ושניהם שורה אחת. Gradient clipping משנה את קנה המידה של וקטור הגרדיאנט בכל פעם שהנורמה שלו עוברת סף, מה שהופך את שורת ״loss פתאום קופץ לערך עצום״ בטבלת האבחון ללא-אירוע. ו-learning rate schedules: warmup קצר מכמעט אפס לאורך מאות הצעדים הראשונים, כי אומדני השונות של Adam הם זבל עד שהם ראו כמה גרדיאנטים וצעד בגודל מלא על זבל יכול להרוס את האתחול; ואז cosine decay לכיוון אפס, כי לסיים ריצה עם אותו גודל צעד שהתחלתם איתו פירושו לרעוד סביב המינימום במקום להתייצב בו.
החצי השני: המודל שמתאים באופן מושלם ולא מנבא כלום
קישור למקטע: החצי השני: המודל שמתאים באופן מושלם ולא מנבא כלוםכל מה שהיה עד עכשיו עסק בלהוריד את ה-loss. עכשיו החצי הקשה יותר, כי ירידת ה-loss אינה המטרה — היא proxy למטרה, וה-proxy נכשל בצורה ספציפית ומפורסמת.
שתים-עשרה נקודות מפונקציה חלקה עם מעט רעש. התאימו פולינומים בדרגה הולכת וגדלה:
| דרגה | train RMSE | test RMSE |
|---|---|---|
| 1 | 0.764499 | 0.6985 |
| 3 | 0.252605 | 0.3031 |
| 5 | 0.164437 | 0.1568 |
| 9 | 0.088960 | 0.2347 |
| 11 | 0.000000 | 1.2094 |
דרגה 11 דרך 12 נקודות עוברת דרך כל אחת ואחת בדיוק — train error אפס עד שש ספרות אחרי הנקודה — והיא גרועה פי שמונה מדרגה 5 על data שלא ראתה. בקשו מדרגה 3 ומדרגה 11 לחזות ב-, ממש מחוץ לטווח האימון:
degree 3: predicts -1.053 (truth -0.012)
degree 11: predicts +61.224 (truth -0.012)שישים ואחת, כשהתשובה היא בערך אפס. המודל לא למד את הפונקציה; הוא למד את שתים-עשרה הנקודות, וביניהן הוא עושה מה שהחשבון דורש.
זהו overfitting, וההפך שלו — דרגה 1, שלא יכולה לייצג את העקומה בכלל וגרועה בכל מקום — הוא underfitting. החשבון הקלאסי מחלק את השגיאה הצפויה של מודל לשלושה חלקים: bias, השגיאה מכך שהמודל קשיח מדי לייצג את האמת; variance, השגיאה מכך שהמודל גמיש עד כדי כך שהוא רודף אחרי הרעש בדגימה הספציפית הזו; ורעש בלתי ניתן לצמצום, ששום דבר לא מתקן. מודלים פשוטים הם biased, מודלים גמישים הם בעלי variance גבוה, והמרשם הקלאסי הוא למצוא את הנקודה המתוקה באמצע — דרגה 5 בטבלה שלמעלה.
הכלים הסטנדרטיים כולם תוקפים את איבר ה-variance:
- רגולריזציית L2 (weight decay) מוסיפה ל-loss, מושכת משקלים לכיוון אפס והופכת את הפונקציה לחלקה יותר. בטבלה שלמעלה, המקדם הגדול ביותר של דרגה 11 הוא שעושה את הנזק; ענישה על גודל מנטרלת אותו.
- L1 מוסיפה במקום זאת . ההבדל אינו קוסמטי: הגרדיאנט של L2 פרופורציונלי למשקל ולכן קטן כשהמשקל קטן, מתקרב לאפס בלי להגיע, בעוד שהגרדיאנט של L1 הוא קבוע שממשיך לדחוף עד הסוף. לכן L1 מייצרת משקלים שהם בדיוק אפס — היא בוחרת features. L2 מייצרת משקלים קטנים. השתמשו ב-L2 כשאתם רוצים חלקות, ב-L1 כשאתם רוצים דלילות.
- Dropout7 מאפס תת-קבוצה אקראית של אקטיבציות בכל צעד אימון, כך שאף יחידה לא יכולה להסתמך על כך שיחידה מסוימת אחרת תהיה נוכחת.
- Early stopping עוקב אחרי ה-validation loss ועוצר כשהוא מתחיל לעלות.
- Data augmentation מייצר עוד דוגמאות אימון מאלה שיש לכם, מה שתוקף את הבעיה במקור: overfitting הוא מחסור ב-data לא פחות משהוא עודף פרמטרים.
- Cross-validation מחלק את ה-data ב- דרכים ומאמן פעמים, מה שקונה אומדן אמין של test error כשיש לכם מעט מדי data מכדי להפריש סט מוחזק בצד.
Double descent, או למה הסעיף הקודם אינו כל הסיפור
קישור למקטע: Double descent, או למה הסעיף הקודם אינו כל הסיפורעכשיו העובדה ששוברת את התמונה.
סיפור ה-bias-variance אומר שאחרי הנקודה המתוקה, יותר פרמטרים פירושם generalisation גרוע יותר. למודלי שפה מודרניים יש הרבה יותר פרמטרים ממה שהכללים הקלאסיים מאפשרים ביחס ל-data שהם רואים, והם מכלילים מצוין. שני המשפטים האלה נכונים, וליישב ביניהם הוא הדבר הכי שימושי בפרק הזה.
ארבעים נקודות אימון, קלטים בעשרים ממדים, features אקראיים של ReLU, ומספר ה-features נסרק מ-2 עד 5000 — עם פתרון minimum-norm שנבחר בכל פעם שיש רבים שמתאימים:
| train RMSE | test RMSE | |||
|---|---|---|---|---|
| 10 | 0.25 | 0.8822 | 1.2520 | 1.89 |
| 20 | 0.50 | 0.5962 | 1.1634 | 2.59 |
| 30 | 0.75 | 0.3896 | 1.5323 | 4.15 |
| 38 | 0.95 | 0.1769 | 3.7163 | 10.25 |
| 40 | 1.00 | 0.0000 | 5.8140 | 14.83 |
| 42 | 1.05 | 0.0000 | 3.1623 | 9.35 |
| 60 | 1.50 | 0.0000 | 1.1058 | 2.78 |
| 200 | 5.00 | 0.0000 | 0.6638 | 0.98 |
| 1500 | 37.50 | 0.0000 | 0.5859 | 0.33 |
| 5000 | 125.00 | 0.0000 | 0.5664 | 0.18 |
קראו אותה בשלושה חלקים. עד הסיפור הקלאסי מחזיק בדיוק: השגיאה יורדת, ואז מתחילה לעלות. ב- — סף האינטרפולציה, שבו למודל יש בדיוק מספיק פרמטרים כדי לעבור דרך כל נקודת אימון — ה-test error מגיע לשיא, ב-5.81, גרוע פי חמישה מהמודל הקטן. השיא הזה הוא האזהרה הקלאסית, והוא אמיתי.
ואז הוא יורד שוב. והוא ממשיך לרדת, אחרי , אחרי , כל הדרך עד , שם ה-test error של 0.5664 טוב יותר מהמודל הטוב ביותר עם פחות מדי פרמטרים שהושג אי פעם. מודל עם 5000 פרמטרים שמותאם ל-40 נקודות הוא המודל הטוב ביותר בטבלה.
זהו double descent,89 והמנגנון נראה בעמודה האחרונה. ברגע ש- יש אינסוף הגדרות פרמטרים שמתאימות בדיוק ל-data האימון, ואיזו מהן תקבלו תלוי באופן הבחירה שלכם. פתרון ה-minimum-norm בוחר את הקטן ביותר, ו- מראה מה זה אומר: הוא מגיע לשיא ב-14.83 בדיוק בסף — שם יש בדיוק פתרון אינטרפולציה אחד ואתם תקועים איתו, קיצוני ככל שיהיה — ואז יורד מונוטונית ככל ש- גדל, כי יותר פרמטרים פירושם יותר פתרונות אינטרפולציה לבחור מתוכם, מה שאומר שהקטן ביותר הזמין נהיה קטן יותר. ב- הנורמה היא 0.18, קטנה פי שמונים מאשר בסף.
אז הפרמטרים הנוספים לא מוסיפים מורכבות. הם מוסיפים בחירה, וכלל הבחירה מוציא את הבחירה הזו על פשטות. הרגולריזציה אינה בפונקציית ה-loss; היא באלגוריתם. gradient descent מאתחול קטן הוא בעל נטייה מתועדת לפתרונות בעלי נורמה קטנה, ולכן ההתנהגות הזו מופיעה ברשתות אמיתיות שמאומנות בדרך הרגילה ולא רק באלגברה הלינארית שלמעלה.
התוצאה המעשית, שפרק 10 תלוי בה: ״למודל יש יותר פרמטרים מ-data, אז הוא יעשה overfit״ אינו טיעון תקף. זה היה כלל טוב כשמודלים חיו משמאל לסף. כל מה שמעניין עכשיו חי הרבה מימינו, שם הכלל מתהפך.
לאן זה הולך הלאה
קישור למקטע: לאן זה הולך הלאההכלים בפרק הזה מספיקים כדי לאמן רשת שעובדת על data שאפשר לשים בטבלה: שורות של מספרים, עמודת labels.
שפה היא לא זה. לפני שמודל יכול לחזות את המילה הבאה, משהו צריך להחליט מהי בכלל ״מילה״ — והתשובה אינה אותיות ואינה מילים, אלא אוצר מילים שהמודל לומד מהבתים הגולמיים של data האימון. ההחלטה הזו, שמתקבלת פעם אחת לפני שהאימון מתחיל, קובעת כמה דברים המודל יכול לומר, כמה בקשה עולה, ולמה מודלים שיכולים לעבור מבחן במשפטים לא יכולים לספור באופן אמין את האותיות ב-strawberry.
פרק 7 בונה tokenizer.
מקורות ושיטה
קישור למקטע: מקורות ושיטהעבור החיבורים השיוריים ששימשו למעלה, He ואחרים, Deep Residual Learning for Image Recognition (arXiv:1512.03385). Building makemore Part 3: Activations & Gradients, BatchNorm של Andrej Karpathy עובר דרך אבחון היסטוגרמת האקטיבציות במודל אמיתי והוא הטיפול המעשי הטוב ביותר בחצי הראשון של הפרק הזה. הרצאות 8 ו-11–13 של Yaser Abu-Mostafa ב-Learning From Data נותנות את תאוריית ה-generalisation הקלאסית כמו שצריך, כולל החלקים שהפרק הזה דחס לפסקה.
הפניות
קישור למקטע: הפניות-
Glorot, X. and Bengio, Y. Understanding the difficulty of training deep feedforward neural networks. AISTATS (2010). טיעון שימור השונות משוחזר בתיבה שלמעלה. ↩
-
He, K., Zhang, X., Ren, S. and Sun, J. Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification. arXiv:1502.01852 (2015). ↩
-
Ioffe, S. and Szegedy, C. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. arXiv:1502.03167 (2015). שימו לב שהסבר ה-״internal covariate shift״ שבכותרת שנוי מאז במחלוקת משמעותית; השכבה עובדת, ההסבר המקורי ללמה — שנוי במחלוקת. ↩
-
Ba, J. L., Kiros, J. R. and Hinton, G. E. Layer Normalization. arXiv:1607.06450 (2016). ↩
-
Kingma, D. P. and Ba, J. Adam: A Method for Stochastic Optimization. arXiv:1412.6980 (2014). ↩
-
Loshchilov, I. and Hutter, F. Decoupled Weight Decay Regularization. arXiv:1711.05101 (2017). ↩
-
Srivastava, N., Hinton, G., Krizhevsky, A., Sutskever, I. and Salakhutdinov, R. Dropout: A Simple Way to Prevent Neural Networks from Overfitting. JMLR 15, pp. 1929–1958 (2014). ↩
-
Belkin, M., Hsu, D., Ma, S. and Mandal, S. Reconciling modern machine-learning practice and the classical bias–variance trade-off. PNAS 116(32), pp. 15849–15854 (2019). המאמר שנתן לתופעה את שמה. ↩
-
Nakkiran, P., Kaplun, G., Bansal, Y., Yang, T., Barak, B. and Sutskever, I. Deep Double Descent: Where Bigger Models and More Data Hurt. arXiv:1912.02292 (2019). מציג את האפקט ברשתות עמוקות אמיתיות, וגם לאורך ציר זמן האימון ולא רק לאורך ציר גודל המודל. ↩