דף צ'יטים לבניית מודלים של למידה עמוקה באמצעות Keras
למידת מכונה היא הדרך העיקרית ליישם בינה מלאכותית, בתוכה למידה עמוקה היא התחום שמושך הכי הרבה עניין. בלמידה עמוקה קיימות 4 סוגי ארכיטקטורות עיקריות: Dense בשביל בעיות סיווג ורגרסיה, CNN בשביל תמונות, RNN בשביל רצפים, ו-Transformers בשביל תרגום רצפים. הדרך הפשוטה ביותר לעשות למידה עמוקה הוא באמצעות ממשק Keras.
Dense
בשכבות Dense כל יחידה בשכבה אחת מחוברת לכל היחידות בשכבה הבאה. בשכבות Dense נשתמש כדי לפתור בעיות פשוטות של רגרסיה או סיווג. בדרך כלל נשתמש בהם, בתור השכבות האחרונות של רשתות CNN או RNN.
משימה |
שכבה אחרונה Dense |
פונקצית אקטיבציה |
פונקצית loss |
---|---|---|---|
סיווג בינארי תגיות 0 או 1 |
יחידה 1 |
סיגמואידית |
binary_crossentropy |
סיווג למחלקות רבות Mutually exclusive |
מספר יחידות שווה למספר המחלקות |
softmax |
אם התגיות one-hot encoded אז categorical_crossentropy אם התגיות הם ספרות אז sparse_categorical_crossentropy |
סיווג למחלקות רבות כאשר דוגמאות יכולות להיות שייכות ליותר מקטגוריה אחת |
מספר יחידות שווה למספר המחלקות |
סיגמואידית |
binary_crossentropy |
רגרסיה |
על פי מספר הערכים אותם מנסים לחזות (לדוגמה, אם מנסים לחזות מחיר בלבד אז יחידה 1) |
לינארית |
MSE |
CNN
רשת CNNהיא השימושית ביותר לזיהוי של תמונות בגלל שהיא מסוגלת להתחשב בממד הרוחב והגובה של תמונה. הרשת שבה נהוג להשתמש לצורך קונבולוציה מתאפיינת במבנה מתכנס, בה השכבות הראשונות רואות פרטים, בעוד שכבות עמוקות יותר רואות דפוסים. הודות למבנה המתכנס השכבה האחרונה של הרשת רואה את התמונה הכללית, ומסיקה מה רואים בתמונה.
רשתות CNN בנויות מבלוקים. כל בלוק מתחיל בשכבת קונבולציה (אחת או שתיים) שאחריהם שכבת דגימה pool. השכבה האחרונה היא Dense שעושה את הסיווג או הרגרסיה. כדי להעביר את המידע מהבלוקים של הקונבולוציה לשכבת ה-Dense נשתמש בשכבת flatten או global pooling כדי לשטח את המידע לוקטור (שכבה שגובהה פיקסל 1 בודד).
model = Sequential()
# block 1
model.add(Conv2D(32, (5, 5), input_shape=(1, 28, 28), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
# block 2
model.add(Conv2D(32, (5, 5), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
RNN
ב-RNN נשתמש כשאנו רוצים לעבוד עם רצפים. כדוגמת, שפה שמורכבת מרצף של מילים, סרטונים שעשויים מרצף של פריימים או מידע התלוי בחילופי העיתים, מחזורי שפל וגאות כלכלית או מחזור כתמי השמש.
Keras מציע שכבות RNN מסוג GRU או LSTM. בעוד LSTM הוא החזק יותר, GRU דורש פחות אנרגיה בשביל היישום.
RNN מרובה שכבות (stacked) מכיל מספר שכבות של LSTM. כל שכבות ה-LSTM מלבד האחרונה צריכות להחזיר רצפים (return_sequences=True) מכיוון ששכבת RNN פולטת כברירת מחדל מערך דו-מימדי אבל כדי להזין שכבת LSTM אנחנו צריכים מערך תלת-מימדי.
model = Sequential()
model.add(LSTM(50, activation='relu', return_sequences=True, input_shape=(x_test.shape[1], n_features)))
model.add(LSTM(50, return_sequences=False, activation='relu'))
model.add(Dense(1))
המטרה של מודל למידת מכונה הוא להכליל מסט נתוני אימון לנתונים שהוא לא ראה במהלך האימון מה שיוצר מתח מובנה בין הצורך להתאים כמה שאפשר את המודל לנתוני האימון והצורך לשמור את המודל מספיק גמיש כדי שיוכל להכליל.
לפני שאתה יכול להעריך את המודל אתה צריך לדעת מהם המדדים לפיהם אתה מעריך את היכולות שלו. לדוגמה, במשימות סיווג חשוב להגיע לדיוק גבוה. לא זו בלבד, אתה גם צריך לדעת למה להשוות. לדוגמה, דיוק של 90% נשמע מצוין. זה נכון עבור סיווג לשני סוגים במצב שמחצית הדוגמאות שייכות לכל סוג. אבל אם השכיחות של אחת הקטגוריות הוא 90% המשמעות היא שהתוצאות אינם טובות יותר מתוצאות שנבחר באקראי.
אם ה-loss תקוע על ערך התחלתי בלי לרדת במהלך האימון נסה:
- לשנות את את קצב הלמידה. קצב איטי מדי יראה לנו שהמודל לא מתקדם, וקצב גבוה מדי יגרום למודל לפספס את המינימום.
- הגדלת כמות הדוגמאות בכל batch יוביל לגרדיאנטים אינפורמטיביים ופחות רועשים בגלל שונות נמוכה.
- אם שני הצעדים הקודמים לא עוזרים אז יכול להיות שארכיטקטורת המודל לא מתאימה למשימה. לדוגמה, יכול להיות שאתה מנסה לסווג תמונות באמצעות מודל Dense במקום CNN.
אם המודל מראה התקדמות על סט האימון אבל המדדים לא משתפרים בסט המבחן נראה שלמודל אין יכולת להכליל מנתוני האימון לסט המבחן. נסה:
- לחלק מחדש את הנתונים לסט אימון ומבחן
- להשתמש ב-K fold cross validation
אם המודל מצליח ללמוד מסט האימון ולהכליל לסט המבחן אתה בדרך הנכונה עכשיו השאיפה שלך צריכה להיות שהמודל יגיע ל-overfitting, זה מתבטא בירידה יפה ב-loss ב-epochs הראשונים עד להגעה למינימום וב-epoch הבאים עלייה הדרגתית ב-loss. לפעמים הדרך הטובה ביותר היא לחכות מספיק epochs עד שמגיעים ל-overfitting.
אם אחרי שחיכית מספיק epochs המודל לא הגיע ל-overfitting אז היכולת שלו נמוכה מדי בשביל הבעיה שאתה מנסה לפתור. במצב זה, נסה להוסיף יכולת למודל באמצעות:
- תוספת שכבות או נוירונים בכל שכבה.
- שיפור ארכיטקטורת המודל.
אם המודל יורד למינימום loss כבר ב-epochs הראשונים ואחר כך הוא עושה זיגזגים יכול להיות שהסיבה היא שהמודל הוא גדול מדי אז כדאי לך לצמצם את המודל - להשתמש בפחות שכבות ופחות נוירונים בכל שכבה.
אין נוסחת קסם למספר השכבות ומספר הנוירונים. לכן הדרך הטובה ביותר היא להתחיל במספר מינימלי של שכבות ונוירונים ולהתקדם בהדרגה למודלים גדולים יותר.
אחרי שראית שהמודל שלך לומד וגם מגיע ל-overfitting עליך להגדיל את יכולת הלמידה של המודל. הדרך העיקרית היא על ידי השקעה באיכות וכמות הנתונים כי לרוב השקעה בסט נתונים מניבה תוצאות טובות יותר מאשר השקעה במודל. תזכור את הפרזה המקובלת במדעי המחשב: "garbage in - garbage out" אתה לא יכול ללמוד שום דבר בעל ערך מנתונים שגויים ורועשים. במסגרת המאמצים לשפר את איכות הנתונים נסה:
- להוסיף יותר דוגמאות ונסה שהם יהיו מגוונות יותר כדי שייצגו יותר היבטים של המידע שאתה חוקר.
- ודא שה-labels אכן תואמים את הדוגמאות ושלא נפלו טעויות של סיווג שגוי.
- נקה את הנתונים וטפל בערכים חסרים.
- אם יש לך הרבה פיצ'רים תבחר מתוכם את המוצלחים ביותר. פעמים רבות צריך שיהיה לך ידע בנושא הנחקר שידריך אותך לבחור במה להתרכז. זה נכון שלמידת מכונה מודרנית פחות רגישה לבחירת הפיצ'רים אבל עדיין חשוב להשקיע אם יודעים איך.
מציאת הנקודה המדוקיית בה המודל שפיתחת עובר מ-underfit ל-overfit היא חשובה ביותר כי זה המקום בו המודל שלך הוא המוצלח ביותר. אז אחרי שפיתחת את המודל ושיפרת את הנתונים אתה יכול להעזר ב-early stopping שימצא בשבילך את הנקודה שבה המודל הוא הכי מוצלח.
אחת הגישות להגדיל את יכולת ההכללה של המודל היא על ידי רגולריזציה של הרשת. הכלים שעומדים לרשותך הם קודם כל הקטנת ופישוט הרשת. אחר כך אתה יכול לבחור בין רגולריזציה של המשקלים על ידי L1 ו-L2 עבור מודלים קטנים לבין dropout עבור מודלים גדולים.
לכל המדריכים בנושא של למידת מכונה
אהבתם? לא אהבתם? דרגו!
0 הצבעות, ממוצע 0 מתוך 5 כוכבים
המדריכים באתר עוסקים בנושאי תכנות ופיתוח אישי. הקוד שמוצג משמש להדגמה ולצרכי לימוד. התוכן והקוד המוצגים באתר נבדקו בקפידה ונמצאו תקינים. אבל ייתכן ששימוש במערכות שונות, דוגמת דפדפן או מערכת הפעלה שונה ולאור השינויים הטכנולוגיים התכופים בעולם שבו אנו חיים יגרום לתוצאות שונות מהמצופה. בכל מקרה, אין בעל האתר נושא באחריות לכל שיבוש או שימוש לא אחראי בתכנים הלימודיים באתר.
למרות האמור לעיל, ומתוך רצון טוב, אם נתקלת בקשיים ביישום הקוד באתר מפאת מה שנראה לך כשגיאה או כחוסר עקביות נא להשאיר תגובה עם פירוט הבעיה באזור התגובות בתחתית המדריכים. זה יכול לעזור למשתמשים אחרים שנתקלו באותה בעיה ואם אני רואה שהבעיה עקרונית אני עשוי לערוך התאמה במדריך או להסיר אותו כדי להימנע מהטעיית הציבור.
שימו לב! הסקריפטים במדריכים מיועדים למטרות לימוד בלבד. כשאתם עובדים על הפרויקטים שלכם אתם צריכים להשתמש בספריות וסביבות פיתוח מוכחות, מהירות ובטוחות.
המשתמש באתר צריך להיות מודע לכך שאם וכאשר הוא מפתח קוד בשביל פרויקט הוא חייב לשים לב ולהשתמש בסביבת הפיתוח המתאימה ביותר, הבטוחה ביותר, היעילה ביותר וכמובן שהוא צריך לבדוק את הקוד בהיבטים של יעילות ואבטחה. מי אמר שלהיות מפתח זו עבודה קלה ?
השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.