نمایشی از مفهوم RLHF
نمایشی از مفهوم RLHF

RLHF: موتوری برای تنظیم ارزش‌های انسانی در مدل‌های زبانی بزرگ

(بررسی عمیق یادگیری تقویتی از بازخورد انسانی)

ما با حیرت به مدل‌های زبانی بزرگ (LLM) مانند GPT-4، Gemini، Claude و Llama نگاه می‌کنیم. این مدل‌ها که بر روی داده‌های مقیاس اینترنت (> 10^12 توکن) آموزش داده شده‌اند، دانش گسترده و تسلط زبانی فراوانی دارند. با این حال، تبدیل این پتانسیل خام به دستیارهای هوش مصنوعی مفید، بی‌ضرر و صادق، چیزی فراتر از مجموعه داده‌های عظیم می‌طلبد. این امر نیازمند همسویی است - آموزش این مدل‌ها برای رفتار مطابق با ترجیحات و ارزش‌های انسانی.

فناوری کلیدی که این همسویی را برای بسیاری از مدل‌های پیشرفته امکان‌پذیر می‌کند، یادگیری تقویتی از بازخورد انسانی (RLHF) است. این یک فرآیند پیچیده است که مدل‌های بزرگ را با استفاده از قضاوت انسانی به عنوان راهنمای نهایی، تنظیم دقیق می‌کند.

این پست به بررسی عمیق‌تر RLHF می‌پردازد و سازوکارهای اساسی، ریاضیات و مراحل محاسباتی درگیر را بررسی می‌کند.

معادله LLM

مسئله همسویی: چرا پیش‌آموزش کافی نیست؟

پیش‌آموزش استاندارد LLM برای پیش‌بینی توکن بعدی در یک دنباله بهینه می‌شود. با توجه به یک زمینه c ، مدل پارامترهای ?\psi را یاد می‌گیرد تا احتمال توکن بعدی واقعی t را در سراسر یک مجموعه داده عظیم D به حداکثر برساند:

این هدف باعث می‌شود که مدل در تولید متن روان و اغلب از نظر واقعی آگاه، ماهر شود. با این حال، ذاتاً به مدل آموزش نمی‌دهد که:

  • دستورالعمل‌ها را به درستی دنبال کند: مدل‌های پیش‌آموزش‌شده ممکن است محدودیت‌ها را نادیده بگیرند یا تفاوت‌های ظریف درخواست کاربر را اشتباه درک کنند.
  • صداقت را حفظ کند: آنها می‌توانند اطلاعات نادرست اما ظاهراً معقول را "توهم" کنند.
  • از خروجی‌های مضر اجتناب کند: آنها ممکن است تعصبات را بازتولید کنند یا محتوای سمی آموخته‌شده از داده‌های آموزشی را تولید کنند.
  • مختصر و مفید باشد: پاسخ‌ها می‌توانند طولانی، طفره‌آمیز یا نادیده گرفتن نیاز اصلی کاربر باشند.
  • از درخواست‌های نامناسب خودداری کند: آنها فاقد درک ذاتی از مرزهای اخلاقی هستند.

ما به مکانیزمی نیاز داریم تا مدل را به طور صریح به سمت رفتارهای مطلوب هدایت کنیم، فراتر از تکمیل الگوی ساده.

فرآیند RLHF

RLHF: یک فرآیند همسویی چند مرحله‌ای

RLHF از طریق یک فرآیند ساختاریافته سه مرحله‌ای به مسئله همسویی می‌پردازد:

مرحله 1: تنظیم دقیق نظارت‌شده (SFT) - (اختیاری اما رایج)

