
نحن نقدم لبنات بناء قابلة للتخصيص بسهولة لنماذج لغة التدريب بما في ذلك تطبيقات الخوارزميات على الجودة ، وظائف المكافآت ، والمقاييس ، ومجموعات البيانات ، وسياسات الممثل الناقد LM
رابط الورق: https://arxiv.org/abs/2210.01241
رابط الموقع: https://rl4lms.apps.allenai.org/
تم اختبارها وقياسها بدقة مع أكثر من 2000 تجربة (معيار Grue؟) على مجموعة شاملة من:
يمكن أن تكون كل لبنات البناء هذه قابلة للتخصيص مما يسمح للمستخدمين بتدريب LMS المستند إلى المحولات على تحسين أي وظيفة مكافأة تعسفية على أي مجموعة بيانات من اختيارهم.
git clone https://github.com/allenai/RL4LMs.git
cd RL4LMs
pip install -e . نحن نقدم أيضًا Dockerfile للتنمية باستخدام حاويات Docker التي تحتوي على جميع التبعيات.
docker build . -t rl4lms اختياريا ، هناك حاجة إلى مكتبات corenlp لبعض الحسابات المترية (على سبيل المثال. التوابل) والتي يمكن تنزيلها من خلال cd rl4lms/envs/text_generation/caption_metrics/spice && bash get_stanford_models.sh
نحن نقدم واجهة برمجة تطبيقات تدريب بسيطة يمكن استدعاؤها عبر البرنامج النصي للقطار يسمح بتدريب PPO أو NLPO أو نموذج خاضع للإشراف باستخدام ملف التكوين (YAML).
على سبيل المثال ، لتدريب T5-base على تلخيص CNN/DM على PPO باستخدام Rouge-1 كدالة للمكافأة ، يمكنك تشغيل:
python scripts/training/train_text_generation.py --config_path scripts/training/task_configs/summarization/t5_ppo.ymlيمكن العثور على ملفات التكوين لجميع المهام هنا.
يحتوي ملف التهيئة على تفاصيل حول إعدادات المعلمة المفرطة للبلاط المبنية الموضحة أدناه:
مجموعة البيانات/المهمة : مجموعة بيانات تحتوي على عينات مع مطالبات الإدخال والجمل المرجعية. تم العثور على مجموعات البيانات المتاحة في فئة DataPoolRegistry في السجل. (انظر كيفية إنشاء مجموعة البيانات الخاصة بك هنا)
datapool :
id : cnn_daily_mail
args :
prompt_prefix : " Summarize: "Tokenizer - مميز مدرب مسبقًا يستخدم ل (DE) تميز تسلسل الإدخال والإخراج مع إعدادات الحشو والاقتطاع
tokenizer :
model_name : t5-base
padding_side : left
truncation_side : left
pad_token_as_eos_token : False وظيفة المكافأة : وظيفة المكافأة التي تحسب درجات على مستوى الرمز المميز في كل خطوة زمنية من MDP. يمكن العثور على وظائف المكافآت المتاحة في الفصل RewardFunctionRegistry . (انظر كيفية إنشاء وظيفة المكافأة الخاصة بك هنا)
reward_fn :
id : rouge
args :
rouge_type : " rouge1 " البيئة : تكوين بيئة توليد نصية على غرار صالة الألعاب الرياضية تحاكي حلقات MDP. يتم إنشاء التمريرات باستخدام عينات القطار من مجموعة البيانات التي تتكون من النصوص الإدخال والمرجع. علاوة على ذلك ، نلتف ENV لدينا باستخدام SubProcVecEnv من الخطيئة المستقرة التي تعالج حلقات n_envs بالتوازي باستخدام المعالجة المتعددة لحساب المكافآت الحكيمة.
تشمل إعدادات التكوين الإضافية:
max_episode_length : أقصى طول الحلقةmax_prompt_length - الحد الأقصى لطول نص الإدخال للنظر فيهterminate_on_eos - ما إذا كان يجب إنهاء الحلقة بمجرد تنفيذ إجراء EOSprompt_truncation_side - جانب الاقتطاع للنص المطالبهcontext_start_token - معرف لرمز السياق (يتوافق مع الرمز المميز الأولي المعطى إلى وحدة فك الترميز في نماذج ترميز التشفير) env :
n_envs : 10
args :
max_prompt_length : 512
max_episode_length : 100
terminate_on_eos : True
prompt_truncation_side : " right "
context_start_token : 0ALG على السيطرة : نحن نقدم تطبيقات من 4 خوارزميات على الجودة: PPO ، NLPO ، A2C و TRPO مقتبسة من baselines 3 مصممة للعمل مع مهام NLP التي يمكن استخدامها خارج الصندوق مع سياسة سببية أو سياسة SEQ2SEQ LM. (انظر كيفية إنشاء خوارزمية أو سياسة خاصة بك)
كما نقدم مدربًا خاضعًا للإشراف لأغراض القياس. يتم بالفعل تحميل نماذج البدء الدافئ الخاضع للإشراف إلى Huggingface Hub وتحديدها في ملفات التكوين ذات الصلة.
يمكن تحديد المعلميات المفرطة للخوارزمية في alg/args .
علاوة على ذلك ، تستخدم جميع خوارزميات RL وحدة تحكم KL Adaptive للحفاظ على LM قريبة من LM الأصلي عن طريق تعيين KL الأولي في الكفاءة ( alg/kl_div/coeff ) والهدف KL ( alg/kl_div/target_kl ).
نحن ندعم نوعين من سياسة LM: سياسة LM السببية (لنماذج فك التشفير فقط) وسياسة SEQ2Seq LM (لنماذج التشفير والتشفير). علاوة على NLPO ، فإننا نقدم أيضًا متغيرات قابلة للإخفاء من هذه. يمكن الاطلاع على تطبيقات السياسة هنا في ويمكن إرفاقها بخوارزميات من خلال تحديد alg/policy/id و alg/policy/args
alg :
id : ppo
args :
n_steps : 512
batch_size : 64
verbose : 1
learning_rate : 0.000002
n_epochs : 5
ent_coef : 0.0
kl_div :
coeff : 0.001
target_kl : 0.2
policy :
id : seq2seq_lm_actor_critic_policy
args :
model_name : t5-base
apply_model_parallel : True
prompt_truncation_side : " right "
generation_kwargs :
do_sample : True
top_k : 50
min_length : 50
max_new_tokens : 100 تكوين المدرب : نحن نقدم مدربًا على السير-غلاف مكتمل للميزات يقوم بتثبيت لبنات بناء من تكويناتها المقابلة ويوفر حلقة تدريب خارجية تتكون من تكرار القطار وتقييم train_evaluation/n_iters .
alg/args/n_steps X env/n_envs من الخوارزمية المختارة.eval_every iters ، يتم تقييم LM عند تقسيم التحقق من الصحة باستخدام المقاييس المدرجة في train_evaluation/metrics مع kwargs المتوفرة في train_evaluation/generation_kwargs alg/policy/generation_kwargs (هذا يتغلب # train and evaluation
train_evaluation :
eval_batch_size : 100
n_iters : 100
eval_every : 10
save_every : 1
metrics :
- id : meteor
args : {}
- id : rouge
- id : bleu
args : {}
- id : bert_score
args :
language : en
- id : diversity
args : {}
generation_kwargs :
do_sample : True
top_k : 0
temperature : 0.7
min_length : 50
max_new_tokens : 100توفر RL4LMs تخصيصًا تامًا-فيما يتعلق بإضافة مهام/مجموعات بيانات جديدة ، وظائف المكافآت ، مقياس التقييم ، الخوارزميات على الجودة والسياسات الفاعلة الناقصة.
يمكن للمستخدمين إنشاء مجموعات البيانات الخاصة بهم عن طريق التصفيات الفرعية textgenpool فقط عن طريق تجاوز prepare(cls, split: str, **args) -> 'TextGenPool': طريقة لإرجاع مثيل textgenpool. يظهر مثال أدناه:
from rl4lms . data_pools . text_generation_pool import Sample , TextGenPool
class MyDataPool ( TextGenPool ):
@ classmethod
def prepare ( cls , split : str ):
..
samples = []
for ix , item in enumerate (..):
sample = Sample ( id = f" { split } _ { ix } " ,
prompt_or_input_text = item [ "document" ],
references = [ item [ "target" ]]
)
samples . append ( sample )
pool_instance = cls ( samples )
return pool_instance يمكن تنفيذ الترون المخصص للمكافآت بسهولة عن طريق تكافؤ المكافأة الفرعية (قابلة للتطبيق) التي تأخذ الملاحظة (
from rl4lms . envs . text_generation . observation import Observation
from rl4lms . envs . text_generation . reward import RewardFunction
class MyRewardFunction ( RewardFunction ):
def __init__ ( self , * args ) -> None :
super (). __init__ ()
def __call__ ( self , prev_observation : Observation ,
action : int ,
current_observation : Observation ,
done : bool ,
meta_info : Dict [ str , Any ] = None ) -> float :
if done :
reward = ..
return reward
return 0بالإضافة إلى مقاييس NLG التقليدية ، من أجل النماذج الأولية السريعة ، نقدم وظيفتين للمكافأة الاصطناعية التي تدرب LMS لإنشاء أرقام بترتيب متزايد وتواريخ. يمكن استخدامها لاختبار خوارزميات وسياسات مختلفة بسرعة. يمكن العثور على التكوينات المقابلة هنا (الأرقام ، التواريخ)
يمكن للمستخدمين إنشاء مقياس التقييم الخاص بهم والذي سيتم استخدامه بعد ذلك لتقييم النموذج بشكل دوري عند تقسيم التحقق من مجموعة البيانات. يمكن القيام بذلك عن طريق التصفيات الفرعية التي تأخذ نصوصًا سريعة ونصوصًا تم إنشاؤها والنصوص المرجعية و meta_infos ونموذج LM الحالي والاسم المقسم كمدخلات وإرجاع الاسم المتري على أنه مفتاح وقيمة تتكون من tuple من SCRONS على مستوى الجملة ودرجات مستوى الجسوس. مثال على النحو التالي:
from rl4lms . envs . text_generation . metric import BaseMetric
class MyMetric ( BaseMetric ):
def __init__ ( self ) -> None :
super (). __init__ ()
def compute ( self ,
prompt_texts : List [ str ],
generated_texts : List [ str ],
reference_texts : List [ List [ str ]],
meta_infos : List [ Dict [ str , Any ]] = None ,
model : PreTrainedModel = None ,
split_name : str = None ):
metric_dict = {
"custom_metrics/my_metric" : ([ 0.4 , 0.7 , 0.9 ], 0.7 )
}
return metric_dict بالإضافة إلى الخوارزميات المدعومة على الجودة (PPO ، NLPO ، A2C ، TRPO) ، يمكن للمستخدمين تنفيذ خوارزمياتهم الخاصة على الجودة بسهولة من خلال التصفيات الفرعية للبلاشين 3. نظرًا لأننا نوفر أغلفة للخوارزميات على الجودة التي تتعامل مع التمريرات باستخدام سياسات LM والبيئة والمكافآت الحوسبة وما إلى ذلك ، يحتاج المستخدمون فقط إلى تنفيذ طريقة train() مع وظائف الخسارة المخصصة.
from stable_baselines3 . common . on_policy_algorithm import OnPolicyAlgorithm
class MyOnPolicyAlgorithm ( OnPolicyAlgorithm ):
def __init__ ( ** args ):
super (). __init__ ( ** args )
def train ( self ) -> None :
# train for n_epochs epochs
for epoch in range ( self . n_epochs ):
# Do a complete pass on the rollout buffer
for rollout_data in self . rollout_buffer . get ( self . batch_size ):
# compute loss نحن نقدم تطبيقات السياسة الناقدة للممثل القائم على LM التي تلتف LM و SEQ2Seq LMS السببية. يمكن أيضًا تمديدها (على سبيل المثال: استخدم بنية ناقد مختلفة) عن طريق تجاوز الأساليب المناسبة (على سبيل المثال. evaluate_actions() )
أخيرًا ، ما عليك سوى تسجيل مكوناتك المخصصة عن طريق إضافتها إلى السجل المقابل ، وبعد ذلك يمكن استخدامها مباشرة من التكوينات المشابهة للمكونات المحددة مسبقًا
لقد قدمنا قوالب التعهيد الجماعي الذي استخدمناه على تركيك ميكانيكي ، إلى جانب إدخال مثال في scripts/crowdworking_templates . قد تجد هذه نقطة انطلاق مفيدة إما لتقييم أجيال النموذج الخاص بك ، أو لجمع بيانات التدريب لوظيفة المكافأة المستفادة.
بالإضافة إلى ذلك ، فإننا ندعم تسجيل WANDB والبدء الدافئ للتدريب عن طريق تخزين نقاط التفتيش وغيرها من القطع الأثرية التدريبية في مسار محدد للمستخدم. هذا مفيد بشكل خاص لتشغيل الوظائف الاستباقية على مجموعات كبيرة مجدولة.
تتضمن القطع الأثرية (1) ملف JSONL يحتوي على infos المتداول على فترات زمنية محددة (2) ملف JSONL الذي يحتوي على infos التدريب على فترات زمنية محددة (3) ملف JSONL يحتوي (8) تهيئة json المستخدمة لتشغيل التجربة
الاستخدام الكامل هو كما يلي:
WANDB_API_KEY= < YOUR-WANDB-API-KEY-HERE > python scripts/training/train_text_generation.py
--config_path < PATH-TO-CONFIG-FILE >
--experiment_name < EXPERIMENT-NAME >
--base_path_to_store_results < PATH-TO-STORE-RESULTS >
--log_to_wandb @inproceedings { Ramamurthy2022IsRL ,
title = { Is Reinforcement Learning (Not) for Natural Language Processing?: Benchmarks, Baselines, and Building Blocks for Natural Language Policy Optimization } ,
author = { Rajkumar Ramamurthy and Prithviraj Ammanabrolu and Kiant{'e} Brantley and Jack Hessel and Rafet Sifa and Christian Bauckhage and Hannaneh Hajishirzi and Yejin Choi } ,
journal = { arXiv preprint arXiv:2210.01241 } ,
url = { https://arxiv.org/abs/2210.01241 } ,
year = { 2022 }
}للمناقشة ، والأسئلة ، تبادل الأفكار ، انضم إلى قناة Slack