דף צ'יטים לבניית מודלים של למידה עמוקה באמצעות Keras

מחבר:
בתאריך:

למידת מכונה היא הדרך העיקרית ליישם בינה מלאכותית, בתוכה למידה עמוקה היא התחום שמושך הכי הרבה עניין. בלמידה עמוקה קיימות 4 סוגי ארכיטקטורות עיקריות: Dense בשביל בעיות סיווג ורגרסיה, CNN בשביל תמונות, RNN בשביל רצפים, ו-Transformers בשביל תרגום רצפים. הדרך הפשוטה ביותר לעשות למידה עמוקה הוא באמצעות ממשק Keras.

דף ציטים למידת מכונה עמוקה באמצעות Keras - RNN, CNN, Dense, transformer - deep learning architectures with 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 כוכבים

 

 

הוסף תגובה חדשה

 

= 7 + 2