قبل از پرداختن به RLHF مناسب، مدل‌ها اغلب در ابتدا بر روی یک مجموعه داده کوچکتر و با کیفیت بالا از جفت‌های دستورالعمل-پاسخ، تنظیم دقیق می‌شوند. این مجموعه داده شامل نمونه‌هایی از خروجی‌های مورد نظر برای درخواست‌های مختلف است که اغلب توسط انسان‌ها انتخاب می‌شوند.

  • هدف: تطبیق مدل پیش‌آموزش‌شده برای پیروی بهتر از دستورالعمل‌ها و پاسخگویی به یک سبک خاص (به عنوان مثال، مانند یک دستیار).
  • فرآیند: تنظیم دقیق مدل با استفاده از همان هدف پیش‌بینی توکن بعدی به عنوان پیش‌آموزش، اما فقط در این مجموعه داده انتخاب‌شده:
  • نتیجه: یک مدل p? که در پیروی از دستورالعمل‌ها بهتر از مدل پیش‌آموزش‌شده پایه p? است. این به عنوان یک نقطه شروع بهتر برای مراحل بعدی RLHF عمل می‌کند. بیایید این سیاست شروع را pSFT بنامیم.
معادله SFT

مرحله 2: آموزش یک مدل پاداش (RM) - یادگیری ترجیحات انسانی

این هسته اصلی بخش "بازخورد انسانی" است. ما باید قضاوت انسانی در مورد اینکه چه چیزی یک پاسخ "خوب" را تشکیل می‌دهد، ثبت کنیم.

  • هدف: آموزش یک مدل r?(x,y) که یک درخواست x و یک پاسخ تولیدشده y را دریافت می‌کند و یک امتیاز اسکالر را خروجی می‌دهد که نشان‌دهنده میزان ترجیح یک انسان برای آن پاسخ است.
  • جمع‌آوری داده‌ها:
  1. مجموعه‌ای متنوع از درخواست‌ها x را انتخاب کنید.
  2. از مدل SFT (یا حتی نسخه‌های مدل متعدد) برای تولید چندین پاسخ کاندید {y1, y2, … , yk} برای هر درخواست x استفاده کنید.
  3. جفت‌های پاسخ (yi, yj) را برای یک درخواست x به برچسب‌گذاران انسانی ارائه دهید.
  4. از برچسب‌گذاران بخواهید که کدام پاسخ را ترجیح می‌دهند، Yw (برنده) یا Yl(بازنده).
  5. یک مجموعه داده بزرگ DRM از تاپل‌های ترجیحی (x,Yw,Yl) جمع‌آوری کنید.
معادله مدل Bradley Terry
  • مدل‌سازی ترجیحات: مدل پاداش r?(x,y) برای پیش‌بینی این ترجیح آموزش داده می‌شود. یک رویکرد رایج از مدل Bradley-Terry استفاده می‌کند، که فرض می‌کند احتمال ترجیح yw بر yl مربوط به تفاوت در امتیازات پاداش آنها از طریق یک تابع سیگموئید s است:
  • هدف آموزش: به حداکثر رساندن احتمال ترجیحات انسانی مشاهده‌شده. این به حداقل رساندن یک تابع زیان لجستیک بر روی مجموعه داده تبدیل می‌شود:
معادله هدف آموزش مدل پاداش
  • مدل پاداش اغلب با وزن‌های مدل SFT (یا مدل پیش‌آموزش‌شده) شروع می‌شود و یک لایه خطی را در بالای نمایش توکن نهایی اضافه می‌کند تا پاداش اسکالر را خروجی دهد.
  • کد مفهومی (زیان مدل پاداش):

import torch
import torch.nn as nn
import torch.optim as optim
from transformers import AutoModelForSequenceClassification, AutoTokenizer

# Example
# Assume RewardModel outputs a single scalar score
# reward_model = AutoModelForSequenceClassification.from_pretrained('sft_model_path', num_labels=1)
# tokenizer = AutoTokenizer.from_pretrained('sft_model_path')

def compute_reward_model_loss(reward_model, tokenizer, prompt, response_winner, response_loser):
    """Conceptual function for RM loss calculation"""
    # Tokenize inputs (handle truncation, padding etc.)
    winner_inputs = tokenizer(prompt + response_winner, return_tensors='pt', truncation=True, padding=True)
    loser_inputs = tokenizer(prompt + response_loser, return_tensors='pt', truncation=True, padding=True)

    # Get reward scores from the model
    # The actual way to get the scalar might differ based on model head architecture
    # Assuming model outputs logits, and we take the first logit as the score
    score_winner = reward_model(**winner_inputs).logits.squeeze() # Shape: [batch_size]
    score_loser = reward_model(**loser_inputs).logits.squeeze()   # Shape: [batch_size]

    # Calculate loss based on pairwise comparison
    # log(sigmoid(score_winner - score_loser))
    loss = -torch.log(torch.sigmoid(score_winner - score_loser)).mean()
    return loss

# --- Training Loop Sketch ---
# optimizer = optim.Adam(reward_model.parameters(), lr=1e-5)
# for batch in preference_dataloader: # Batches of (prompt, y_w, y_l)
#     optimizer.zero_grad()
#     loss = compute_reward_model_loss(reward_model, tokenizer,
#                                      batch['prompt'], batch['response_winner'], batch['response_loser'])
#     loss.backward()
#     optimizer.step()
  • سلب مسئولیت: کد بالا بسیار مفهومی است و بسیاری از جزئیات مانند بارگیری داده‌ها، معماری مدل دقیق برای امتیازدهی، دستکاری دستگاه و آموزش توزیع‌شده را حذف می‌کند.
معادله اقدام

مرحله 3: تنظیم دقیق با یادگیری تقویتی (RL) - بهینه‌سازی سیاست

اکنون، ما از مدل پاداش آموزش‌دیده برای بهبود مدل زبانی SFT (سیاست اولیه ما) با استفاده از RL استفاده می‌کنیم.

  • هدف: آموزش یک سیاست (که LLM است که ما در حال تنظیم آن هستیم) که پاسخ‌هایی y به درخواست‌ها x تولید می‌کند که پاداش مورد انتظار پیش‌بینی‌شده توسط مدل پاداش را به حداکثر می‌رساند.
  • فرمول‌بندی RL:
  • حالت: درخواست x دریافت‌شده توسط عامل.
  • اقدام: تولید پاسخ:
معادله تابع هدف PPO
  • پاداش: امتیاز اختصاص‌داده‌شده توسط مدل پاداش.
  • چالش: به حداکثر رساندن ساده‌لوحانه می‌تواند LLM را به انحراف شدید از تولید زبان واقع‌گرایانه (یافتن سوء استفاده‌ها در RM) یا فراموش کردن دانش از پیش‌آموزش سوق دهد.
  • راه‌حل (PPO): بهینه‌سازی سیاست پروگزیمال (PPO) معمولاً استفاده می‌شود. هدف آن به حداکثر رساندن پاداش ضمن محدود کردن میزان تغییر سیاست از یک سیاست مرجع است که معمولاً سیاست اولیه SFT است. این محدودیت با استفاده از یک جریمه واگرایی KL اعمال می‌شود.
  • تابع هدف PPO: هدف برای تنظیم سیاست LLM تقریباً به شرح زیر است:
  • جایی که:
  • E(x,y)~p? نشان‌دهنده انتظار زمانی است که درخواست‌ها x از یک مجموعه داده گرفته می‌شوند و پاسخ‌ها y توسط سیاست فعلی p? تولید می‌شوند.
  • r?(x,y) پاداش حاصل از مدل پاداش آموزش‌دیده است.
  • KL واگرایی Kullback-Leibler بین سیاست فعلی و سیاست اولیه SFT است. این میزان "انحراف" سیاست فعلی از مرجع را اندازه‌گیری می‌کند.
  • ß یک ابرپارامتر است که قدرت جریمه KL را کنترل می‌کند. یک ß بالاتر p? را به pSFT نزدیک‌تر نگه می‌دارد.
  • (توجه: PPO در عمل از یک هدف جانشین بریده‌شده کمی پیچیده‌تر برای پایداری استفاده می‌کند، اما ایده اصلی در بالا ثبت شده است.)
  • کد مفهومی (مرحله به‌روزرسانی RL):

import torch
# Assume policy_llm is the model being trained (e.g., AutoModelForCausalLM)
# Assume reference_llm is the frozen SFT model (same architecture)
# Assume reward_model is the trained RM from Stage 2
# Assume tokenizer is shared

