[wpum_restrict_logged_in]
[/wpum_restrict_logged_in]
בשיעור זה נדבר על עוד נגזרת של GAN שנקראת Interactive Gan.
מאמר זה שיצא ב 2016 של אוניברסיטת Berkeley בשיתוף עם חברת Adobe (היוצרים בין השאר של תכנת פוטושופ, וזה חשוב לצורך הבנת את השימושים של זה) לוקח את GAN למקום אחר קצת שמאפשר לעשות יצירה אינטראקטיבית, ז”א משולבת יצירה אנושית בשילוב עם אלגוריתם.
בסרטון זה ניתן לראות איך בכלי שלהם גם אדם שלא ממש יודע איך לעצב או לצייר וסתם משרבט יוצר יצירות יפות ומוצלחות. האלגוריתם ממש יוצר תמונה חדשה שנראית טוב בהתאם לשרבוט האנושי.
בואו נבין את המתמטיקה מאחורי תהליך בו מאפשרים למשתמש לקחת איזשהיא תמונה אמיתית של אוביקט (למשל תיק בדוגמה בסרטון) ולעצב על בסיסה תיק חדש ללא כל מיומנויות של עיצוב תיקים.
לאחר שמאמנים רשת GAN באופן הרגיל לעולם תוכן של תיקים ומקבלים תמונה אמיתית Xr (real), ראשית מחפשים את וקטור z (אותו מבוא לרשת ה Generator) אשר גורם ליצירת תמונת G(z) הדומה ביותר שניתן לתמונה האמיתית Xr. אותו וקטור z המייצר תמונה דומה ככל שניתן לתמונה הנתונה יסומן ב z*. הסימון L מייצג איזשהיא מטריקה בין תמונות.
ואז מאפשרים למשתמש לבצע פעולות עריכה שונות (שמסומנות ע”י f_g) כפי שראינו בסרטון (צביעה, מתיחה, כיווץ, הזזת נקודות קיצון ועוד…). ברור שלאחר פעולות אלו התמונה (שמסומנת ע”י v_g) כבר לא תיראה כמו תמונה אמיתית של תיק, כי המשתמש הממוצע כנראה יהרוס את התמונה.
ולכן מה שעושים כעת זה שוב לחפש וקטור z אופטימלי שממזער את הביטוי הבא (שמורכב משלושה גורמים שונים):
הראשון: מרחק מינימלי בין התמונה שנערכה (וכנראה נהרסה) v_g לבין תמונה כלשהיא שיוצאת מה Generator ועברה את אותה סדרת פעולות עריכה f_g.
השני: גורם חלקות לפי משקל _sλ ז”א שאותו z אופטימלי יהיה כמה שיותר קרוב ל z הראשוני. (שלא יהיו שינויים דרסטיים)
השלישי: הגורם של ה GAN הסטנדרטי שמתמרץ תמונות עליהן רשת ה Discriminator אומרת שאמיתיות. גורם זה אופציונאלי, אומנם משפר ניראות אך מאט קצב.
את התוצאות כבר ראיתם, ולכל אלו שעדיין שואלים למה GAN טוב ולמה משמש ? אז כעת ראיתם שואריאנט זה: interactive GAN הינו יישום מסחרי ולא רק למטרות מחקר ושעשוע.
בשיעור זה נדבר על עוד נגזרת נחמדה של GAN שנקראת Info Gan.
מאמר זה שיצא ב 2017 שבשמו המלא נקרא: “Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets”
ז”א ייצוג שניתן לפירוש של רשתות GAN באמצעות מקסום אינפורמציה. שיטה זו מנסה לתת פרשנות שניתנת לשליטה על המשתנים הנסתרים (Latent variables) שיש ב GAN (ז”א אותו קלט של מספרים אקראיים שסומן כ z) במבוא של ה Generator.
ראשית ניזכר או נכיר מושג מפתח בו משתמשים, שלקוח מתורת האינפורמציה והינו אינפורמציה הדדית Mutual Information בין שני משתנים אקראיים. זהו מדד (המסומן ב I) המתאר עד כמה המשתנים תלויים זה בזה או במילים אחרות זהו מדד המציין עד כמה מידע ממשתנה אקראי אחד ניתן להשיג ממידע ממשתנה אקראי השני:
הרעיון הוא להוסיף לאותו קלט של משתנים נסתרים z עוד אוסף משתנים שיסומנו ב- c שלמבנה שלהם יש קשר לאופי ה DB. ולהוסיף עוד מרכיב למשוואת המינימקס הסטנדרטית של ה GAN:
שבנוסף ימקסם את האינפורמציה ההדדית.
אם V(D,G) הינו הביטוי המוכר לנו מ GAN אותו נרצה למזער כשמאמנים את ה Generator ולמקסם כשמאמנים את ה Discriminator אזי נחסיר ממנו מרכיב עם משקל λ שהינו האינפורמציה ההדדית בין משתנה c לבין המוצא של רשת ה Generator. ז”א נרצה לקבל רשת Generator לא רק כזו שתדע לזייף ולרמות את רשת Discriminator אלא גם תוציא פלט שקשור באופן ישיר למשתנה c. וזאת להבדיל ה GAN הסטנדרטי בו הקשר בין הקלט z לבין המוצא G(z) מקרי בהחלט.
כעת נראה מה יוצא מהאילוץ הנוסף הזה.
בתמונה מימין ניתן לראות מה קורה כשמשנים קלות את משתני הקלט ב GAN רגיל – רואים את אותה הספרה עם שינויים עדינים וחסרי משמעות. בתמונה משמאל ניתן לראות מה קורה כשמשנים את משתני הקלט c בגישת ה InfoGan שהוא מוגדר כמשתנה קטגורי (ז”א בדיד) בין 0 ל 9 – מה שרואים זה שהספרה עצמה משתנה.
שימו לב שזה עדיין אימון Unsupervised ז”א לא מתייגים את ה DB (למשל אם זה MNIST לא משתמשים במידע של מהי כל ספרה) על אף שיצא שה InfoGan כאילו למד לבד לייצר תמונה של ספרה בהינתן משתנה בדיד c ביום 0 ל 9 המייצג ספרה. וזו תוצאה מדהימה!
כל מה שדאגנו זה המבנה של משתנה c (בדיד בין 0 ל 9) שיתאים למבנה הDB שמקרה של MNISTמכיל עשר סוגי תמונות.
דוגמא נוספת כשהגדירו את משתנה c כוקטור עם שני ערכים רציפים בין -2 ל 2, ניתן לראות ששינוי עדיין של c1 מביא לסיבוב הספרה ושינוי עדין של c2 מביא לעיבוי הספרה.
התוצאות המדהימות האלו חזרו באימון על מאגרי תמונות אחרים למשל של ריהוט שם שוב שתי ערכי c לקחו תפקידים של סיבוב ורוחב, וב DB של פנים תלת מימדיות (ז”א בזוויות צילום שונות) שם שוב על ערך של c לקח תפקיד של azimuth, elevation, lightning, wide-narrow שאלו מאפיינים של ה DB.
ודוגמא אחרונה במאגר תמונות פנים, ערכי c שוב קיבלו תפקידים של מאפייני ה DB כמו azimuth, משקפיים\ללא משקפיים, סגנון שיער והבעות פנים.
כאמור אף אחד לא הגדיר לאלגוריתם מה יש ב DB ומה הם מאפייניו, הדבר היחיד זה ההגדרה של משתנה c ככזה התואם את מאפייני ה DB וכמובן האילוץ למקסם את האינפורמציה ההדדית בין משתני c למוצא ה Generator. מה שמקבלים זה יכולת לחולל\לג’נרט תמונות עם שליטה על מה יהיה בתמונה. (בהתאם לקלט c)
מיועד ל- כל אחד (כתבה לא טכנית)
נכתב על ידי תמיר נווה
1) לא יפגע רובוט לרעה בבן אדם, ולא יניח, במחדל, שאדם ייפגע.
2) רובוט חייב לציית לפקודותיו של אדם, כל עוד אינן סותרות את החוק הראשון.
3) רובוט ידאג לשמור על קיומו ושלמותו, כל עוד הגנה זו אינה עומדת בסתירה לחוק הראשון או לחוק השני.
אלו הם שלושת חוקי הרובוטים מספר המדע הבדיוני של אסימוב משנות ה-50. נראה כי המדע הבדיוני הזה מתקרב מאוד למדע האמיתי. הנושא שנקרא תאונות AI מדאיג יותר ויותר אנשים בעולם והוא המוטיבציה למאמר הזה.
כשמגדירים מטרת על לאלגוריתם או לרובוט שהינה מורכבת ודורשת הרבה פעולות קטנות מסוימות בכדי להשלימה, עלולים להיווצר בעיות בדרך. לעיתים בסוף האימון האלגוריתם יידע איך למקסם את התגמול אך לא ידע לבצע את המשימה… מנגד אם בן אנוש יפקח על תהליך האימון באופן שוטף זה גם לא ריאלי כי מדובר במאות אלפי איטרציות אימון. (כמובן זה תלוי משימה).
OpenAI (אותו ארגון ללא כוונת רווח של אלון מאסק) בשיתוף עם DeepMind (החברה שפיתחה את האלגוריתם שניצח את אלוף העולם ב GO ונרכשה ע”י גוגל בחצי מיליארד דולר) פרסמו גישת אימון המשלבת פיקוח אנושי מינימליסטי שנועד לפתור בעיה זו.
במאמר שלהם הם מציעים אימון מבוסס פידבק אנושי בינארי, ז”א מידי פעם להראות לצופה אנושי שתי דרכים שהאלגוריתם ניסה ולקבל פידבק איזו משתי הדרכים טובה יותר על מנת להגיע למטרת העל. בשיטה זו הם אימנו למשל רובוט לעשות סלטה אחורית (בסימולציה הוירטואלית MuJoCo):
ניתן לראות בוידיאו הזה שהסוכן Agent מנסה (בהתחלה באופן אקראי) להתהפך ומוצגת לצופה האנושי בכל פעם שתי “התנהגויות” ועל הצופה האנושי להחליט מי מהן טובה יותר בכדי להשיג את המטרה של לבצע סלטה אחורית. שימו לב שהצופה האנושי לא אמור לתת פידבקים על כל תהליך האימון (שהינו ארוך מאוד) אלא רק באופן מדגמי על קטעים קצרים. (הם הראו שיש דרך שזה מספיק)
באימון זה למשל נעזרו ב 900 החלטות אנושיות (דרש עבודה של שעת אדם בלבד) ולא השתמשו בתגמולים הקלאסיים הנהוגים ב Reinforcement Learning. באימון קלאסי התגמולים נקבעים לפי התכנות או הפרשנות של הסביבה של הסוכן\רובוט דבר שאומנם קורה אוטומטי אך לא תמיד מביא לתוצאות הרצויות.
למעשה OpenAI’s Safety Team היא שעומדת מאחורי מחקר זה כי כאמור אם נותנים מטרת על רחוקה ונותנים לתהליך האימון לרוץ לבד, קשה לנבא מה יקרה. שיטות אלו יותר מבוקרות, לעיתים יותר יעילות ועשויות למנוע אסונות.
גישה זו גם הראתה תופעה מעניינת בה האלגוריתם מנסה לרמות את הצופה: באימון של זרוע רובוטית להרים חפץ, הצופה שנותן את הפידבקים רואה זאת בתמונה דו ממדית בה לעיתים קשה להעריך עומק. הזרוע ה-“שובבה” למדה שיש מיקומים ומנחים כאלו שהצופה נותן פידבק חיובי כאילו הזרוע אכן בדרך להרים את החפץ אך בפועל היא לא באמת קרובה לאובייקט (בציר העומק).
במאמר הם מציגים גם אימון של סוכן המשחק במשחקי אטארי מגוונים:
בהנחיות שלהם לנותני הפידבקים האנושיים הם אומרים: שחק בעצמך במשחק כמה דקות, ואז קבל בכל פעם שתי קטעי וידאו קצרים ותן תגמולים טובים יותר על דברים כמו כשהסוכן יורה לעומת כשלא יורה (במשחק יריות), כשאתה עוקף ולא כשעוקפים אותך (במרוץ מכוניות), וכו’…
גישה זו אומנם מונעת אימונים שעשויים להתפתח לתאונות AI, אך מנגד ניתן רק לדמיין איך ייראה העתיד שלנו בו מתכנתים יכתבו קוד שיאמן רובוטים וסוכנים ואנשים טובים ואמינים (או לא טובים ולא אמינים) יפקחו על תהליכי האימון…
אחרי שהבנו את הרעיון המרכזי באלגוריתם GAN ואנחנו מאוד נלהבים לייצר Data מקורי כלשהוא,
נשיג Database גדול, נבנה רשתות Generator ו Discriminator , נאמן וניצור יש מאין יצירות…
אבל, נראה שהעסק לא כזה פשוט. לא כל אימון מתכנס ומצליח לייצר “זיופים” שעוברים את מבחן טיורינג.
קפיצת המדרגה שבאה אחרי GAN הינה DCGAN שיצא ב 2015 שגם הציע להשתמש ב CNN=Convolutional Nueral Network לרשתות ה Generator וה Discriminator וגם סיפק כמה עקרונות ל-איך לגרום לכך להתכנס.
משמעות השם הינה: DCGAN=Deep Convolutional GAN.
ניתן לראות בתרשים הזה את רשת ה Generator המוצעת במאמר, היא מקבלת וקטור בן 100 מספרים אקראיים (כמו במאמר המקורי) ובאמצעות פעולות Deconv (שנקראות גם transpose conv או fractionaly strided conv) מגדילה את הטנזור יותר ויותר עד שמגיע לגודל של תמונה.
במאמר הם מסכמים את העקרונות שהסיקו שגורמים לאימון להצליח:
כל התובנות האלו הם די טכניות לגבי הארכיטקטורה, וגם אין להם בהכרח הסבר מוצלח מלבד תוצאות אמפיריות,
ז”א יותר מצליחים לאמן ככה את המודל, ראו למשל את תמונות חדרי השינה המג’ונרטות הללו.
אבל החידוש הכי מעניין שהביאו DCGAN הוא מה שנקרא אריתמטיקה של תמונות או באופן כללי של דגימות המידע.
כזכור רשת ה Generator מקבלת כקלט וקטור z שהינו 100 מספרים אקראיים ואותו הופכת לתמונה. הדבר היפה הוא שהרשת למדה לייצר את הפלט שלה באופן רציף, ז”א ששינוי קטן בוקטור z בכניסה יביא לשינוי קטן במוצא. (זה כמובן נובע מהארכיטקטורה של הרשת). תופעות מעניינות שקורות הם למשל בשורה רביעית מלמטה וקטור z כלשהוא הביא לתמונה של חדר ללא חלון, ושינוי עדין של ערכי z משנים את החדר במעברים חלקים עד שהופך בהדרגתיות לחדר עם חלון, או טלוויזיה שאט אט הופכת לחלון.
ויותר מזה: אם עושים אריתמטיקה עם הוקטורים z מקבלים תמונות מג’ונרטות עם פרשנות מאוד אינטואיטיבית לנו כבני אדם. למשל בג’ינרוט של תמונות פנים ניתן לראות: מחוללים תמונות של גבר עם משקפיים, גבר ללא משקפיים ושל אישה ללא משקפיים. לכל תמונה כזו ישנו איזשהוא וקטור z שחולל אותה. לוקחים את וקטור z של הגבר עם המשקפיים פחות הוקטור z של הגבר ללא המשקפיים, מפחיתים וקטור z של האישה ללא המשקפיים ומה z החדש מחוללים תמונה שיוצאת … ניחשתם נכון! אישה עם משקפיים.
תוצאה מדהימה לכל הדיעות! ז”א לא רק שהאלגוריתם יודע לחולל יש מאין תמונות שנראות אמיתיות אלא גם יש לנו כבר שליטה חלקית על מה תהיה התמונה!
כפי שראינו בשיעור הקודם את הדיאגרמה שמראה איך מאמנים את אלגוריתם GAN.
אדבר על עולם התמונה אך כאמור זה יכול להיות סוג מידע אחר.
לא נעסוק בארכיטקטורות הפנימיות של הרשתות Generator, Discriminator (שאגב, במאמר המקורי הם בכלל Perceptron ולא CNN). אבל כידוע הרשתות הללו הינם אוסף גדול של מספרים אקראיים בהתחלה ולכן מיישמות פעולות מתמטיות חסרי משמעות. מה שיהפוך אותם למשיגות מטרה (יצירת תמונות אוטנטיות וזיהוי אם תמונה היא אוטנטית או לא) אלו פונקציות ה Loss שעל פיה נאמן אותם.
ניתן לראות באנימציה הזו איך תוצאת רשת ה Generator בהתחלה מחוללת תמונות אקראיות ולאורך תהליך האימון נראות יותר ויותר אמיתיות.
במאמר המקורי יש הוכחות מתמטיות יפות על איך אימון כזה עם פונקצית Loss (אותה מייד נראה) מהווה משחק מינימקס ויכולה להתכנס לנקודת איזון. לא נכנס כאן לתיאוריה של תורת המשחקים,
אבל נבין את האינטואיציה של האימון המשותף לסירוגין, ז”א איטרציות אימון של ה Generator ואז איטרציות אימון של ה Discriminator וחוזר חלילה.
נזכיר שרשת ה Generator (או בקיצור רשת G) מקבלת רעש אקראי המסומן z ומוציאה תמונה ורשת ה Discriminator (או בקיצור רשת D) מקבלת גם תמונות מזויפות וגם תמונות אמיתיות ממאגר תמונות נתון שמסומנות כ x. המוסכמה היא שרשת D אמורה להחזיר 0 לתמונות מזויפות ו 1 לתמונות אמיתיות.
ואז באיטרצית אימון של רשת G נשתמש בפונקציית ה Loss:
במידה ו G אכן טובה יותר מרשת D במשימתה (ז”א מצליחה לזייף תמונות ובכך לרמות את D) אזי ביטוי זה ישאף לאפס ואם להיפך G פחות טובה מ D ז”א מייצרת תמונות מזויפות ש D מזהה שאינן אותנטיות אזי ביטוי זה ישאף לאינסוף.
באיטרצית אימון של רשת D נשתמש בפונקציית ה Loss:
במידה ורשת D טובה מרשת G אזי ביטוי זה ישאף לאפס (ז”א D תגיד על X שאמיתי ועל G(Z) שמזויף).
במידה ורשת D פחות טובה מרשת G אזי ביטוי זה ישאף לאינסוף.
כדי להבין זאת פשוט זכרו שרשת D אמורה כשהיא מוצלחת להחזיר 0 על D(G(z))
ו 1 על D(x). המשתנה z די חסר חשיבות בהקשר זה, הוא פשוט קלט אקראי שאמור להיכנס לרשת G.
אלו, אם כן פונקציות ה Loss איתם אפשר לאמן אלגוריתם GAN. האימון לא תמיד מצליח בקלות כפי שנראה בהמשך. במידה והאימון כן הצליח נוכל לקחת רק את רשת G מהמנגנון הזה ולהשתמש בה ליצירת תוכן חדש (ללא רשת D שרק היוותה אמצעי לאימון).
בשיעור זה נבין את הרעיון שעומד מאחורי אלגוריתם GAN=Generative adversarial Network
אך לפני זה חשוב שנבין את רמת הפופולאריות של המאמר שהפך לתחום פורה בפני עצמו.
שימו לב לגרף הזה שמראה כמה מאמרים שמבוססים על GAN פורסמו מאז אותו מאמר ראשון ב 2014, שימו לב לאתר הזה (The Gan Zoo) שמרכז את כל הנגזרות שנולדו בגן החיות הזה.
כעת להבין את הרעיון המרכזי של האלגוריתם:
דמיינו צורף יהלומים שמומחה בזיהוי תכשיטים מזויפים ובנוכל שמנסה לייצר תכשיטים מזוייפים. האחד כל היום יושב בחנות ומקבל תכשיטים לבדיקה, חלקם אמיתיים וחלקם מזוייפים, ככל שעוברות השנים הוא משתפר באיבחונים שלו. השני יושב כל היום ומנסה למכור את הזיופים שלו ולפי תגובת חנויות התכשיטים משתפר במלאכת הזיוף. הזייפן משתפר בתחומו בזכות הבודק, והבודק משתפר בתחומו בזכות הזייפן.
רעיון זה ממומש באמצעות שתי רשתות נוירונים האחת נקראת Generator ותפקידה לחולל (לג’נרט) מידע באופן כזה שהרשת השניה תחשוב שהמידע אמיתי.
הרשת השניה נקראת Discriminator ותפקידה להחליט האם מידע כלשהוא הינו אמיתי או לא.
כשאני אומר מידע אמיתי אני מתכוון נראה כשייך לאיזשהוא עולם תוכן. למשל תמונות של זברות, למשל יצירות קלאסיות, למשל פרק במחזה של שייקספיר.
רשת ה Generator מקבלת כקלט רעש אקראי ותפקידה להוציא פלט מסוג מסויים. (למשל תמונה). רשת ה Discriminator מקבלת כקלט קלט מהסוג שמוציאה רשת ה Generator (שוב נניח תמונה) ומחזירה ערך בין אפס לאחד שמשמעותו מידת האותנטיות של הקלט. (כאשר 0 זה לא אותנטי בכלל ו-1 זה מאוד אותנטי)
כעת נתבונן בתרשים הזה כדי להבין איך מאמנים את שני הרשתות האלו. האימון של שתי הרשתות הללו מתבצע במקביל באמצעות איזשהוא Database, נניח של תמונות של זברות.
רשת ה Generator מקבלת בכניסה רעש אקראי ומוציאה תמונות שבתחילת האימון גם הן תהיינה רעש לבן ואם האימון יצליח יהיו תמונות מזויפות של זברות.
רשת ה Discriminator תקבל בכניסתה לסירוגין תמונות מזוייפות שמגיעות ממוצא ה Generator ותמונות אמיתיות שמגיעות מה Database האמיתי שלנו (ז”א תמונות אמיתיות של זברות).
אימון זה הינו Unsupervised ז”א איננו צריכים לתייג את התמונות של הזברות כיוון שבכל איטרציה של הזנת תמונה כלשהיא לרשת ה Discriminator , ה Ground Truth שלנו הוא בינארי ואנחנו יודעים אותו בקלות: אם הוכנסה תמונה מזויפת או אם הוכנסה תמונה אמיתית.
כעת בארכיטקטורה זו, כל מה שנותר זה להגדיר מהי פונקצית ה Loss שתגרום לכך שהרשתות יאלצו להשתפר במשימתן.
מודלים דיסקרימנטיביים כמו קלאסיפיקציה או רגרסיה מוציאים פלט על בסיס קלט נתון. להבדיל, מודלים ג’נרטיביים מוציאים פלט שהינו דגימות לפי התפלגות כלשהיא שמאפיינת database כלשהוא.
database ז”א מאגר נתונים לאו דווקא מתויג (unsupervised data) יכול להיות למשל אוסף תמונות מבלי שיש רשימות שאומרות מה יש בכל תמונה כמו שנדרש בבעיית הקלאסיפיקציה שהינה בעיית supervised learning.
אם כן לדוגמה נאמן מודל ג’נרטיבי על אוסף תמונות לא מתויגות של זברות, ומטרתו המודל (הרשת) “להבין” באופן מפורש או לא מפורש את ההתפלגות של ה database או במילים אחרות איך אמורה להראות זברה. וליצור\לג’נרט\לחולל תמונות נוספות של זברות מבלי להעתיק מהמאגר הנתון, ז”א ליצור תמונות חדשות יש מאין.
מודלים ג’נרטיביים מחלקים לכאלו שגם יודעים להוציא באופן מפורש את פונקצית הפילוג של ה dataset הנתון ולכאלו שלא יודעים להוציא באופן מפורש אך עדיין יודעים לחולל דגימות שתואמות לאותה התפלגות.
שתיים מהגישות שצברו פופולאריות בעיקר כי הן מבוססות Convolutional Nueral Network הינן GAN=Generative Adversarial Network ו .VAE=Variational Auto Encoders
בשעורים אלו זה נדבר על GAN שהחל במאמר ב 2014 ונהיה תחום מחקר ופיתוח פורה עם מגוון תוצאות מדהימות שחלקן עוברים את מבחן טיורינג יותר וחלקן פחות. (לעבור את מבחן טיורינג ז”א שבן אנוש לא ידע להבדיל אם מדובר בתוצאה אנושית או מלאכותית)
למשל נראה את הסרטון הזה שמדגים איך אלגוריתם למד לצייר בתים.
בהתחלה ניתן לראות שהרשת מציירת כל מיני ציורים אקראיים וחסרי משמעות, אך לאט לאט ככל שהאימון מתקדם משתפרת ומציירת ציורים שקצת יותר נראים כציורים, ועד שכבר מתחילים לזהות שמדובר בציורים של בתים, שגם הם משתפרים ונהיים כבר ציורים מוצלחים של בתים.
מדהים לא ?
מיועד ל- כל אחד (כתבה לא טכנית)
נכתב על ידי תמיר נווה
Data Sciense עוסק בלהסיק תובנות ממידע.
Machine Learning עוסק בפיתוח אלגוריתמים ושיטות שמאפשרים למחשב ללמוד.
שני תחומים אלו נהיו מאוד פופולאריים, והרבה אנשים שרוצים להיכנס ל-“ספורט” הזה, לומדים את התיאוריה וכשניגשים לראיונות עבודה נתקלים בפרדוקס המוכר: “אבל אין לך ניסיון…”, ואיך ניתן לצבור ניסיון אם אין מקום עבודה שיקבל אותך כדי לצבור ניסיון ? ? ?
בכתבה זו אציג את אחת השיטות הפרקטיות להיכנס לספורט הזה דרך תחרויות עולמיות נחשבות:
הכירו את “Kaggle“: שהוקמה באוסטרליה ב 2010 ונרכשה ב 2017 ע”י גוגל (אך שמרה על השם והמיתוג שלה) והינה פלטפורמת לתחרויות בין אלגוריתמאים ואנשי DataSciense ו Machine Learning. התחרויות פתוחות לציבור הרחב בחינם וחלקן מזכות בפרסים שיכולים להגיע עד מיליון וחצי דולר.
אתר Kaggle לא רק מאפשר להתחרות אלא גם מעודד שקיפות ועזרה מהקהילה, ז”א שאפשר ללמוד מבלוגים של המומחים הגדולים ואפשר להעלות קוד ולקבל עליו פידבקים ממומחים אחרים.
מי שמממן את הפרסים ומספק את ה Database שנדרש לפיתוח האלגוריתם הם חברות, ארגונים וגופי מחקר שרוצים לפתור בעיה כלשהיא ומשתמשים בחכמת ההמונים ומייצרים תחרות בין ההמונים בכדי לקבל פתרונות.
לצורך המחשה אציג כמה מהתחרויות:
שיפור הדיוק של Department of Homeland Security בזיהוי איום שווי פרסים של 1,500,000$
שיפור הדיוק של הערכת מחירי בתים Zillow שווי פרסים של 1,200,000$
זיהוי גרעין התא (לקידום הרפואה) שווי פרסים של 100,000$
ניבוי תגובת השוק לרכישות גדולות שווי פרסים של 10,000$
זיהוי שיימינג ברשתות חברתיות שווי פרסים של 10,000$
ניבוי גישות מיחשוב הדרושות לעובד חדש שווי פרסים של 5,000$
זיהוי זן ציפור על בסיס הקלטות שמע שווי פרסים של 1,800$
ניבוי אנרגיה סולארית על בסיס נתוני מזג אוויר שווי פרסים של 1,000$
ניבוי מכירות של חנויות פרס לא כספי אלא הזדמנות לעבוד ב Walmart
ובכן,Kaggle צברו הרבה בעיות, נתונים ופתרונות, להלן וידאו של ארבע דקות בו מנכ”ל Kaggle אנטוני גולדבלום מספר על מה למדו ממיליוני משתמשים שהעלו את המודלים\האלגוריתמים שלהם:
זה מה שהוא מספר (בתמציתיות) לגבי שלבי העבודה הקלאסיים:
1) לנתח את ה Data מכל כיוון אפשרי
להציג בכל מיני דרכים, להבין כל משתנה, להבין איך נאספו הנתונים…
2) לבנות פיצ’רים
מה מהמידע הכי ישרת את פתרון הבעיה ? פה הוא נותן דוגמא של מציאת מכונית הכי טובה למכירה ומסתבר שהזוכה בחר בצבע המכונית כאחד הפיצ’רים הדומיננטים בקבלת ההחלטה מתוך הנחה שאם זה צבע ייחודי זה אומר שמי שקנה אותה היה נלהב בהתחלה וכנראה שמר עליה היטב.
3) בחירת המודל
Random Forest היה מאוד פופולארי ואז היה מעבר ל Gradient Boosting Machine
אם כי בחירת המודל לא חשוב כמו ששלב 2 חשוב.
מיועד ל- מתחילים (כתבה קצת טכנית)
נכתב על ידי תמיר נווה
שימושי של בינה מלאכותית לאומנות (לא בהכרח להחליף אומנים אלא לסייע ביצירתם עם בינה מלאכותית) הוא תחום מדהים שמתפתח ללא הפסקה. פרויקט מחקרי בהקשר זה נקרא Magneta שם תוכלו למצוא למשל ליווי מלאכותי לנגינה בפסנתר.
אבל בכתבה זו נכיר את אחד היישומים המרשימים שנולדו כנגזרת של GAN=Generative Adversarial Networks שנקרא CycleGan:
חוץ מלהמיר חיות לחיות אחרות, גם ממירים תמונות של חורף לקיץ, תמונות מז’אנר אומנות אחד לאחר, נותנים חיים לערים עתיקות ע”י הפיכתן לערים מודרניות ואפילו פרויקט ישראלי בו הופכים תמונת פנים אינטראקטיבית לפורטרט ירקות.
כאמור האלגוריתם עוסק בלהמיר תמונות מעולם תוכן אחד לתמונות מעולם תוכן שני. מה שמיוחד ב CycleGan בשונה מאלגוריתמים קודמים שממירים תמונה מסוג אחד לתמונה מסוג שני הוא שאין צורך בזוגות תמונות תואמות כדי לאמן אותו, אלא רק באוסף תמונות מסוג אחד ואוסף תמונות מסוג שני (מבלי שיהיו זוגות תואמים, למשל תמונה של פסל החירות שצולמה בחורף עם אותה התמונה של פסל החירות שצולמה בקיץ). יתרון זה מאוד מקל כי להשיג מאגר תמונות של זוגות תואמים זו משימה הרבה יותר קשה מאשר להשיג שני מאגרי תמונות שונים ובלתי תלויים.
כיוון שאין זוגות תמונות תואמות, הטריק של אלגוריתם CycleGan הינו לאמן המרה של תמונה מעולם תוכן א’ לעולם תוכן ב’, ולאמן בחזרה המרה של תמונות מעולם תוכן ב’ לעולם תוכן א’ כך שהמסלול המחזורי (א’ ל-ב’ ומשם ב’ ל-א’) יחזיר לנו תמונה דומה ככל הניתן למקור. אילוץ זה מחייב את ההמרה (מא’ ל-ב’) להיות כזה שהתמונה תיראה אותו דבר רק שהינה מעולם ב’. (ז”א הזברה שנוצרה מתמונת הסוס תהיה באותה התנוחה והזווית צילום של תמונת הסוס המקורית)
כדי להבין את אלגוריתם CycleGan צריך להבין איך אלגוריתם GAN (הבסיסי) עובד. אנסה בכל זאת לתת את המבנה גם לקורא שהדברים זרים לו:
ישנן שתי זוגות של רשתות בסיפור הזה (Generator, Discriminator),
זוג אחד: המרה מעולם תוכן א’ ל-ב’ (Generator), ורשת זיהוי עולם תוכן ב’ (Discriminator).
זוג שני: (ההפוך) המרה מעולם תוכן ב’ ל-א’ (Generator), ורשת זיהוי עולם תוכן א’ (Discriminator).
מאמנים כל זוג רשתות כמו שמאמנים רשת GAN רגילה כמו בתרשים הסכמטי הבא:
ובדומה את זוג הרשתות השני.
כמו כן מאמנים את התהליך הציקלי (המחזורי) בשני הכיוונים שלו (ז”א מעולם תוכן א’ ל-ב’ ולהיפך), כך שתמונה שמקורה בעולם תוכן כלשהוא שחזרה לאותו עולם התוכן, אמורה להיות זהה ככל הניתן.
תרשים סכמטי עבור עולם תוכן א’:
ובדומה מאמנים עבור עולם תוכן ב’.
והתוצאות המדהימות מדברות בשם עצמן!
זו למשל תמונה שסווגה ככישלון ע”י כותבי המאמר, אם כי זהו כשלון מעניין לכל הדעות:
מיועד ל- מתחילים (כתבה קצת טכנית)
נכתב על ידי תמיר נווה
המאמר הזה בניו יורק טיימס מתאר איך פורסם ב Reddit סרטון פורנו שבו מככבת מישל אובמה, מזעזע?
כן, די… אבל העולם השתנה וכדאי שנבין את זה.
כידוע ההתקדמות המדעית טכנולוגית בבינה מלאכותית משרתת מגוון תחומים שמקדמים את האנושות: רובוטיקה, רפואה, רשתות חברתיות, מסחר ועוד… יש תחום אחד שנקרא Generative Models שמאוד מרתק וסוחף אבל מעבר לכמה יישומים מועילים שנולדו ממנו (למשל ג’ינרוט גרפיקה למשחקי מחשב) הרבה מהעיסוק בו הינו למטרת שעשוע ומחקר. הרבה שואלים למה זה משמש ?
על אף שהתחום כביכול לא מאוד שימושי, הוא עדיין משנה את העולם של כולנו (ולא רק של החוקרים הנלהבים שעוסקים בו). וזה בגלל שיש בו הרבה יישומים לא כל כך טובים…
קשה להישאר אדישים לטכנולוגיה שמערערת את כל הבטחון שיש לנו במה שאנחנו רואים או שומעים ומקשה עלינו להבין מה אמיתי ומה מזויף.
האם מה שייתכן שקביל מבחינה משפטית יכול להיות קביל באותה רמת סמך אחרי שחשופים לטכנולוגיה כמו זו למשל:
אחד הדברים שמסעירים את הרשת לאחרונה היא אפליקצייתFakeApp מבוססת קוד פתוח ע”י מפתח אנונימי (אפשר להבין מה…) ועובדת באופן הבא:
מזינים לה לפחות מאות תמונות (ככל שיותר יותר טוב) של הפנים שנרצה להשתיל ושל הפנים שנרצה להחליף, ולאחר אימון ממושך (תלוי בחומרה של המחשב שלך) מסוגלת לקבל וידאו של האדם עם הפנים שרוצים להחליף ומוציאה וידאו עם הפנים המוחלפות ברמת נראות מידי אמינה.
מה שהאפליקציה עושה זה חותכת רק את הפנים מתוך כל תמונה נתונה (וזאת בגישות עיבוד תמונה קלאסיות שאינן למידה עמוקה, למשל עם אלגוריתם HOG) ומאמנת שתי רשתות נוירונים מסוג Autoencoder אחת על פניו של המוחלף והשניה על פניו של המחליף. ולאחר האימון האפליקציה תדע לקבל כל תמונה של המוחלף ולהחליף את פניו בפנים האחרות (ולחבר לגוף באופן שנראה מאוד אמיתי).
רשת Autoencoder שהינה הבסיס לתהליך הזה הינה רשת נוירונים המורכבת משני חלקים Encoder מקודד, ו Decoder מפענח שמסודרים במבנה הבא:
ה Encoeder מקבל קלט כלשהוא (במקרה שלנו תמונת פנים), מעבד אותו ומחזיר פיסת נתונים קטנה יותר (z בתמונה). אם למשל תמונת פנים מיוצגת ע”י עשרות אלפי ערכים מספריים, אזי z במוצא ה Encoder (נקרא גם הנתונים נסתרים latent variables) יכול להיות בסך הכל עשרות מספרים. ז”א ה Encoder מעבד ומאבד מידע, אבל השאיפה לאמן אותו כך שהמידע שיוציא ייצג את הקלט באופן כזה שיהיה ניתן לשחזר את הקלט המקורי.
ה Decoder מקבל את אותו הקוד המקוצר z ומטרתו לעבד אותו ולהרחיב אותו לגודלו מקורי (במקרה שלנו שוב תמונת פנים).
האימון של שני המרכיבים Encoder, Decoder נעשה במשותף והתגמול לכל אחד על הצלחתו היא כאשר התמונה במוצא ה Decoder זהה לתמונה בכניסת ה Encoder. אימון מוצלח של AutoEncoder משמעותו סוג של דחיסת נתונים או קידוד של הרבה מידע במעט מידע. יש לכך שימושים רבים אך במקרה שלנו השימוש הוא לייצג בתמציתיות מבנה פנים של אדם א כדי לשחזר (באמצעות Autoencoder שאומן אחרת) תמונה של פנים של אדם ב.
מי שרוצה את כל הפרטים הטכניים איך ליצור בעצמכם וידאוים מזויפים, גשו לכאן (דרוש ידע טכני בסיסי בלבד).
הרשת כעת מלאה בדוגמאות של החלפת שחקנים וסלבריטאים בסרטים:
אז מעתה, קבלו בעירבון מוגבל את מה שעינכם רואות…
כעת משהבנו איך מחשבים קונבולוציה בין מטריצות ננסה לענות על שאלה חשובה יותר והינה: למה קונבולוציות? או מה המשמעות של ביצוע פעולה זו ?
נסתכל בקישור זה שממחיש מאוד יפה איך עובדת קונבולוציה על תמונה ומה בדיוק היא עושה לתמונות.
כידוע תמונה מורכבת מפיקסלים שמיוצגים כמספרים בין 0 ל 255 אם זו תמונת Gray level ושלשת מספרים בין 0 ל 255 אם זו תמונה צבעונית. ראו איך אני עובר על פיקסלים בתמונה ומשמאל רואים את הערך המספרי בין 0 ל 255 של אותו הפיקסל (כאשר אפס משמעותו הכי שחור, 255 משמעותו הכי לבן וכל הערכים בניהם הינם גווני אפור). אם כך בעצם תמונה מיוצגת ע”י מטריצה מאוד גדולה.
פעולת הקונבולוציה נקראת גם פעולת סינון (פילטור) ומייד נראה המחשה של קונבולוציה עם תמונת הקלט הזו ועם כל מיני מטריצות גרעין Kernel או במילים אחרות כל מיני פילטרים שונים.
נתחיל במטריצת הגרעין שנקראת Sharpen כי מה שמייד נראה שעושה זה חידוד של התמונה. מטריצת גרעין מסוג Sharpen בגודל 3X3 לדוגמא היא המטריצה עם המספרים: 0,-1,0,-1,5,-1,0,-1,0
ניתן לראות את תוצאת הקונבולוציה שהינה תמונה מחודדת יותר ביחס לתמונה המקורית.
ולמה זה קורה ?
כאמור כל איבר או פיקסל בתוצאת הקונבולוציה, ז”א בתמונה המחודדת הינה תוצאה של סכום המכפלות של תשעה מספרים בהתאם לאיפה כרגע ממוקם החלון אותו אני מזיז.
כיוון שהמספרים במטריצת הגרעין הם כאלו שמגבירים את הפיקסל האמצעי (הוא הרי מוכפל תמיד בחמש) ומפחיתים ממנו את הסביבה שלו, הרי הפיקסלים מימין, משמאל, מלמטה ומלמעלה לפיקסל המרכזי מוכפלים ב 1- כל אחד. אז נקבל שפיקסל התוצאה הינו פיקסל המקור מועצם פי חמש פחות ארבעת הפיקסלים בסביבה שלו. פעולה זו מחדדת את התמונה כי היא מעצימה כל פיקסל ביחס לסביבה שלו. אם פיקסל היה בולט לפני (ז”א שונה מסביבתו) יקבל ערך גבוה, אם לא (ז”א דומה לסביבתו) אזי יקבל ערך נמוך.
בואו נשחק ונראה תוצאות של עוד פילטרים (ז”א מטריצות גרעין).
פילטר Blur (טישטוש), אשר אלו הערכים שלו, מטשטש את התמונה ובכך גם מנקה ממנה רעשים.
פילטר Left Sobel , אשר אלו הערכים שלו, מדגיש בתמונה שינויים משמאל לימין, פילטר Top Sobel מדגיש עליות מלמעלה למטה.
ופילטר Identity, אשר אלו הערכים שלו, משאירה אותה איך שהיא.
לסיום נראה כמה פילטרים פופולאריים עם מטריצת הגרעין שלהם, פילטרים שמחדדים תמונה, מטשטשים תמונה, מבליטים תמונה, מדגישים קצוות בתמונה. וזו גם הסיבה שקוראים להם פילטרים כי הם מסננים את התמונה ומשאירים פרטים מסוימים. פילטרים בעיבוד תמונה ובעיבוד אות שמע הם כלים מאוד שימושיים לעיבוד והם אבן היסוד של CNN=Convolutional Nueral Network.
נסו כתרגיל להבין מדוע ערכי מטריצות הגרעין\פילטר הללו עושות מה שהן עושות לתמונה.
קונבולוציה הינה פעולה מתמטית בין פונקציות שתוצאתה היא גם פונקציה. זו ההגדרה המתמטית לקונבולוציה רציפה ולקונבולוציה בדידה. הסימון המקובל לפעולת הקונבולוציה הינו *. לא נשקיע זמן בלהבין את ההגדרה הזו,
כי בהקשר שלנו הקונבולוציה נעשית בין מטריצות (שהינן למעשה פונקציות דו מימדיות בדידות) ומחזירה מטריצה.
נסביר בדיוק איך מבוצעת הפעולה המתמטית הזו, רק נזכור שבפועל המחשב כבר יעשה אותה, אנחנו בתור המפתחים נצטרך רק להבין את המימדים של התוצאה בהינתן המימדים של המטריצות המקוריות שלעיתים נקראות מטריצת הקלט ומטריצת הגרעין Kernel או הפילטר. מטריצת התוצאה תחושב ע”י החלקת מטריצת הגרעין\הפילטר על פני מטריצת הקלט. ובכל אזור חפיפה מחשבים את סכום המכפלות של האלמנטים החופפים בין המטריצות וזה יהיה אלמנט של מטריצת התוצאה.
למשל נסתכל על שתי המטריצות הללו: מטריצת הקלט משמאל (בגודל 3X3) קונבולוציה עם מטריצת הגרעין\הפילטר מימין (גם כן בגודל 3X3) ונבין איך מחשבים את מטריצת התוצאה (גם היא בגודל 3X3).
כל אלמנט במטריצה התוצאה הינו תוצאה של סכום של כל המכפלות בין כל האלמנטים החופפים בין מטריצת הקלט ומטריצת הגרעין כשהיא הפוכה, כאשר כל פעם מטריצת הגרעין ההפוכה מוסטת. האיבר הראשון (שמאלי עליון) של מטריצת התוצאה שהינו 13- חושב ע”י סכום המכפלות: 01+02+(-2)4+(-1)5
כעת נזיז את מטריצת הגרעין ההפוכה ימינה ונחזור על החישוב. כאשר האיברים החופפים אחרים כעת.
הפעם החישוב יכלול סכום של יותר מכפלות (כי יש יותר חפיפה בין המטריצות). החישוב יהיה:
01+02+03+(-1)4+(-2)5+(-1)6 וזה שווה ל 20- שהוא האלמנט האמצעי מלמעלה במטריצה התוצאה.
נמשיך באותו אופן ונראה איך נוצרת השורה הראשונה של מטריצת התוצאה, השורה השניה של מטריצת התוצאה, והשורה השלישית של מטריצת התוצאה.
לגבי המימדים של מטריצת התוצאה, לזה ניכנס בקורס למידה עמוקה. בשלב זה חשוב רק להבין את המכניקה שמאחורי חישובי הקונבולוציה.
[wpum_restrict_logged_in]
[/wpum_restrict_logged_in]
להבין פילטר של תמונה באופן אינטראקטיבי:
http://setosa.io/ev/imagekernels
בשיעור זה נבין איך בדיוק מחשבים כפל בין מטריצות.
לפני שנדון בפירוט נשים לב שכפל מטריצות אינו קומוטטיבי, ז”א אם נחליף סדר התוצאה תשתנה ולכן יש חשיבות מי היא המטריצה הראשונה ומי השניה בפעולת הכפל.
כמו כן נשים לב שכפל בין שני מטריצות מייצר מטריצה חדשה שהמימדים שלה שונים. מספר השורות של מטריצת התוצאה הינו כמספר השורות של המטריצה הראשונה ומספר העמודות של מטריצת התוצאות הינו כמספר העמודות של המטריצה השניה. כמו כן תנאי לכך שבכלל ניתן להכפיל מטריצות הינו שמספר העמודות של המטריצה הראשונה זהה למספר השורות של המטריצה השניה, אחרת לא ניתן להכפיל בין המטריצות.
למשל בין המטריצות הבאות לא ניתן לבצע מכפלה:
כי במטריצה הראשונה יש 2 עמודות ובמטריצה השניה יש שלוש (ולא שתים) שורות.
איך בפועל מחשבים כפל מטריצות ?
נסתכל על שתי מטריצות האחת בגודל 3×2 (ז”א שלוש שורות ושתי עמודות) עם איברי a (a11,a12,… וכו’) והשניה בגודל 2×3 עם איברי b.
שימו לב שהמספרים הסידוריים ליד a או b מייצגים מיקום במטריצה. למשל a12 הינו האיבר שבשורה ראשונה ועמודה שניה.
ונכפיל את שתי המטריצות האלו פעם בסדר הזה ופעם בסדר הפוך.
מדוע בכלל ניתן להכפיל את המטריצות בסדר הזה ובסדר ההפוך ?
בסדר הזה מספר העמודות של המטריצה הראשונה זהה למספר השורות של המטריצה השניה והינו 2 ובסדר ההפוך תנאי זה גם מתקיים והינו 3.
אם כן התוצאה הינה מטריצה בגודל 3×3 ומחשבים אותה ע”י סכימה של המכפלות. אז למשל איבר במיקום 1 על 1 (שורה ראשונה עמודה ראשונה) יחושב כסכום המכפלות של שורה ראשונה ממטריצה ראשונה (של ה aים) עם העמודה הראשונה של המטריצה השניה (של ה b ים) a11b11+a12b21
האיבר בשורה ראשונה ועמודה שניה במטריצה התוצאה יחושב ע”י a11b12+a12b22
וכך הלאה… למעשה תמיד האינדקס של איבר במטריצת התוצאה אומר איזה שורה לקחת מהמטריצה הראשונה ואיזה עמודה לקחת מהמטריצה השניה.
נראה מורכב למי שרואה זאת בפעם הראשונה אך עם קצת תירגול זה נהיה מאוד טכני. כל מה שצריך לזכור זה שורות של מטריצה ראשונה ועמודות ממטריצה שניה!
נדגים זאת עם מספרים אמיתיים, נכפיל שתי מטריצות A,B בגודל 2×2 ונקבל את מטריצת התוצאה באופן הבא.
למשל איבר 1,2 (שורה ראשונה, עמודה שניה) של מטריצת התוצאה מתקבל ע”י סכום המכפלות של שורה ראשונה ממטריצה ראשונה עם עמודה שניה ראשונה: 1(-1) + 21=3
למי שדואג שהחישוב אינו ברור או לא מוטמע מספיק אוכל להגיד שבפועל כשמפתחים אלגוריתמים בלמידה עמוקה לא ממש צריך להתעסק עם זה, כי כבר יש פונקציות מוכנות שעושות זאת בישבילנו.
לכן לא אקדיש לכך זמן נוסף ורק מי שרוצה להתעמק יעבור על דוגמאות אלו שוב ושוב.
מה שכן חשוב לנו בתור מפתחים זה להבין את המימדים, ז”א לאילו גדלי מטריצות ניתן לבצע מכפלות ואילו לא, ומה צפויים להיות המימדים של מטריצת התוצאה.
לאחר שדיברנו על נגזרות, גראדיאנטים וכלל השרשרת נעסוק מעט באלגברה לינארית. אין באמת צורך בלמידת אלגברה לינארית באופן מלא כדי ללמוד למידה עמוקה. יש כמה מושגים ופעולות אותם יש להכיר ואותם נראה כעת.
ראשית המושגים סקלר, וקטור, מטריצה וטנזור. סקלר הינו מספר, וקטור הינו אוסף מספרים מסודרים בשורה או בעמודה. מטריצה היא אוסף של מספרים המסודרים במלבן, וטנזור הינו אוסף מספרים המסודרים בקוביה תלת או רב מימדית. טנזור הינו למעשה המושג הכללי ביותר, ז”א שטנזור דו מימדי הוא בעצם מטריצה, טנזור חד מימדי הוא בעצם וקטור.
שימו לב לזוג המספרים הקטנים מימין לכל אלמנט. מספרים אלו מתארים את הגודל או המימדים של הטנזור. מימדים של מטריצה מתוארים כזוג מספרים הראשון כמה שורות יש בה והשני כמה עמודות יש בה.
למשל מטריצה 3×4 או 3×2 או 2×2
מימדים של טנזור בדומה…
פעולת ה transpose או בעברית שיחלוף, הינה פעולה שעושים אותה על מטריצה שהינה החלפת השורות בעמודות. את הפעולה מסמנים באמצעות t קטנה מימין למעלה למטריצה. למשל המטריצה הזו בגודל 2×3 תהפוך אחרי שיחלוף למטריצה בגודל 3×2. כאשר השורה הראשונה 6,2,-1 הפכה לעמודה הראשונה והשורה השניה 7,-5,0 הפכה לעמודה השניה.
מטריצה ריבועית (ז”א בעלת מספר זהה של שורות ועמודות) תישאר באותם המימדים לאחר שיחלוף, רק סדר המספרים ישתנה.
הדבר הנוסף החשוב שיש להכיר הינו כפל בין מטריצות. מטריצות ניתן להכפיל ולקבל מטריצה חדשה וזו פעולה בסיסית באלגברה לינארית. הפעולה מתבססת על סכום המכפלות של כל שורה ממטריצה ראשונה עם כל עמודה ממטריצה שניה. בשיעור הבא נתעמק בכפל בין מטריצות.
מיועד ל- כל אחד (כתבה לא טכנית)
נכתב על ידי תמיר נווה
סנונית מהפיכת הלמידה העמוקה הגיעה ב 2012 עם תוצאה טובה באופן משמעותי בתחרות זיהוי אוביקטים השנתית שנקראת ILSVRC. לראשונה אלגוריתם מבוסס רשת נוירונים עמוקה שנקרא Alexnet היצליח לזהות מה רואים במיליוני תמונות ברמת הצלחה של 85% בעוד המקום השני בתחרות דאז הגיע ל 74% הצלחה.
מאז ועד היום כל זוכי התחרות הזו משתמשים ברשתות נוירונים עמוקות (מה שכלל לא נחשב כ- main stream לפני), ולמעשה מיום ליום מסתבר שלמידה עמוקה מצליחה לא רק לבעיות ראייה ממוחשבת (כמו זיהוי מה רואים בתמונה) אלא גם לניתוח קול, ניתוח טקסט, רובוטיקה ובעצם כמעט לכל תחום.
מאז 2012 התחום לא מפסיק להתפתח ולהפתיע, אם נישאר בעולם התמונה, ב 2013 זכתה רשת נוירונים עמוקה בשם ZF Netעם 89% הצלחה, אחריה ב 2014 VGG עם 93% הצלחה, אחריה ב 2015 GoogleNet של גוגל עם 94% הצלחה, אחריה ResNet של מיקרוסופט עם 97% הצלחה, ומשם הדברים עוד התפתחו והרעיונות השתלבו כמו Inception v4 או Inception-resnet.
אבל איך זה שאלגוריתם מקבל 3072 מספרים (למשל תמונה ממאגר התמונות CIFAR10 שהינה בגודל 32X32 פיקסלים וכל פיקסל צבעוני ולכן מתואר ע”י שלוש מספרים: 32323=3072) ומחזיר מספר בין 1 ל עשר שמציין מה רואים בתמונה (מטוס, רכב, ציפור, חתול, וכו…).
הרי אותה רשת נוירונים עמוקה הינה אוסף (מיליונים) של פעולות אריתמטיות פשוטות ומוכרות לכולנו שמסודרות בסדר מסוים. משפט אחרון זה אולי נשמע הפשטה לא סבירה למי שלא מכיר, אבל זה באמת מה שיש ברשתות CNN= Convolutional Neural Network:
פעולות חיבור, פעולות כפל ופעולת תנאי (אם מספר גדול מסף מסויים אז תחזיר כך אחרת תחזיר כך)
האם זה כל מה שצריך כדי לתרגם תמונה למספר שמייצג מה רואים בתמונה ?
אין פה שום מתמטיקה כבדה ומסובכת ?
התשובה המאכזבת היא שלא, אין כאן!
אני לא מדבר על איך הגיעו לאותם אוסף פעולות אריתמטיות שפה כן יש מתמטיקה (ואגב ממש לא כבדה), אני מדבר על כך שאחרי שאימנו (איכשהוא) רשת CNN וכעת היא מצליחה לזהות מה רואים בתמונה, מסתבר שכל מה שהיא עושה זה פעולות אריתמטיות פשוטות בסדר מסוים!
מסתבר אפילו שיש הרבה יותר מאפשרות יחידה לסדר את אותם הפעולות האריתמטיות כך שיגרמו לרשת לזהות את התמונה באופן מוצלח. אפשר לאמן את אותה הרשת בכמה פעמים דרכים שונות ויצאו רשתות שונות שכל אחת תדע לזהות היטב.
אז בכל זאת מה עושות אותן מיליוני הפעולות האריתמטיות הללו בכדי לזהות מה רואים בתמונות ?
המסקנות של החוקרים של מה הפעולות שהרשת עושה על התמונה כדי לזהות מה רואים בה הם שהפעולות הראשונות (מה שנקרא השכבות הראשונות) מדגישות מאפיינים פשוטים כמו קצוות ושינויי צבע בתמונה בעוד הפעולות הבאות (השכבות הגבוהות שמקבלות כקלט את התוצאות מהפעולות הראשונות) ישלבו את המאפיינים הפשוטים ויסיקו אילו תבניות רואים בתמונה. (למשל אם יש כמה קוים ישרים ושני עיגולים יותר סביר שזה רכב מאשר אדם).
והנה עוד סרטון שסוקר כלי ויזואליזציה נוסף כללי יותר ועם הסברים:
נעיר שכדי לקבל רשת CNN מוצלחת יש לאמן אותה עם עשרות אלפי דוגמאות לפחות של איך אוביקט נראה כדי להצליח לזהות מופע חדש שלו, בעוד לנו בני האנוש מספיקים מאות, עשרות ולעיתים אף מספר בודד של דוגמאות ללמוד איך נראה אוביקט כלשהוא כדי שנזהה אותו.
אבל ההתקדמות לא נעצרת כאן, כי כמה שרשתות CNN קלאסיות השתפרו והן טובות כמו בני אנוש בזיהוי מה רואים בתמונה, מסתבר שהם לא באמת חכמות. למשל את התמונה הבאה כנראה יסווגו כבן אדם רגיל:
הדבר החם בעולם הזיהוי תמונות הגיע מג’פרי הינטון ונקרא Capsule Network (עוד לא ממש ברור איך לתרגם לעברית).
ג’פרי הינטון Geoffrey Hinton מאבות הלמידה העמוקה שהאמין ברשתות נוירונים עוד בשנות השמונים כשרב הקהילה ראתה בזה ענף חסר עתיד. (עיקר הביקורות היו: כשזה כבר כן עובד זה מקרי ואי אפשר להבין למה זה עובד כי זו קופסה שחורה).
דווקא הוא זה שלאחרונה יצא נגד CNN והביא לקהילה בשורה חדשה.
החסרון ב CNN הקלאסי, אותו באו רשתות הקפסולות לפתור הוא שפיצ’רים איבדו את מיקומם היחסי בתמונה כפי שניתן לראות בתמונה למעלה שם אכן יש שתי עיניים, פה ואף אך עדיין זו לא תמונה של פנים אמיתיות. רשתות הקפסולה באים בין השאר לפתור בעיה זו. על רשתות הקפסולות ארחיב בכתבה אחרת.