אלגוריתמים אבולוציוניים וחיים מלאכותיים – עבודה 5
מגישים:
כרמל קרני 040656423
טל
רון
300069929
תיאור
הבעיה
נתבקשנו לממש את האלגוריתם Back-propagation ולאמן בעזרתו רשת
נוירונים עם שכבה חבויה אחת על מנת לסווג את בעיית IRIS.
בבעיה זו המטרה היא לזהות על פי 4
פרמטרים, את המין של צמח מסוים – מתוך 3 אפשרויות (או בקיצור – קטלוג).
תהליך
הפתרון
מימשנו את ה-framework עבור רשת הנוירונים, את האלגוריתם Back-propagation
שבעזרתו הרשת מאומנת, לאחר מכן בנינו את הרשת עבור הבעיה הספציפית
שלנו– IRIS.
במימוש הכללי, הרשת שלנו מקבלת את ה-Inputs, שהם כמה מספרים מסוג double, ואת הערך הצפוי עבור כל אחד
מהנוירוני output, שמכיוון שאין
לבעיה הרבה פלטים אפשריים, החלטנו שהם יהיו 0 או 1, ושנוירוני הפלט יהיו תמיד מסוג
Threshold.
הרשת היא fully-connected, כלומר כל נוירון בכל שכבה מחובר לכל הנוירונים שבשכבה הבאה, ניתן
לקנפג את מספר הנוירונים בכל שכבה חבויה.
התוכנית שלנו מקבלת את קבוצת הקלטים,
ומשתמשת בחלק מהם (שנקבע על ידנו) על מנת לאמן את הרשת, לאחר מכן התוכנית בודקת את
ביצועי הרשת על כל קלט מקבוצת הקלטים (כולל אלו שהשתמשנו בהם על מנת לאמן את
הרשת), ומחזירה נתונים סטטיסטיים על הריצות.
המשקל ההתחלתי של כל חיבור בין
הנוירונים נבחר רנדומלית בין 1 ל- 1-.
מכיוון שזהו אלגוריתם רנדומלי, התוכנית
מורצת מספר רב של פעמים על מנת לראות מהו הממוצע עבור כל הריצות.
בכל הריצות המתוארות כאן – כל רשת אומנה
100 פעמים – כל פעם עם משקלים התחלתיים שונים, והתוצאה היא ההצלחה הממוצעת שלה.
פירוט הנסיונות:
תחילה בנינו את הרשת כמו שנתבקשנו
במאמר, עם 4 נוירוני קלט, 3 נוירוני פלט ומספר משתנה של נוירונים בשכבה חבויה אחת,
כאשר התשובה של הרשת היא הנוירון עם הערך 1 (אם היו 3,2 או 0 נוירונים שהחזירו את
הערך 1 – התשובה נחשבה אוטומטית כשגויה).
תחילה ניסינו לבחור את הקלטים לאימון
הרשת בצורה רנדומלית, שיטה זו לא צלחה והשגנו הצלחה של כ-33% בממוצע (מה שגם
אלגוריתם המנחש את התוצאה היה יכול להשיג).
לאחר מכן בחרנו את הקלטים בצורה שווה
מכל אחת מהקטגוריות והכנסנו אותם לרשת בסדר רנדומלי, מהלך זה בהחלט שיפר את
התוצאות במקרה הממוצע, אך עדיין לא הינו מרוצים מהתוצאות, נראה שהרשת הצליחה לזהות
רק 2 מתוך שלושת הצמחים והתעלמה לחלוטין מהצמח השלישי, כך שבמקרה הממוצע הרשת
זיהתה בהצלחה 66% מהצמחים.
עשינו עוד נסיון, ודאגנו שהסדר שבו הרשת
תקבל את הקלטים יהיה פחות או יותר הוגן ושהרשת לא תקבל לדוגמא את כל הפרחים מהסוג
הראשון בבת אחת.
כדי לבצע זאת, בחרנו בכל איטרציה קלט
אחד מכל אחת משלושת הקטגוריות, והכנסנו את הקלטים לרשת בסדר רנדומלי.
בנוסף, שינינו את הטופולגיה של הרשת
ושמנו בה 2 נוירוני פלט בלבד, כך ש-00,01,10 מציינים את שלושת הסוגים השונים של הצמחים,
ו-11 נחשב אוטומטית כשגיאה.
אנו מאמינים שמהלך זה שיפר את התוצאות,
מכיוון שאכן ראינו שיפור ובנוסף – כעת יש רק ערך אחד שנחשב אוטומטית כשגיאה לעומת
5 ברשת הקודמת, ובנוסף יש סיכוי של 1 ל-4 לבחור את התשובה הנכונה כעת לעומת 1 ל-8
ברשת הקודמת (למרות שהרשת אינה מהמרת בצורה כזאת, דבר כזה בטוח לא יכול להזיק J).
לאחר כל הנסיונות האלה, אחוזי ההצלחה של
הקטלוג עומדים על כ-85%, נתון שמאוד הטריד אותנו הוא שכאשר בחנו את הרשת על אותם
קלטים בהם השתמשנו לאמן אותה, השגנו תוצאות הדומות מאוד לנסיונות עם הקלטים שהרשת
לא ראתה מעולם – אין לנו הסבר לנתון זה, ועברנו על הקוד שלנו במשך שעות רבות מבלי
למצוא שום באג (נשמח מאוד אם תוכל להסביר לנו איך דבר כזה קורה).
על מנת לוודא שאכן האלגוריתם עובד כמו
שצריך והנתונים הגיוניים, ניסינו לזהות כל צמח בנפרד – כלומר עבור כל צמח בנינו
רשת עם נוירון פלט אחד, וערך הנוירון פשוט עונה על השאלה "האם הקלט הניתן
מצביע על הצמח שעבורו נבנתה הרשת?".
התוצאות עבור רשתות אלו מסתדרות עם
התוצאות של הרשת הכללית.
עבור אחד הצמחים קיבלנו אחוזי הצלחה קרובים
מאוד ל-100%, ועבור 2 הצמחים האחרים הדיוק היה באיזור ה-90% - כך שאם היינו מחברים
את שלושת הרשתות האלו לרשת אחת שאינה fully connected עם 3 נוירוני פלט, מספיק שאחד מהרשתות תחזיר פלט שגוי כדי להרוס
את התוצאה כולה.
תוצאות
וניתוחם
הרצנו את האלגוריתם עם שכבה אחת, 2
שכבות ו-3 שכבות חבויות, התוצאות יצאו דומות ולכן נציג רק 2 מהגרפים:
ריצה
עם אימון על 75 מתוך 150 הדוגמאות, ושכבה חבויה אחת:

