טכני קל

לחולל DATA חדש כדי לשפר סיווג (הרחבת Data בעזרת GAN)

מיועד ל- מתחילים (כתבה קצת טכנית)

נכתב על ידי תמיר נווה

מה עושים כשאין מספיק Data ?

כשרוצים לאמן רשת Deep Learning ואין מספיק Data ישנם מספר שיטות מה לעשות, העיקריות הינן:

  • – Data Augmentation (למשל בתמונות: סיבובים, הזזות, הרעשות, מחיקות, שינויי הארה)
  • – הקטנת המודל
  • – יצירת DB סינטטי
  • – עזרה לאימון ע”י Data Preprocessing (למשל בתמונות Cropping מתוך הבנה מה חשוב ומה מיותר בתמונה על מנת לסווג)

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

רציתי להתעמק ולהבין למה שזה יעבוד ועד כמה זה בכלל משפר תוצאות ?

גיגול קצר הביא אותי לשני המאמרים האלו: (ששניהם אגב יצאו במרץ 2018 ואף אחד מהם לא מצטט את השני)

DATA AUGMENTATION GENERATIVE ADVERSARIAL NETWORKS

GAN-based Synthetic Medical Image Augmentation for increased CNN Performance in Liver Lesion Classification

בחרתי להתעמק במאמר הראשון מבין השניים (שנקרא בקיצור DAGAN), כי הם מצרפים לו קוד שאפילו רץ לי במכה ראשונה 🙂

בתמונות פנים הבאות ניתן לראות שהתמונות האמיתיות (לקוחות מ VGG-Face) הם רק בעמודה השמאלית הן של הגברים והן של הנשים, ובכל השאר העמודות התמונות מג’נרטות\מזויפות. (ז”א תוצר של DAGAN)

תודה ל DATA AUGMENTATION GENERATIVE ADVERSARIAL NETWORKS

איך בדיוק קורה הקסם ?

הרעיון לקבל תמונה ממחלקה מסוימת ולחולל על בסיסה תמונות נוספות מאותה מחלקה באמצעות Wasserstein GAN (שהינו שיכלול של אלגוריתם GAN).

מדובר על Database המחולק לכמה מחלקות ומטרתנו להגדיל את ה DB כדי לשפר רשת סיווג (אחרת).

הרשת שמגדילה את ה DB מורכבת מGeneratror  ו Discriminator.

רשת ה Generator מנסה לשנות\לעוות את התמונה בכל אופן שמצליחה כל עוד התמונה נשארת באותה מחלקה. רשת ה Discriminator תפקידה לקבל זוג תמונות מאותה מחלקה ולהחליט אם הם באמת שייכות לאותה מחלקה או שאחת מהן מזויפת (ז”א תולדה של ה Generator).

התרשים הבא (לקוח מהמאמר) והוא מסביר הכל:

תודה ל  DATA AUGMENTATION GENERATIVE ADVERSARIAL NETWORKS

מאמנים רשת Generator (צד שמאל בתרשים) המקבלת רעש גאוסיאני (z) ותמונה אמיתית (xi) ממחלקה c ועל בסיסם לג’נרט תמונה מזויפת (xg). ובמקביל לאמן רשת Discriminator (צד ימין בתרשים) להבדיל בין זוג תמונות אמיתי (xi, xj) ממחלקה c לבין זוג תמונות שאחת מהן אמיתית ואחת מזויפת (xi,xg) כאשר השניה (xg) נוצרה על בסיס הראשונה (xi).

בצד שמאל (הג’ינרוט) משתמשים במקודד-מפענח כאשר המפענח מקבל שירשור של הטלה לינארית ל z (הרעש המוגרל) ושל xi (התמונה האמיתית).

המימוש המוצע

הכותבים מימשו את הרעיון באופן הבא:

ה Generator (המחולק לEncoder  ול- Decoder) ממומש ע”י שילוב של UNet ושל ResNet והכותבים קוראים לו UResNet:

תודה ל DATA AUGMENTATION GENERATIVE ADVERSARIAL NETWORKS

ה Discriminator ממומש ע”י DenseNet.

סדרי גודל ותוצאות

ראשית נציין עובדה חשובה שכשהשוו תוצאות של ה classifier, בתוצאות ללא ה Gan Augmentation הם כן השתמשו ב Augmentation קלאסי (שכלל: סיבובים של 90 מעלות, הזזות, הוספת רעש לבן), ובתוצאות ים ה Gan Augmentation הם עשו גם Augmentation  קלאסי, מה שאומר שהגישה של ה Gan Augmentation באמת תרמה ביחס להוספת תמונות באופן רגיל.

הבחינה נעשתה על שלושה אתגרי קלאסיפיקציה:

האחד במאגר Omniglot שהינו מאגר של עשרות אלפי תמונות של 1623 אותיות שונות מחמישים שפות שונות בכתב יד. השני ממאגר תמונות פנים VGG-Face והשלישי ממאגר תמונות כתב יד EMNIST שהינו הרחבה של MNIST  הפופולארי.

השיפור בביצועי הקלאסיפיקציה משמעותי:

הבעיה עם Augmentation רגיל   עם Gan Augmentation 
Omniglot 69% 82%
EMNIST 73.9% 76%
VGG-Face 4.5% 12%

 

הריצה מאוד ארוכה אגב: 500 epochs על עשרות אלפי תמונות, חייבים כמה GPUים כדי להריץ בזמן סביר.

קישורים

ניתן להשתמש ב-DAGAN להרחבת DB כלשהוא של תמונות, כקופסה שחורה באמצעות הקוד הבא:

https://github.com/AntreasAntoniou/DAGAN

Posted by תמיר נווה in deep

שיעור #7 – קוד של DCGAN

[wpum_restrict_logged_in]


 

מלל השיעור

[/wpum_restrict_logged_in]

בשיעור זה נעבור ממעוף הציפור על קוד המממש אלגוריתם DCGAN

ונראה איך ניתן לאמן אותו עם מאגר תמונות מאוד סינטתי גדול (גדול כרצוננו) של מלבנים צבעוניים על רקע לבן כדי להמציא תמונות מסוג זה בעצמו.

ז”א האלגוריתם לומד ליצור תמונות מתוך חיקוי של דוגמאות שמוצגות לו מבלי להסביר לו מה זה מלבן ואיך הוא אמור להראות.

קישור לקוד:

https://github.com/tamirnave/dcgan—demo-with-synthetic-db

תמונות לדוגמא של התמונות איתן מתבצע האימון:

dcgan

תמונות מתחילת האימון:

dcgan

תמונות משלב מתקדם באימון:

dcgan

 

 

Posted by תמיר נווה in GAN

Random Erasing Data Augmentation – הרחבת מידע בעזרת מחיקה אקראית

מיועד ל- מתחילים (כתבה קצת טכנית)

נכתב על ידי Yanai Ankri

 הרחבת מאגר הנתונים – Data Augmentation

אחת השיטות האפקטיביות בלמידה עמוקה להגדיל את כמות הדוגמאות איתן מאמנים רשת, נקראת Data Augmentation. הגדלת ה DB תורמת לאימון מודל מוצלח יותר וכללי יותר ובפרט להימנע מתופעת ה-overfit (כשהמודל לומד טוב מידי את הדוגמאות שמביאים לו באימון אך לא לומד על המקרה הכללי).

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

data augmentation

https://zhuanlan.zhihu.com/p/44363288

המוטיבציה לשיטת המחיקה האקראית

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

בתמונות הבאות מתוך המאגר של nanit אפשר לזהות בקלות את התינוק, אך לרשת שמסתמכת בעיקר על תווי הפנים יהיה קל לזהות את התינוק בתמונה השמאלית וקשה לזהות אותו בתמונה הימנית, למראות מאפיינים מובהקים כמו ידיים ורגליים.

image recognition 

הרחבה באמצעות מחיקה אקראית

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

בשיטה זו קיימת בעיה חדשה: איך יודעים איזה חלק יהיה הדומיננטי באובייקט? וגם אם נגלה או ננחש אותו, יש סכנה שחלק אחר יהפוך לדומיננטי והבעיה תחזור על עצמה. הפתרון הוא להסתיר כל פעם חלק אחר בתמונה באופן אקראי. בכל איטרציית אימון מלאה (epoch) נבחרים חלק מהתמונות באופן אקראי, ובכל תמונה מוגרל מלבן שערכי הפיקסלים שלו מוסתרים באופן שתואר קודם.

תודה ל Random Erasing Data Augmentation

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

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

תודה ל Random Erasing Data Augmentation

תוצאות

להלן תרשים המתאר את שיפור הביצועים באימון מודל ResNet על מאגר תמונות Cifar-10 עם ובלי שיטת המחיקות האקראיות (Random Erasing). ניתן לראות איך ללא השגת תמונות נוספות אמיתיות לאימון, הרשת מצליחה בזיהוי בשגיאה נמוכה באופן משמעותי:

תודה ל Random Erasing Data Augmentation

קישורים

לקוד –  https://github.com/zhunzhong07/Random-Erasing

למאמר – https://arxiv.org/abs/1708.04896

Posted by Yanai Ankri in deep

סיסמת הפנים – רשתות קומפקטיות שרצות ללא ענן

מיועד ל- מתחילים (כתבה קצת טכנית)

נכתב על ידי תמיר נווה

רקע

