
オンポリシーアルゴリズムの実装、報酬機能、メトリック、データセット、 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 . また、すべての依存関係を含むDockerコンテナを使用した開発用のDockerFileも提供します。
docker build . -t rl4lmsオプションで、CORENLPライブラリは、 cd rl4lms/envs/text_generation/caption_metrics/spice && bash get_stanford_models.shからダウンロードできる特定のメトリック計算(例:スパイス)に必要です。
Configファイル(YAML)を使用してPPO、NLPO、または教師付きモデルをトレーニングできるトレインスクリプトを介して呼び出すことができる簡単なトレーニングAPIを提供します。
たとえば、Rouge-1を報酬関数として使用してPPOでCNN/DMの要約でT5ベースをトレーニングするには、次を実行できます。
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 :
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エピソードをシミュレートするジムスタイルのテキスト生成環境を構成します。ロールアウトは、入力テキストと参照テキストで構成されるデータセットの列車サンプルを使用して生成されます。さらに、Multi-Processingを使用して段階的な報酬を計算するためにn_envsエピソードを並行して処理するStable BaselinesからのSubProcVecEnvでENVをラップします。
さらに構成設定には次のものがあります。
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 : 0オンポリシーアルグ:4つのポリシーアルゴリズムの実装を提供します:PPO、NLPO、A2C、およびTRPOは、原因ポリシーまたはSEQ2SEQ LMポリシーのいずれかでボックスを使用できるNLPタスクを使用できるように調整されたStable-Baselines3から調整されています。 (独自のオンポリシーアルゴリズムまたはポリシーを作成する方法をご覧ください)
また、ベンチマークの目的で監督されたトレーナーを提供しています。監視付きのウォームスタートモデルは、すでにハグFaceハブにアップロードされており、それぞれの構成ファイルで指定されています。
アルゴリズムのハイパーパラメーターはalg/argsで指定できます。
さらに、すべてのRLアルゴリズムは、Adaptive KLコントローラーを使用して、初期KL係数( alg/kl_div/coeff )とターゲットKL( alg/kl_div/target_kl )を設定することにより、LMを元のLMに近づけます。
2種類の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 Iterについて、LMは、 train_evaluation/metrics Generation Kwargsを使用してtrain_evaluation/generation_kwargs Metricsにリストされているメトリックを使用して検証分割で評価されます(これは、推論のためにのみロールアウト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は、新しいタスク/データセットの追加、報酬機能、評価メトリック、オンポリシーアルゴリズム、およびアクター批判的なポリシーの追加に関して、完全なカスタマイズ可能性を提供します。
ユーザーはprepare(cls, split: str, **args) -> 'TextGenPool': 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をトレーニングするために順序を増やし、日付を生成する2つの合成報酬機能を提供します。これらを使用して、さまざまなアルゴリズムとポリシーをすばやくテストできます。対応する構成はここにあります(数字、日付)
ユーザーは独自の評価メトリックを作成できます。これにより、データセットの検証分割に関するモデルを定期的に評価するために使用できます。これは、迅速なテキスト、生成されたテキスト、リファレンステキスト、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のonpolicyalgorithmをサブクラスすることにより、独自のオンポリシーアルゴリズムを簡単に実装できます。 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およびSEQ2SEQ LMSをラップするLMベースのアクタークライティックポリシーの実装を提供します。これらは、適切な方法をオーバーライドすることにより(例:別の批評家アーキテクチャを使用する)拡張することもできます(例: evaluate_actions() )
最後に、対応するレジストリに追加してカスタムコンポーネントを登録するだけで、事前定義されたコンポーネントと同様の構成から直接使用できます。
機械タークで使用したクラウドソーシングテンプレートと、 scripts/crowdworking_templatesの入力の例を提供しました。これらは、独自のモデルの世代を評価するため、または学習された報酬機能のためのトレーニングデータを収集するために、役立つ出発点になるかもしれません。
さらに、チェックポイントやその他のトレーニングアーティファクトをユーザー指定のパスに保存することにより、WandBロギングとトレーニングの温かいスタートをサポートします。これは、大規模なスケジュールされたクラスターでプリエンプションジョブを実行するのに特に役立ちます。
アーティファクトには、(1)指定された間隔でロールアウトinfosを含むJSONLファイルが含まれます(2)指定された間隔でトレーニングinfosを含むJSONLファイル(3)指定された間隔での検証メトリックを含むJSONLファイル(4)トレーニング前後のテストメトリックを含むJSONLファイルを含むJSONLファイルをトレーニング(5)jsonファイルを設定した検証予測(6)JSONファイル(6)JSONファイル(6)JSONファイル(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チャンネルに参加してください