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

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

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

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

הגבלות ידועות

הזמני קצובים הבאים חלים על כל סוג תגמול:

סוג התגמול זמן קצוב לתפוגה
התאמת מחרוזות אין זמן קצוב לתפוגה
הרצת קוד ‫100 שניות לכל הפעלת method evaluate
בודק אוטומטי מבוסס-Gemini פסק זמן של דקה אחת בהמתנה לתגובת סיווג של LLM
Cloud Run זמן קצוב של 5 דקות לכל טריגר

הגדרת פרסים במסוף Cloud de Confiance

כשיוצרים משימת כוונון באמצעות למידת חיזוק בCloud de Confiance מסוף בקטע Models > Tuning, בשלב Reward configuration אפשר להגדיר תגמולים יחידים או מורכבים:

  1. מזינים שם תגמול ובוחרים סוג תגמול מהתפריט הנפתח:

    • תגמול על התאמת מחרוזת: מגדירים סוג ניתוח (למשל, חילוץ ביטוי רגולרי), פעולת התאמה (למשל, התאמה מדויקת) וביטוי לטירגוט, וגם תגמולים על תשובות נכונות ושגויות.
    • תגמול מבוסס LLM: מספקים פרומפט לדירוג אוטומטי ומגדירים איך הפלט של הדירוג האוטומטי מנותח ומקבל ציון.
    • תגמול מבוסס פונקציית Python: מזינים קוד הערכה מותאם אישית של Python ישירות בעורך המוטבע או מעלים קובץ Python.
    • תגמול שניתן להתאמה מלאה באמצעות Cloud Run: מציינים את ה-URI של שירות Cloud Run.
  2. מציינים משקל תגמול לכרטיס התגמול.

  3. לוחצים על סיום.

  4. כדי להגדיר תגמול מורכב, לוחצים על + הוספת תגמול נוסף (אפשר להוסיף עד 16 תגמולים). בכל כרטיס תגמול מכווץ מוצג המשקל שהוגדר לו, ובטופס מוצג סיכום המשקל הכולל.

פרס על התאמת מחרוזות

מפרט API: ‏ ReinforcementTuningStringMatchRewardScorer

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

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

לסכימת ההגדרה, אפשר לעיין במפרט ה-API של ReinforcementTuningStringMatchRewardScorer. לפרטים על השדה references, אפשר לעיין בדף Tuning dataset.

תגמול על סמך דירוג אוטומטי מבוסס-Gemini

מפרט API: ‏ ReinforcementTuningAutoraterScorer

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

התגמול הזה תומך בשני דפוסים:

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

למסווג האוטומטי מותר גם להציג את שרשרת ההיגיון שלו, כך שאפשר לנתח קטע מהתשובה באותו אופן שבו מנתחים את התגמול של התאמת המחרוזת. לדוגמה, מערכת לדירוג אוטומטי יכולה להפיק את התוצאות blahblahblah <answer>Yes</answer> או blahblahblah <answer>No</answer>, ואפשר ליצור פונקציית ניתוח כדי לחלץ את התגובה של מערכת הדירוג האוטומטי בין <answer> לבין </answer>. לאחר מכן אפשר להשוות את הפלט של הכלי לדירוג אוטומטי לביטוי מוגדר מראש שממפה את Yes לציון +1 ואת כל הערכים שלא תואמים (כמו No) לציון -1.

ההגדרה הבאה של מסנן לדירוג אוטומטי מאפשרת לקבל את הטקסט שבין התגים <answer>, למפות את Yes ל-+1 ולמפות כל ערך אחר ל--1:

{
  "autoraterResponseParseConfig": {
    "parseType": "REGEX_EXTRACT",
    "regexExtractExpression": "<answer>(.*?)</answer>"
  },
  "exactMatchScorer": {
    "expression": "Yes",
    "correctAnswerReward": 1.0,
    "wrongAnswerReward": -1.0
  }
}

תגמול על הרצת קוד

מפרט API: ‏ ReinforcementTuningCodeExecutionRewardScorer

הגדרת התגמול על הרצת קוד מאפשרת לספק קוד Python שהוגדר על ידי המשתמש כדי להעריך את התשובות של המודל בלי להגדיר שירות Cloud Run. מטמיעים פונקציית evaluate עם החתימה הבאה:

def evaluate(example: dict[str, Any], response: dict[str, Any]) -> float:
  ...

הפונקציה מקבלת:

  • ‫example: ReinforcementTuningExample בפורמט ProtoJSON (כלומר, אותו פורמט כמו שורה אחת במערך הנתונים של האימון או האימות, רק שהמפתחות צריכים להיות בפורמט CamelCase). ההוראות למערכת (example.get("systemInstruction")) וההפניות (example.get("references")) נכללות גם ב-example, בתנאי שהן מוגדרות במערך הנתונים לאימון או לאימות.
  • ‫response: Content בפורמט ProtoJSON (כלומר, המפתחות צריכים להיות בפורמט camel case), שהוא זהה לתגובה של חיזוי אונליין למודלים של Gemini.

הפונקציה צריכה להחזיר מספר עשרוני, שייחתך לטווח [-1, 1].

דוגמה להטמעה:

def evaluate(example, response) -> float:
  response_str = response.get("parts", [])[0]["text"]
  references = example.get("references", {})

  if response_str == references.get("concise_answer"):
    return 1.0
  return -1.0

ספריות נתמכות

בנוסף לספריית Python Standard Library, הספרייה הבאה של Python זמינה בארגז החול של הרצת הקוד:

  • cv2
  • matplotlib
  • mpmath
  • numpy
  • pandas
  • seaborn
  • sklearn
  • statsmodels
  • sympy

