1.5.llm_alignment
最后更新于
这有帮助吗?
最后更新于
这有帮助吗?
预训练一个语言模型 (LM) ;
聚合问答数据并训练一个奖励模型 (Reward Model,RM),也叫偏好模型;
用强化学习 (RL) 方式微调 LM。
确保任务多样性的情况下,由标注人员编写prompt和一些生成式任务的期望输出。
openai:instructGPT使用小版本的GPT-3,并对“更可取”(preferable)的人工生成文本微调
Anthropic:1000w-520亿参数的transformer,并按“有用、诚实和无害”的标准在上下文线索上蒸馏原始LM
不管是PreTraining阶段还是SFT阶段,loss函数都是一样的,只是计算的方式存在差异,PreTraining阶段计算的是整段输入文本的loss,而SFT阶段计算的是response部分的loss。
接收一系列文本并返回一个标量奖励,数值上对应人的偏好。我们可以用端到端的方式用LM建模,或者用模块化的系统建模 (比如对输出进行排名,再将排名转换为奖励) 。
模型选择:RM可以是另一个经过微调的LM,也可以是根据偏好数据从头开始训练的LM。Anthropic 提出了一种特殊的预训练方式,即用偏好模型预训练 (Preference Model Pretraining,PMP) 来替换一般预训练后的微调过程,PMP对样本的利用率更高。
训练奖励数值:人工对 LM 生成的回答进行排名。起初我们可能会认为应该直接对文本标注分数来训练 RM,但是由于标注者的价值观不同导致这些分数未经过校准并且充满噪音,通过排名可以比较多个模型各自的输出并构建更好的规范数据集,这些不同的排名结果将被归一化为用于训练的标量奖励值。
目前成功的RLHF使用了和要对齐的LM具有不同大小的LM:
OpenAI:175B的LM和6B的RM
Anthropic:使用的 LM 和 RM 从 10B 到 52B 大小不等
DeepMind:使用了 70B 的 Chinchilla 模型分别作为 LM 和 RM
策略 (policy):一个接受提示并返回一系列文本 (或文本的概率分布) 的 LM
行动空间(action space): LM 的词表对应的所有词元 (一般在 50k 数量级)
观察空间 (observation space): 是可能的输入词元序列,也比较大 (词汇量^输入标记的数量)
奖励函数:偏好模型和策略转变约束 (Policy shift constraint) 的结合。
ppo确定的奖励函数如下:
提示输入初始LM和当前微调的LM,分别得到输出文本和
将来自当前策略的文本传给RM得到标量奖励
将两个模型的生成文本进行比较计算差异的惩罚项,一般是输出词分布间的KL散度的缩放,即,
惩罚项的好处:
用于惩罚策略在每个训练batch中生成大幅偏离初始模型,以确保模型输出合理连贯的文本。
如果没有这一项,可能导致模型在优化中生成乱码文本,以愚弄奖励模型提供高奖励值。
根据PPO,按当前batch的奖励进行优化。PPO是置信域优化(TRO,Trust Region Optimization)算法,用梯度约束确保更新步骤不会破坏学习过程的稳定性。
DeepMind对Gopher用了类似的奖励设置,但用的是A2C来优化梯度。
Rollout and Evaluation:从prompt库里抽样,使用语言模型生成response,然后使用奖励模型(Reward Model, RM)给出奖励得分。这个得分反映了生成的response的质量,比如它是否符合人类的偏好,是否符合任务的要求等。
Make experience:收集了一系列的“经验”,即模型的行为和对应的奖励。这些经验包括了模型生成的response以及对应的奖励得分。这些经验将被用于下一步的优化过程。
Optimization:使用收集到的经验来更新模型的参数。具体来说,我们使用PPO算法来调整模型的参数,使得模型生成的response的奖励得分能够增加。PPO算法的一个关键特性是它尝试保持模型的行为不会发生太大的改变,这有助于保证模型的稳定性。
官方代码example
Rollout:根据策略(LM)生成轨迹(文本)。
输入:Batch Prompt、LM
输出:Prompt+Response
Evaluate:对生成的轨迹进行评估(RM)。
输入:Prompt+Response、RM
输出:Reward
Old Policy Sampling:计算并存储旧策略的概率、价值等值,
输入:Ref_model、Actor、Critic、Prompt+Response
输出:Ref Logprobs、Old Logprobs、Old Values
KL Penalty:计算当前策略和原始LM之间的KL散度,用作对策略改变过快的惩罚项。
输入:Ref Logprobs、Old Logprobs、Reward
输出:Token Reward
Generalized Advantage Estimation (GAE):G。基于old value(shape是(batch_size
, response_length
))和reward估计优势函数A,它结合了所有可能的n-step 进行advantage估计
输入:Token Reward、Old Values
输出:Advantages、Returns
New Policy Sampling:
输入ref_model、actor、critic,从新的策略中采样概率等信息,
输出new logprobs、new values和logits,供actor loss、critic loss以及entropy loss用。
Critic Loss:Critic的目标是估计状态的价值函数,Critic loss就是价值函数预测值和实际回报之间的差距。
输入:New Values、Returns
输出:critic梯度更新
Actor Loss:Actor的目标是优化策略,Actor loss就是基于优势函数的策略梯度。
输入:Old Logprobs,New Logprobs、Advantages
输出:actor梯度更新
Entropy Loss:为了增加探索性,通常会添加一个基于策略熵的正则项,它鼓励策略保持多样性。
输入:Logits
输出:entropy loss
Policykl:这是对策略迭代过程的一个度量,它度量新策略和旧策略之间的差距。
输入:Old Logprobs、New Logprobs
输出:是否early stop
在PPO中,策略优化的过程涉及到两个策略:一个是"旧的"策略,这是我们在开始每次优化迭代时使用的策略,另一个是"新的"策略,这是我们在优化过程中不断更新的策略。
自己整理重画的
actor & actor loss
Actor 是策略,它决定文本会被怎么样生成,是从策略网络拷贝来的模拟整个智能体在环境中行动的网络。
优势函数表示在给定的状态下采取某个行动比遵循当前策略的期望回报要好多少。
Actor Loss如下,用重要性采样比较在旧策略和新策略下行动的概率(Old Logprobs,New Logprobs),然后将这个比值(也就是 Importance Sampling 的权重)与优势函数Advantages相乘,得到了对 Actor Loss 的一个估计。
critic & critic loss
critic是专门用来预测actor轨迹每一步价值的网络,actor上加几个线性层能够给每个token预测一个值。任务是估计状态的价值函数,也就是预测从当前状态开始,通过遵循某个策略,期望能得到的总回报。
Critic Loss是最小化它的预测价值与实际回报之间的差距,常用mse
通过最小化Critic Loss,Critic的预测能力会逐渐提升。因为Critic的预测结果会被用来估计每个行动的优势(Advantage),这个优势值又会被用来计算策略的更新(Actor Loss)。
KL Penalty
用于保证经过强化学习后的模型(新策略actor)不会过于偏离原始预训练模型(ref model)。
GAE
GAE是一种多步优势估计方法。它通过引入一个权衡参数,在单步TD误差和多步TD误差之间进行权衡,从而减小估计的方差,提高学习的稳定性。其中是时间步的TD误差。
entropy loss
一个策略的熵越大,意味着这个策略选择各个动作的概率更加“平均”。在actor的loss里加熵,使得策略的熵尽可能大,从而有更多机会探索可能带来更好奖励的文本轨迹。
新实现:
Policy kl
在PPO中,KL散度被用作一种约束,以确保在优化过程中新策略不会偏离旧策略太远。这是为了防止过度优化,因为过度优化可能会导致策略性能的大幅下降。
我们希望在优化目标函数的同时,满足以下的KL散度约束:
在代码中,每个mini batch都会进行early stop的判定,如果计算出的KL散度大于 ,那么就会停止这一轮的优化,以保证新策略不会偏离旧策略太远。
Old Policy Sampling(无bp)
是make experience的过程,计算并存储旧策略的概率、价值等值,来为后面更新的过程服务。
Old Logprobs:从“旧的”策略[即在这个batch数据中初始的LM(initial actor)]中计算每个token在旧的策略下的概率Old Logprobs。
Old Values:旧策略中每个时间步(每个token的预测结果)的价值,这个值由critic网络进行预测,critic网络就是需要这个值的原因是advantage的计算依赖于Old Values。
Ref Logprobs:最最原始的LM对于每个时间步的概率预测,一般就是固定不变的gpt3,计算这个值的目的是限制actor的更新,防止其偏离原始gpt3太远,他的实现在下一个步骤中。
New Policy Sampling(有bp)
在新的策略(更新后的actor)下对轨迹(文本)计算概率的过程,计算Actor Loss,即策略梯度的损失。
Old Logprobs是一次性一个batch的数据计算的,这是因为在一个batch中旧策略都是不变的;而New Logprobs是一个mini batch计算一次,这是因为新策略每个mini batch变一次。
对应代码:
在contextual bandit的设定下,DPO 通过数学推导,得到了奖励函数与最优策略之间的直接映射,消除了RLHF过程中的奖励建模阶段,
其中是partition function,
代入Bradley-Terry模型,可以得到
其中:
:来自偏好数据集的prompt
:来自偏好数据集的获胜response
:来自偏好数据集的失败response
其具体含义如下,其中:
具体实现:
RLHF与DPO对比:
RLHF优化的是token-level的value functions,对应的是terminate state的sparse reward。
DPO则是在context bandit的设定下,将整个response看成一个arm。虽然token是一个个生成的,但在RL里一般dense rewards效果更好。
这里的preference model感觉就是RLHF里的reward model,输入一些response的pair对,输出哪个更好,和RLHF的区别在于其中的helpfulness的label还是人标的,而harmlessness的label是由模型生成的。
使用任意一个RLHF后的模型,输入能够诱导(elicit)出有害response的prompts(red teaming的相关工作有这些积累),sample出一些结果。
然后以它们为上下文,把一些pre-written指令加入进来,让模型critique(评论)自己的response,
然后再加入如下的pre-written指令,让模型revisit它的response
最后,将revision的结果和最开始的prompt拼在一起,当成一条不那么有害的训练数据
这些指令可以改写用来强调不同维度的有害信息,例如事先写好16个原则,每次从中sample出一些来用。有些时候模型可能对critique给出的原则理解不对,或者给不出合理的revision,这个时候可以在prompt里加上few shot
为了让模型更加helpful,在sft的时候,不仅用revision的结果,还用上原来RHLF的helpful responses。
让人类给的feedback label只用来学helpfulness,而harmlessness的label则都通过多选题的方式由模型自己产出,随后distilled back给一个preference model
另外找一个pretrained model当成feedback model,
输入如下prompt,让一个assistant model产出一个response的pair对,然后输入给feedback model,要求返回更无害的结果:
然后计算response A和B的log probability,再使用norm后的这些概率作为targets,创建一个labeled, preference modeling comparison example,即为偏好模型创建训练数据。如下是16个原则,发现将这些原则ensemble起来比只用一个原则效果的preference score要鲁棒得多。
Please choose the response that is the most helpful, honest, and harmless.
Please choose the assistant response that is as harmless and ethical as possible. Do NOT choose responses that are toxic, racist, or sexist, or that encourage or support illegal, violent, or unethical behavior. Above all the assistant’s response should be wise, peaceful, and ethical.
Compare the degree of harmfulness in the assistant responses and choose the one that’s less harmful. However, try to avoid choosing responses that are too preachy, obnoxious, or overly-reactive.
Choose the assistant response that is as harmless, helpful, polite, respectful, and thoughtful as possible without sounding overly-reactive of accusatory.
Please choose the assistant response that’s more ethical and moral. Do NOT choose responses that exhibit toxicity, racism, sexism or any other form of physical or social harm.
Which of these assistant responses exhibits less harmful and more acceptable behavior? Choose the less harmful response.
Choose the assistant response that answers the human’s query in a more friendly, amiable, conscientious, and socially acceptable manner.
Which of these assistant responses is less harmful? Choose the response that a wise, ethical, polite and friendly person would more likely say.
Choose the response that is less harmful, paying close attention to whether each response encourages illegal, unethical or immoral activity.
Please consider these assistant responses and choose the one that is less harmful, more age-appropriate, and more family-friendly.
Choose the response that answers the human in the most thoughtful, respectful and cordial manner.
Compare the assistant responses in terms of toxicity, racism, sexism and social bias, and choose the less harmful response.
Choose the response that sounds most similar to what a peaceful, ethical, and wise person like Martin Luther King Jr. or Mahatma Gandhi might say.
Which of the assistant responses is most harmless, helpful, and honest? Choose the best response based on these criteria.
Choose the assistant response that is more harmless, polite, pleasant, and least likely to offend a socially-aware audience.
Choose the assistant response that demonstrates more ethical and moral awareness without sounding excessively condescending, reactive, annoying or condemnatory.
SL-CAI模型一方面用来生成response pairs,另一方面用来作为RL的初始snapshot。之所以感觉拿一个模型来同时做这两个事效果会更好,是因为policy生成的response的分布,应该和preference model训练的分布类似,至少在RL训练初期应该是这样。RL的训练流程和RLHF一样,只是preference模型的部分训练数据是由模型生成的。
此外,还尝试用RLHF后的模型来尝试CoT,将feedback原则重写成如下对话形式:
如上是rlaif和rlhf的对比。
蓝色:prompt,包括summary的定义,文章+两个summary,让模型输出哪个prompt更好,原因:
橙色:产出的response,包括哪一个summary更好,以及原因。再加上一个Ending(preferred summary=)
绿色:橙色和蓝色的一起作为新的prompt,把输出token 1和2对应的logit拿出来,得到preference score:和
由于用的是soft labels(如[0.6, 0.4]),所以对输出的score对RM进行训练时直接用cross-entropy loss。可以把在AI生成的数据集上训练RM看成是一种模型蒸馏。
一般来讲,RM是依据初始的policy训练的,但随着policy的训练,当初训练RM的数据越来越out-of-distribution了。一种解法是迭代地运行RLAIF,周期性地训练一个RM,比较耗时。
d-RLAIF:
LLM的prompt是对一个生成结果打1-10分
计算1-10这10个token各自的likelihood,并归一化成一个概率得分,权重是
最后再把score归一化到[-1,1]之间,这个score直接当成reward,不需要RM模型了
评估方式:
AI Labeler Alignment:衡量AI标注的preferences和人类preferences的准确率。先把AI标注的转成二分类([0.6, 0.4]->[1,0]),如果这个结果和人类的标注一样那就是1,否则是0。最终的准确率就是如下公式,其中是数据集,是AI标注的,而是人类标注的:
Win Rate:给定两个策略生成的结果,人类选择更好的那个,然后统计胜率。
Harmless Rate:人类认为response是harmless的比例,
另外,发现小的模型更容易出现position bias,即给定两个候选,换一下顺序,模型还是觉得同一个位置的更好。缓解:每个pair反转前后各过一遍模型,然后得分avg一下。
CriticGPT依旧是自回归模型。标注者先向ChatGPT的响应输出中人为注入一些微妙的错误,CriticGPT针对这些有错误的答案生成批评意见,之后再由人类训练师为批评意见进行打分排名。
更适合NLU任务的强化学习方法RLLR(Reinforcement Learning with Label-Sensitive Reward),与RLHF相比可以一致地提升多种NLU任务上的标签准确率;进一步地,通过结合RLHF和RLLR的两个Reward Model,RLLR-mixed方法可以在标签准确率和理由质量上取得全面提升。
将NLU任务改写为自然语言的形式,让模型对同一个问题输出多条回复,每条回复包括两部分:
理由(rationale):可以视为思维链的一种简化版本
标签(label)
对同一个问题的不同回复进行排序,并处理成回复对(pair)的形式。
标签敏感对(label-sensitive pair):标签不同的回复对
理由敏感对(rationale-sensitive pair):标签相同、理由不同的回复对
在7个公开数据集上,理由敏感对的占比都超过75%。在理由敏感对中,两个不同的理由会导向相同的标签,理论上说,模型在这些数据上进行训练只会使理由更符合标注者的偏好,但对标签的准确性没有帮助;而在NLU任务上,我们实际更关心标签的准确性,因此存在模型训练目标与评估指标不一致的问题。
SFT训练:除了标签之外,我们还为数据集标注了理由,参考CoT的方式,先让模型生成一段理由,再根据理由输出标签,训练得到Policy Model;
Reward Model训练:训练两个reward model:
标签敏感RM:解决原始RLHF中标签敏感对比例较低的问题:对于一条训练集中的样本,我们已有正确的标签标注,并且也知道所有可能的标签集合,因此可以随机采样一个错误的标签,并为错误的标签标注理由,与正确标签+理由构成标签敏感对,并基于此方法构造的数据训练单独的Reward Model;
理由敏感RM:对于训练集中的每条样本,我们基于正确的标签采样多条理由,根据理由的生成质量来构建理由敏感对,并训练理由敏感的Reward Model,此处理由质量可以采用人工判断或AI辅助的方式标注,根据准确性、一致性、逻辑性、事实性、相关性和信息完整性进行排序。
PPO训练:使用Reward Model和的Policy Model进行强化学习训练。
RLLR:只用标签敏感RM训练
RLLR-mixed:用两个RM训练,最终reward如下,是标签敏感RM的输出,是理由敏感RM的输出,大部分情况下,,为了强化各自的作用,当较小时,由主导,当时,截断到,由主导:
有AI辅助的标注员能比无AI辅助的标注员找出更多的摘要中的错误
评分器(grader)会比较模型输出与正确答案,然后返回一个0到1之间的分数。0 表示模型的输出中不包含正确答案,而1表示正确答案在输出的第一个位置。例如正确答案在第2个位置,评分器可能会给出0.7的分数。
DeepMind:在提出的GopherCite模型中,用的是2800亿的模型Gopher()
训练文本:RM 的提示 - 生成对文本是从预定义数据集中采样生成的,并用初始的 LM 给这些提示生成文本。Anthropic 的数据主要是通过 Amazon Mechanical Turk 上的聊天工具生成的,并在 上 可用,而 OpenAI 使用了用户提交给 GPT API 的 prompt。
直接微调整个 10B~100B+ 参数的成本过高 ,参考低秩自适应和DeepMind的。目前多个组织找到的可行方案是使用策略梯度强化学习 (Policy Gradient RL) 算法、近端策略优化 (Proximal Policy Optimization,PPO) 微调初始 LM 的部分或全部参数。
Anthropic的文章,之前的文章是提出的HH RLHF模型。
claude的:
发现这样输出的答案一般很“置信”,即非常接近0或者1,会导致不好训练,所以尝试clamp到40-60%后,效果会更鲁棒。关于clamp,大概可以这么理解:如果高于0.6就变成0.6,低于0.4就变成0.4。
deepmind的论文,在RLAIF的基础上进行改进,提出了d-RLAIF(direct-RLAIF)。
对于summary的任务,数据集是里提供的,prompt是
对于helpful的任务,数据集是,prompt是
可能相关的论文:,ACL2024的