close menu

3 שיטות ליצירת תמונות היפר-ריאליסטיות

התמונה לא אמיתית.

ברוכים הבאים לעתיד! הכל מזויף! שום דבר כבר לא אנושי! וכולנו מדברים עם בוטים על בסיס קבוע!

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

מה הופך תמונות להיפר-ריאליסטיות?

מודל. דאטה. מזל.

וכסף. גם כסף.

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

אותו הרעיון אומר שאם ניתן לו את התמונות של עצמנו, הוא ילמד לשקר גם אותנו לתוך התמונות? נכון?

לא.

שיהיה לכם בהצלחה עם זה.

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

אבל! יש גם חדשות טובות!

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

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

שיטה 1 – מודל נוסף

פעם, לפני שטרנספורמרים היו כל מה שאנחנו צריכים – שאר הדברים שהינו צריכים כללו למשל LSTM או אמבדינגס שגוגל כבר אימנו בשבילנו או דברים נוספים בסגנון.

אליהם הינו מחברים "חצי רשת" משלנו, מאמנים רק אותה וכולם היו מאושרים.

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

ובכן היום נחזור לתקופה הפרהיסטורית של 2017 ונעשה זאת שוב!

אבל, אל דאגה. טרנספורמרים הם כל מה שנצטרך. כמו שכתוב ב([ספר-דת for ספר-דת in כל_הדתות])any

השיטה עובדת כך:

נבחר מודל כרצוננו, למשל Bart ונשתמש בו כמקודד נוסף לטקסט שלנו.

להלן, כך אמרו האנשים הכי חכמים בעולם: ".Bert." "Bart." "Bort"

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

לא יעיל בריבוע – כמו שתמיד עושים בתחום.

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

שיטה 2 – אדפטרים

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

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

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

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

ולמי שרוצה לנסות בעצמו, חבילה חדשה מHugging Face הנקראת PEFT נמצאת בבלוג פוסט הזה: https://huggingface.co/blog/peft

רגע של כנות: אני מקבל תוצאות משמעותית פחות טובות בשימוש בחבילה זו.

שיטה 3 – רשת בקרה

נניח ויש לכם את המשאבים לאמן כל מה שתרצו. מה השיטה הכי טובה?

השיטה הכי טובה היא לא לאמן את הרשת. היא לאמן עוד רשת!

ולחבר את יצוגי השכבות שלהן.

מאמר: Adding Conditional Control to Text-to-Image Diffusion Models

לינק: https://arxiv.org/abs/2302.05543

קוד: https://github.com/lllyasviel/ControlNet

כך נוצרה התמונה בפוסט, דרך אגב.

על ידי שימוש ברשת נוספת מקבילה לStable Diffusion נוכל לאמנה לייצר תמונות אחרות.

הרשת הנוספת מאותחלת ממשקולות הרשת המקורית ורק היא מאומנת כשהלוס נמדד ברשת המקורית.

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

אבל אם סתם נחבר דברים בין רשתות (גם אם אותה הרשת) היא תשבר. מה עושים?

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

אבל יםםםםם אם המשקולות מאופסות, המודל לא ילמד כלום כי הנגזרת תהיה 0! לא נכון. הוכחה 1: אם y=wx+b למשל אז y/∂w = x, ∂y/∂x = w, ∂y/∂b = 1∂ ואז אם הקלט x ≠ 0 לא אפס: y/∂w ≠ 0, ∂y/∂x = 0, ∂y/∂b = 0∂ ולכן y/∂x ≠ 0∂ והגרדיאנט לא מתאפס. הוכחה 2: זה עובד במציאות.

ובמודל זה תוכלו לשחק בעצמם ממש כאן: https://huggingface.co/…/ControlNet-with-other-models

May be an image of 1 person, beard, standing and indoor

עוד בנושא: