
Мы предоставляем легко настраиваемые строительные блоки для моделей обучения языковым моделям, включая реализации алгоритмов политики , функций вознаграждения , метрик , наборов данных и политики, критико-критической политики, основанной на LM, на основе LM
Бумажная ссылка: https://arxiv.org/abs/2210.01241
Ссылка на веб -сайт: https://rl4lms.apps.allenai.org/
Тщательно протестированные и сравниваемые с более чем 2000 экспериментами (GRUE BENCHMARK?) На комплексном наборе:
Все эти строительные блоки могут быть настраиваемыми, позволяя пользователям обучать LMS на основе трансформатора оптимизировать любую произвольную функцию вознаграждения в любом наборе данных по своему выбору.
git clone https://github.com/allenai/RL4LMs.git
cd RL4LMs
pip install -e . Мы также предоставляем DockerFile для разработки, используя контейнеры Docker, содержащие все зависимости.
docker build . -t rl4lms Необязательно, для определенных метрических вычислений необходимы библиотеки CORENLP (например, SPICE), которые можно загрузить через cd rl4lms/envs/text_generation/caption_metrics/spice && bash get_stanford_models.sh
Мы предоставляем простой учебный API, который можно вызвать с помощью сценария поезда, который позволяет обучать PPO, NLPO или контролируемую модель с помощью файла конфигурации (YAML).
Например, для обучения T5-базы на суммировании 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: "Токенизатор - предварительно обученный токенизатор, который используется для (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 - ID для контекста токен (соответствует первоначальному токену, данному декодеру в моделях Encoder -Decoder) env :
n_envs : 10
args :
max_prompt_length : 512
max_episode_length : 100
terminate_on_eos : True
prompt_truncation_side : " right "
context_start_token : 0On-Policy ALG : мы предоставляем реализации 4 алгоритмов на политике: PPO, NLPO, A2C и TRPO, адаптированные из стабильных баселинов3 для работы с задачами NLP, которые можно использовать из-за бокса с помощью политики причинно-следственной связи или политики SEQ2SEQ LM. (Посмотрите, как создать свой собственный алгоритм или политику на политике)
Мы также предоставляем контролируемого тренера для сравнительных целей. Контролируемые модели теплого старта уже загружаются в концентратор Huggingface и указаны в соответствующих файлах конфигурации.
Гиперпараметры для алгоритма могут быть указаны на alg/args .
Кроме того, все алгоритмы RL используют адаптивный контроллер KL, чтобы держать LM вблизи исходного LM, установив начальный коэффициент KL ( alg/kl_div/coeff ) и Target KL ( alg/kl_div/target_kl ).
Мы поддерживаем два типа политики LM: причинно-следственная политика LM (для моделей только декодера) и политики SEQ2SEQ LM (для моделей Encoder-Decoder). Кроме того, для 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 , 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 : 100RL4LMS обеспечивает полную настраиваемость-в отношении добавления новых задач/наборов данных, функций вознаграждения, метрики оценки, алгоритмов на политике и критической политики.
Пользователи могут создавать свои собственные наборы данных с помощью подкласса 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, разделение имени в качестве входных данных и возвращает DICT с метрическим именем в качестве ключа и значения, состоящего из дефектов баллов на уровне предложений и баллов уровня корпуса. Пример заключается в следующем:
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) пользователи могут легко реализовать свои собственные алгоритмы на политике, путем субкласирования Stable-Baselines3. Поскольку мы предоставляем обертки для алгоритмов политики, которые обрабатывают развертывание с использованием политик 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() )
Наконец, просто зарегистрируйте свои пользовательские компоненты, добавив их в соответствующий реестр, после чего их можно использовать непосредственно из конфигураций, аналогичных предварительно определенным компонентам
Мы предоставили краудсорсинговые шаблоны, которые мы использовали на Mechanical Turk, а также примеры входов в scripts/crowdworking_templates . Вы можете найти это полезной отправной точкой либо для оценки поколений вашей собственной модели, либо для сбора данных обучения для обученной функции вознаграждения.
Кроме того, мы поддерживаем журнал Wandb и теплое начало обучения, сохраняя контрольные точки и другие учебные артефакты на определенном пользователе пути. Это особенно полезно для выполнения упреждающихся работ на больших, запланированных кластерах.
Artifacts include (1) jsonl file containing rollout infos at specified intervals (2) jsonl file containing training infos at specified intervals (3) jsonl file containing validation metrics at specified intervals (4) jsonl file containing test metrics before and after training (5) json file with validation predictions at specified intervals (6) json file with test predictions before and after training (7) trained LM model (8) Config 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