אותנטיקציה (אימות) אמין ופשוט למשתמש זה מצרך מאוד מבוקש בימנו! החיים שלנו יותר ויותר נמצאים בעולמות וירטואליים ודיגיטליים, ואפילו נכסים פיננסים (ביטקוין וחבריו) כבר נכנסו לעולם זה. כדי להיכנס לעולם הדיגיטלי הפרטי שלנו נידרש לשם משתמש וסיסמא אישית לכל הפחות. כשמדובר באתרים רגישים יותר גם מוסיפים Two-factor Authentication ואישור במייל או בסמס. כל זה מאוד מייגע עבורנו (ראו מערכון מעולה של ארץ נהדרת בנושא).

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

תוצאות נכון להיום (אימות תמונות פנים במובייל)

ישנן רשתות קומפקטיות (מתאימות למובייל) שמוצלחות בזיהוי (לאו דווקא של פנים) כמו ShuffleNet, SqueezeNet ו MobileNetV2. אך לאחרונה יצאה רשת MobileFaceNet  שנראה שמתמחה בזיהוי הפנים.

במאמר המציג את MobileFaceNet בחנו ביצועים על מאגר התמונות LFW=Labeled Faces in the Wild המכיל 13,000 תמונות פנים שנאספו מהרשת, (in the wild הכוונה שאלו תמונות שצולמו בתנאים בלתי נשלטים, ז”א במגוון תנאי תאורה, הבעות פנים, רעשים, הסתרות, תנוחות וכו’) ועל מאגר התמונות AgeDB שגם מכיל תיוג גיל לכל תמונה.

רשת MobileFaceNet  מגיעה לדיוקים של 99.55% על LFW ו 96.07% על AgeDB. הרשת צורכת 4MB  זכרון (פחות ממיליון פרמטרים) ונותנת תשובה תוך 24 מילישניות (על מעבד של mobile) על תמונה באורך\רוחב 112 או 96 פיקסלים. (תלוי בגירסה). הגדולה של רשת זו היא שהביצועים שלה גבוהים כמו של הרשתות הגדולות והכבדות הדורשות מאות MB זכרון (שאינן מתאימות למובייל).

את הרשת אימנו על מאגר בן 10 מיליון תמונות פנים של 100 אלף סלבריטאים MS-celeb-1M.

על הארכיטקטורה של הרשת ומה החידוש בה, במאמר הבא.

מה קורה ב MobileFaceNet 

ה tradeoff בין דיוק גבוה של רשת לבין כמות פרמטרים הינו נושא מחקר פורה. אחרי שנדהמנו מהדיוקים של Alexnet ואלו שבאו אחריה נעשו ונעשים מחקרים רבים המנסים לשחזר דיוקים עם רשתות קומפקטיות. ראו למשל SqueezeNet, MobileNetV1, MobileNetV2, ShuffleNet, NasNet, Light CNN-29, LMobileNetE. הגישות של הרשתות הקומפקטיות מתבססות על טכניקות כגון bottleneck, depthwise convolution layer או מציאת רשת באמצעות reinforcement learning או גישת ה  .knowledge distillation

אימות תמונת פנים מתבצע באופן כללי בשלושה שלבים: עיבוד מקדים (preprocessing), חישוב פיצ’רים מהתמונה בעזרת רשת CNN, השוואה בין פיצ’רים של שתי תמונות פנים.

במאמר הם מנתחים את אזורי ה reception field (האזור בשכבה שמשפיע על נקודה בשכבות הבאות) של הפיצ’רים במוצא ה CNN ועל בסיס הניתוח כמו גם על בסיס ניסויים מראים שהחולשה של רשתות שרצות על מובייל היא שכבת ה averaging pooling שמתייחסת באופן שווה לכל היחידות. כיוון שלהחליף אותה ב fully connected זו לא אופציה כיוון שיעלה משמעותית את כמות הפרמטרים של הרשת, הם מציעים להחליף אותה בשכבת global depthwise convolution=GDConv. להלן הארכיטקטורה המלאה של הרשת:

תודה ל MobileFaceNets: Efficient CNNs for Accurate Real-time Face Verification on Mobile Devices

Posted by תמיר נווה in deep

הרעיון מאחורי רשת הקפסולות

מיועד ל- מתחילים (כתבה קצת טכנית)

נכתב על ידי תמיר נווה

תסכימו שזה מעורר סקרנות לשמוע את הינטון שנחשב לאחד האושיות של הלמידה העמוקה נותן הרצאה ב MIT ששמה “מה הבעיה ברשתות קונבולוציה ?”

רקע

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

לשתי תמונות אלו של דג יש אלמנטים משותפים (סנפירים, קשקשים, רקע של מים,…) ואת אלו למדנו למצוא, ולבדוק אם כל אחד מהם מעיד על אותם מאפיינים של דג שמכיל אותם. ז”א סנפיר מואר בהיטל על עשוי להעיד על דג מואר בהיטל על, קשקשים חשוכים בהיטל צד עשויים להעיד על דג בהיטל צד בתאורה חשוכה. רעיון זה הינו ההשראה לפיתוח רשת הקפסולה.

