בפוסט בבלוג הזה, אני הולך לדבר על פרטים ועקרונות של שיטת LoRA (התאמת מודלים של שפה גדולה בדרגה נמוכה), תוך כדי סקירת המאמר . המוקד העיקרי של המאמר הוא להציג מבנה חדש אשר מפחית את עלות הכוונון העדין של המודל תוך שיפור ביצועיו. פעולות כוונון עדין תופסות מקום חשוב במחקרי עיבוד שפה טבעית מזה זמן. נניח שיש לכם מודל מאומן, ואתם רוצים להרחיב את הידע שלו. אתם יכולים לעשות זאת על ידי כוונון עדין, מבלי לאמן את המודל מאפס.
נניח שלדגם יש n פרמטרים לאחר האימון ואתה צריך לכוונן אותו. אם אתה משתמש בשיטת כוונון עדין מלא, כל הפרמטרים של המודל יתעדכנו. כשאנחנו בוחנים מודלים שיש להם מיליארדי פרמטרים, העדכון בכל הפרמטרים יצור בעיות זמן ואחסון. במאמר, תוצאות ביצועים טובות יותר או שוות דגש עבור דגמי RobERTa, DeBERTa, GPT-2 ו-GPT-3 על ידי שימוש בשיטת LoRA.
מוזכר במאמר ששיטת LoRA שואבת השראה ממחקריו של Li et. al (2018a) ו-Aghajanyan et al. (2020). מחקרים אלו מדגישים כי הצלחתם של מודלים עם פרמטריזציה יתר מבוססת למעשה על ממד פנימי נמוך. זו הפכה לנקודה שעיצבה את ההשערה של שיטת LoRA.
שיטת LoRA היא מחקר המבוסס כולו על פירוק הדרגה. בשיטה זו, שתי מטריצות עוקבות מתווספות במקביל לכמה שכבות צפופות ברשתות העצביות כפי שמוצג באיור 1. מטריצות עוקבות אלו נוצרות על ידי תצורת דירוג נתונה. האיור שלהלן מראה כיצד נראית שכבה צפופה לאחר הוספת מטריצות הדירוג הרציפות. משתני הקלט נשלחים הן דרך מטריצת משקל ההכנה המקורית והן דרך המטריצה הראשונה של המטריצות הרציפות. לאחר מכן, ערכי הפלט מחושבים על ידי סיכום התפוקות של שתי המטריצות המקבילות הללו.

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