פסק זמן ומגבלות על משאבים

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

מומלץ מאוד לבדוק את הקוד באמצעות ValidateReinforcementTuningRewardAPI (ראו אימות הגדרת תגמול) ולשאוף לכך שביצוע הקוד יסתיים תוך פחות מ-100 שניות כדי להשיג את הביצועים הטובים ביותר.

סביבת הרצת הקוד מספקת מעבד אחד וזיכרון בנפח ‎1 GB לכל הפעלה.

פרס שניתן להתאמה אישית מלאה באמצעות Cloud Run

מפרט API: ‏ ReinforcementTuningCloudRunRewardScorer

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

שיטת HTTP‏: POST

גוף הבקשה (application/json):

{
  "example": { "object(RLFTExample)" },
  "response": { "object(Content)" },
  "metadata": {
    "step": int,
    "tuningJobId": int64
  }
}

‫example הוא ReinforcementTuningExample בפורמט ProtoJSON, ו-response הוא Content בפורמט ProtoJSON.

גוף התשובה (application/json):

{
  "reward": float,
  "...": {}
}

דוגמה לבקשה

{
  "example": {
    "contents": [
      {
        "role": "user",
        "parts": [
          { "text": "What is the capital of France?" }
        ]
      }
    ],
    "references": {
      "answer": "Paris"
    }
  },
  "response": {
    "parts": [
      { "text": "London" }
    ]
  },
  "metadata": {
    "step": 1,
    "tuningJobId": 123456789
  }
}

דוגמה לתשובה

{
  "reward": -1.0
}

הגדרת הרשאות IAM

  • כדי להעניק הרשאות IAM נוספות לשירות Cloud Run, אתם צריכים את ההרשאה roles/run.admin בשירות.
  • צריך לתת הרשאה לסוכן של שירות הכוונון העדין המאובטח של Gemini Enterprise Agent Platform‏ (service-PROJECT_NUMBER@gcp-sa-vertex-tune.s3ns-system.iam.gserviceaccount.com) כדי להפעיל את שירות Cloud Run שלכם (לדוגמה, על ידי מתן הרשאה roles/run.invoker ב-IAM).

פסק זמן וניסיונות חוזרים

הזמן המקסימלי שמוקצב לשירות Cloud Run לעיבוד כל בקשה לחישוב תגמול הוא 300 שניות. במקרה של שגיאות בבקשה, השירות מנסה שוב עם השהיה מעריכית לפני ניסיון חוזר (לדוגמה, אחרי 2, 4, 8, 16 ו-32 שניות) לפני שהוא מפסיק לנסות. אם לא מוחזרת תגובה תקינה אחרי שכל הניסיונות מוצו, התגמול מסומן כNaN.

המלצות לעיצוב תגמולים

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

סולם התגמולים

כל תגמול צריך להיות בסולם של [-1, 1]. ערכי תגמול מחוץ לטווח הזה נחתכים.

מה הופך תגמול לטוב

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

אימות הגדרת פרס

מפרט API: ‏ ValidateReinforcementTuningReward

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

  • כדי לבדוק את התוקף והיציבות של התגמול, אפשר להשתמש ב-Cloud de Confiance Console או לבצע קריאה ל-ValidateReinforcementTuningRewardAPI. שגיאות קטנות – כמו שגיאות בניתוח, מקרים חריגים שלא טופלו או קטעי קוד לא תקינים – עלולות לפסול את התגמול ואת ההתאמה.
  • מבצעים הערכה עם התגמול המותאם אישית על מדגם של מערך הנתונים. למידת חיזוק לא יכולה ללמוד היטב כשהתגמול קשה מדי (התגמולים הם כמעט תמיד 0) או פשוט מדי (התגמולים הם כמעט תמיד 1) עבור מערך הנתונים.

אימות במסוף Cloud de Confiance

בשלב Test reward (Optional) (בדיקת תגמול (אופציונלי)) באשף Create a tuned model (יצירת מודל שעבר התאמה):

  1. בעורך Training Example, מזינים שורה של מערך נתונים לדוגמה בפורמט JSON שמכילה את systemInstruction, contents ו-references.
  2. בשדה תשובה לדוגמה של המודל, מזינים תשובה לדוגמה או לוחצים על יצירה מדוגמה לאימון כדי שהמודל הבסיסי ייצור תשובה לדוגמה.
  3. לוחצים על בדיקה כדי להעריך את הגדרת התגמול בהשוואה לדוגמה.
  4. בודקים את באנר הסטטוס ואת הניקוד הכולל. לוחצים על See individual reward information (או על See individual scores and debug info עבור תגמולים מורכבים) כדי לפתוח את חלונית ההזזה ולבדוק את הניקוד, הודעות השגיאה ויומני ניפוי הבאגים של כל תגמול.

אימות באמצעות API בארכיטקטורת REST

‫ValidateReinforcementTuningReward API מצפה ל-sampleResponse (מסוג Content, בדרך כלל מתקבל מפלט של מודל Gemini), ל-RLFTExample ולאחד מהערכים singleRewardConfig או compositeRewardConfig. אם התוצאה שמוחזרת מכילה שגיאה או NaN, סימן שיש בעיה בהגדרת התגמול שצריך לטפל בה לפני שמריצים את משימת הכוונון בפועל.

curl -i -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  "https://us-central1-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/us-central1/tuningJobs:validateReinforcementTuningReward" \
  -d @validate_reward_request.json

מחליפים את PROJECT_ID במזהה הפרויקט ב- Cloud de Confiance by S3NS .

המאמרים הבאים