def compute_rl_loss(policy_llm, reference_llm, reward_model, tokenizer, prompts, responses, beta):
    """Conceptual function for RL loss/objective calculation"""
    # --- Get Rewards ---
    # Need to tokenize prompts + responses for the reward model
    reward_inputs = tokenizer(prompts, responses, return_tensors='pt', padding=True, truncation=True)
    with torch.no_grad(): # RM is frozen during RL update
        rewards = reward_model(**reward_inputs).logits.squeeze() # Shape: [batch_size]

    # --- Get Log Probabilities ---
    # Tokenize for the policy LLM (inputs = prompts, labels = responses)
    policy_inputs = tokenizer(prompts, return_tensors='pt', padding=True, truncation=True)
    policy_labels = tokenizer(responses, return_tensors='pt', padding=True, truncation=True).input_ids
    # Calculate log probability of generating 'responses' given 'prompts'
    # under the current policy_llm
    outputs_policy = policy_llm(**policy_inputs, labels=policy_labels)
    log_probs_policy = outputs_policy.loss * -policy_labels.size(1) # Reconstruct sum log P(token|context)
    # Calculate log probability under the reference model (frozen)
    with torch.no_grad():
        outputs_ref = reference_llm(**policy_inputs, labels=policy_labels)
        log_probs_ref = outputs_ref.loss * -policy_
labels.size(1)

    # --- Calculate KL Divergence --- #
    # KL(P || Q) = sum(P(x) * log(P(x) / Q(x)))
    kl = log_probs_ref - log_probs_policy # per-token KL estimates
    mean_kl = kl.mean()

    # --- Compute Objective --- #
    # objective = E[reward - beta * KL]
    objective = rewards - beta * kl
    loss = -objective.mean() # PPO minimizes the negative objective
    return loss, mean_kl

# --- Training Loop (Conceptual) ---
# optimizer = optim.Adam(policy_llm.parameters(), lr=1e-5)
# for batch in rl_dataloader: # Batches of prompts
#     # 1. Generate responses from the policy model
#     responses = policy_llm.generate(batch['prompt'])
#     # 2. Compute loss and KL
#     loss, mean_kl = compute_rl_loss(policy_llm, reference_llm, reward_model, tokenizer,
#                                       batch['prompt'], responses, beta)
#     # 3. Backpropagate and update
#     optimizer.zero_grad()
#     loss.backward()
#     optimizer.step()

# 4.  Monitor KL, adjust beta if needed
#   if mean_kl > kl_threshold:
#     beta *= kl_penalty
#   elif mean_kl < kl_threshold:
#     beta /= kl_penalty

مانند قبل، کد بالا برای وضوح ساده شده است. کتابخانه Transformer و TRL (Transformer Reinforcement Learning) ابزارهای بسیار قدرتمندی برای تسهیل این روال‌های پیچیده در یک کد تمیز ارائه می‌دهند.

شکل

چالش‌ها و ملاحظات عملی

اگرچه RLHF به طور قابل توجهی LLM‌ها را بهبود بخشیده است، چندین چالش عملی و حوزه‌های برای تحقیق وجود دارد:

  1. برچسب‌گذاران انسانی پرهزینه: بدست آوردن داده‌های ترجیحی انسانی با کیفیت بالا گران و زمان‌بر است. نیاز به برچسب‌گذارانی دارد که دستورالعمل‌ها را درک کنند، دیدگاه‌های متفاوتی را در نظر بگیرند و با سناریوهای پیچیده سروکار داشته باشند.
  2. تعصب در بازخورد انسانی: ترجیحات انسانی می‌تواند ذهنی و تحت تأثیر عوامل فرهنگی، جمعیت‌شناختی و فردی باشد. LLM آموزش‌دیده ممکن است ناخواسته این تعصبات را به نفع دیدگاه‌های خاص تقویت کند.
  3. مقیاس‌بندی بازخورد: تعداد مقایسه‌های انسانی مورد نیاز برای آموزش یک مدل پاداش قوی با مقیاس مدل زبان افزایش می‌یابد. مقیاس‌بندی بازخورد انسانی به عنوان مثال از طریق عدم قطعیت برچسب‌گذاران به تحقیق بیشتری نیاز دارد.
  4. انحرافات مدل پاداش: مدل‌های پاداش ناقص می‌توانند بهینه سازی سیاست RL را به سمت پاسخ‌هایی هدایت کنند که به ترجیحات واقعی انسان هماهنگ نیستند. سیاست RL ممکن است "سوء استفاده‌ها" را در مدل پاداش بیابد و به روش‌های غیرمنتظره و نامطلوب از آن سوء استفاده کند. استفاده از تکنیک‌های پاداش‌دهی ایمن به یک حوزه تحقیقاتی فعال تبدیل شده است.
  5. مشکلات آموزش RL: آموزش سیاست RL می‌تواند از نظر محاسباتی گران باشد و در مقایسه با تنظیم دقیق نظارت‌شده، بی‌ثبات‌تر است. ایجاد تعادل در پاداش با محدودیت واگرایی KL و انتخاب الگوریتم‌های RL مناسب مستلزم تنظیم دقیق است.
