
我们为培训语言模型提供易于自定义的构建块,包括实施上的算法,奖励功能,指标,数据集和基于LM的Actor-Critic-Critic策略
纸张链接: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 . 我们还为使用包含所有依赖项的Docker容器提供了用于开发的Dockerfile。
docker build . -t rl4lms可选地,Corenlp库是某些度量计算(例如SPICE)所需的,可以通过cd rl4lms/envs/text_generation/caption_metrics/spice && bash get_stanford_models.sh下载这些度量计算
我们提供了一个简单的培训API,可以通过火车脚本调用,该API允许使用Config File(YAML)训练PPO,NLPO或监督模型。
例如,要使用Rouge-1作为奖励功能,在CNN/DM摘要上训练T5-base,您可以运行:
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是否在执行EOS动作后立即终止该情节prompt_truncation_side提示文本的截断侧context_start_token上下文令牌的ID(对应于编码器模型中给出的解码器的初始令牌) 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改编自稳定的Baselines3量身定制的,可用于处理NLP任务,可以与Causal Policy或ASEQ2SEQ2SEQ LM Policy一起使用的NLP任务。 (请参阅如何创建自己的政策算法或策略)
我们还为基准目的提供了监督的教练。监督温暖的开始模型已经上传到拥抱面轮毂并在相应的配置文件中指定。
算法的超参数可以在alg/args上指定。
此外,所有RL算法都使用自适应KL控制器来保持LM接近原始LM,这是通过设置初始KL Co效率( 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,使用Train_evaluation/train_evaluation train_evaluation/generation_kwargs中列出的指标train_evaluation/metrics对LM进行评估(这覆盖了推出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 : 100RL4LM提供了完整的可自定义性 - 关于添加新任务/数据集,奖励功能,评估度量,派利算法和参与者批判性策略。
用户可以通过覆盖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以增加顺序生成数字并生成日期。这些可用于快速测试不同的算法和策略。可以在此处找到相应的配置(数字,日期)
用户可以创建自己的评估指标,然后将其用于定期评估数据集验证拆分模型。这可以通过子级基础计算来完成,该基础底层计在及时文本,生成的文本,参考文本,元_Infos,当前LM模型,拆分名称为输入中,并返回以公制名称为键和值的dict,由句子级别的分数和coldus级别分数组成。一个例子如下:
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)外,用户还可以通过子类稳定的baselines3的OnpolyCyalgorithm轻松地实现自己的上政策算法。由于我们为使用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的Actor-Critic政策实施,以包装因果LM和SEQ2SEQ LMS。这些也可以通过覆盖适当的方法(例如evaluate_actions() )来扩展(例如:使用不同的评论家体系结构)
最后,只需通过将它们添加到相应的注册表中注册您的自定义组件,然后可以直接从类似于预定义组件的配置中使用它们
我们提供了在机械土耳其人上使用的众包模板,以及scripts/crowdworking_templates中的示例输入。您可能会发现这些是评估自己模型的几代的有用起点,或者用于收集学习奖励功能的培训数据。
此外,我们通过在用户指定的路径中存储检查站和其他培训工件来支持WANDB记录和培训培训。这对于在大型计划的集群上运行可抢先的作业特别有用。
伪像包括(1)JSONL文件,其中包含指定间隔的推出信息(2)JSONL文件包含指定间隔的培训INFO(3)JSONL文件,其中包含JSONL文件,在指定的间隔(4)JSONL文件(4)JSONL文件(4)jsonl文件中包含培训前和培训后的测试预测(5)在指定间隔(6)json trains(6)JSON文件(6)JSON文件(6)json prection(6)JSON(6)JSON文件(6)JSON文件(6)JSON(6)JSON文件(6)JSON(6)JSON(6)jsonl文件(6)JSON(6)JSON(6)JSON LIVER(6) 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频道