דלג לתוכן
6/30פרק 6 מתוך 30

לגרום לה להתאמן, ולגרום לה להכליל

רשת בת שש שכבות שה-loss שלה לא זז מ-ln 2, מתוקנת מדידה אחר מדידה. ואז double descent: 5,000 פרמטרים על 40 נקודות.

בעמוד הזה

הרשת מפרק 5 עובדת. יש לה תשעה פרמטרים, היא לומדת XOR, והגרדיאנטים שלה תואמים ל-PyTorch עד שש-עשרה ספרות אחרי הנקודה.

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

TEXT
step    1: loss 0.693147
step 5000: loss 0.693147
accuracy: 50.0 %

המספר הזה לא שרירותי. ln2=0.693147\ln 2 = 0.693147 הוא ה-binary cross-entropy של מודל שמוציא הסתברות 0.50.5 לכל דבר, ו-50 % היא הטלת מטבע על dataset מאוזן. אחרי חמשת אלפים צעדים הרשת לא הזיזה אפילו ספרה אחת. שום דבר לא קרס, שום אזהרה לא הופיעה, והגרדיאנטים עדיין נכונים בדיוק.

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

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

profile.pyPYTHON
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}")

שלושה אתחולים, אותה ארכיטקטורה, שש שכבות של tanh\tanh:

אתחולסטיית תקן של אקטיבציות, שכבות 1→6
normal, std 0.010.010.0145 · 0.0016 · 0.0002 · 0.0000 · 0.0000 · 0.0000
normal, std 110.6573 · 0.9296 · 0.9585 · 0.9634 · 0.9637 · 0.9625
Xavier0.1579 · 0.1493 · 0.1353 · 0.1333 · 0.1325 · 0.1403
אתחולסטיית תקן של גרדיאנטים, שכבה ראשונה → אחרונה
normal, std 0.010.013.20e-06 · 4.97e-07 · … · 6.40e-06
normal, std 111.94e+03 · 2.28e+02 · 1.22e+02 · 4.43e+01 · 1.85e+01 · 7.30e+00
Xavier2.31e+00 · 4.50e-01 · 4.26e-01 · 3.89e-01 · 4.39e-01 · 4.73e-01

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

השורה השנייה היא הכשל ההפוך, ושווה להבין אותה כי היא לא אינטואיטיבית. האקטיבציות נראות בריאות — סביב 0.96 — אבל זה tanh\tanh רווי, מוצמד קרוב לגבול שלו, בדיוק המשטר שפרק 5 מדד כמאבד פקטור של כמעט עשרת אלפים בגרדיאנט. ועדיין הגרדיאנטים עצומים: 1940 בשכבה הראשונה. שני הדברים נכונים באותו זמן. כל צעד אחורה מכפיל ב-WW^\top, ועם 128 קלטים בשונות יחידה לפקטור הזה יש הגבר של בערך 12811\sqrt{128} \approx 11, שמכריע את ההתכווצות מה-tanh\tanh הרווי. הגרדיאנטים גדלים גאומטרית בדרך חזרה. זהו גרדיאנט מתפוצץ, והוא מייצר ערכי loss של nan בתוך כמה צעדים בכל ריצת אימון אמיתית.

השורה השלישית היא מה שאתם רוצים: אקטיבציות בערך באותו קנה מידה לאורך העומק, גרדיאנטים בערך באותו קנה מידה לאורך העומק. שום דבר לא מת, שום דבר לא מתפוצץ.

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

שכבות נרמול אוכפות את קנה המידה ברציפות. בהינתן וקטור של אקטיבציות, מחסירים ממוצע, מחלקים בסטיית תקן, ואז מפעילים קנה מידה נלמד γ\gamma והזחה β\beta כדי שהשכבה תוכל לבטל את הנרמול אם יתברר שזה מה שהיא רוצה:

h^=hμσ2+ϵ,y=γh^+β\hat{h} = \frac{h - \mu}{\sqrt{\sigma^2 + \epsilon}}, \qquad y = \gamma\hat{h} + \beta

השאלה האמיתית היחידה היא על מה עושים ממוצע. Batch normalization3 לוקח μ\mu ו-σ\sigma לאורך ממד ה-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.693150.0 %
אתחול Xavier0.569260.4 %
LayerNorm0.623061.5 %
חיבורים שיוריים0.665156.6 %
Adam0.678758.7 %
כל הארבעה0.0000100.0 %

קראו את הטבלה הזו כמו שהייתם קוראים אותה ב-2 בלילה והמסקנה היא: שום דבר לא עובד לבד, הכול עובד יחד, ולכן deep learning היא אלכימיה. המסקנה הזו שגויה, ולגלות למה זה הדבר הכי שימושי בפרק הזה.

תנו לכל ריצה פי שישה תקציב — 5000 צעדים במקום 800 — והיא משתנה לחלוטין:

מה נוסףloss סופי @ 5000דיוק
כלום0.693150.0 %
אתחול Xavier0.0007100.0 %
LayerNorm0.0002100.0 %
חיבורים שיוריים0.665356.7 %
Adam0.690853.4 %
Xavier + Adam0.0000100.0 %
Xavier + LayerNorm0.0001100.0 %

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

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

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

ו״כלום״ עדיין בדיוק 0.6931 אחרי חמשת אלפים צעדים. לא 0.6929. זה לא איטי; זה מת, וההבחנה הזו נראית עכשיו באופן שלא נראתה קודם, כי יש לכם שורה שאומרת שתיקון עובד להשוואה.

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

אופטימייזר הוא כלל להפיכת גרדיאנטים לעדכוני פרמטרים. gradient descent פשוט משתמש בגרדיאנט. Momentum משתמש בממוצע רץ שלו, שמחליק את הרעש ובונה מהירות בכיוונים שנשארים עקביים:

optim_by_hand.pyPYTHON
v = beta * v + p.grad          
p -= lr * v                    

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

optim_by_hand.pyPYTHON
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 צעדים:

TEXT
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 הוא ״learning rates אדפטיביים לכל פרמטר״, שזה תיאור ולא סיבה. הסיבה היא גאומטריה, ואפשר למדוד אותה.

קחו loss שהעקמומיות שלו שונה בין כיוונים: תלולה באחד, רדודה באחר. ל-SGD יש learning rate גלובלי אחד, ולכן הוא חייב לבחור ערך קטן מספיק כדי להיות יציב בכיוון התלול ביותר — והערך הזה אז קטן מדי בהרבה לכיוון הרדוד, שבו ההתקדמות זוחלת. זה מה שיוצר את התמונה הקלאסית של gradient descent המזגזג במורד עמק צר.

שני יחסי עקמומיות, שלושה אופטימייזרים, 300 צעדים, וכל אופטימייזר מקבל את ה-learning rate הטוב ביותר מסריקה כדי שאף אחד לא יתחיל בנחיתות:

יחס עקמומיותSGDSGD + momentumAdam
10 : 1error 0.000002error 0.000000error 0.000000
1000 : 1error 1.925485error 0.001432error 0.000000
התבדר ב-(1000:1)4 מתוך 8 rates4 מתוך 8 rates0 מתוך 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 RMSEtest RMSE
10.7644990.6985
30.2526050.3031
50.1644370.1568
90.0889600.2347
110.0000001.2094

דרגה 11 דרך 12 נקודות עוברת דרך כל אחת ואחת בדיוק — train error אפס עד שש ספרות אחרי הנקודה — והיא גרועה פי שמונה מדרגה 5 על data שלא ראתה. בקשו מדרגה 3 ומדרגה 11 לחזות ב-x=3.25x = 3.25, ממש מחוץ לטווח האימון:

TEXT
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) מוסיפה λw2\lambda \lVert w \rVert^2 ל-loss, מושכת משקלים לכיוון אפס והופכת את הפונקציה לחלקה יותר. בטבלה שלמעלה, המקדם הגדול ביותר של דרגה 11 הוא שעושה את הנזק; ענישה על גודל מנטרלת אותו.
  • L1 מוסיפה במקום זאת λwi\lambda \sum |w_i|. ההבדל אינו קוסמטי: הגרדיאנט של L2 פרופורציונלי למשקל ולכן קטן כשהמשקל קטן, מתקרב לאפס בלי להגיע, בעוד שהגרדיאנט של L1 הוא קבוע ±λ\pm\lambda שממשיך לדחוף עד הסוף. לכן L1 מייצרת משקלים שהם בדיוק אפס — היא בוחרת features. L2 מייצרת משקלים קטנים. השתמשו ב-L2 כשאתם רוצים חלקות, ב-L1 כשאתם רוצים דלילות.
  • Dropout7 מאפס תת-קבוצה אקראית של אקטיבציות בכל צעד אימון, כך שאף יחידה לא יכולה להסתמך על כך שיחידה מסוימת אחרת תהיה נוכחת.
  • Early stopping עוקב אחרי ה-validation loss ועוצר כשהוא מתחיל לעלות.
  • Data augmentation מייצר עוד דוגמאות אימון מאלה שיש לכם, מה שתוקף את הבעיה במקור: overfitting הוא מחסור ב-data לא פחות משהוא עודף פרמטרים.
  • Cross-validation מחלק את ה-data ב-kk דרכים ומאמן kk פעמים, מה שקונה אומדן אמין של test error כשיש לכם מעט מדי data מכדי להפריש סט מוחזק בצד.

Double descent, או למה הסעיף הקודם אינו כל הסיפור

קישור למקטע: Double descent, או למה הסעיף הקודם אינו כל הסיפור

עכשיו העובדה ששוברת את התמונה.

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

ארבעים נקודות אימון, קלטים בעשרים ממדים, features אקראיים של ReLU, ומספר ה-features PP נסרק מ-2 עד 5000 — עם פתרון minimum-norm שנבחר בכל פעם שיש רבים שמתאימים:

