ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

【AI大模型面试真题】倒腾了一波RLHF,把我整蒙圈了...

【AI大模型面试真题】倒腾了一波RLHF,把我整蒙圈了... 前言最近两月倒腾了一波 RLHF从 ColossalAI 到 TRLX 以及 DeepSpeed-Chat最后基于 DeepSpeed-Chat 成功训练上了自己的模型最后效果也是肉眼可见的提升。对这一部分进行下总结包括原理代码以及踩坑与解决方案。1、基本概念首先还是解释一下一些概念从 NLP 的角度举一些例子。首先是 RL 中的 PolicyStateActionPolicy π这是我们需要学习的策略函数我们使用语言模型来近似这个函数。State S模型接受的输入句子这里的话状态是无限的因为输入可能为任意句子。Action A根据所处的状态策略函数做出动作。这里的话就是模型接受上文预测下一个字符。这里的动作是有限集合大小为 vocab size。RL 概念图接下来介绍 RewardReturnQVPS这里要注意区分价值和奖励价值是未来累计奖励的期望。奖励是我们做出该动作后立即获取的收益。2、RLHF过程整个过程主要是分为三步SFTTraining Reward ModelRLHF。这里主要介绍一下 Training Reward Model 和 RLHF。Step2Training Reward Model1数据首先是这一部分数据的构成每一条数据由 querychosen response rejected response 构成chosen response 相较于 rejected response 质量更高。我使用的数据来自 Cohere/miracl-zh-queries-22-12里面对于每条 query 包含了 positive_passages 和 negative_passages 两个部分。positive 部分可以视为 chosennegative 部分视为 rejected就可以采样构建我们训练 Reward Model 的数据了{query:联合国总部在哪里,chosen:联合国总部大楼亦称联合国大厦是联合国总部的所在地位于美国纽约市曼哈顿东侧属于国际领土因此只要是会员国国民持有护照就可以进入包括与美国无邦交的联合国会员国。联合国总部大楼位于纽约市其西侧边界为第一大道、南侧边界为东42街、北侧边界为东48街、东侧边界为东河从联合国总部大楼可以俯瞰东河。此大楼于1949年和1950年间兴建土地购自于当时的纽约房地产家面积阔达17英亩约6.87973公顷。在此之前洛克斐勒家族有意提供其在纽约州威斯特彻斯特郡洛克菲勒庄园的土地但因距离曼哈顿遥远而作罢之后纳尔逊·洛克菲勒便协助新的土地的购买其父小约翰·戴维森·洛克菲勒则捐助了850万美元协助兴建大楼。,rejected:联合国的15个专门机构如教科文组织都没有设在总部。然而有一些“自治附属机构”如联合国儿童基金会的总部设在联合国总部。}2模型结构Reward Model 相较于原始的 SFT Model在后面加上了一个 value headvalue head 是一个 Linear输入维度为模型的 hidden_dim输出维度为 1输出表示模型预测每一字符获取的得分。DeepSpeed-Chat 中使用最后一个字符的得分作为整个 response 的得分当然也可以使用整个句子中每个字符的平均分作为整体的得分。Reward Model3训练目标训练 Reward Model 是一个排序任务针对 query输入 chosen 和 rejected response训练目标尽可能的使得 chosen 和 rejected 的差值更大损失函数为以上就是第二步 Training Reward Model 的全部过程基于 rank loss 训练了一个打分模型。在第三步强化学习中reward 模型将扮演环境的角色针对模型预测的字符给出奖励分数。Step3RLHF1整体结构首先来从整体上看一下这部分这里就只介绍 RL 部分PTX 就是加上了预训练任务DeepSpeed-Chat RLHFRLHF 基于 A2C 方法这一步包含了四个模型Actor Model由 SFT 之后的模型初始化而来。作为策略policy模型用于接收上文做出动作预测下一个字符。学习完毕之后我们最终使用的就是这个模型。Reference Model和 Actor Model 同样初始化自 SFT Model训练过程中冻结参数用于和 Actor Model 做对比保证模型不要偏离原始 SFT Model 太多。Reward Model作为环境env训练过程中冻结参数针对每一个状态给出奖励分数。Critic Model由 Reward Model 初始化而来用于近似价值函数输入为状态 s估计当前状态的价值 V。2训练过程接下来梳理一遍训练过程。训练过程整体分为两步maker experience 和 learn。首先是 make_experience首先在训练数据中抽取一部分 query然后 Actor Model 生成答案。然后我们依据这条答案获取我们所需要的经验actor_logits由 Actor Model 产生包含对答案所有词的概率分布。reference_logits由 Reference Model 产生包含对答案所有词语的概率分布用于和 actor logits 进行对比防止 actor model 偏离 SFT Model 太远。reward_score由 Reward Model 产生为当前句子状态下立即获取的收益分数。values由 Critic Model 产生估计当前句子状态下到完成生成可以获取的回报。整体流程如下make experience然后在 learn 的时候通过所产生的经验进行学习。我们通过 Actor Model 与 Critic Model 近似策略函数和价值函数整体流程如下learn关于 learn 这部分详细介绍下 Critic Model 训练和 Actor Model 训练过程。这里对下标 new 和 old 做一下说明最近自己复习一下看自己的文章想了半天也没想起最后被迫又去看代码了可恶问这里获得的 actor prob 和之前 make experience 中获得的有什么区别为什么要区分 old 和 new 包括 critic 也是答因为模型会有 dropout 所以会有一些区别。 此外如果 ppo_epoch 大于 1那么 actor 产生经验之后在 forwardbackward 之后也会有不同https://github.com/microsoft/DeepSpeedExamples/issues/5333Critic LossCritic Model 估计当前状态可以获取的价值也就是我们前面所说的 V 值。模型的输入为状态 s也就是当前模型生成的句子输出为状态价值 Vs。这里举一个例子早上起床去公司地图预计通行时间是 50min然后走了 10 分钟到马连洼地图预计用时还需要三十分钟。那么一开始预估的总体时间是 50min而基于一部分真实观测的总体时间是 103040min 那么我们最终的误差就是(1030 - 50) **2啦。critic loss example4Actor Loss举个例子如果我们模型有“上下左右”四个动作分别有累计奖励“10203040”我们做出任意动作都会获取正向的累计奖励因此模型也会向这个动作更新参数。而实际上我们累计奖励的平均期望为 25对于动作“上下”我们都应该受到惩罚。最后我们在通过 PPO 算法来进一步优化。关于 PPO 详细讲解可以看我的文章 PPO 详解。PPO 的想法是希望限制训练过程中对 policy 进行的更改避免 policy 进行过大的更新来提升 policy 训练的稳定性。基于 PPO 算法我们的目标函数变为以上就是第三步的核心内容RL 过程整体分为两步make experience 和 learn。我们首先采样数据然后生成结果Reward Model 给出环境的奖励以及 Critic Model 对结果进行评判。之后我们依据所获取的经验来对模型进行更新。3、DeepSpeed-Chat实践与踩坑Step2 Training Reward Model这个步骤基本就是全部按照 DeepSpeed-Chat 代码来了使用 cohere-zh 的数据大约构造了 2w 条 chosen-rejected pair 用于训练。最后训练训练了一个 epoch在验证集上准确率到了 0.79 左右。*****Evaluating reward,Epoch1/1*****step:499/2287,chosen_last_scores(higherisbetter):5.074454307556152,reject_last_scores(lowerisbetter):0.5599770545959473,acc(higherisbetter):0.812000036239624step:999/2287,chosen_last_scores(higherisbetter):5.084388732910156,reject_last_scores(lowerisbetter):0.7938708662986755,acc(higherisbetter):0.7940000295639038step:1499/2287,chosen_last_scores(higherisbetter):5.106724262237549,reject_last_scores(lowerisbetter):0.7971451878547668,acc(higherisbetter):0.7986666560173035step:1999/2287,chosen_last_scores(higherisbetter):5.0183587074279785,reject_last_scores(lowerisbetter):0.672178328037262,acc(higherisbetter):0.7955000400543213chosen_last_scores(higherisbetter):5.028912544250488,reject_last_scores(lowerisbetter):0.7077188491821289,acc(higherisbetter):0.7936161160469055Step3 RLHF1踩坑解决方案在这个步骤中从跑通到收敛还是有不少麻烦分享一些比较重要的点训练过程中发现 make experience 的时候model.generate() 产生的答案全是重复的无意义字。这里就很奇怪了最后发现是开启了 DeepSpeed Hybrid Engine 所导致的查看了 issue 之后也发现了有类似的问题。不过目前 DeepSpeed-Chat 也没有解决需要关闭 Hybrid Engine 进行训练。DeepSpeed-Chat 还有一个很严重的问题就是在 make experience 的时候强制 Actor Model 生成到最大长度设置max_lengthmin_lengthmax_min_length这样子导致模型生成偏差很大。对于一个简单的问题模型可能本来生成简单的一句话就可以完美回答了但是却必须强制生成到最大长度这样训练的模型和我们实际用起来的模型是有区别的。对于这个问题可以通过修改 generate 中的参数 eos_token_id 来解决。设置一个虚假的结束符然后模型就可能生成正常的结束符。然后我们在构建 attention_mask 来遮蔽掉结束符后面的回答。例如seq [0,0,0,0, prompt, answer, eos_token, other_word]mask [0,0,0,0,1(prompt),1(answer),1(eos_token),0(other_word)]通过以上两步基本就可以跑通流程了但是训练过程中还遇到了一个比较大的问题就是 Critic Loss 并不收敛越来越大。具体的原因是训练后期随着模型输出答案越来越好我们的 reward 值也会越来越高导致我们最终累计回报 return 的区间也会越来越大。而前面说过我们 Critic Loss 是一个 MSE 损失因此训练后期随着 return 的估计范围越来越大Critic Model 就越难估计。在我训练的过程中一开始 return 的范围是在 3-4 左右训练后期涨到了 18-20因此我们需要想点办法来约束一下我们的 return。首先的超参的调节γ 参数为折扣回报率DeepSpeed-Chat 中初始设置为 1可以将其调小一些来缓解。其次的话使用 reward scale 这一 trick 帮助也非常大。通过以上这些步骤基本上我们正常训练了模型最后也能看到一些效果但是需要取得更好的效果我们就需要引入一些 trick 了。2Tricktrick 方面主要参考了 The 37 Implementation Details of Proximal Policy Optimization 以及影响 PPO 算法性能的 10 个关键技巧附 PPO 算法简洁 Pytorch 实现。对于部分 trick进行了尝试。Normalization of Advantages将 Advantage 进行归一化adv(adv-mean)/std在 mini-batch 上进行没有指标的量化从我个人看结果而言感觉提升不大Overall Loss and Entropy Bonus为了提高算法的探索能力在 actor 的 loss 中增加一项策略熵并乘以一个系数 entropy_coef使得在优化 actor_loss 的同时让策略的熵尽可能大。一般我们设置 entropy_coef0.01总体损失变为loss policy_loss - entropy * entropy_coefficient value_loss * value_coefficient没有指标的量化从我个人看结果而言感觉没有太多提升Reward Scale对 reward 进行缩放将 reward 除以标准差从训练 log 来看对稳定 critic loss 效果很好毕竟将 reward 进行缩放之后降低了 return 的估计区间。没有指标的量化从我个人看结果而言提升很大推荐使用。关于其他的一些 trick如学习率衰减、梯度裁剪、Value Clipping 等本身框架就包含了就不进行特别说明了。当然这些 trick 在不同的数据或者模型上都会有不同的效果需要自己进行探索。通过以上这些方法最后也顺利的完成了训练希望对大家能有所帮助也希望大家能分享自己有用的经验与理解关于 RL 自己了解的也很少还需要更多的学习。最后的最后感谢你们的阅读和喜欢作为一位在一线互联网行业奋斗多年的老兵我深知在这个瞬息万变的技术领域中持续学习和进步的重要性。为了帮助更多热爱技术、渴望成长的朋友我特别整理了一份涵盖大模型领域的宝贵资料集。这些资料不仅是我多年积累的心血结晶也是我在行业一线实战经验的总结。这些学习资料不仅深入浅出而且非常实用让大家系统而高效地掌握AI大模型的各个知识点。如果你愿意花时间沉下心来学习相信它们一定能为你提供实质性的帮助。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】大模型知识脑图为了成为更好的 AI大模型 开发者这里为大家提供了总的路线图。它的用处就在于你可以按照上面的知识点去找对应的学习资源保证自己学得较为全面。经典书籍阅读阅读AI大模型经典书籍可以帮助读者提高技术水平开拓视野掌握核心技术提高解决问题的能力同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说阅读经典书籍是非常有必要的。实战案例光学理论是没用的要学会跟着一起敲要动手实操才能将自己的所学运用到实际当中去这时候可以搞点实战案例来学习。面试资料我们学习AI大模型必然是想找到高薪的工作下面这些面试题都是总结当前最新、最热、最高频的面试题并且每道题都有详细的答案面试前刷完这套面试题资料小小offer不在话下640套AI大模型报告合集这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
返回列表