news 2026/9/22 18:45:05

LLM 生成内在奖励的强化学习:基于 TRL 的 PPO 文本生成实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LLM 生成内在奖励的强化学习:基于 TRL 的 PPO 文本生成实战指南

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),包含PPOTrainerPPOConfig以及价值头模型封装。

安装与依赖

仓库采用可编辑安装方式(见 README.md):

pip install -e .

核心依赖记录在 requirements.txt 中:

依赖包说明
tqdm训练进度显示
transformers模型与分词器加载
accelerate分布式训练 / 混合精度
peft>=0.3.0LoRA 微调(去毒化的 self-critique 实验使用)
tyro>=0.5.7sentiment 脚本的命令行参数解析

去毒化任务还需要在.bashrc中配置 Perspective API(8 进程、bf16)与deepspeed_zero1/2/3.yaml

训练流程总览:从环境奖励到 token 级内在奖励

以情感控制脚本为例,单步训练循环的完整调用链(见 ppo-intrinsic-rewards-sentiment.py)为:

  1. 构建数据集build_datasetdatasets库加载 IMDB,过滤过短评论,用LengthSampler将输入截断到 4~10 token(L112-L150);
  2. 生成响应ppo_trainer.generatemin_new_tokens~max_new_tokens的随机长度采样输出;
  3. 计算环境奖励:用lvwerra/distilbert-imdb情感分类 pipeline 对"查询+响应"打分,得到序列级标量rewards
  4. 伪 token 奖励create_pseudo_token_rewards把序列级标量放到序列最后一个 token 上(L160-L167),这是 TRL 标准 PPO 的做法;
  5. 计算内在奖励(仅开启use_instric_reward时):get_intrinsic_rewards挑选环境奖励 ≤ 阈值的样本,调用 LLM 批评者标注 span,解析为逐 token 内在奖励;
  6. 合并奖励并更新:内在奖励按位置与伪 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.pdfeval_rouge_pref_curve.pdfeval_pref_curve.pdfanalysis_bs.pdftrade_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.bin
source 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_rewardFalse是否开启内在奖励(注意 sentiment/summarization 脚本拼写为instric,toxicity 脚本为intrinsic,命令中需保持一致)
--positive_reward_value0.0(sentiment 示例中为 0.5)命中"正面/应保留"片段的 token 获得的奖励值
--negative_reward_value-1.0命中"负面/有毒/应删除"片段的 token 获得的奖励值
--intrinsic_reward_threshold10.0环境奖励 ≤ 该阈值时才调用 LLM 批评者(对低质量输出做"事后补救")
--prompt_file./prompts/prompt_3shot_v3.txtLLM 批评者的 few-shot 标注提示模板路径
--num_shared_layersNone参考模型与策略模型共享的层数(create_reference_model使用,用于计算 KL 惩罚)
--save_freqNone每 N 步保存一次 checkpoint(主进程执行save_pretrained
--epochs1数据集遍历轮数

PPO 训练超参数

情感脚本通过--ppo_config.xxx前缀直接改写PPOConfig字段。核心字段及其默认值(来自 trl/trainer/ppo_config.py):

字段默认值说明
learning_rate1e-5Adam 学习率(示例中常用 1.41e-5)
batch_size256每次 PPO 优化的样本数
mini_batch_size1每个 mini-batch 优化的样本数(示例中与 batch_size 相等)
gradient_accumulation_steps1梯度累积步数,backward_batch_size = mini_batch_size × 梯度累积步数,且要求batch_size能被其整除(__post_init__exact_div校验)
ppo_epochs4每批样本上执行的优化轮数
target_kl1超过该值 50%(即 1.5×)时触发 early stopping(_early_stop
kl_penalty"kl"可选kl(logp 差)/abs/mse/full,决定 KL 惩罚形式(_kl_penalty
cliprange/cliprange_value0.2PPO 策略比值裁剪 / 价值裁剪范围
vf_coef0.1价值损失系数
gamma/lam1/0.95GAE 折扣因子与 λ
use_score_scalingFalse是否对奖励做 running std 缩放(摘要内在奖励实验开启)
use_score_normFalse在缩放基础上是否减均值做归一化(依赖use_score_scaling
score_clipNone对奖励做 ±clip 截断
adap_kl_ctrl/init_kl_coef/target/horizonTrue/0.2/6/10000自适应 KL 控制器参数
seed0随机种子(初始化价值头前set_seed,保证确定性评估)
log_withNonewandbtensorboard日志

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.0max_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.txtprompt_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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/22 18:44:10

3步手写实现中国哪个省面积最大解析面试必问

3步手写实现中国哪个省面积最大解析面试必问 面试官抛出“中国哪个省面积最大”时,别急着背新疆。他真正想考的是:当业务需要动态计算、排序、聚合时,你能否脱离框架, 手写实现…

作者头像 李华
网站建设 2026/9/22 18:44:09

30秒清除你电脑中的垃圾源码深度剖析

30秒清除电脑垃圾完整示例:从Python到Shell的实战选型对比 看了一堆教程还是不会写项目?别急,这次给你上硬菜。很多开发者卡在“知道原理但写不出完整示例”的死胡同里,尤其是面对系统清理这种看似简单实则坑爹的需求。今天不聊虚的,直接拆解如何用代码实现 30秒清除你电脑中的垃圾 ,并对比…

作者头像 李华
网站建设 2026/9/22 18:43:50

面试被问电磁炉加热原理答不上来?这份保姆级教程源码级拆解救急

面试被问电磁炉加热原理答不上来?这份保姆级教程源码级拆解救急 上周陪一个后端同事复盘面试,他卡在了一道“八股文”上。面试官问:“电磁炉加热原理是什么?”他支支吾吾,只说了个“电流产生磁场”,然后就被问倒了。其实这题在嵌入式、电力电子或物联网硬件岗的初面中极高频。很多纯软件工程师觉得这是物理题,跟代码…

作者头像 李华
网站建设 2026/9/22 18:43:32

2026最新abstract方法避坑指南,3招解决项目卡壳难题

2026最新abstract方法避坑指南,3招解决项目卡壳难题 看了一堆教程还是不会写项目?别慌,这不是你笨,是教程太理想化。 2026最新实战经验告诉我,abstract方法的核心不在于“定义”,而在于“约束”和“解耦”。…

作者头像 李华
网站建设 2026/9/22 18:43:14

搞定二维码点餐系统卡顿:后端并发优化速查手册

搞定二维码点餐系统卡顿:后端并发优化速查手册 昨天刚接手一个连锁餐饮的 二维码点餐系统 重构项目,第一反应是头皮发麻。老板拿着平板演示,点一下加菜,页面转圈圈转了五秒才出来,高峰期直接白屏。更尴尬的是,代码是从网上复制来的“高并发示例”,本地测试明明挺快,一上生产环境就崩。 这种…

作者头像 李华
网站建设 2026/9/22 18:43:07

3步搞定可靠性实验:图解原理避坑指南

3步搞定可靠性实验:图解原理避坑指南 刚把网上的可靠性实验代码复制下来,运行直接报错?别急,这种“复制即崩”的坑,90%的新手都踩过。问题往往不在代码本身,而在于你根本没看懂背后的 图解原理 ,只盯着表面语法硬调。 别慌,今天这篇干货,咱们不整虚的。我会带你从底层逻辑拆解 可靠性实验…

作者头像 李华