
我們為培訓語言模型提供易於自定義的構建塊,包括實施上的算法,獎勵功能,指標,數據集和基於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頻道