הינטון דיבר על כך שיש בעיה ברשתות CNN והתייחס לפעולת ה pooling שאומנם עובדת (באופן מקרי) אך מאבדת מידע (מרחבי) חשוב ולכן לא טובה לזיהוי ולכן מציע חלופה.

סיכום המאמרTransforming Auto-encoders” (2011)

המושג קפסולה מוזכר לראשונה במאמר זה ומודגם עם ארכיטקטורה מאוד פשוטה. (ללא כל קישור לקוד)

כל קפסולה אמורה לטפל באוביקט מסוים (מתוך התמונה הגדולה), לקודד את המאפיינים שלו ומתוכם לשחזר את האוביקט לפי אותם המאפיינים, קצת כמו פעולת ה Rendering בגרפיקה ממוחשבת. למשל נתונים אוביקט כסא ומטריצת טרנספורמציה שיודעת איך לסובב אותו במרחב כדי להציג אותו באופן נכון בסצנה של משרד. פלט של כל קפסולה הינו וקטור שגודלו מציין את ההסתברות לקיומו בתמונה המלאה וכיוונו מציין את המאפיינים שלו, ובתוך כל קפסולה יש כפל במטריצת טרנספורמציה. לטענת הינטון זיהוי במוח האנושי הוא פעולה ההפוכה מ Rendering וקרא לזה Inverse Graphics. ז”א המוח מפרק את התמונה המלאה לאובייקטים ולמאפייניו של כל אוביקט, וכך מזהה מה רואים בתמונה המלאה. (בתלות בהתאמה בין המאפיינים)

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

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

הרעיון של הקפסולות פותח בהתחלה ברשת שנקראת .Transforming Auto-encoders רשת זו “מאלצת” את המשתנים הפנימיים שלה ללמוד לזהות חלקים בתמונה ואת מיקומם היחסי.

 באופן כללי Auto-encoder זו רשת שמאמנים אותה לקבל תמונה, ולהחזיר את אותה התמונה אבל בשכבות הביניים שלה יש מעט משתנים כך שאין לרשת אפשרות להוציא בדיוק את מה שקיבלה Identity (כי זה הרי לא חוכמה), היא נאלצת לקודד את התמונה הנקלטת למעט משתנים ולשחזר את התמונה כולה מתוכם.

ב- Transforming Auto-encoders מאלצים את הרשת לקודד את התמונה לפי חלקים שלה ומיקומם היחסי.

תודה ל Transforming Auto-encoders

בתרשים זה ניתן לראות הדגמה פשוטה של הרעיון רק על הזזה. בתרשים יש שלוש קפסולות שכל אחת מהם מקבלת תמונת קלט (הסיפרה 2) והיא מורכבת משכבת מקודד Encoder (העיגולים האדומים) ומשכבת מפענח Decoder (העיגולים הירוקים). מאמנים את הרשת הזו כך שתקבל את התמונה ותחזיר אותה מוסטת ב ∆y,∆x. בנוסף לקלט התמונה גם מזינים את ההסטה ז”א את זוג הערכים ∆y,∆x. כל קפסולה מכילה רק שלושה משתנים פנימיים x,y,p שמשמעותם מיקום האלמנט (או מיקום האוביקט כולו בתמונה אם זה האלמנט שלו) וההסתברות לקיומו בתמונה. תמונת הפלט הסופית משלושת הקפסולות משקללות פלט של כל קפסולה לפי ההסתברות p שלה.

כותבי המאמר לקחו רשת מבנה כזה אך עשיר יותר (30 קפסולות, 10 נוירונים במקודד ו 20 נוירונים במפענח) ואימנו אותה על מאגר MNIST כאשר מבצעים בכל פעם הסטה אקראית של התמונה אופקית או אנכית עד כשני פיקסלים בכל פעם. הם קיבלו שהמשתנים הפנימיים x,y במוצא ה encoder תואמים להסטה של התמונה ∆y,∆x מה שאומר שכל קפסולה למדה לזהות אלמנט מסויים בתמונה במיקום מסוים. וכשישנה הסכמה על המיקומים של האלמנטים המרכיבים ספרה מסוימת אזי זו אכן הספרה המסוימת ולא אחרת.

איך התקדם מאז ?

ארכיטקטורת הקפסולות חזרה לכותרות ב 2017 במאמר של הינטון וחבריו האחרים בו הם מציעים ארכיטקטורת קפסולות יותר מורכבת ויותר חשוב מזה מציגים שיטה איך לאמן קפסולות (Dynamic Routing). ייתכן ואכתוב על כך מאמר נוסף בהמשך (תלוי בביקוש שלכם הקוראים…) אך מה שחשוב להבין זה את התוצאות שלהם. כשהשוו ביצועים של CNN קלאסי לזיהוי ספרות ב MNIST הדורש אותם משאבי חישוב בערך כמו רשת הקפסולות שלהם, ניצחה רשת הקפסולות בהסתברות הזיהוי (הגיעה ל-0.25%  שגיאה), מה גם שדרשה פחות זיכרון. (8.2M  פרמטרים לעומת 35.4M פרמטרים ב CNN אליו הושוו התוצאות)

