דוד משיח

רשימה · למידת מכונה · שרשרת אספקה

המודל שלי קיבל ציון מושלם וזו הייתה הבעיה

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

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

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

זה קרה ב־20 מתוך 30 מבחנים.

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

המערך

אתם לא צריכים מדעי החומרים בשביל החלק הזה.

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

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

זהו תחום גדול עם הרבה מאמרים, והם מדווחים על דיוק מצוין. גם אני קיבלתי דיוק מצוין.

השאלה

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

אבל גם אותם 200 הם חורים עגולים. אותו מחולל. הם פשוט לא שימשו באימון.

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

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

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

החלק שכמעט טעיתי בו

הגרסה הראשונה שלי לניסוי הזה הייתה חסרת ערך, ולקח לי יומיים לשים לב.

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

שש המשפחות שלי, כשנוצרו בדרך המתבקשת, ישבו בצפיפויות שונות. אז כשמודל שאומן על עיגולים התמוטט על חלות דבש, לא למדתי דבר. חלות הדבש היו פשוט צפופות יותר מכל מה שראה. זה לא המודל שנכשל להבין צורה. זה כמו לבקש ממי שראה רק מחירים בין 10 ל־20 לתמחר משהו ב־50.

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

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

הבקרה הזו היא התרומה האמיתית כאן. התוצאה היא רק מה שנפל ממנה.

מה שקרה

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

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

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

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

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

לכישלון יש צורה

אילו התשובה הייתה רק «המודלים האלה לא מכלילים», זו הייתה משיכת כתף. מה שהופך את זה לשווה את זמנכם הוא שההתמוטטות עוקבת אחר תבנית שכמעט אפשר לראות.

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

מעיגולים לצלבים: אסון. ממרובעים לצלבים: אסון. מכל דבר לצלבים: אסון.

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

וזה משנה את השאלה המעשית. היא אינה «האם המודל שלי יכליל», שאין לה תשובה שימושית. היא כמה רחוק המקרה החדש יושב ממה שאומנתם עליו, ומה «רחוק» בכלל אומר כאן. אני רואה את התבנית בתוצאות שלי ואינני יכול למדוד אותה. נראה שגם לאף אחד אחר אין דרך למדוד אותה, ככל שמצאתי. הפער הזה מעניין אותי יותר מהכישלון.

למה שתאמינו לכל זה

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

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

ואז יש את המבחן שבאמת נהניתי ממנו.

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

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

הפיזיקה הייתה בצורה כל הזמן. התוכנה רק עשתה חשבון והמוזרות נפלה החוצה.

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

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

מה זה לא מוכיח

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

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

החלק שאינו על מתכת

הוציאו את ההנדסה, וזוהי אמירה על איך כמעט כל למידת מכונה מתוקפת.

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

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

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

אם יש לכם מודל בפרודקשן, השאלה אינה מה הוא הבקיע. היא מה השתנה בין הנתונים שעליהם נבדק לנתונים שהוא רואה עכשיו, והאם מישהו בדק.

הכול פתוח — סימולטור, מבחני ולידציה, מאגר נתונים, הרשת מאפס: https://doi.org/10.6084/m9.figshare.32993597