RLHF介绍及实践测试

介绍

RLHF(Reinforcement Learning Hyperparameter Optimization Framework)是一种用于强化学习模型的超参数优化框架。它结合了强化学习中的经典方法贝叶斯优化技术能够更高效地找到最佳超参数组合。下面是强化学习微调的完整 RLHF 流程:

  • RLHF-Stage1 是 supervised-fintuning,即使用上文提到的数据集进行模型微调,目的是将大模型能力往垂直领域迁移;
  • RLHF-Stage2 训练奖励模型,它通过对于同一个 prompt 的不同输出进行人工排序,得到对应分数,监督训练奖励模型,目的是训练一个自动评估函数
  • RLHF-Stage3 使用了强化学习算法训练优化LM,目前多个组织找到的可行方案是使用策略梯度强化学习 (Policy Gradient RL) 算法、近端策略优化 (Proximal Policy Optimization,PPO) 微调初始 LM 的部分或全部参数。

ps: 与lora微调的区别是:RLHF多了强化学习的过程,lora微调相当于RLHF-Stage1的SFT

参考学习资料:如何看待Geoffrey Hinton对RLHF的看法? - 知乎【科普向】Chat GPT背后的技术:什么是RLHF(人类反馈强化学习)? - 哔哩哔哩

框架

三个框架对比介绍:

RLHF几大常用框架实践对比(trlx、deepspeedchat、colossalaichat) - 知乎

实践

本次实践采用ColossalAI框架分步训练(暂不支持TP策略,支持DP策略)

官方训练介绍:https://github.com/hpcaitech/ColossalAI/tree/main/applications/Chat#rlhf-training-stage3---training-model-with-reinforcement-learning-by-human-feedback

conda环境:conda activate coati

RLHF Training Stage1 - Supervised instructs tuning

数据准备:https://huggingface.co/datasets/yizhongw/self_instruct/viewer/super_natural_instructions/train

train_sft.sh:执行监督训练shell脚本

CUDA_VISIBLE_DEVICES=0 torchrun --standalone --nproc_per_node=1 train_sft.py \
    --pretrain "/data/jupyter/LLM/models/llama-7b-hf/" \  #微调训练底模
    --model 'llama' \
    --strategy colossalai_zero2 \ #微调策略方法
    --log_interval 10 \
    --save_path  /data/jupyter/your_production/ColossalAI/applications/Chat/models/sft-7b \ #保存路径
    --dataset "yizhongw/self_instruct" \ #huggingface数据集
    --batch_size 1 \
    --accumulation_steps 8 \
    --lr 2e-5 \
    --max_datasets_size 512 \
    --max_epochs 1 \
    --lora_rank 1

ps:

  • 更多参数说明参考

train_sft.py

  • 训练方法:执行

./train_sft.sh

  •  该步训练的坑较少,只要显存足够,一般不会遇到问题。

RLHF Training Stage2 - Training reward model

数据准备:https://huggingface.co/datasets/Anthropic/hh-rlhf/viewer/Anthropic--hh-rlhf/train?row=1

train_rm.sh:执行奖励函数训练脚本

torchrun --standalone --nproc_per_node=1 train_reward_model.py \
   --pretrain  "/data/jupyter/your_prodcution/ColossalAI/applications/Chat/models/sft-7b" \ #这里是第一步训练保存的模型路径
   --model 'llama' \
   --strategy colossalai_gemini \ #训练策略,这里只能该策略,其他策略实测单张3090 24G显存不足
   --loss_fn 'log_exp'\
   --save_path /data/jupyter/your_prodcution/ColossalAI/applications/Chat/models/rmstatic.pt \ #保存模型路径,这里仅为模型权重
   --dataset 'Anthropic/hh-rlhf'\ #huggingface数据集
   --lora_rank 1 \
   --batch_size 1 \
   --max_len 128 

ps:

  • 更多参数说明参考

train_reward_model.py

  • pretrain的模型是第一步训练保存的模型
  • strategy只能执行colossalai_gemini,其他会显存不足
  • max_len设置为128、256可以跑通,但512会出现显存不足

RLHF Training Stage2 - Training reward model

数据准备:

使用generate_prompt_dataset.py对目标数据生成prompt数据(instructions)https://github.com/XueFuzhao/InstructionWild/tree/main/data#instructwild-data

使用步骤一的pretrain dataset(including the instruction and corresponding response)https://huggingface.co/datasets/yizhongw/self_instruct/viewer/super_natural_instructions/train

train_prompts.sh:执行LM微调训练脚本

torchrun --standalone --nproc_per_node=2 train_prompts.py \
    --pretrain "/data/jupyter/your_production/ColossalAI/applications/Chat/models/sft-7b" \
    --model 'llama' \
    --strategy colossalai_gemini \
    --prompt_dataset /data/jupyter/LLM/datasets/InstructionWild/data1 \
    --pretrain_dataset /data/jupyter/LLM/datasets/self_instruct \
    --rm_pretrain /your/pretrain/rm/definition \
    --rm_path /data/jupyter/your_production/ColossalAI/applications/Chat/models/rmstatic.pt