המחקר על הגישה עדיין בראשיתה ועוד לא ברור באופן מוחלט שהיא תמיד עדיפה באופן כללי (למשל על מאגרי תמונות יותר גדולים ומאתגרים מ- MNIST), במאמר יש דיון בין השאר על אחד החסרונות של השיטה שנקרא crowding שזה קושי בזיהוי אוביקטים זהים וקרובים מה שגם קורה בזיהוי אנושי. ללא ספק מבחינה רעיונית יש כאן התקדמות ששווה להכיר!

Posted by תמיר נווה in deep

המפתח לאימון רשתות נוירונים – BackPropogation

מיועד ל- מתחילים (כתבה קצת טכנית)

נכתב על ידי תמיר נווה

בהרצאות שלי אני תמיד מספר שב 2012 הייתה מהפיכה מדעית (מהפיכת הלמידה העמוקה) שבזכותה אתגרים שבקושי פוצחו ע”י אלגוריתמים קלאסיים בעבר, כעת פתורים באופן כמעט מושלם באמצעות למידה עמוקה. רק שבלמידה עמוקה אין איזשהו קסם מתמטי חדש, זה כמעט הכול מבוסס על שיטות שהיו ידועות עוד משנות השמונים, ההבדל הוא כמות ה Data וכוח החישוב שגדלו משמעותית.

רשת נוירונים לכשעצמה היא אוסף פעולות מתמטיות יחסית פשוטות (מורכבת מהרבה הרבה פעולות חיבור וכפל), ז”א לרוב אין פה פעולות מתמטיות מתוחכמות. הרשת מכילה משקלים (פרמטרים) שקובעים מהם אותם פעולות מתמטיות. ז”א שינוי משקלי הרשת ישנה את הפעולות המתמטיות שמבצעת הרשת.

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

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

אז תמיד בהרצאות שואלים אותי בפליאה: אבל איך המשקלים מתכווננים ? איך זה בדיוק קורה ?

כי הרי באמת שם כביכול טמון הקסם…

התשובה הינה BackPropagation (חלחול לאחור) שהינה שיטה שהייתה ידועה בכל מיני גרסאות שונות עוד משנות השישים

(ובשנות השמונים הייתה בשימוש בעולם הרשתות נוירונים).

אותו שכר ועונש שאנחנו “נותנים” לרשת נוירונים אותה אנו מאמנים נקראת פונקצית ההפסד או פונקצית המחיר (loss function) וערכה קובע עד כמה מוצלחת הרשת בתוצאותיה. תהליך האימון הינו למעשה שינוי המשקלים (הפרמטרים) של הרשת כך שפונקצית ההפסד תהיה מינימאלית. (או לחילופין שהרשת תקבל מקסימום תגמול)

למשל בקישור הזה ניתן ממש לאמן בדפדפן שלכם רשת לזהות מה רואים בתמונה (על בסיס מאגר תמונות CIFAR10). כאשר בהתחלה הזיהוי שגוי (כי הוא אקראי) ולאורך זמן האימון הזיהוי משתפר ונהיה יותר ויותר מדויק.

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

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

לרב עושים זאת תהליך (אופטימיזציה) זה באמצעות Gradient Descent שמתואר ע”י המשוואה הבאה:

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

לסיכום התהליך הינו: בהתחלה מגרילים ערכים אקראיים לכל אחד מאותם מיליוני משקלים (ואז ביצועי הרשת אקראיים), ומתוך אותם ערכים התחלתיים עושים שינויים מאוד קטנים (נניח מוסיפים או מחסירים 0.0001 לכל משקל) ורואים מה זה עושה לפונקצית המחיר. במילים אחרות מנסים את כל האפשרויות איך לשנות אותה, אבל בשינויים מזעריים ובכל איטרצית אימון בוחרים את השינוי המזערי המוצלח מכולם. ממשיכים כך עד שלא מצליחים לשפר יותר את ביצועי הרשת. ורק ב 2012 לראשונה ראו שאם עושים תהליך כזה עם מיליוני משקלים (ולא רק אלפים) על תמונה זה מספיק כללי כדי “לייצר” את הרשת (או את הפעולות המתמטיות) שמתרגמת אוסף פיקסלים לתשובה מי רואים בתמונה.

זהו סוד הקסם (לפחות ברמת האינטואיציה…)

Posted by תמיר נווה in deep

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

מיועד ל- מתחילים (כתבה קצת טכנית)

נכתב על ידי תמיר נווה