شکل

گزینه‌ها

RLHF تنها تکنیک همسویی نیست. در اینجا یک لیست سریع از برخی رویکردهای دیگر وجود دارد:

  1. تنظیم دقیق نظارت‌شده (SFT): یک پایه ارزشمند برای سیستم RLHF است و همچنان یک رویکرد همسویی سودمند محسوب می‌شود.
  2. یادگیری معکوس (IRL): در عوض، IRL به دنبال بازیابی تابع پاداش از یک رفتار متخصص است. ایده پشت این روش این است که از این طریق، عامل یاد می‌گیرد نه تنها عمل درست، بلکه دلیل درست انجام آن را نیز انجام دهد.
  3. یادگیری تقویتی بدون مدل: تلاش برای آموزش یک "تابع ارزش" (به نام Q-Learning) که به عامل می‌گوید کدام اقدام در هر ایالت بیشترین پاداش را می‌دهد. به طور معمول، عوامل مبتنی بر مدل سریع‌تر و با داده کمتری یاد می‌گیرند.
  4. DPO (بهینه‌سازی ترجیح مستقیم): مشابه RLHF، DPO با بهینه‌سازی مستقیم مدل زبانی برای برآوردن ترجیحات انسانی عمل می‌کند. با فرمول‌بندی مجدد مسئله یادگیری تقویتی به یک مسئله طبقه‌بندی ساده، مدل را آموزش می‌دهد تا تفاوت‌های بین پاسخ‌های ترجیح‌داده‌شده و نامطلوب را تشخیص دهد. در نتیجه، در مقایسه با RLHF، حذف نیاز به مدل پاداش، ثبات و کارآمدی را افزایش می‌دهد.
شکل

در نتیجه

همسو کردن مدل‌های زبانی بزرگ با ارزش‌های انسانی یک چالش مهم است. یادگیری تقویتی از بازخورد انسانی (RLHF) با بهینه‌سازی مدل‌ها برای ترجیحات انسانی، به طور قابل توجهی پیشرفت کرده است.

فرآیند RLHF شامل سه مرحله کلیدی است:

  1. مدل زبانی با استفاده از داده‌های نظارت‌شده تنظیم دقیق می‌شود.
  2. یک مدل پاداش برای پیش‌بینی ترجیحات انسان آموزش داده می‌شود.
  3. با استفاده از یادگیری تقویتی، مدل زبانی با پاداش مدل پاداش بهینه‌سازی می‌شود.

با این حال، RLHF چالش‌هایی مانند جمع‌آوری داده‌ها، تعصبات در بازخورد انسانی، در مقیاس دادن به بازخورد و مدل‌سازی پاداش دارد. تحقیقات در حال انجام بر این چالش‌ها متمرکز است تا همسویی مدل را بیشتر بهبود بخشد.

RLHF پیشرفت قابل توجهی را در همسویی مدل‌های زبانی بزرگ نشان می‌دهد. با درک مکانیسم‌های آن و رسیدگی به چالش‌های آن، می‌توانیم دستیارهای هوش مصنوعی ایجاد کنیم که مفیدتر، بی‌ضررتر و همسو با ارزش‌های انسانی هستند.