PPP/nP/ntrain RMSEtest RMSEw\lVert w \rVert
100.250.88221.25201.89
200.500.59621.16342.59
300.750.38961.53234.15
380.950.17693.716310.25
401.000.00005.814014.83
421.050.00003.16239.35
601.500.00001.10582.78
2005.000.00000.66380.98
150037.500.00000.58590.33
5000125.000.00000.56640.18

קראו אותה בשלושה חלקים. עד P/n=0.5P/n = 0.5 הסיפור הקלאסי מחזיק בדיוק: השגיאה יורדת, ואז מתחילה לעלות. ב-P=n=40P = n = 40סף האינטרפולציה, שבו למודל יש בדיוק מספיק פרמטרים כדי לעבור דרך כל נקודת אימון — ה-test error מגיע לשיא, ב-5.81, גרוע פי חמישה מהמודל הקטן. השיא הזה הוא האזהרה הקלאסית, והוא אמיתי.

ואז הוא יורד שוב. והוא ממשיך לרדת, אחרי P=5nP = 5n, אחרי P=37nP = 37n, כל הדרך עד P=125nP = 125n, שם ה-test error של 0.5664 טוב יותר מהמודל הטוב ביותר עם פחות מדי פרמטרים שהושג אי פעם. מודל עם 5000 פרמטרים שמותאם ל-40 נקודות הוא המודל הטוב ביותר בטבלה.

זהו double descent,89 והמנגנון נראה בעמודה האחרונה. ברגע ש-P>nP > n יש אינסוף הגדרות פרמטרים שמתאימות בדיוק ל-data האימון, ואיזו מהן תקבלו תלוי באופן הבחירה שלכם. פתרון ה-minimum-norm בוחר את הקטן ביותר, ו-w\lVert w \rVert מראה מה זה אומר: הוא מגיע לשיא ב-14.83 בדיוק בסף — שם יש בדיוק פתרון אינטרפולציה אחד ואתם תקועים איתו, קיצוני ככל שיהיה — ואז יורד מונוטונית ככל ש-PP גדל, כי יותר פרמטרים פירושם יותר פתרונות אינטרפולציה לבחור מתוכם, מה שאומר שהקטן ביותר הזמין נהיה קטן יותר. ב-P=5000P = 5000 הנורמה היא 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 הקלאסית כמו שצריך, כולל החלקים שהפרק הזה דחס לפסקה.

  1. Glorot, X. and Bengio, Y. Understanding the difficulty of training deep feedforward neural networks. AISTATS (2010). טיעון שימור השונות משוחזר בתיבה שלמעלה.

  2. He, K., Zhang, X., Ren, S. and Sun, J. Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification. arXiv:1502.01852 (2015).

  3. Ioffe, S. and Szegedy, C. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. arXiv:1502.03167 (2015). שימו לב שהסבר ה-״internal covariate shift״ שבכותרת שנוי מאז במחלוקת משמעותית; השכבה עובדת, ההסבר המקורי ללמה — שנוי במחלוקת.

  4. Ba, J. L., Kiros, J. R. and Hinton, G. E. Layer Normalization. arXiv:1607.06450 (2016).

  5. Kingma, D. P. and Ba, J. Adam: A Method for Stochastic Optimization. arXiv:1412.6980 (2014).

  6. Loshchilov, I. and Hutter, F. Decoupled Weight Decay Regularization. arXiv:1711.05101 (2017).

  7. 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).

  8. 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). המאמר שנתן לתופעה את שמה.

  9. 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). מציג את האפקט ברשתות עמוקות אמיתיות, וגם לאורך ציר זמן האימון ולא רק לאורך ציר גודל המודל.


נוצר על ידי

David Vicente Campos

מייסד NeuraLIA Labs ושותף-מייסד MyRealFood

אני מהנדס מחשבים, בוגר אוניברסיטת לאון. הייתי שותף בהקמת MyRealFood, שם, כסמנכ״ל טכנולוגיות, בניתי את האפליקציה שמיליוני אנשים השתמשו בה כדי לאכול בריא יותר, והקמתי את NeuraLIA Labs, שם אני בונה מוצרי בינה מלאכותית. כאן אני כותב על מה שהייתי צריך להבין לאורך הדרך, כפי שהייתי רוצה שמישהו היה מסביר לי בזמנו.

עוד על המחבר

פורסם על ידי NeuraLIA Labs.

פוסטים חדשים ישירות לתיבת הדואר

חדשות AI, מדריכים ועדכוני מוצר — מייל קצר כשאנחנו מפרסמים משהו ששווה את הזמן שלך.

תוכן הקורס

Abstract software decision engine with branching paths, probability nodes, and glowing gates.
jev10 דקות קריאה

מודל ה-AI Jev נבנה להחלטות, לא לפרוזה

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

Abstract agent runtime sorting documents, memory blocks and pointer nodes inside a bounded context frame.
context-engineering10 דקות קריאה

הנדסת הקשר לסוכני AI ארוכי־טווח

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

מוכנים לתת ל-LIA לבחור?

בנו עם כל מודלי ה-AI במקום אחד — התחילו בחינם עוד היום.