בואו נתכנת יחד רשת נוירונים! (חלק א')
לא יודעים לתכנת? נפלא! בואו תראו איך זה נראה.
יודעים לתכנת? נפלא יותר! יש גיט בסוף.
סליחה, בתור "אינפלואנסר AI" הנה הכותרת המתבקשת:
🤯🤯🤯 לא תאמינו כמה זה פשוט 🤯🤯🤯
אבל באמת.
בואו איתי 🧵>>
#פידטק#פידאטה#פידטכנולוגיה
1. נתחיל בבסיס.
אני יוצא מנק' הנחה שאנחנו יודעים, בגדול, איך רשת נוירונים עובדת.
אם לגמרי לא, אני ממליץ להתחיל מהשרשור הזה.
היום נאמן רשת נוירונים לקלסיפיקציה (סיווג) - ניסיון לחזות האם הלקוח יוצא מרוצה. >>
twitter.com/tsoofbaror/status/1564335495559221249
2. גילוי נאות: כתבתי את הרשת הזו לגמרי עם ChatGPT.
העניין כזה - זה לא תחליף.
הוא טעה המון, הייתי צריך לתקן אותו בקטנות, אבל הוא חסך לי מלא זמן של כתיבה סזיפית.
שימו ❤️!
אשתמש פה בהמון מושגים מהשרשור המצורף.
אם קראתם, פתאום תראו את הכל מתחבר >>
twitter.com/tsoofbaror/status/1664576595137527810
3 . כרגע אנחנו לוקחים כמובן מאליו שהדאטהסט שלנו מוכן ונקי לכניסה לרשת. בחלק ב' נדבר על איך מכינים דאטה לרשת נוירונים.
יפה.
אז מה התיוג?
היום נרצה לחזות את מידת שביעות הרצון של לקוחות חברת תעופה.
הבעיה היא בעיית סיווג בינארית - לקוח יכול להיות מרוצה או לא מרוצה. >>
4. מה המאפיינים?
גיל, מגדר, באיזה מחלקה טס ותשובות מספריות לכל מיני שלבים בתהליך.
נניח "כמה היית מרוצה ממיקום הגייט מ1 עד 5?".
יש לנו סה"כ 22 מאפיינים.
הפלט שלנו יהיה מספר בין 0 ל1.
אם הוא יהיה קרוב יותר ל0, נחליט שזה לקוח שיהיה לא מרוצה.
אם ל1 - לקוח מרוצה.
הבנו? הבנו. נמשיך >>
5. הנה הרשת.
גם אם אין לכם מושג בתכנות - תראו כמה מעט שורות. זה כל הקוד.
את הרשת בניתי בPytorch, ספרייה יעודית בפייתון.
מה רואים?
הגדרת "אובייקט" (class) בשם רשת נוירונים.
הכנסת שכבת כניסה,
שכבות חבויות בהתאם לקלט שהאובייקט מקבל.
ולבסוף שכבת יציאה.
הפונקציה השניה היא Forward >>
6. והיא פשוט העברה של הקלט בכל שכבות הרשת, עד התוצאה בלולאה.
בשלב הבא נחלק את הדאטה שלנו לסט אימון, אימות (ולידציה) ובחינה.
כאמור, "קופסא שחורה" לטובת השרשור הזה. חילקנו.
נמשיך בלהעביר את הדאטה לכרטיס המסך (GPU), שעליו רשת הנוירונים תתאמן.
סופר משמעותי למהירות האימון. >>
6. עכשיו - היפר פרמטרים!
גודל הקלט - ככמות העמודות בדאטה.
שכבות חבויות - החלטה שרירותית, אסביר בהמשך.
קצב למידה - גם שרירותי, אבל אלה סדרי הגודל.
מספר אפוקים - כמות הפעמים שעוברים על כל הדאטה.
גודל באץ' - כמה דגימות מעבירים ברשת לחישוב כל נגזרת. >>
7. הגדרנו את הרשת, עכשיו יצרנו אותה (58)!
כעת נגדיר את הלוס - BCE, "אנטרופיה בינארית".
רגע, בעברית.
מהרשת יוצאים Logits - מה שהרשת מוציאה, מספרים.
BCE משתמש בסיגמואיד, שלוקח כל Logit והופך אותו למספר בין 0 ל1.
אחרי שעשינו את זה, אפשר להסתכל על המספר כהסתברות ללקוח מרוצה (1) >>
8. עם ההסתברות מחשבים אנטרופיה.
מה זה אנטרופיה?
הנוסחה בגדול, ממירה את הפער בין הרצוי (0 או 1) למצוי (הסתברות) למספר כמותי.
ככל שגדול יותר - הפער גדול יותר.
זה לוס.
באופטימייזר בחרנו בADAM. לא ארחיב כאן, זה מצדיק שרשור.
בקצרה: סוג של ממוצע נע לגרדיאנטים לאימון מהיר ומדוייק. >>
9. הגדרנו הכל בשתי שורות, נתחיל לאמן.
בתחלת כל אפוק נערבב את הדאטה, ונעביר כל באץ' ברשת.
תראו כמה זה פשוט - model(batch_x) מעביר את הבאץ' בפונ' הForward שהגדרנו בציוץ מספר 5 (שורה 93).
כל הטרלול של האימון קורה בשתי השורות בסוף.
בשורה 98 חישוב גרדיאנט.
ב99 צעד דיסנט.
סה-טו >>
10. מעולה, סיימנו באץ'?
נתחיל בלבטל את חישוב הגרדיאנטים (שורה 105).
אחרי זה נבדוק את הביצועים של הרשת על הסט שהיא למדה, האימון, וגם על סט האימות.
הביצועים במקרה שלנו הם הדיוק - כמה לקוחות הרשת סיווגה כמו שצריך.
את זה נעשה בכל סוף אפוק, כדי לראות התקדמות.
בסוף נוציא גרף!
11. מעולה.
נגמר האימון.
נעשה את אותה פעולה על סט הבחינה, ונקבל את הדיוק של הרשת שלנו על סט שהיא מעולם לא ראתה.
שימו לב!
את הרשת בונים.
נשחק עם כמות וגודל השכבות, עם קצב הלמידה, עם גודל הבאץ'.
כל פעם נראה את הביצועים של הרשת על סט האימות תוך כדי האימון, אבל לא ניגע בסט הבחינה. >>
12. רק בסוף בסוף, אחרי שבנינו את הרשת, נריץ את הבדיקה על הסט הבחינה פעם אחת בודדת, לא יותר.
ככה יש לנו "טסט פנימי" שהוא סט האימון, ו"טסט חיצוני" שהוא סט הבחינה.
כנראה שבסוף, כשנרצה להשתמש ברשת, נאמן אותה שוב על כל הדאטה - כי חבל לבזבז דאטה בצד.
תוצאות!
בואו נראה תוצאות! >>
13. בגרף השמאלי - הלוס בכל אפוק.
בימני - הדיוק בכל אפוק.
מה רואים בתמונה?
Over Fitting!
אפשר לראות שהדיוק על סט האימון עולה ועולה, אבל הדיוק על סט האימות עולה.. עולה.. ואז יורד.
הרשת ענקית, ואימנו 100 אפוקים.
אנחנו רואים שהתוצאה הכי טובה מגיעה סביב אפוק 15.
בואו נקטין את הרשת. >>
14. מרשת ענקית של 5 שכבות ואלפי נוירונים, הקטנתי אותה לשכבה אחת של 256 נוירונים, אחריה 32 וזהו.
מה קרה?
נעלם הOver Fitting! הרשת לא מספיק מסובכת, לא עם מספיק פרמטרים כדי להצליח לעשות את אותה התאמת יתר וללמוד את הרעש שבדאטה, במקום את הבעיה.
בואו נקטין את הרשת עוד יותר >>
15. עכשיו שכבה אחת, נוירון אחד בודד.
התוצאות לא רעות.
מגיעים לאיזה 80% דיוק, לא הרבה פחות מרשת מסובכת.
למה?
הדאטה פשוט.
מספיק צירוף ממושקל פשוט של כל המשתנים כדי לתת תחזית טובה.
אגלה גם ש"הרעשתי" את הדאטה כדי להקשות.
על הלא רועש - רגרסיה לוגיסטית הייתה מספיק לגמרי! >>
16. התהליך שעשינו כאן, של שינוי השכבות נקרא "כיוונון היפר פרמטרים".
עושים אותו שוב ושוב, עד שמוצאים את הקונפיגורציה הכי יעילה.
אין דרך טובה לעשות את זה - לאמן שוב ושוב ולנסות.
ו.. סיימנו!
מה שבעיקר יפה זה כמה זה קל היום.
קצת יותר מ100 שורות קוד.
בחלק הבא אדבר על איך הכנתי את >>
17. הדאטה לכניסה לרשת.
הקוד זמין לכולכם בGitHub שלי, שגם הוא בלינקטרי יחד עם קבוצת הטלגרם שאם-עוד-לא-הצטרפתם-עכשיו-זה-הזמן-ככה-לא-תפספסו-כלום:
linktr.ee/tsoofbaror
נסו לשחק עם ההיפרפרמטרים בעצמכם!
אם ניסיתם - פרסמו פה את התוצאות!
מוזמנים להעזר בי בתהליך.
אם זה השרשור הראשון שלי שאתם קוראים, היי!
מזמין אתכם לחקור איתי את הקישקע של הAI,
כל פעם בדרך אחרת.
זה הזמן לעקוב אחרי:
twitter.com/tsoofbaror
מזמין אתכם לרטווט ולהגיב אם אהבתם,
ולהתעלם לגמרי אם השתעממתם. 😍
דיסקליימר למומחים.
דברים שלא עשיתי כדי לפשט: לא השתמשתי בדאטהלואדר, לא הראתי מטריצת מבוכה, לא עשיתי פיצ'ר סלקשן, לא התעסקתי עם פונ' אקטיבציה שונות, גודל הבאץ', לא בדקתי אופטימייזרים אחרים ועוד מלא.
הכל כדי לתת Overview פשוט על התהליך בשרשור ארוך.
נא לקטול במשורה.