ניתן לראות מהגרף שהתוצאות הטובות ביותר
נתקבלו מריצה עם 10, 65, 105 או 115 נוירונים – שם התוצאה המינימלית היא מעל 50%
דיוק, התוצאה הממוצעת היא בעלת כמעט 85% דיוק והתוצאה המקסימלית היא כמעט מדויקת
לחלוטין.
כמו
הריצה של הגרף הקודם, עם 2 שכבות חבויות (בשכבות החבויות היה מספר זהה של
קודקודים):

כאן 65 או 80 נוירונים בכל שכבה נתנו את
התוצאה הטובה ביותר, התוצאות דומות לתוצאות עם שכבה חבויה אחת, אך מעט פחות טובות.
בריצה עם 3 שכבות חבויות קיבלנו תוצאות
דומות לריצה עם 2 השכבות, אך פחות טובות גם הן (כדי לקצר במעט את הדו"ח שיצא
ארוך ממילא, חסכנו בגרפים).
ריצה
עם אימון על 30 מתוך 150 הדוגמאות ושכבה חבויה אחת:

ניתן לראות כאן שהרשת עדיין מצליחה
לקטלג את הצמחים בצורה משביעת רצון – אם כי פחות טובה מאשר כשהשתמשנו בקבוצה יותר
גדולה על מנת לאמן את הרשת.
בדומה להשוואה הקודמת, כאשר השתמשנו
בקבוצה של 75 על מנת לאמן את הרשת – גם כאן הריצות עם יותר שכבות נתנו תוצאות פחות
טובות, אבל עם 2 הבדלים עיקריים:
·
ההבדלים בין
התוצאות היו גדולים יותר בין הריצה עם ה-3 שכבות והריצות האחרות.
·
בריצה עם 2 השכבות
היה חריג אחד: כאשר ניסינו 65 נוירונים בכל שכבה – קיבלנו תוצאה יותר טובה מהשכבה
הראשונה (0.84 דיוק בממוצע).
הרצה של 3 רשתות נפרדות – על כל צמח
בנפרד
על מנת לבדוק את הביצועים של הרשת ה-Fully connected שלנו, עשינו ניסוי
נוסף בו החזקנו 3 רשתות נפרדות – כל רשת מזהה צמח אחד, ולאחר מכן חיברנו את
התשובות של כל הרשתות, כלומר תשובה נחשבה כנכונה אם כל רשת בנפרד ענתה נכון (2
רשתות אמרו "לא" ואחת "כן").
מספר הנוירונים המצוין בגרף הוא מספר
הנוירונים בכל רשת, כלומר יש בעצם פי 3 נוירונים בכל הרשתות ביחד.
ריצה
עם אימון על 75 דוגמאות מתוך 150, ושכבה חבויה אחת בכל רשת:

