כיצד להתגבר על overfitting במודלים מבוססי Keras?

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

במדריך זה נסביר מהו מודל שסובל מ-overfitting וכיצד להתמודד עם הבעיה.

מודל לוקה ב-overfitting אם הוא מתאים יותר לסט הדוגמאות שעליהם הוא אומן (training set) מאשר עם דוגמאות אחרות.

הבעיה מאוד נפוצה, ונוטה להופיע בשלבים שונים בתהליך האימון והפריסה (deployment) של המודל.

כבר במהלך אימון המודל ניתן להבחין ב-overfitting. אם אנחנו מודדים את מידת הדיוק (accuracy) ואנחנו רואים שהדיוק עבור דוגמאות האימון הוא פחות טוב מאשר עבור דוגמאות הווידוא. במדריך בחירת המודל המשמש ללמידת מכונה ראינו את המצב הזה קורה אחרי 4 epochs:

דוגמה ל-overfit זה מצב שבו המודל למד יותר מדי טוב ולכן הוא יודע לזהות את דוגמאות האימון ומתקשה במציאת דוגמאות הביקורת.

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

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

 

כיצד להתמודד עם בעיית ה-overfitting?

קיימות 5 דרכים עיקריות להתמודד עם בעיית ה- overfitting:

 

1. הפיכת המודל לפשוט יותר

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

 

2. הוספת דוגמאות אימון לצורך הגדלת המגוון

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

 

3. הוספת שכבת dropout

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

בממשק keras מוסיפים פוקנצית Dropout בתור שכבה במודל מסוג Sequential:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout

model = Sequential()

# The model receives 1 input 
model.add(Dense(12, activation='relu', input_shape=(1,)))

# A single hidden layer
model.add(Dense(36,  activation='relu'))

# The dropout layer
model.add(Dropout(0.2))

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

 

4. הוספת regularizers

regularizer מפחית את השונות בין המשקלים (weight) וה-bias בתוך הרשת הנוירונית. הפונקציה הנפוצה יותר היא l2.

את l2 מוסיפים כפרמטר לתוך שכבה קיימת:

from tensorflow.keras.regularizers import l2

….

# A layer with l2 regularization
model.add(Dense(36, kernel_regularizer=l2(0.001), bias_regularizer=l2(0.001), activation='relu'))

מקובל להזין את הפונקציה בערכים נמוכים מ-0.1

 

5. הוספת שכבת batch normalization

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

ב-Keras מוסיפים את הפונקציה BatchNormalization כמו כל שכבה אחרת:

from tensorflow.keras.layers import Dense, BatchNormalization

...
# A single hidden layer
model.add(Dense(36,  activation='relu'))

# Batch normalization layer
model.add(BatchNormalization(axis=1))

כשעובדים עם הפונקציה BatchNormalization נשים לב:

א. שמוסיפים אותה אחרי שכבה חבויה.

ב. כמעט תמיד מגדירים את הנורמליזציה על העמודות (axis=1)

 

בדרך כלל, נצטרך להשתמש בשילוב של שיטות כדי לפתור את בעיית ה-overfitting שמתעקשת לתקוף את המודלים שלנו.

לכל המדריכים בנושא של למידת מכונה

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים

 

 

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

 

= 7 + 6