שימושי של בינה מלאכותית לאומנות (לא בהכרח להחליף אומנים אלא לסייע ביצירתם עם בינה מלאכותית) הוא תחום מדהים שמתפתח ללא הפסקה. פרויקט מחקרי בהקשר זה נקרא Magneta שם תוכלו למצוא למשל ליווי מלאכותי לנגינה בפסנתר.

אבל בכתבה זו נכיר את אחד היישומים המרשימים שנולדו כנגזרת של GAN=Generative Adversarial Networks שנקרא CycleGan:

חוץ מלהמיר חיות לחיות אחרות, גם ממירים תמונות של חורף לקיץ, תמונות מז’אנר אומנות אחד לאחר, נותנים חיים לערים עתיקות ע”י הפיכתן לערים מודרניות ואפילו פרויקט ישראלי בו הופכים תמונת פנים אינטראקטיבית לפורטרט ירקות.

כאמור האלגוריתם עוסק בלהמיר תמונות מעולם תוכן אחד לתמונות מעולם תוכן שני. מה שמיוחד ב CycleGan בשונה מאלגוריתמים קודמים שממירים תמונה מסוג אחד לתמונה מסוג שני הוא שאין צורך בזוגות תמונות תואמות כדי לאמן אותו, אלא רק באוסף תמונות מסוג אחד ואוסף תמונות מסוג שני (מבלי שיהיו זוגות תואמים, למשל תמונה של פסל החירות שצולמה בחורף עם אותה התמונה של פסל החירות שצולמה בקיץ). יתרון זה מאוד מקל כי להשיג מאגר תמונות של זוגות תואמים זו משימה הרבה יותר קשה מאשר להשיג שני מאגרי תמונות שונים ובלתי תלויים.

כיוון שאין זוגות תמונות תואמות, הטריק של אלגוריתם CycleGan הינו לאמן המרה של תמונה מעולם תוכן א’ לעולם תוכן ב’, ולאמן בחזרה המרה של תמונות מעולם תוכן ב’ לעולם תוכן א’ כך שהמסלול המחזורי (א’ ל-ב’ ומשם ב’ ל-א’) יחזיר לנו תמונה דומה ככל הניתן למקור. אילוץ זה מחייב את ההמרה (מא’ ל-ב’) להיות כזה שהתמונה תיראה אותו דבר רק שהינה מעולם ב’. (ז”א הזברה שנוצרה מתמונת הסוס תהיה באותה התנוחה והזווית צילום של תמונת הסוס המקורית)

כדי להבין את אלגוריתם CycleGan צריך להבין איך אלגוריתם GAN (הבסיסי) עובד. אנסה בכל זאת לתת את המבנה גם לקורא שהדברים זרים לו:

 ישנן שתי זוגות של רשתות בסיפור הזה (Generator, Discriminator),

זוג אחד: המרה מעולם תוכן א’ ל-ב’ (Generator), ורשת זיהוי עולם תוכן ב’ (Discriminator).

זוג שני: (ההפוך) המרה מעולם תוכן ב’ ל-א’ (Generator), ורשת זיהוי עולם תוכן א’ (Discriminator).

מאמנים כל זוג רשתות כמו שמאמנים רשת GAN רגילה כמו בתרשים הסכמטי הבא:

אימון של GAN

ובדומה את זוג הרשתות השני.

כמו כן מאמנים את התהליך הציקלי (המחזורי) בשני הכיוונים שלו (ז”א מעולם תוכן א’ ל-ב’ ולהיפך), כך שתמונה שמקורה בעולם תוכן כלשהוא שחזרה לאותו עולם התוכן, אמורה להיות זהה ככל הניתן.

תרשים סכמטי עבור עולם תוכן א’:

ובדומה מאמנים עבור עולם תוכן ב’.

והתוצאות המדהימות מדברות בשם עצמן!

זו למשל תמונה שסווגה ככישלון ע”י כותבי המאמר, אם כי זהו כשלון מעניין לכל הדעות:

תודה ל CycleGan

Posted by תמיר נווה in deep

מלאכת בינת הזיופים

מיועד ל- מתחילים (כתבה קצת טכנית)

נכתב על ידי תמיר נווה

המאמר הזה בניו יורק טיימס מתאר איך פורסם ב Reddit סרטון פורנו שבו מככבת מישל אובמה, מזעזע?

כן, די… אבל העולם השתנה וכדאי שנבין את זה.

כידוע ההתקדמות המדעית טכנולוגית בבינה מלאכותית משרתת מגוון תחומים שמקדמים את האנושות: רובוטיקה, רפואה, רשתות חברתיות, מסחר ועוד… יש תחום אחד שנקרא Generative Models שמאוד מרתק וסוחף אבל מעבר לכמה יישומים מועילים שנולדו ממנו (למשל ג’ינרוט גרפיקה למשחקי מחשב) הרבה מהעיסוק בו הינו למטרת שעשוע ומחקר. הרבה שואלים למה זה משמש ?

