LLM 生成内在奖励的强化学习:基于 TRL 的 PPO 文本生成实战指南
【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-research
本指南以relc/llm-intrinsic-reward项目为核心,讲解如何利用 LLM 的批评能力(critiqueability)为 PPO 强化学习训练生成token/span 级密集内在奖励,用于改善文本生成模型在情感控制(Sentiment Control)、去毒化(Detoxification)与摘要生成(Summarization)三类任务上的表现。该项目是 EMNLP 2024 论文Enhancing Reinforcement Learning with Dense Rewards from Language Model Critic(Drlc)的开源实现(详见 relc/README.md),读完后你将掌握:如何搭建带价值头(value head)的 PPO 训练流程、如何让 GPT-3.5 等 LLM 充当批评者输出片段级标注并转化为逐 token 奖励、以及三个任务从训练到评估的完整复现命令。
项目背景与核心思想
在传统的 RLHF/RL 文本生成流程中,环境奖励(如情感分类器得分、毒性得分、ROUGE 分数)通常是序列级的稀疏信号——整段输出只拿到一个标量,模型难以知道具体是哪个词、哪段短语导致了奖励偏低,训练信号不充分。
Drlc 框架的核心思路是:借助 LLM 的文本批评能力,把稀疏的环境奖励"翻译"成密集的 token 级内在奖励。整体由两个模型协作(参见 sentiment 训练入口 的导入结构):
- 策略模型(policy model):被优化的文本生成模型(如 gpt2-large),带价值头(value head);
- 批评模型(critic):通过 OpenAI API 调用的 LLM(默认
gpt-3.5-turbo),输入任务描述、策略模型输出与环境奖励信号,输出"正/负情感片段""有毒片段"等 span 级标注,再被解析为逐 token 奖励。
具体来说:当某条样本的环境(外部)奖励低于阈值时,才将该样本交给 LLM 批评者做标注;LLM 返回的片段(span)与输出中的 token 逐一对齐,命中的 token 获得正向/负向内在奖励,未命中的 token 奖励为 0。内在奖励叠加在原始环境奖励(被转换为 token 级伪奖励)之上,共同驱动 PPO 优化,从而在整个生成过程中提供密集的梯度信号。
仓库中trl/目录是基于 TRL 库裁剪的 PPO 实现(README 明确说明 part of the implementation is based on TRL),包含PPOTrainer、PPOConfig以及价值头模型封装。
安装与依赖
仓库采用可编辑安装方式(见 README.md):
pip install -e .核心依赖记录在 requirements.txt 中:
| 依赖包 | 说明 |
|---|---|
tqdm | 训练进度显示 |
transformers | 模型与分词器加载 |
accelerate | 分布式训练 / 混合精度 |
peft>=0.3.0 | LoRA 微调(去毒化的 self-critique 实验使用) |
tyro>=0.5.7 | sentiment 脚本的命令行参数解析 |
去毒化任务还需要在.bashrc中配置 Perspective API(8 进程、bf16)与deepspeed_zero1/2/3.yaml。
训练流程总览:从环境奖励到 token 级内在奖励
以情感控制脚本为例,单步训练循环的完整调用链(见 ppo-intrinsic-rewards-sentiment.py)为:
- 构建数据集:
build_dataset从datasets库加载 IMDB,过滤过短评论,用LengthSampler将输入截断到 4~10 token(L112-L150); - 生成响应:
ppo_trainer.generate按min_new_tokens~max_new_tokens的随机长度采样输出; - 计算环境奖励:用
lvwerra/distilbert-imdb情感分类 pipeline 对"查询+响应"打分,得到序列级标量rewards; - 伪 token 奖励:
create_pseudo_token_rewards把序列级标量放到序列最后一个 token 上(L160-L167),这是 TRL 标准 PPO 的做法; - 计算内在奖励(仅开启
use_instric_reward时):get_intrinsic_rewards挑选环境奖励 ≤ 阈值的样本,调用 LLM 批评者标注 span,解析为逐 token 内在奖励; - 合并奖励并更新:内在奖励按位置与伪 token 奖励相加,然后
ppo_trainer.step(query_tensors, response_tensors, token_rewards)执行 PPO 更新。
任务一:情感控制(Sentiment Control)
目标是把语言模型引导为生成正面的电影评论。实验代码位于 examples/research_projects/sentiment/。
训练 PPO 基线
source activate PPOIntrinsic CKPT_DIR=$HOME/ppo-intrinsic-reward/ckpts accelerate launch \ --main_process_port 9876 \ --num_machines 1 \ --machine_rank 0 \ --num_processes 2 \ --mixed_precision bf16 \ --multi_gpu \ --dynamo_backend no ppo-intrinsic-rewards-sentiment.py \ --epochs 2 \ --query_dataset "imdb" \ --min_new_tokens 15 \ --max_new_tokens 20 \ --num_shared_layers 20 \ --save_freq 50 \ --model_save_path $CKPT_DIR/sentiment/ppo_baseline_epoch2_bs16_mbs16 \ --ppo_config.model_name "gpt2-large" \ --ppo_config.learning_rate 1.41e-5 \ --ppo_config.batch_size 16 \ --ppo_config.mini_batch_size 16 \ --ppo_config.gradient_accumulation_steps 1 \ --ppo_config.target_kl 6.0 \ --ppo_config.kl_penalty "kl" \ --ppo_config.ppo_epochs 4;训练 PPO + 内在奖励
在基线命令基础上增加--use_instric_reward以及三个内在奖励相关参数:
source activate PPOIntrinsic CKPT_DIR=$HOME/ppo-intrinsic-reward/ckpts accelerate launch \ --main_process_port 9876 \ --num_machines 1 \ --machine_rank 0 \ --num_processes 2 \ --mixed_precision bf16 \ --multi_gpu \ --dynamo_backend no ppo-intrinsic-rewards-sentiment.py \ --use_instric_reward \ --positive_reward_value 0.5 \ --negative_reward_value -0.5 \ --intrinsic_reward_threshold 10 \ --prompt_file $HOME/ppo-intrinsic-reward/prompts/prompt_sentiment_3shot_v2.txt \ --epochs 2 \ --query_dataset "imdb" \ --min_new_tokens 15 \ --max_new_tokens 20 \ --num_shared_layers 20 \ --save_freq 50 \ --model_save_path $CKPT_DIR/sentiment/ppo_intrinsic_epoch2_bs16_mbs16 \ --ppo_config.model_name "gpt2-large" \ --ppo_config.learning_rate 1.41e-5 \ --ppo_config.batch_size 16 \ --ppo_config.mini_batch_size 16 \ --ppo_config.gradient_accumulation_steps 1 \ --ppo_config.target_kl 6.0 \ --ppo_config.kl_penalty "kl" \ --ppo_config.ppo_epochs 4;测试集评估(SST-2)
对每个中性提示生成 25 条续写,用distilbert-base-uncased-finetuned-sst-2-english分类器判定情感:
source activate PPOIntrinsic MODEL_NAME_OR_PATH=$CKPT_DIR/sentiment/ppo_intrinsic_epoch2_bs16_mbs16 PROMPT_PATH=./eval_scripts/neutral_prompts.jsonl OUTPUT_FILE=./outputs/ppo_intrinsic_neu_prompts.jsonl python eval_sentiment_sst.py \ $MODEL_NAME_OR_PATH \ $PROMPT_PATH \ --output_file $OUTPUT_FILE \ --num_return 25 \ --classifier_path distilbert-base-uncased-finetuned-sst-2-english;困惑度与多样性评估
source activate PPOIntrinsic GENERATIONS_FILE=./outputs/ppo_intrinsic_neu_prompts.jsonl OUTPUT_FILE=./outputs/ppo_intrinsic_neu_prompts_eval.txt echo $OUTPUT_FILE CUDA_VISIBLE_DEVICES=0 python eval_perplexity_dist.py \ --generations_file $GENERATIONS_FILE \ --output_file $OUTPUT_FILE;任务二:去毒化(Detoxification)
目标:防止语言模型生成冒犯性、有害或带偏见的文本。实验代码位于 examples/research_projects/toxicity/,该目录还附带 README.md 与数据准备 notebook(create_offline_data.ipynb)。
首先在.bashrc中导出 Perspective API 密钥(README 明确要求):
export PERSPECTIVE_API_KEY="YOUR_API_KEY"训练数据来自allenai/real-toxicity-prompts,并只保留毒性得分高于--prompt_toxicity_level(0.6)的提示词(对应源码build_dataset的过滤逻辑,见 ppo-intrinsic-rewards-toxicity.py)。环境奖励由PerspectiveAPI(未配置密钥时回退到facebook/roberta-hate-speech-dynabench-r4-target分类器)给出,见 L196-L203。
训练 PPO 基线
source activate PPOIntrinsic CKPT_DIR=$HOME/ppo-intrinsic-reward/ckpts accelerate launch \ --main_process_port 9987 \ --num_machines 1 \ --machine_rank 0 \ --num_processes 2 \ --multi_gpu \ --mixed_precision bf16 \ --dynamo_backend no ppo-intrinsic-rewards-toxicity.py \ --perspective_api $PERSPECTIVE_API_KEY \ --model_name gpt2-large \ --model_save_path $CKPT_DIR/toxicity/ppo_baseline_epoch5_bs32_mbs32 \ --epochs 5 \ --prompt_toxicity_level 0.6 \ --output_min_length 10 \ --output_max_length 14 \ --learning_rate 1.41e-5 \ --batch_size 32 \ --mini_batch_size 32 \ --gradient_accumulation_steps 1 \ --ppo_epochs 4;训练 PPO + 内在奖励
注意此处与情感任务相反:命中"有毒片段"的 token 获得负奖励-0.5,未命中得 0,因此--positive_reward_value 0.0:
source activate PPOIntrinsic CKPT_DIR=$HOME/ppo-intrinsic-reward/ckpts accelerate launch \ --main_process_port 9987 \ --num_machines 1 \ --machine_rank 0 \ --num_processes 2 \ --multi_gpu \ --mixed_precision bf16 \ --dynamo_backend no ppo-intrinsic-rewards-toxicity.py \ --use_intrinsic_reward \ --prompt_file $HOME/ppo-intrinsic-reward/prompts/prompt_toxicity_3shot_v2.txt \ --positive_reward_value 0.0 \ --negative_reward_value -0.5 \ --intrinsic_reward_threshold 1.0 \ --perspective_api $PERSPECTIVE_API_KEY \ --model_name gpt2-large \ --model_save_path $CKPT_DIR/toxicity/ppo_intrinsic_epoch5_threshold1.0_bs32_mbs32 \ --epochs 5 \ --prompt_toxicity_level 0.6 \ --output_min_length 10 \ --output_max_length 14 \ --learning_rate 1.41e-5 \ --batch_size 32 \ --mini_batch_size 32 \ --gradient_accumulation_steps 1 \ --ppo_epochs 4;Self-Critique 实验(Llama-2 + PEFT)
这是 README 提供的另一组实验:用meta-llama/Llama-2-7b-chat-hf作为策略模型,借助 PEFT(LoRA)训练,并调整阈值到 0.9:
source activate PPOIntrinsic CKPT_DIR=$HOME/ppo-intrinsic-reward/ckpts accelerate launch \ --main_process_port 9999 \ --num_machines 1 \ --machine_rank 0 \ --num_processes 1 \ --mixed_precision bf16 \ --dynamo_backend no ppo-intrinsic-rewards-toxicity-peft.py \ --use_intrinsic_reward \ --prompt_file $HOME/ppo-intrinsic-reward/prompts/prompt_toxicity_3shot_v2.txt \ --positive_reward_value 0.0 \ --negative_reward_value -0.5 \ --intrinsic_reward_threshold 0.9 \ --perspective_api $PERSPECTIVE_API_KEY \ --model_name meta-llama/Llama-2-7b-chat-hf \ --model_save_path $CKPT_DIR/toxicity/ppo_intrinsic_llama2_epoch3_bs16_mbs8 \ --epochs 3 \ --prompt_toxicity_level 0.6 \ --output_min_length 10 \ --output_max_length 14 \ --learning_rate 1.41e-5 \ --batch_size 16 \ --mini_batch_size 8 \ --gradient_accumulation_steps 2 \ --ppo_epochs 4;生成与毒性评估
第一步:对nontoxic_prompts-10k_test.jsonl中的每个提示生成 N=25 条续写(采样 2000 条子集):
source activate PPOIntrinsic LM_DIR=$CKPT_DIR/toxicity/ppo_intrinsic_epoch5_threshold1.0_bs32_mbs32 PROMPTS_FILE=./eval_scripts/nontoxic_prompts-10k_test.jsonl OUTPUT_FILE=./toxicity/outputs/ppo_intrinsic_gens.jsonl echo $OUTPUT_FILE CUDA_VISIBLE_DEVICES=0 python decoding.py \ --lm_dir $LM_DIR \ --prompts_file $PROMPTS_FILE \ --output_file $OUTPUT_FILE \ --top_p 0.9 \ --max_length 20 \ --num_returns 25 \ --do_sample \ --batch_size 8 \ --sample_size 2000;第二步:调用 Perspective API 评估生成文本毒性(8 线程、5000 条样本):
source activate PPOIntrinsic DATA_FILE=./outputs/ppo_intrinsic_gens.jsonl OUTPUT_FILE=./outputs/ppo_intrinsic_gens.jsonl python eval_toxicity_perspective.py \ --data_file $DATA_FILE \ --output_file $OUTPUT_FILE \ --sample_size 5000 \ --num_thread 8 \ --save_scores;第三步:评估困惑度与多样性:
source activate PPOIntrinsic GENS_FILE=./outputs/ppo_intrinsic_gens.jsonl OUTPUT_FILE=./outputs/ppo_intrinsic_gens_eval_results.txt echo $OUTPUT_FILE CUDA_VISIBLE_DEVICES=0 python eval_perplexity_dist.py \ --generations_file $GENS_FILE \ --output_file $OUTPUT_FILE;任务三:摘要生成(Summarization)
目标:为长文本生成简洁连贯的摘要。实验代码位于 examples/research_projects/summarization/,其中还包含分析 notebook(evaluation_results.ipynb)与多组评估曲线图(figures/下的rouge_eval_curve.pdf、eval_rouge_pref_curve.pdf、eval_pref_curve.pdf、analysis_bs.pdf、trade_off_trunc.pdf)。
运行前先安装评估依赖:
pip install evaluate pip intall nltk训练 PPO 基线(ROUGE 奖励)
策略模型从 SFT 好的gpt2-mediumcheckpoint(sft_gpt2-medium/checkpoint-1000)继续训练:
source activate PPOIntrinsic CKPT_DIR=$HOME/ppo-intrinsic-reward/ckpts accelerate launch \ --main_process_port 8765 \ --num_machines 1 \ --machine_rank 0 \ --num_processes 2 \ --multi_gpu \ --mixed_precision bf16 \ --dynamo_backend no ppo_summ_rouge.py \ --num_shared_layers 12 \ --model_name $CKPT_DIR/summarization/sft_gpt2-medium/checkpoint-1000 \ --model_save_path $CKPT_DIR/summarization/ppo-baseline-rouge \ --epochs 5 \ --output_min_length 30 \ --output_max_length 50 \ --learning_rate 1.41e-5 \ --batch_size 8 \ --mini_batch_size 8 \ --gradient_accumulation_steps 1 \ --ppo_epochs 4 \ --prompt_file $HOME/ppo-intrinsic-reward/prompts/prompt_summ_3shot_rouge_v2.txt;训练 PPO + 内在奖励
摘要任务额外开启--use_score_scaling(对奖励做 running std 缩放,见下文 PPOConfig 说明),阈值设为 100:
source activate PPOIntrinsic CKPT_DIR=$HOME/ppo-intrinsic-reward/ckpts accelerate launch \ --main_process_port 8765 \ --num_machines 1 \ --machine_rank 0 \ --num_processes 2 \ --multi_gpu \ --mixed_precision bf16 \ --dynamo_backend no ppo_summ_rouge.py \ --use_instric_reward \ --positive_reward_value 0.5 \ --negative_reward_value -0.5 \ --intrinsic_reward_threshold 100 \ --use_score_scaling \ --num_shared_layers 12 \ --model_name $CKPT_DIR/summarization/sft_gpt2-medium/checkpoint-1000 \ --model_save_path $CKPT_DIR/summarization/ppo-intrinsic-rouge \ --epochs 5 \ --output_min_length 30 \ --output_max_length 50 \ --learning_rate 1.41e-5 \ --batch_size 8 \ --mini_batch_size 8 \ --gradient_accumulation_steps 1 \ --ppo_epochs 4 \ --prompt_file $HOME/ppo-intrinsic-reward/prompts/prompt_summ_3shot_rouge_v2.txt;ROUGE 与偏好评估
先下载 6B 奖励模型 checkpoint(CarperAI 的 TLDR 摘要奖励模型),再运行评估脚本:
mkdir rm_checkpoint wget https://huggingface.co/CarperAI/openai_summarize_tldr_rm_checkpoint/resolve/main/pytorch_model.bin -O rm_checkpoint/pytorch_model.binsource activate PPOIntrinsic MODEL=$HOME/ppo-intrinsic-reward/ckpts/summarization/ppo-intrinsic-rouge accelerate launch \ --main_process_port 8765 \ --num_machines 1 \ --machine_rank 0 \ --num_processes 1 \ --mixed_precision bf16 \ --dynamo_backend no summ_eval.py \ --model_name $MODEL \ --save_path eval_results/sft_gpt2-medium_bs64_step1000.csv \ --num_samples_to_eval 6000 \ --reward_model_ckpt_path ./rm_checkpoint/pytorch_model.bin \ --output_max_length 50 \ --batch_size 20 \ --rw_batch_size 20 \ --reward_model_device 0;关键参数解析
内在奖励相关参数
从 sentiment 脚本的ScriptArguments定义(ppo-intrinsic-rewards-sentiment.py#L45-L106)可整理出:
| 参数 | 默认值 | 作用 |
|---|---|---|
--use_instric_reward | False | 是否开启内在奖励(注意 sentiment/summarization 脚本拼写为instric,toxicity 脚本为intrinsic,命令中需保持一致) |
--positive_reward_value | 0.0(sentiment 示例中为 0.5) | 命中"正面/应保留"片段的 token 获得的奖励值 |
--negative_reward_value | -1.0 | 命中"负面/有毒/应删除"片段的 token 获得的奖励值 |
--intrinsic_reward_threshold | 10.0 | 环境奖励 ≤ 该阈值时才调用 LLM 批评者(对低质量输出做"事后补救") |
--prompt_file | ./prompts/prompt_3shot_v3.txt | LLM 批评者的 few-shot 标注提示模板路径 |
--num_shared_layers | None | 参考模型与策略模型共享的层数(create_reference_model使用,用于计算 KL 惩罚) |
--save_freq | None | 每 N 步保存一次 checkpoint(主进程执行save_pretrained) |
--epochs | 1 | 数据集遍历轮数 |
PPO 训练超参数
情感脚本通过--ppo_config.xxx前缀直接改写PPOConfig字段。核心字段及其默认值(来自 trl/trainer/ppo_config.py):
| 字段 | 默认值 | 说明 |
|---|---|---|
learning_rate | 1e-5 | Adam 学习率(示例中常用 1.41e-5) |
batch_size | 256 | 每次 PPO 优化的样本数 |
mini_batch_size | 1 | 每个 mini-batch 优化的样本数(示例中与 batch_size 相等) |
gradient_accumulation_steps | 1 | 梯度累积步数,backward_batch_size = mini_batch_size × 梯度累积步数,且要求batch_size能被其整除(__post_init__中exact_div校验) |
ppo_epochs | 4 | 每批样本上执行的优化轮数 |
target_kl | 1 | 超过该值 50%(即 1.5×)时触发 early stopping(_early_stop) |
kl_penalty | "kl" | 可选kl(logp 差)/abs/mse/full,决定 KL 惩罚形式(_kl_penalty) |
cliprange/cliprange_value | 0.2 | PPO 策略比值裁剪 / 价值裁剪范围 |
vf_coef | 0.1 | 价值损失系数 |
gamma/lam | 1/0.95 | GAE 折扣因子与 λ |
use_score_scaling | False | 是否对奖励做 running std 缩放(摘要内在奖励实验开启) |
use_score_norm | False | 在缩放基础上是否减均值做归一化(依赖use_score_scaling) |
score_clip | None | 对奖励做 ±clip 截断 |
adap_kl_ctrl/init_kl_coef/target/horizon | True/0.2/6/10000 | 自适应 KL 控制器参数 |
seed | 0 | 随机种子(初始化价值头前set_seed,保证确定性评估) |
log_with | None | wandb或tensorboard日志 |
PPO 更新核心在 trl/trainer/ppo_trainer.py 中:step()先做前向得到新旧 logprobs 与价值,compute_rewards将"环境奖励 + KL 惩罚"展开为逐 token 奖励(序列级奖励挂在最后一个非 mask token 上,见 L1068-L1101),compute_advantages用 GAE 计算优势(L1119-L1142),loss计算带裁剪的 policy loss 与 value loss(L1144-L1231)。当平均比值超过ratio_threshold时该 mini-batch 的损失会被清零以避免损失尖峰。
内在奖励机制源码剖析
1. 选择"值得批评"的样本
get_intrinsic_rewards(ppo-intrinsic-rewards-sentiment.py#L199-L279)遍历环境奖励,只对r.item() <= args.intrinsic_reward_threshold的样本构造 LLM 查询:
selected_query_indices, selected_queries = [], [] for idx, r in enumerate(rewards): if r.item() <= args.intrinsic_reward_threshold: selected_query_indices.append(idx) llm_query = prompt.format( (batch["query"][idx] + batch["response"][idx]).replace("\n", "") ) selected_queries.append(llm_query)其余样本的内在奖励为空字符串占位。这种"条件式批评"显著控制了 LLM API 的调用成本。
2. 调用 LLM 批评者
query_batch_span(trl/extras/openai_scores.py)通过OpenAIGenerator并行调用gpt-3.5-turbo,使用temperature=0.0、max_tokens可配(sentiment 用 60),返回的是片段文本而非数值:
def query_batch_span(queries, max_workers=2, max_tokens=600, api_key=None): openai_api_key = os.environ["OPENAI_API_KEY"] if api_key is None else api_key generator = OpenAIGenerator( model_name_or_path="gpt-3.5-turbo", api_key=openai_api_key, num_workers=max_workers, max_tokens=max_tokens, temperature=0.0, wait_time=1.0, ) responses = generator(queries)注意:这要求环境变量OPENAI_API_KEY已配置。
3. 片段解析为逐 token 奖励
sentiment 脚本用parse_intrinsic_rewards(L170-L196)把 LLM 返回的[Span 1]: xxx文本用正则清洗后,与解码出的 token 列表逐项比对:token 出现在片段中则给reward_matching,否则给reward_no_matching(此处为 0)。正面片段与负面片段分别解析后相加:
positive_intrisic_rewards = parse_intrinsic_rewards( llm_pos_responses, batch_tokens, reward_matching=args.positive_reward_value, reward_no_matching=0.0) negative_intrisic_rewards = parse_intrinsic_rewards( llm_neg_responses, batch_tokens, reward_matching=args.negative_reward_value, reward_no_matching=0.0) intrisic_rewards = add_lists(positive_intrisic_rewards, negative_intrisic_rewards)toxicity 脚本的parse_intrinsic_rewards(ppo-intrinsic-rewards-toxicity.py#L90-L132)则用正则Toxic Span \d+: (.+)提取有毒片段,对每个 token 检查token in combined_span,命中给negative_reward(-0.5),未命中给positive_reward(0.0)。
4. 合并到 PPO 奖励
最后在训练循环中,内在奖励与伪 token 奖励按位置累加(sentiment L410-L415):
for tok_rewards, i_rewards in zip(token_rewards, intrisic_rewards): i_rewards = i_rewards[1:] # 去掉首 token(查询起点) assert len(tok_rewards) == len(i_rewards) for tok_i in range(len(tok_rewards)): tok_rewards[tok_i] += i_rewards[tok_i]这样每个 token 的最终奖励 = 环境奖励(序列级,落在末尾 token)+ KL 惩罚(逐 token)+ LLM 内在奖励(逐 token),PPO 因此能定位到具体该褒扬或抑制的词语。
5. 提示模板设计
三个任务的批评者提示均采用 3-shot 标注指令风格(存放在 prompts/ 目录):
- prompt_sentiment_3shot_v2.txt:要求标注"Identified Positive Text Span"与"Identified Negative Text Span",并给出"span 应尽量简洁""中性句写 None identified"等标注准则,末尾以
{}占位符接收待标注文本; - prompt_toxicity_3shot_v2.txt:给出毒性的定义(仇恨、歧视、威胁、攻击等)与最短 span 原则,输出格式为
Toxic Span N: ...; prompt_summ_3shot_rouge_v2.txt及prompt_summ_3shot_rouge_rlhf.txt等:面向摘要质量批评。
提示工程直接影响奖励的精度:示例既教模型"哪些词算情感词/毒词",也教它"哪些情况应回答 None identified",从而让 span 解析(正则)能稳定工作。
注意事项与适用范围
- API 成本与延迟:内在奖励依赖外部 LLM 批评,
intrinsic_reward_threshold越高,被批评的样本越多、成本越大;从源码看该机制面向的是"低奖励样本"的精细化反馈,阈值需要结合任务奖励分布调节(情感任务 10、毒性任务 1.0、摘要任务 100)。 - 参数拼写差异:sentiment / summarization 脚本使用
--use_instric_reward,toxicity 脚本使用--use_intrinsic_reward,照抄命令时注意区分。 - 运行环境:示例命令假定名为
PPOIntrinsic的 conda 环境已就绪,使用accelerate launch以 bf16 混合精度多卡运行;toxicity 的 Llama-2 自批评实验为单进程,需要可访问 Llama-2 模型权重(Hugging Face 授权)。 - 适用任务边界:仓库演示的三类任务均为文本生成,且外部奖励信号可计算、可解释;若任务环境奖励无法可靠反映输出质量,或无法构造清晰的 span 标注指令,则本框架的收益有限。README 注释中还提到了可选的 Question Answer 任务(被注释掉),可作为扩展方向参考。
总体而言,relc/llm-intrinsic-reward提供了一个"外部稀疏奖励 + LLM 密集批评"的可复现范本:训练脚本、few-shot 提示、PPO 训练器与评估流水线均在本仓库内闭环,既适合作为 RLHF 变体的研究基线,也可作为接入自定义文本生成任务的起点。
【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-research
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考