סיכום תחרות Kaggle SIIM-ISIC Melanoma Classification (קבוצת Yuval & nosound)

מאת יובל ריינה, 23 באוגוסט 2020

הירשמו לערוץ יוטיוב שלנו!

כל הסרטונים מאירועי הקהילה

סיכום זה נכתב כחלק מפוסט של Yuval Reina

על התחרות

כפי שנכתב התחרות מתרכזת בזיהוי של מלנומה בתמונות של כתמים ונקודות חן שונות.
תחרות כזו מתקיימת כבר מספר שנים על פלטפורמות שונות (לאו דווקא Kaggle), כאשר החידוש השנה הוא ברצון לראות האם ניתן להשתמש במספר תמונות מאותו חולה לשם שיפור דיוק הגילוי.
המידע הוא תמונות + ID של החולה ומספר נתונים על החולה – גיל (בעת צילום התמונה), מין, על התמונה – מיקום, איזה סוג כתם זוהה (נקודת חן/מלנומה/וכו') וה Target – כן/לא מלנומה.
הקריטריון של התחרות היה AUC – ROC
האתגר העיקרי בתחרות הוא המספר הקטן של תמונות עם Target=1 . מכיוון שרצו להביא תמונות רבות מכל חולה (בין בודדות ל 200, בממוצע כ 20), ומכיוון שמרבית התמונות, גם בחולה עם מלנומה, הן ללא מלנומה, רק כ 2% מהתמונות היו עם Target=1.
הדבר הקשה על בניית המודלים, אבל יותר מכך עשה שמות ב LB של התחרות. ב Public LB היו רק 78 תמונות חיוביות מתוך מעל 3000 תמונות וב Private LB היו כנראה רק כ 170 תמונות חיוביות.
כתוצאה מכך בסוף התחרות היה Shakeup עצום: המקום הראשון הסופי היה במקום 886 לפי ה Public LB ומעטים מה 50 הראשונים היו בעמדה לקבלת מדליה לפני כן. (המשמעות של הדבר בעיניי היא שהתחרות למעשה נכשלה, המקומות הגבוהים הם די שרירותיים לפי התאמתם ל Private LB).

הקבוצה

אני הייתי חלק מקבוצת Yuval & nosound שכללה אותי ואת nosound שהוא ZAHAR CHIKISHEV (גם ישראלי). זו הפעם הרביעית שאנו משתפים פעולה בקאגל, עד כה בצורה מוצלחת למדי (2*זהב, 2*כסף)
את התחרות סיימנו במקום ה 29 (לפני ה Shakeup היינו במקום שני אבל רק בגלל שזכר מומחה ל LB Probing ושלושה ימים לפני הסיום הגיש פתרון כמעט מושלם שהציב אותנו במקום שני עם התוצאה, הלא אמיתית של 0.9913).

המודלים

הפתרון שלנו הו אנסמבל של שני סוגי מודלים:
  1. מודל בסיסי שבנוי על רשת efficientnet-b3-b7 המקבלת החלטה על כל תמונה בנפרד
  2. מודל מורכב בו מתייחסים לוקטור הכניסה לשכבה האחרונה במודל הבסיסי כוקטור פיצ'רים. הוקטורים מכל התמונות של הפצינט מהווים מטריצה אחת הנכנסת כקלט למודל Transformer המקבל החלטות על כל התמונות במקביל תוך מבט כולל על הפיצרים שלהן.

המודלים הבסיסיים:

מודלים אלו מבוססים על גדלים שונים של רשת Efficientnet שאומנה מראש על Imagenet בטכניקת Noisy-Student.
מהרשת הזו מורידים את השכבה האחרונה – שכבת הקלסיפיקציה, לכניסה לשכבת הקלסיפיקציה נקרא הפיצ'רים. לוקטור הפיצרים מצרפים (Concatenate) את היציאה של רשת Fully Connected קטנה שמקבל בכניסתה את ה Metadata (גיל, מין, מיקום הכתם). וקטור זה נכנס לשכבה לינארית שביציאתה 256 פיצרים חדשים והיא נכנסת לשכבת קלסיפיקציה.
לכאורה המטרה בתחרות זו היא לזהות מלנומה/לא מלנומה ולכן מוצא שכבת הקלסיפיקציה יכול היה להיות ברוחב 1, אולם הנסיון מראה שעדיף שהרשת תבצע קלסיפיקציה מורכבת ככל האפשר. במקרה שלנו, יש נתון נוסף שהוא סוג הכתם, ישנם מספר סוגים שאחד מהם הוא מלנומה ועל כן הרשת מבצעת קלסיפיקציה של 8 סוגי כתמים שונים (ישנם יותר סוגים, אבל בחלקם יש מספר קטן מאוד של דוגמאות כך שהחלטתי לצרפם לקטגוריית ה Unknown).
ה Loss שנבחר היה Cross Entropy (בדקתי גם Focal Loss בגלל ה imbalance המשמעותי, אבל התוצאות לא השתפרו).
הרשת אומנה על התמונות מתחרות זו, אך גם על תמונות מהתחרות של 2019 בה ה imbalance קטן בהרבה (עוד על האימון בהמשך).

מודלים מורכבים:

בכדי לאפשר לכל התמונות של הפציינט להשפיע על ההחלטה, בנינו Transformer Encoder עם 4 Attention Heads ו 4 שכבות Encoder. כניסת הרשת היא וקטורי הפיצרים ברוחב 256 מהשכבה האחרונה של הרשתות הבסיסיות והיציאה היא 8 קטגוריות עבור כל תמונת כניסה.
גם לרשת זו מצרפים את ה – Metadata, רק שמכיוון שזהו טרנספורמר הדבר מבוצע באופן שונה, כל נתון (לדוגמא מיקום הכתם) עובר דרך שכבת Embedding והופך לוקטור ברוחב 256 שמסוכם לוקטור הפיצרים של התמונה.
ה Loss גם כאן הוא Cross Entropy רק שנדרשת זהירות רבה באופן החישוב של הממוצע מכיוון שכמות התמונות שיש לכל פציאנט שונה מאוד (בתמונות 2019 אין מידע על הפציאנט כך שכל תמונה היא נפרדת).

הכנה ואימון:

הגודל של כל התמונות שונה ל 400*600 (מרבית המתחרים הפכו את התמונות לריבוע, אך מכיוון שיחס המימדים השכיח בתמונות המקור הוא 1:1.5 בחרתי בגודל זה, לאחר שכל התמונות סובבו בהתאמה), בשניים מהמודים השתמשתי בתמונות בגודל 600*900 (בדקתי גם 300*450 אך התוצאות היו נחותות).
במהלך האימון השתמשתי באוגמנטציות הבאות:
Random ResizeCrop, Rotation, Flip, ColorJitter, CutOut, HairAdd* (* באוגמנטציה האחרונה מוסיפים שיער באופן אקראי בכדי לדמות את השערות בחלק מהתמונות).
בנוסף בצעתי גם אוגמנטציה על המטהדאטה ע"י הוספת ערכים אקראיים לגיל והפיכה אקראית של המין (רעיון שנלקח מהמודל המנצח בשנה שעברה)
האימון נעשה על 3 Folds (המספר הנמוך נבחר בגלל הכמות הקטנה של הדוגמאות החיוביות) שחולקו כך שכל התמונות של הפציינט יהיו באותו fold ושמספר הפציינטים עם מלנומה יהיה שווה בין ה folds.
בגלל הכמות הקטנה של folds, ביצעתי 3 חלוקות עם 3 סידים שונים בכדי לקבל למעשה 9 מודלים מכל סוג (שילמתי על זה בזמן האימון של כל סוג מודל).
בכדי לאמן את מודלי הטרנספורמר הכנתי עבור כל תמונה 12 וקטורי פיצרים עבור 12 אוגמנטציות רנדומליות של התמונה. כאשר בכל פעם נבחר וקטור רנדומלי.
מודלי הטרנספורמר אומנו בשני שלבים, בשלב ראשון עם תמונות מתחרות 2019 ולאחר מכן נעשה עוד fine-tuning ללא תמונות אלו.

Inference

בשלב זה השתמשתי ב TTA – Test Time Augmentation, תוך מיצוע של כל התוצאות עבור כל המודלים. על וקטור היציאה בוצע SoftMax והפרדיקציה היתה הערך עבור קטגוריית המלנומה

תוצאות

Private LB 0.9441 Public LB 0.9581
ההגשה הטוב ביותר היתה אנסמבל של 5 מודלים בסיסיים Efficientnet b3, b4, b5, b6 (600*900), b7 וחמשת הטרנספורמרים המקבילים למודלים אלו.
(בדיעבד היו 4 מודלים עם תוצאה יותר, כולם אנסמבלים קצת שונים, אך לא היתה סיבה אמיתית לבחור בהם, בכל מקרה, אף אחד מהם לה היה נותן זהב)
הגשה ללא מודלי הטרנספורמר נתנה Private LB: 0.9430 Public LB 0.9575
המודל הבודד הטוב ביותר הוא מודל הטרנספורמר של Efficientnet_b5 שנתן Public LB: 0.9603 Private LB 0.9383 (זו התוצאה המדווחת הטובה ביותר למודל בודד ב Public LB והיא בתחום מדלית הארד ב Private LB)

הסטאפ

אימון המודלים הבסיסיים הצריך כח מחשוב רב. בנושא זה אני נהנה מיתרון. בתחרויות עבר בקאגל זכיתי ב GPU מסוג Tesla-V100 ובכסף (לא המון) אותו השקעתי בחזרה בשרת חזק המבוסס על Intel i9920x עם 64GB RAM ושני כרטיסי GPU: אחד Tesla-v100 והשני Titan-RTX. בכל תקופת התחרות דאגתי שאף GPU לא ינוח.

LB Probing

במהלך התחרות ניצל זכר כל הגשה פנויה בכדי לבצע LB probing תוך הפעלת אלגוריתם של Mixed Integer Programming. יותר על כך ניתן למצוא כאן.
לפעולה זו היו מספר מטרות:
  1. הבנה טובה יותר של ה test data
  2. מחשבה שאולי נוכל להשתמש במידע מתוך ה Public Test לאימון הרשת (Pseudo Labeling מדוייק יותר)
  3. להשוויץ בסוף
לגבי המטרה השניה, היו לנו תכתובות מייל עם המארגנים, לאחר ששאלנו "שאלת קיטבג" (זכר היה רק שנה בצבא ולא הגיע לחלק הזה בלימוד) האם שימוש כזה הוא חוקי – המסקנה היא: אולי. בסופו של דבר לא השתמשנו במידע זה לאימון מכיוון שלא היה מדוייק מספיק ולא יכולנו להיעזר בו ביעילות.
המטרה השלישית הושגה כמעט במלואה כאשר שלושה ימים לפני סוף התחרות, זכר הגיש וקיבל את התוצאה הבלתי אפשרית Public LB = 0.9913 ששמה אותנו במקום שני זמני (שלושה ימים לפני הסוף בכדי לא להרוס את ה – LB, כבר היתה תחרות שבה הוא עשה זאת ביום הלפני אחרון עם התוצאה המושלמת: 1.)

קצת פיקנטריה

בערך באמצע התחרות הבנתי שאין ממש קשר בין ה – Public LB לבין מה שיהיה בסוף, הפער בין ה – CV (בסביבות 0.93-0.94 כאשר משתמשים רק בתמונות התחרות של 2020) לבין ה – LB של אותו מודל (0.95-0.96), חוסר הקורלציה בין המספרים והשונות שלהם, הבהירה לי שיהיה המון רעש בתחרות. בנקודה הזו היינו בעשיריה הראשונה, אבל אני הפסקתי להסתכל על הטבלה, אלא רק על המודלים שלנו ותוצאותיהם. בינתיים פורסמו כמה מודלים בהן היה Over-fit גדול מאוד ל Public LB שהתווסף ל Over-fit הטבעי שעושים רבים מהמתחרים ומיקומנו התחיל להתדרדר, בהתחלה לאט ואז במהירות עד שהגענו מתחת למקום 800 (אז קפצנו למקום השני בעקבות ה LB probing). ההתעלמות הזו כנראה השתלמה מכיוון שבחרתנו באנסמבל הנכון ביותר מבחינתנו תוך השענות על איכות המודל והרובוסטיות שלו.
ולסיום:
יום לפני התחרות שלח לי Abhishek Thakur שאלה:
what do you think will be the winning auc in melanoma?
עניתי
I don't know, there aren't enough positive examples to get a solid and consistent result.
I have a feeling it will be lower then public LB. Maybe around 0.95.
As I said, it can be higher – but not more then 0.97.
But we will definitely see a huge shakeup ( I won't be surprised if the 1st place is currently in the 100th place)
מסתבר שהייתי מעט אופטימי, אבל קרוב – התוצאה המנצחת היא 0.9490 והמקום הראשון היה במקום 880.

הצטרפו לערוץ הטלגרם שלנו!

כל ההודעות שאתם לא רוצים לפספס

X