ניתן לראות שהתוצאות מאוד דומות לרשת
המקורית, אפשר לאמר כי היינו מעדיפים להשתמש ברשת הרגילה מכיוון שצריך הרבה פחות
נוירונים על מנת להריץ אותה והחישוב שם הרבה יותר מהיר.
אותה
ריצה עם 3 שכבות חבויות בכל רשת

ניתן לראות שבדומה לתוצאות הקודמות,
האלגוריתם מאמן רשת בעלת יותר שכבות בצורה פחות טובה ומגיע לתוצאות פחות טובות,
עבור 20 או 10 נוירונים בכל שכבה התוצאה הייתה ממש לא טובה, כנראה שזאת מכיוון
שמספיק שאחת הרשתות לא תחזיר תשובה נכונה.
כאשר הרצנו עם 2 שכבות חבויות, התוצאות
היו פחות טובות משכבה חבויה אחת, אבל לא בצורה קיצונית.
ריצה
עם אימון על 30 דוגמאות מתוך 150, ושכבה חבויה אחת:

בדומה להשוואות הקודמות, גם כאן קיבלנו
תוצאה דומה לריצה עם הרשת ה-fully connected, אך שוב נזכיר שכאן אנו משתמשים בהרבה יותר נוירונים, ולכן נראה
כי הרשת היחידה עדיפה.
הריצות עם 30 הפרטים היו פחות סלחניות,
ושימוש ב-3 הרשתות הנפרדות הניב שגיאות הרבה יותר גדולות כאשר השתמשנו ב-2 ו-3
שכבות, בריצה עם 3 השכבות קיבלנו שגיאה ממוצעת גדולה יחסית (של יותר מ-0.3) גם
עבור שימוש ב-40 נוירונים בכל רשת.
עוד משהו קטן - זיהוי של כל צמח בנפרד
על ידי רשת עם נוירון פלט אחד
אלו התוצאות עבור הרצה של רשת לזיהוי כל
צמח בנפרד, כלומר רשת נפרדת לזיהוי Iris-setosa, רשת לזיהוי Iris-versicolor ורשת לזיהוי Iris-virginica, כל רשת פשוט אומרת האם הצמח הוא מהסוג שהיא צריכה לזהות או לא,
בגרפים מוצגת מידת ההצלחה של הזיהוי (בממוצע, עבור כל 150 הדוגמאות) של כל אחת
מהרשתות.
אימון
על 75 מתוך 150 הדוגמאות:

ניתן לראות כי הרשת שצריכה לזהות את Iris-setosa מצליחה לעשות זאת כמעט בצורה מושלמת
בכל המקרים, בעוד ש-2 הרשתות האחרות מתקשות הרבה יותר ולרוב משיגות דיוק באיזור
ה-90%.
אימון
על 30 מתוך 150 הדוגמאות:

ניתן לראות בגרף שעדיין הרשת של ה-Iris-setosa עושה את עבודתה ללא בעיה ועם שגיאה
אפסית, בעוד הדיוק של 2 הרשתות האחרות יורד וכעת נדיר שהן מגיעות ליותר מ-90%
דיוק.
מסקנות
·
האגוריתם Back-Propagation רגיש מאוד
לפרמטרים, ובחירה לא נכונה שלהם לא תניב תוצאות טובות – ראינו זאת בהרבה ניסויים
שהרצנו ידנית.
-
בחירה נכונה
של המשקלים ההתחלתיים של הקשרים בין הנוירונים יש השפעה גדולה מאוד על הסיכוי לאמן
את הרשת בצורה טובה.
-
סדר ההזנה של
הדוגמאות לאימון הרשת חשוב מאוד על מנת להשיג תוצאות טובות.
·
מההרצות עם
רשת עבור כל סוג צמח בנפרד, ראינו כי האלגוריתם מצליח לזהות סוג אחד של צמח
באחוזים גבוהים מאוד, אך מתקשה במקצת להבדיל בין 2 הסוגים האחרים (שגיאה של כ-10%
עבור כל אחד מהם, אך עדיין משמעותית).
·
שימוש בכמה
שכבות לא משפר את ביצועי האלגוריתם ואפילו להפך – דבר זה נגרם כנראה מהמספר הקטן
של הדוגמאות שבעזרתן אימנו את הרשת.
·
שימוש ברשת Fully-connected מניב תוצאות
סבירות, אך טעונות שיפור. אנו משערים כי קישור הרשת בצורה יותר חכמה יניב תוצאות
יותר טובות – ראינו כי קיים הבדל בין הרצות עם טופולוגיה שונה.
·
הקטנת מספר
נוירוני הפלט משפרת את התוצאות, כנראה מכיוון שבצורה כזאת יש פחות סיכוי שאחד
מנוירוני הפלט ישבש את התוצאה כולה.