公司开发个网站多少钱,建筑设计网站 知乎,pascal建设网站,德化住房和城乡建设网站LLM 微调 之 InstructGPT中的微调与对齐
LLM 微调 之 InstructGPT中的微调与对齐 技术概览 InstructGPT中的微调与对齐 大体步骤标注数据量模型训练 1. SFT 是如何训练的2. Reward Model是如何训练的3. RLHF 是如何训练的具体讲解RLHF 的loss 函数 模型效果参考链接#xf…LLM 微调 之 InstructGPT中的微调与对齐
LLM 微调 之 InstructGPT中的微调与对齐 技术概览 InstructGPT中的微调与对齐 大体步骤标注数据量模型训练 1. SFT 是如何训练的2. Reward Model是如何训练的3. RLHF 是如何训练的具体讲解RLHF 的loss 函数 模型效果参考链接
LLM 我们不一定要预训练模型但是一定要会微调。InstructGPT更是微调的最经典的文章。这里详细介绍InstructGPT的微调技术。
技术概览
InstructGPT中的微调与对齐
InstructGPT 里面提到LLM的微调技术 分为2个阶段:
指令微调使得模型有指令遵循的能力对齐微调对齐人类价值观 大体步骤
在GPT3/3.5的基础上要解决的问题是 跟人类期待匹配。 最直接的方法就是人工构造一批数据(人类自己写prompt 和 期望的输出) 然后交给模型去学习使得模型学到人类期望输出。但是这个代价太大人类自己写prompt和答案 构造者个数据集 代价太大。
所以才有了微调和对齐模型大体步骤如下
有监督微调SFT: 我们称原始模型为V0也就是GPT-3。人工先构造一批数据数据量不用很大先让模型学一学得到模型V1(SFT) 让模型有基本指令遵循能力。人类偏好对齐(Reward model PPO) 持续重复进行。 人类偏好对齐用强化学习的方式来微调模型输入prompt 输出几个答案人类对答案进行评价反馈(相当于环境反馈模型根据评价的结果来继续优化反复迭代使得最后模型输出符合人类偏好。那么问题是人类如何反馈,这套机制如何建立 Reward Model 奖励模型。 最直接的方法肯定是 输入prompt 模型有几个输出然后人类给每个输出打出高低分数模型收到评价 再反向传播迭代更新。人类在根据更新后的模型输入prompt 等新模型输出 再打分模型再迭代。但是人类不可能在模型前面等他输出一个个打分的。所以这里需要一个自动评分的模型 替代人类做 反馈。 于是就有了 reward model 这个模型输入就是prompt和模型的answer是输出是得分。 为了得到这个RM模型制作训练集让模型对一个prompt输出多个答案然后人类对这个答案进行打分排序。打分排序比自己写训练数据要方便多了从而得到更多的标注数据prompt,answer,score).用这个训练集 来训练RM model作用是对 prompt和answer pair 进行打分评价这个pair是否搭配。 有了打分模型接下来就要微调第一步得到的SFT(V1)模型。采用PPO方法 这里给定一些prompt得到输出把prompt和输出 一起给RM 模型得到打分(外界环境的反馈)然后借助强化学习的方法训练SFT反复迭代最终得到V2模型也就是InstructGPT.
步骤 1 只进行一次而步骤Reward model 和PPO算法可以持续重复进行在当前最佳策略模型上收集更多的比较数据用于训练新的 RM 模型然后训练新的策略。
标注数据量
上述三个步骤分别制造和标注了多少样本呢
SFT 数据第一步分类根据prompt自己写理想输出SFT supervised fine tuning 有13k的prompt.人工标注的占比高一些11.3k,API 1.5kRewardModel数据第二步用来训练打分模型的数据包含33k的promptsPPO数据第三步用来训练强化学习PPO模型的数据包含31k的prompts。
其中前2步的prompts 来自OpenAI的 API上用户使用数据和人工标注写的数据最后一步全是从API上采样的数据。第一步人工占比高第二步人工占比低。
初始种子数据集需要标注者来编写prompts。
plain自己随便想一些prompts同时尽可能保证任务多样性。(各种问题和要求)Few-shot: 不仅仅需要写prompts还需要写对应的outputs(这部分是最耗人力的也就是SFT的主要组成)User-based: 标注者根据openAI的waitlist里面的task 来编写一些prompts(相当于告诉标注人员用户期待的功能你们来写prompt 答案
API中的数据
模型训练
这里面3个步骤 分别是如何训练的呢
1. SFT 是如何训练的 训练数据 SFT是有监督的微调训练数据是通过给定一个提示列表人工写对应的输出得到的。大概13k左右。这里面的提示列表有来自人工自己写的也有API收集的。(这一步主要为了让模型有指令遵循的能力人工写的比例高一些因为API很多数据都是扩写 不使用这个任务。)模型初始化InstructGPT 是从GPT3初始化的chatGPT是从GPT3.5初始化的。训练在Fine-tuning的过程中同样采用自回归的方式将Prompt和对应的label answer串联在一起进行训练(下一个词预测训练目标)。
这一步finetuning时1个epoch就已经overfit了 但是由于这个不是最终的模型并且train epoch越多对后面两步越有帮助所以train了16个epoch。
由于该步骤的数据量也有限该过程获得的 SFT 模型可能会输出仍然并非用户关注的文本并且通常会出现不一致问题。这里的问题是监督学习步骤的 可扩展性成本高 不可能让标注人员把所有的问题都写一遍。
所以需要让模型学到人类的喜爱偏好(训练出一个RM模型作为机器裁判从而代替人类当裁判) 也就是使用的策略是让人工标注者对 SFT 模型的不同输出进行排序以创建 RM 模型而不是让人工标注者创建一个更大的精选数据集
2. Reward Model是如何训练的 初始化 OpenAI使用了指令微调16个epoch的6B模型作为奖励模型的初始模型。通过『移除了最后一层unembedding layer的上一阶段的SFT模型』初始化出我们的RM模型且考虑到175B计算量大且不稳定不适合作为奖励函数故最后用的6B版本的SFT初始化RM模型。模型训练训练方式是两两对比计crossentropy其实就是logist 二分类损失这里是两两组合其中rθ 是奖励函数对指令x和回复y的打分如下 abc) 两两组合 计算loss l o s s ( θ ) − 1 ( 2 k ) E ( x , y w , y l ) D [ l o g ( σ ( r θ ( x , y w ) − r θ ( x , y l ) ) ) ] loss(\theta) -\frac{1}{(^k_2)} E_{(x,y_w,y_l)~D}[log(\sigma(r_{\theta}(x,y_w) - r_{\theta}(x,y_l)))] loss(θ)−(2k)1E(x,yw,yl) D[log(σ(rθ(x,yw)−rθ(x,yl)))] 数据收集让阶段1的SFT模型回答来自OpenAI API和labeler-written且规模大小为33k的数据集的一些问题比如 x n 1 x_{n1} xn1接着针对每个问题收集4-9个不同的模型输出从而获取4-9个回答。 为什么模型会有多个回答呢在于模型每次预测一个词都有对应的概率根据不同的概率大小可以采样出很多答案比如通过beam search保留k个当前最优的答案(beam search相当于贪心算法的加强版除了最好的答案外还会保留多个比较好的答案供选择)。 人工对这4-9个回答的好坏进行标注且排序排序的结果用来训练一个奖励模型RM具体做法就是学习排序结果从而理解人类的偏好。 对于标注者来说对输出进行排序比从头开始打标要容易得多这一过程可以更有效地扩展。在实践中所选择的 prompt 的数量大约为 30-40k并且包括排序输出的不同组合。 训练技巧OpenAI发现如果对数据进行Shuffle则训练一轮就会过拟合但如果把针对1个指令模型的K个回复K在4~9之间得到 C K 2 C^2_K CK2 个pairwise对放在一个batch里进行训练会得到显著更高的准确率。这里一个batch包括64个指令生成的所有回复对其中排名相同的样本对被剔除。这里感觉和对比学习要用大batch_size进行拟合的思路有些相似是为了保证对比的全面性和充分性使用全面对比后计算的梯度对模型进行更新。另一个原因可能是不同标注人员之间的偏好差异shuffle之后这种偏好差异带来的样本之间的冲突性更高。
3. RLHF 是如何训练的
大体步骤
首先 初始化PPO模型然后 让PPO模型去回答问题这些问题没有人类标注都是新问题此时不用人工评估而是让阶段二的RM来对结果进行打分进而进行排序。之后通过不断更大化奖励而优化PPO模型的生成策略(因为生成策略更好模型的回答便会更好)策略优化的过程中使用PPO算法限制策略更新范围最后根据优化后的策略再次生成 - RM再评估 - 模型再优化后再生成如此循环进行直到策略最优为止. o b j e c t i v e ( ∅ ) E ( x , y ) D π ∅ R L [ r θ ( x , y ) − β l o g ( π ∅ R L ( y ∣ x ) / π S F T ( y ∣ x ) ) ] γ E x D p r e t r a i n [ l o g ( π ∅ R L ( x ) ) ] objective(\varnothing) E_{(x,y)~D_{\pi_{\varnothing}RL}}[r_\theta(x,y) - \beta log(\pi_{\varnothing}^{RL}(y|x)/\pi^{SFT}(y|x))] \gamma E_{x~D_{pretrain}}[log(\pi_{\varnothing}^{RL}(x))] objective(∅)E(x,y) Dπ∅RL[rθ(x,y)−βlog(π∅RL(y∣x)/πSFT(y∣x))]γEx Dpretrain[log(π∅RL(x))]
在RL微调的部分OpenAI使用了PPO算法基于Reward模型的打分进行微调微调了2个epoch。在此基础上加入了两个目标
微调模型和原始模型在token预测上的KL散度避免模型过度拟合奖励函数偏离原始模型。后面也论证了KL的加入可以加速RL收敛核心是在相同的KL下最大化模型偏好的提升10%的预训练目标(PPO-PTX) 降低RL对模型语言能力的影响
且论文提到样本的收集和RL训练是多次迭代的也就是使用RL微调后的模型上线收集更多的用户请求重新训练RM再更新模型。不停在优化后的模型上收集用户反馈会让RM模型学习到更充分的高偏好样本强者愈强。 具体讲解RLHF 的loss 函数
首先目标函数如下 o b j e c t i v e ( ∅ ) E ( x , y ) − D π ∅ R L [ r θ ( x , y ) − β l o g ( π ∅ R L ( y ∣ x ) / π S F T ( y ∣ x ) ) ] γ E x D p r e t r a i n [ l o g ( π ∅ R L ( x ) ) ] objective(\varnothing) E_{(x,y)-D_{\pi_{\varnothing}^{RL}}}[r_\theta(x,y) - \beta log(\pi_{\varnothing}^{RL}(y|x)/\pi^{SFT}(y|x))] \gamma E_{x~D_{pretrain}}[log(\pi_{\varnothing}^{RL}(x))] objective(∅)E(x,y)−Dπ∅RL[rθ(x,y)−βlog(π∅RL(y∣x)/πSFT(y∣x))]γEx Dpretrain[log(π∅RL(x))]
其中 ∅ \varnothing ∅是我们要训练的参数, π S F T \pi^{SFT} πSFT是基线模型基线策略 π ∅ R L \pi_{\varnothing}^{RL} π∅RL 是我们要训练得到的RL模型也是RL策略这个模型是用SFT基线模型初始化的x 是用于训练的Prompty 是将x输入到 π ∅ R L \pi_{\varnothing}^{RL} π∅RL后得到的输出 r θ ( x , y ) r_\theta(x,y) rθ(x,y)是用第二步训练出来的参数为 θ \theta θ的Reward Model对 x和y 进行打分 我们希望这个分数是最大的我们优化的PPO目标就是最大化 E ( x , y ) − D π ∅ R L r θ ( x , y ) E_{(x,y)-D_{\pi_{\varnothing}^{RL}}}r_\theta(x,y) E(x,y)−Dπ∅RLrθ(x,y) 这样训练出来的 D π ∅ R L D_{\pi_{\varnothing}{RL}} Dπ∅RL 就是符号人类要求的输出得分最高的那个模型. 这里有一个问题是 每次更新 D π ∅ R L D_{\pi_{\varnothing}^{RL}} Dπ∅RL后x 还是不变prompt不变y会因为更新 π ∅ R L {\pi_{\varnothing}^{RL}} π∅RL策略而发生变化然后采样到的数据就会发生变化此时xy输入到 r θ ( x , y ) r_\theta(x,y) rθ(x,y)中得到分数。RL中常见的是 模型输出-人排序-模型反向传播更新-输出-人排序 这是在线学习 on-policy.
真正计算时 实际上是如下展开 o b j e c t i v e ( ∅ ) E ( x , y ) D π ∅ R L ′ [ π ∅ R L π R L ′ r θ ′ ( x , y ) − β l o g ( π R L ′ ( y ∣ x ) / π S F T ( y ∣ x ) ) ] γ E x D p r e t r a i n [ l o g ( π ∅ R L ( x ) ) ] objective(\varnothing) E_{(x,y)~D_{\pi_{\varnothing}^{RL}}}[\frac{\pi_{\varnothing}^{RL}}{\pi^{RL}}r_{\theta}(x,y) - \beta log(\pi^{RL}(y|x)/\pi^{SFT}(y|x))] \gamma E_{x~D_{pretrain}}[log(\pi_{\varnothing}^{RL}(x))] objective(∅)E(x,y) Dπ∅RL′[πRL′π∅RLrθ′(x,y)−βlog(πRL′(y∣x)/πSFT(y∣x))]γEx Dpretrain[log(π∅RL(x))]
这里面 ∅ \varnothing ∅是我们要训练的参数, π S F T \pi^{SFT} πSFT是基线策略 π R L ′ \pi^{RL} πRL′是旧策略 π ∅ R L \pi_{\varnothing}^{RL} π∅RL 是新策略。
第一部分 E ( x , y ) D π ∅ R L ′ [ π ∅ R L π R L ′ r θ ′ ( x , y ) ] E_{(x,y)~D_{\pi_{\varnothing}RL}}[\frac{\pi_{\varnothing}^{RL}}{\pi^{RL}}r_{\theta}(x,y)] E(x,y) Dπ∅RL′[πRL′π∅RLrθ′(x,y)]: 由于 第二阶段已经得到了奖励模型便可基于最大化奖励这个目标通过PPO算法不断优化RL模型的策略 π R L \pi^{RL} πRL第二部分 是带 β \beta β的惩罚项 β l o g ( π R L ′ ( y ∣ x ) / π S F T ( y ∣ x ) ) \beta log(\pi^{RL}(y|x)/\pi^{SFT}(y|x)) βlog(πRL′(y∣x)/πSFT(y∣x)) 作用是通过KL散度对比RL 在最大化RM的目标下学到的策略 π R L ′ \pi^{RL} πRL′ 和基线 π S F T \pi^{SFT} πSFT的差距开始时 π R L ′ \pi^{RL} πRL′的初始值就是 π S F T \pi^{SFT} πSFT最终希望 π R L ′ \pi^{RL} πRL′最终迭代结束后 他们两个之间的差距不至于太大。 如何避免差距太大呢可以通过KL散度衡量两个策略的概率分布之间的差距从而使得在优化策略时限制参数更新的范围。RL和RL’与PPO算法中的 θ / θ ′ \theta/\theta θ/θ′相对应比如与环境交互的 θ ′ \theta θ′等同于旧策略 π R L ′ \pi ^{RL} πRL′但具体而言则有以下4点 已经掌握人类偏好的RM模型一旦判定现有回答不好则会更新 π ∅ R L \pi_{\varnothing}^{RL} π∅RL 但是如果 π ∅ R L \pi_{\varnothing}^{RL} π∅RL发生变化会导致后续的$R_\theta E_{t~p_{\theta}(\tau)}[R(\tau)\nabla log p_\theta(\tau)] $ 计算一系列问答评分时中的 p θ ( τ ) p_{\theta}(\tau) pθ(τ)发生变化(策略轨迹必变化)进而已经采样的问答数据 x n 2 , y n 2 1 , . . y n 2 4 x n 3 . . x_{n2},{y^1_{n2},..y^4_{n2}} x_{n3}.. xn2,yn21,..yn24xn3.. 便无法使用而只能不断采样一批新的问答数据(更新一次 π ∅ R L \pi_{\varnothing}^{RL} π∅RL 后得采样新一批数据再更新一次 π ∅ R L \pi_{\varnothing}^{RL} π∅RL 后 再采样新一批数据…) 为了避免 π ∅ R L \pi_{\varnothing}^{RL} π∅RL 只要一更新便只能一次次去采样一批批新问题数据。(为了提高数据利用率)我们改成让 π ∅ R L ′ \pi_{\varnothing}^{RL} π∅RL′去和环境交互 a. 首先在使用旧策略 π R L ′ \pi^{RL} πRL′生成一批数据包括状态、动作和奖励等信息这些数据可以类似DQN那样存储在一个经验回放缓冲区中b. 其次在训练新策略 π ∅ R L \pi_{\varnothing}^{RL} π∅RL时从经验回放缓冲区中随机抽取一批数据c.对于旧策略采样到的每个数据样本(x,y) 计算重要性采样权重w(x,y) w ( x , y ) π ∅ R L ( y ∣ x ) π R L ′ ( y ∣ x ) w(x,y) \frac{\pi_{\varnothing}^{RL}(y|x)}{\pi^{RL}(y|x)} w(x,y)πRL′(y∣x)π∅RL(y∣x) 比如 前几轮通过旧策略 π ( R L ′ ) \pi_{(RL)} π(RL′)采样的数据放在经验缓冲区中把新策略多次迭代更新出 π ( R L 2 ) \pi_{(RL2)} π(RL2) π ( R L 3 ) \pi_{(RL3)} π(RL3),这个过程中重要性采样的比值为 π ( R L ) π ( R L ′ ) \frac{\pi_{(RL)}}{\pi_{(RL)}} π(RL′)π(RL) π ( R L 2 ) π ( R L ′ ) \frac{\pi_{(RL2)}}{\pi_{(RL)}} π(RL′)π(RL2)…再之后通过 π ( R L 3 ) \pi_{(RL3)} π(RL3)采样一批新数据再次放在经验缓冲区里从而积雪迭代更新出 4 5 6 这个过程中重要性采样的比值变为 π ( R L 4 ) π ( R L 3 ) / \frac{\pi(RL4)}{\pi(RL3)}/ π(RL3)π(RL4)/. π ( R L 5 ) π ( R L 3 ) / \frac{\pi(RL5)}{\pi(RL3)}/ π(RL3)π(RL5)/… 以此类推。且使用一些方法限制策略更新的幅度例如PPO中截断重要性采样比率. d. 然后通过最大化奖励而不断迭代 π R L ′ \pi^{RL} πRL′ 迭代过程中可一定程度的重复使用旧策略生成的已有数据反复验证。e. 按照更新后的目标函数进行梯度计算和参数更新f. 在训练过程中可以多次重复使用经验回复缓冲区中的数据进行训练,但是需要注意的是 随着梯度更新新旧策略之间的差异可能会变化大这时重要性采样权重可能变得不稳定从而影响训练的稳定性。 第三部分是加在最后边的偏置项 γ E x D p r e t r a i n [ l o g ( π ∅ R L ) ] \gamma E_{x~D_{pretrain}}[log(\pi_{\varnothing}^{RL})] γEx Dpretrain[log(π∅RL)] 其中 D p r e t r a i n D_{pretrain} Dpretrain是GPT3的预训练分布预训练损失系数 γ \gamma γ控制预训练梯度的强度且为0 则是PPO模型否则称为PPO-ptx模型。 之所以加最后这个偏置项是防止ChatGPT在训练过程中过度优化从而避免过于放飞自我通过某种刁钻的方式愉悦人类而不是老实地根据问题给出正确答案。GPT3-SFT-RM-RLHF.
模型效果 PPO-Ptx/PPO SFT GPT(with prompted) GPT 人类对齐的效果 好于 SFT 好于GPT with prompted 调整过的 好于GPT only。
参考链接
李沐视频讲解
ChatGPT技术原理解析从RL之PPO算法、RLHF到GPT4、instructGPT