על אף שהתחום כביכול לא מאוד שימושי, הוא עדיין משנה את העולם של כולנו (ולא רק של החוקרים הנלהבים שעוסקים בו). וזה בגלל שיש בו הרבה יישומים לא כל כך טובים…

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

האם מה שייתכן שקביל מבחינה משפטית יכול להיות קביל באותה רמת סמך אחרי שחשופים לטכנולוגיה כמו זו למשל:

אחד הדברים שמסעירים את הרשת לאחרונה היא אפליקצייתFakeApp  מבוססת קוד פתוח ע”י מפתח אנונימי (אפשר להבין מה…) ועובדת באופן הבא:

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

מה שהאפליקציה עושה זה חותכת רק את הפנים מתוך כל תמונה נתונה (וזאת בגישות עיבוד תמונה קלאסיות שאינן למידה עמוקה, למשל עם אלגוריתם HOG) ומאמנת שתי רשתות נוירונים מסוג Autoencoder אחת על פניו של המוחלף והשניה על פניו של המחליף. ולאחר האימון האפליקציה תדע לקבל כל תמונה של המוחלף ולהחליף את פניו בפנים האחרות (ולחבר לגוף באופן שנראה מאוד אמיתי).

רשת Autoencoder שהינה הבסיס לתהליך הזה הינה רשת נוירונים המורכבת משני חלקים Encoder מקודד, ו Decoder מפענח שמסודרים במבנה הבא:

תודה ל  Gerald Geronimo ול Chervinskii

ה Encoeder מקבל קלט כלשהוא (במקרה שלנו תמונת פנים), מעבד אותו ומחזיר פיסת נתונים קטנה יותר (z בתמונה). אם למשל תמונת פנים מיוצגת ע”י עשרות אלפי ערכים מספריים, אזי z במוצא ה Encoder (נקרא גם הנתונים נסתרים latent variables) יכול להיות בסך הכל עשרות מספרים. ז”א ה Encoder מעבד ומאבד מידע, אבל השאיפה לאמן אותו כך שהמידע שיוציא ייצג את הקלט באופן כזה שיהיה ניתן לשחזר את הקלט המקורי.

ה Decoder מקבל את אותו הקוד המקוצר z ומטרתו לעבד אותו ולהרחיב אותו לגודלו מקורי (במקרה שלנו שוב תמונת פנים).

האימון של שני המרכיבים Encoder, Decoder נעשה במשותף והתגמול לכל אחד על הצלחתו היא כאשר התמונה במוצא ה Decoder זהה לתמונה בכניסת ה Encoder. אימון מוצלח של AutoEncoder משמעותו סוג של דחיסת נתונים או קידוד של הרבה מידע במעט מידע. יש לכך שימושים רבים אך במקרה שלנו השימוש הוא לייצג בתמציתיות מבנה פנים של אדם א כדי לשחזר (באמצעות Autoencoder שאומן אחרת) תמונה של פנים של אדם ב.

deepfake

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

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

אז מעתה, קבלו בעירבון מוגבל את מה שעינכם רואות…

Posted by תמיר נווה in deep

Q-Learning על רובוטים שיודעים לדחות סיפוקים

מיועד ל- מתחילים (כתבה קצת טכנית)

נכתב על ידי תמיר נווה

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

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

מה קורה כשיש דילמות ?

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

לתחום הלמידה החיזוקית Reinforcement Learning יש הרבה במשותף עם בקרה אופטימלית Optimal Control, והוא עוסק במציאת הפעולות שימקסמו פונקציית תגמול בהינתן תגובות מהסביבה.

תודה ל Megajuice

את החישוב המתמטי של מה עדיף בדילמות הללו (פעולה עם תגמול מיידי או פעולה עם תגמול עתידי) בא לפתור אלגוריתם Q-Learning. האות “Q “מסמלת Quality במשמעות של מה הערך שבפעולה מסוימת, ז”א האם תביא לתגמול עתידי יותר או פחות.

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

כמו כן ככל שמנסים יותר פעולות מגוונות מעדכנים את האסטרטגיות של איך הכי נכון לפעול כדי לקבל תגמול, המישוואה הבסיסית של האלגוריתם הינה:

מישוואה בסיסית של Q-Learning

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

ערך זה נקבע ע”י הערך הידוע עד כה שבלבצע פעולה ועוד הערך של הפעולה הבאה המשתלמת ביותר.

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

אלגוריתם Q-Learning הוצג לראשונה ב 1989 כעבודת הדוקטורט של Watkins תחת השם: “Learning from Delayed rewards” ז”א ללמוד מתגמולים דחויים.