מופרדים בדרג נמוך. כאן, B היא מטריצת dxr, A היא מטריצת rxk, בעוד r (דרגה) קטנה בהרבה מ-d ו-k. במהלך הכוונון העדין, עדכוני השיפוע ל-Wo נמנעים. גם המטריצות Wo וגם ∆W מוכפלות באותם ערכי קלט והתוצאות מסוכמות ונוצר הפלט h= w0 + ∆Wx = w0 +BAx.
בתחילת האימון, הם השתמשו באתחול גאוס אקראי עבור ערכי מטריצת A ובאתחול מלא באפס עבור ערכי מטריצת B. במילים אחרות, BA שווה לאפס בהתחלה.
יישום LoRA בארכיטקטורת שנאי
ישנן 4 מטריצות משקל Wq, Wk,Wv,Wo במודול תשומת לב עצמית ו-2 מטריצות משקל במודול MLP בארכיטקטורת שנאים. במהלך התאמת LoRA, הם הקפיאו את המשקולות במודול MLP, ויישמו את השיטה על משקולות קשב על מנת לשמור על האימון פשוט.
יתרונות
- הנוחות הגדולה ביותר שמספקת LoRA היא שימוש בזיכרון ובאחסון. לדוגמה, במאמר מוזכר שעבור דגם שנאי גדול שאומן עם Adam, השימוש ב-VRAM מופחת עד 2/3 אם << r d. הסיבה לכך היא שמצבי האופטימיזציה אינם נשמרים עבור פרמטרים קפואים.
- עבור דגם GPT-3 175B, צריכת VRAM ירדה מ-1.2TB ל-350GB.
- בתרחיש שבו r=4 ורק המשקולות של מטריצות הערך והשאילתה שונו, גודל המחסום הצטמצם מ-350GB ל-35MB. זה אפשר לבצע אימון עם פחות GPUs.
- בנוסף, מכיוון שאין עדכון גרדיאנט ברוב הפרמטרים, הושגה האצה של 25% בעת אימון ה-GPT-3 175B עם LoRA בהשוואה לתהליך הכוונון המלא.
המאמר מזכיר גם שאם יש צורך בתהליך הכוונון לשפה אחרת, יש להשתמש במודל כולו במקום ב-LoRA.
ידע נוסף
מה זה דרגה
דירוג הוא המספר הכולל של עמודות או שורות בלתי תלויות ליניארית במטריצה. נניח שיש לנו מטריצה עם n עמודות וכל העמודות בלתי תלויות זו בזו, אז נוכל לומר שדירוג העמודה של מטריצה זו הוא n. שוב, אם כל השורות של מטריצה עם n שורות אינן תלויות זו בזו, אז נוכל לומר שוב שדירוג השורה של המטריצה הוא n.
דירוג השורה והעמודה של מטריצה חייבים להיות שווים. כדוגמה, אנו יכולים להסתכל על המטריצה שלהלן.
מטריצה A = [[1,2,5], [2, 4, 10] ]
אם נסתכל היטב על המטריצה, נוכל לראות שהשורה השנייה היא פי שניים מהשורה הראשונה. באופן דומה, העמודה השנייה והשלישית של המטריצה הן פי 2 ו-1 מהעמודה הראשונה, בהתאמה. במילים אחרות, בעוד שיש שני וקטורים על אותו קו על בסיס שורה במטריצה, ושלושה וקטורים שונים על קו אחר על בסיס עמודה, יש רק וקטור ייחודי אחד על בסיס שורה ועמודה. המשמעות היא שדרגת המטריצה היא 2.
על מנת למצוא את הדרגה, נמיר את המטריצה לצורת הדרג שלה, ולאחר מכן מחשבים את מספר השורות המורכבות מערך אחד שאינו אפס לפחות.
מהי מטריקס בדרג נמוך
במטריצות, הדירוג יכול להיות שווה או קטן ממספר העמודות או השורות. מטריצות שיש להן שורות או עמודות בלתי תלויות ליניאריות קטנות יותר ממספר השורות או העמודות הנוכחיות נקראות מטריצות בדרג נמוך. מטריצות שבהן כל השורות או העמודות אינן תלויות נקראות מטריצות בדרגה מלאה.
מהו פקטוריזציה/פירוק דירוג
נוכל לכתוב מחדש מטריצה עם הדרגה r כ- B=LR^T על ידי פירוקה למטריצות L ו-R. כאן, L היא מטריצה בעלת ממדים mxr, בעוד ש- R^T היא מטריצה בעלת ממדים rxn. תהליך זה ידוע כפירוק דרגה.
החשיבות של פקטוריזציה של דירוג:
חשיבותו של תהליך פירוק הדרגה לגורמים טמונה בכך שהוא מאפשר לנו לחלק מטריצה למטריצות קטנות יותר, L ו-R, ולשמור אותן בפחות מקום. משמעות הדבר היא שניתן לאחסן את B על ידי אחסון הגורמים שלה L ו-R. זה מפחית את דרישות האחסון של B למספרים (m+n)r מ-mn מספרים. נקודה נוספת שכדאי להזכיר כאן היא שלאחר פירוק מטריצה לשתי מטריצות קטנות אלה, זה מאפשר לבצע חישובים רבים על המטריצה מבלי אפילו לייצר את אותה מטריצה שוב. מסיבה זו, כאשר מתמודדים עם מטריצה בעלת דרגה נמוכה, פירוק דרגה לגורמים נחשב תמיד כצעד ראשון חשוב. לאחר פירוק הדרגה, ניתן לבצע חישובים מהר הרבה יותר ותוך שימוש בפחות זיכרון.
יתר על כן
למידע מפורט יותר על מטריצות בדרגה נמוכה, ניתן לקרוא את הבלוג של אית'ן ר. אפרלי ואת המאמר של LoRA . בנוסף, ניתן לבחון את היישומים מבוססי הקוד של LoRA בפירוט במאגר github של microsoft/LoRA.
גיזם אבאלי, MSc. / ראש צוות