ps:

  • 因显存不足,该过程暂无法跑通,底层代码多处封装cuda使用,较难使用仅cpu运行
  • rm_pretrain本意应为训练第二步保存的模型结构,但第二步训练保存的是pt文件,无保存模型结构(colossalai_gemini无法执行save_pretrained,原作者也没有这样保存,colossalai_zero2策略可以,但显存不足),所以在第三步作者是分两步完成模型加载

state_dict = torch.load(args.rm_path, map_location='cpu') reward_model = LlamaRM(pretrained=args.rm_pretrain) reward_model.load_state_dict(state_dict)

  • 这里存在有问题:第二步RM保存pt文件是有两层lora训练的,LlamaRM是无lora的,导致加载直接报错,修改为:

reward_model = LlamaRM(pretrained=pretrain, lora_rank=lora_rank)

  • critic加载第二步RM保存pt文件,存在问题,LlamaCritic是三层lora,pt是二层lora导致报错:

_IncompatibleKeys(missing_keys=['value_head.lora_A', 'value_head.lora_B'], unexpected_keys=[])

修改critic.load_state_dict(state_dict, strict=False)可解决;

  • critic的lora加载顺序可能有问题:先加载value_head后convert_to_lora,导致value_head不可训练,该层参数随机化;

self.model = model self.value_head = value_head self.use_action_mask = use_action_mask self.convert_to_lora()

### 使用 RLHF 方法对大型语言模型进行微调 #### 什么是 RLHF强化学习基于人类反馈(Reinforcement Learning from Human Feedback, RLHF)是一种利用人类偏好数据来优化大型语言模型(LLM)的方法[^1]。这种方法通过引入外部的人类评价信号,使模型能够更好地理解复杂的语义需求并生成高质量的内容。 RLHF 的核心流程可以分为以下几个方面: 1. **数据收集** 需要从真实场景中获取大量的人类反馈数据。这些数据通常来源于问卷调查、用户交互记录或者专门设计的任务实验。例如,在对话系统中,可以让测试人员评估不同回复的质量,并标记哪些回复更好。 2. **奖励建模** 基于上述标注好的数据集构建一个奖励函数或奖励模型。该模型用于衡量当前状态下采取某种行动所带来的收益大小。对于自然语言处理任务来说,则可能涉及判断一段文字是否符合预期风格、逻辑连贯程度等方面的标准。 3. **策略优化** 利用强化学习算法调整原始预训练模型参数直至达到最优解为止。在此过程中会不断尝试新的动作序列组合并通过比较其累积折扣回报值决定下一步该如何改进现有政策πθ(s)[^1]。 以下是实现这一过程的一个简单伪代码示例: ```python import torch from transformers import AutoTokenizer, AutoModelForCausalLM def rlhf_finetune(model_name="gpt2", num_epochs=5): tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained(model_name) optimizer = torch.optim.AdamW(model.parameters(), lr=1e-5) # 加载奖励模型... reward_model = load_reward_model() for epoch in range(num_epochs): inputs = get_training_data() # 获取一批次的数据 outputs = model(**inputs) # 计算前向传播结果 rewards = compute_rewards(reward_model, outputs.logits) # 根据奖励模型计算奖励 loss = calculate_loss(outputs.loss, rewards) # 结合损失与奖励更新目标函数 loss.backward() optimizer.step() optimizer.zero_grad() rlhf_finetune() ``` 此脚本展示了如何加载基础的大规模预训练模型以及定义相应的优化器设置;接着循环迭代读取样本批次执行梯度下降操作完成整个训练周期内的参数修正工作流。 值得注意的是虽然相比监督式微调(Supervised Fine-Tuning,SFT),采用RLHF确实能带来更好的效果表现但是同时也增加了不少额外开销比如需要精心准备高质量的示范案例供后续分析参考之外还需要花费更多时间去探索最佳超参配置方案等问题都需要提前考虑清楚再付诸实践才行。 --- #### RMSNorm 对 RLHF 微调的影响 除了传统的层归一化(Layer Normalization),近年来提出的RMSNorm也逐渐成为提升Transformer架构性能的重要工具之一。它通过对输入张量求平方后再开根号的方式来进行标准化处理而无需显式估计均值项因此具备更快的速度特性同时还能够在一定程度上缓解某些特定条件下可能出现数值不稳定现象的发生几率从而间接促进了包含RLHF在内的各种高级技术手段的应用与发展趋势[^4]。 --- #### 总结 综上所述,RLHF 提供了一种强大的机制使得我们可以更加灵活精准地定制专属版本的语言生成解决方案不仅限于学术研究领域同样适用于工业界实际产品开发当中只要合理规划资源投入比例就能收获显著成效当然前提条件是要充分认识到其中存在的挑战所在并且积极寻找应对措施加以克服最终达成既定目标要求水平之上甚至超越期望上限范围以外的结果呈现形式出来才是真正的成功标志体现之处。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值