ב 2014 הראו Google DeepMind שימוש ב Q-Learning עם CNN (ז”א עם למידה עמוקה) ויצרו אלגוריתמים שמשחקים משחקי אטארי ישנים ברמה של בני אדם. לזה קראו Deep Reinforcement Learning למידה חיזוקית עמוקה.

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

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

גם פה אפשר שיש פעולות שלא משתלמות בטווח המיידי אבל כן בטווח הארוך:

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

מסקנה: אפילו כדי ללכת צריך ללמוד לדחות סיפוקים! נסו להסביר זאת לפעוט בן שנתיים…

רוצים ללמוד עוד על למידה חיזוקית ברמה הפרקטית ובעברית, כנסו לכאן!

Posted by תמיר נווה in deep

הטלוויזיה הרגה את הרדיו, האינטרנט הרג את הטלוויזיה והבוטים הורגים את אתרי האינטרנט

מיועד ל- מתחילים (כתבה קצת טכנית)

נכתב על ידי תמיר נווה

צאטבוטים Chatbots קיימים עוד משנות ה-60 (ראו את אליזה ELIZA החלוצה) אך ההתעניינות והפופולאריות שלהם גוברת :

רמת הפופולאריות של המושג Chatbot לפי Google Trends

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

פייסבוק הכניסה את האפשרות למפתחי בוטים למסנגר שלה ב 2017, וזה אחד הגורמים שהניעו את התחום הזה (יש עשרות אלפי צאטבוטים במסנגר). לעיתים יש גם אסונות, כמו בוט רפואי שבתגובה לתיאור סימפטומים של אדם כלשהוא יעץ שמדובר בסך הכל בכויית שמש (מה שנקרא: “אחי, נשרפת…”) כאשר מה שבאמת היה זה הרעלת דם (sepsis) שעלולה להביא למוות.

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

אז איך עובד הקסם הזה ?

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

לפי הגישה הג’נרטיבית Generative המודל הבסיסי לצ’אטבוט הינו אותו מודל המשמש לתירגום של טקסט ונקרא סדרה לסדרה seq2seq.

ארכיטקטורת seq2seq המשמש לניתוח שפה

ארכיטקטורת seq2seq המשמש לניתוח שפה

מודל זה מורכב ממקודד Encoder, צד שמאל בתרשים שמקבל את המשפט הקודם, וממפענח Decoder, צד ימין בתרשים שמחזיר את משפט התגובה. כל אחד מאותם מרכיבים “מקודד” ו-“מפענח” הינם רשת RNN=RecurrentNeural Network. רשת RNN מקבלת קלט סדרתי (מילה מילה במקרה שלנו) ומעדכנת משתני מצב נסתרים בתוכה תוך כדי הוצאת פלט.

הסבר על התרשים:

התרשים קצת לא ברור למי שלא מכיר RNN ולכן אנסה להסביר אותו ואת ההיגיון שיש מאחורי מבנה זה:

חישבו על משפט בן שלוש מילים שמקבל הצאטבוט ועל משפט שהוא מחזיר בן ארבע מילים. על כל משפט להסתיים בסימון מקובל של סוף משפט.

הסבר על החיצים האנכיים:

כל יחידת חישוב של ה Encoder (המלבנים משמאל) מקבלת כקלט מילה מהמשפט שנאמר לצאטבוט וכל יחידת חישוב של ה Decoder (המלבנים מימין) מקבלת את הפלט של היחידה שמשמאלה.

הסבר על החיצים האופקיים:

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

מבנה זה של רשתות RNN שונה ממבנה של הרשתות הקלאסיות שנקראות Feedforward Neural Network בהן כל יחידה רק מקבלת קלט אחד שהינו התוצאה של היחידה הקודמת.

מה ההיגיון שבשימוש ברשתות RNN לניתוח שפה:

כשאנחנו בתור בני אדם שומעים משפט ואנו מחברים בראש משפט כתגובה שמורכב מכמה מילים.

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

למשל נשאל צאטבוט: “מהו אירוע הספורט הגדול שיש במלבורן בחודש הקרוב ?”

והצאטבוט יענה: “אירוע הספורט הגדול במלבורן בחודש הקרוב הינו Australian Open Tennis”

משפט השאלה מקודד למשתני מצב נסתרים שמייצרים את משפט התגובה. משפט התגובה יתחיל במילה “ארוע” ואז המילה הבאה כנראה תתאר את המילה הראשונה (למשל יתאים פה אירוע מוסיקלי, אירוע תרבות,…) אבל גם קשורה למשפט השאלה כולו שעסק בספורט, ז”א המילה השנייה הכי סבירה תהיה “הספורט”. זו הסיבה שמבנה שכזה של רשת ש-“זוכר” משתני מצב שמתארים את הקלט ההיסטורי (ולא רק את הקלט האחרון) יעיל בניתוח שפה טבעית (NLP).

 

Posted by תמיר נווה in deep