- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
前几章我们讨论了RLHF的样本构建优化和训练策略优化,这一章我们讨论两种不同的RL训练方案,分别是基于过程训练,和使用弱Teacher来监督强Student 。
### 数据标注
- Solving math word problems with processand
outcome-based feedback- PRM:Let's verify step by step
- https://github.com/openai/prm800k
想要获得过程监督所需的标注样本,其实是一件成本很高事情,因为需要对解题的每一个步骤是否正确进行标注。论文选择了3分类的label,positive是推理正确合理,negative是步骤错误或逻辑错误,neural是模糊或者存在误导。如下 。
为了让高昂的标注过程产生最大的价值,这里需要保证生成解题样本的格式规范(容易拆分成多个解题步骤),以及样本不能全是easy negative或者easy positive。也就是我们需要解决推理格式和样本筛选问题.
为了保证稳定的推理格式,这里论文训练了Generator,使用'\n'来分割每一步解题步骤。为了避免这一步微调导致样本信息泄露,论文使用few-shot构建格式正确的推理样本后,过滤了答案正确的样本,只使用答案错误但格式正确的样本训练Generator。更大程度保证微调只注入推理格式,不注入额外数学知识和推理信息.
在样本筛选步骤,论文使用当前最优的PRM模型筛选打分高,但是答案错误的Convincing wrong answer答案,来构建更难,过程监督信号更多,且PRM对当前解题过程一定存在至少一步判断错误的样本,来进行人工标注.
既然看到这里是使用PRM打分筛选样本来训练PRM,自然使用到了Iterated Training,也就是会先构建一波样本训练一个PRM,用新训练好的PRM,对问题的N个回答进行打分,再筛选Top K的Convincing wrong answer去进行人工标注,再训练PRM,这个过程总共迭代了10次。最终得到了PRM800K解题步骤的训练样本,包括从12K问题中采样得到的75K答案.
ORM的训练样本就简单很多,只需要用到问题的答案即可。不过考虑到上面PRM对样本进行了有偏筛选得到的大多是答案错误的样本,因此ORM的样本是在相同问题上用Generator重新随机生成的。所以ORM和PRM的回答样本并不相同.
训练阶段,ORM是预测最终答案正确与否的positive/negative分类目标;PRM的目标是预测每一个解题步骤的positive/neural/negative,这里论文没有做任何解题步骤前后关联,单纯把每个解题步骤独立作为一个分类样本进行训练,因此和ORM一样是分类任务。论文同时提到因为预训练LM和分类CLM的目标差异巨大,因此低LR的训练得到的PRM更加稳定,不论模型大小都只训练2个Epoch 。
这里虽然感觉PRM这个每个解题步骤条件独立的假设有一些强,但确实如果按不独立来标注,那标注成本会再高一个数量级,也是不太现实~ 。
推理阶段,论文给出了两种PRM的推理方案。一种是使用PRM计算每一步推理正确的概率,再把多个推理步骤的得分求积,得到每个答案唯一的打分,用来比较同一个问题多个回答之间的优劣。一种是预测第一个错误的步骤,这样PRM和ORM会先对可比,对于对的回答二者的预测都是全对,对于错的回答,二者的预测都是存在有错误的步骤,只不过PRM会进一步给出错误的具体位置.
效果上论文使用Best-of-N的Major Voting作为基准,来对比PRM和ORM筛选答案的正确率,如下图,随着采样答案N的数量增加,PRM相比ORM和Major-Voting的相对优势会越来越显著.
考虑以上ORM和PRM训练数据集并不相同,不算严格的对比实验,之后论文还做了相对可比的消融实验,这里不再赘述.
除了直观的效果对比,PRM相比ORM还有几个对齐优势 。
- WEAK-TO-STRONG GENERALIZATION: ELICITING STRONG CAPABILITIES WITH WEAK SUPERVISION
- https://github.com/openai/weak-to-strong
weak-to-strong是openAI对齐团队在23年年终交出的答卷。论文的本质是对超级对齐问题进行一个简化的讨论,也就是当大模型的能力越来越强甚至超越人类的时候,人类的监督是否还能有效指导模型行为,保证模型的安全性和指令遵从性。以及这种弱监督该如何进行?
所以超级对齐本质是一个“弱-监督-强”的问题,而论文进行的简化,就是把人类监督超级模型的问题,类比简化成一个弱模型监督强模型的过程,即所谓“Weak-to-Strong Generalization” 。
论文的思路其实和前几年曾经火过的弱监督,半监督,带噪学习的思路非常相似。就是在任务标签上训练弱模型,然后使用训练后的弱模型进行打标,再使用模型打标的标签来训练强模型,看强模型的效果能否超越弱模型。逻辑上弱监督半监督,其实是提高模型在unseen样本上的泛化能力,而OpenAI这里研究的Weak-to-Strong更多是模型能的泛化.
论文可以分成两个部分,使用常规微调测试weak-to-strong的泛化效果,以及探索如何提升weak-to-strong的泛化,下面我们来分别说下 。
首先论文选择了三种任务类型来测试模型泛化效果 。
其次就是在以上数据集上,分别进行以下训练 。
以上得到的三个模型效果理论上应该是weak-supervisor < weak-to-strong < strong-ceiling,最后论文通过计算弱监督训练帮助强模型恢复的能力占比来衡量weak-to-strong监督的泛化效果,既Performance-Gap-Recovered(PGR) 。
以下为直接微调的实验结果,下图分别展示了不同模型大小的strong student(横轴),weak teacher(颜色),在以上三个任务上的任务准确率,和对应的PGR用来衡量weak-to-strong的泛化效果.
这里三种任务的泛化差异,其实和前面提到的三种任务本身难度,以及和模型大小的相关性有关。如果从噪声学习的角度来讨论的话,NLP任务和模型大小相关性低,且标签噪声较小;Chess Puzzle和单模型大小以及stduent-teacher之间的gap相关性都很大,teacher标签噪声,以及student-teacher预测的一致性都随模型scale变化;reward任务都很一般,和模型大小没啥关系.
整体上通过直接微调,能稳定获得一定的能力泛化(PGR>0),但泛化效果并不好。于是下面论文讨论了能否通过改变训练方案来提高weak-to-strong的泛化效果.
采用渐进训练的方案,也就是我们可以先用小模型对齐略大一些的模型,再用略大一些的模型来对齐更大一些的模型,然后逐步迭代下去。这种训练方式可能更适合上面Chess Puzzle的任务,考虑该任务存在Inverse Scaling,既当Student比Teacher大的越多,weak-to-strong的泛化效果越差,那我们可以逐步放大Student模型的大小,保持Teacher和Student之间的gap不要太大.
效果上不难发现对比以上的inverse scaling的PGR变化,在相同的Teacher模型上,我们可以获得几乎持平的PGR泛化效果,也就意味着更小的模型可以帮助更大的模型恢复相同比例(但绝对值更大) 的能力。这里论文统一采用了3次迭代,也就是会训练两个中间大小的模型.
如果我们想让大模型学习的时候,只学习小模型在任务上获得的Insight,而不是简单的去模仿小模型,可以通过加入正则项的方法。用的是半监督学习里面的最小熵原则,和Pseudo Label的损失函数是近似的,不熟悉的同学看这里小样本利器3. 半监督最小熵正则 。
也就是在原始的交叉熵(左)的基础上,加上了student模型的预测熵值,这里f(x)是训练中的大模型,而t是一个动态阈值,是batch内样本预测概率的中位数,这样大模型即便不去学习Teacher模型,通过提高自己对预测样本的置信度(自信一点!你是对的),也可以降低损失函数.
以上损失函数还可以改写为噪声损失函数中的Bootstrap Loss, 不熟悉的同学看这里聊聊损失函数1. 噪声鲁棒损失函数。也就是Student学习的label是由Teacher的预测label,和student模型自己预测的label混合得到的。逻辑也是一样,如果这个问题你对自己的预测很自信,那请继续自信下去! 。
以上正则项的加入在NLP任务上,当student和teacher之间的gap较大时,能显著提高weak-to-strong的泛化效果,即便最小的Teacher也能恢复近80%的大模型效果,说明降低student无脑模仿teacher的概率是很有效的一种学习策略.
最后论文讨论了为何存在weak-to-strong泛化,以及在什么场景下存在。这是一个很大的问题,论文不可能穷尽所有的场景,因此有针对性的讨论了模仿行为和student模型本身对该任务是否擅长。这里简单说下主要的结论吧 。
Imitation 这里论文分别通过过拟合程度,以及student和teacher的预测一致性来衡量大模型是否无脑拟合了teacher模型。并提出了合适的正则项,以及early stopping机制可以降低模仿,提高泛化 。
Sailency 论文提出当强模型本身通过预训练对该任务已经有很好的任务学习(表征)的情况下,泛化会更好。这里个人感觉有些像DAPT,TAPT(domain/taskadaptive pretraining)的思路,不熟悉的同学看这里预训练不要停!Continue Pretraining。从文本表征空间分布的角度来说,就是当模型对该任务文本所在空间分布本身表征更加高维线性可分,边界更加清晰平滑时,模型更容易泛化到该任务上.
想看更全的大模型相关论文梳理·微调及预训练数据和框架·AIGC应用,移步Github >> DecryPrompt 。
最后此篇关于解密prompt系列34.RLHF之训练另辟蹊径:循序渐进&青出于蓝的文章就讲到这里了,如果你想了解更多关于解密prompt系列34.RLHF之训练另辟蹊径:循序渐进&青出于蓝的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在学习使用 PowerShell 编写脚本,我发现这段代码可以帮助我完成一个项目 该示例来自 Is there a one-liner for using default values with
出于好奇,window.prompt 和 JavaScript 中的 prompt 之间有什么区别。 老师用的我考试题的答案之一 var yourName = window.prompt("Pleas
我正在使用 Phonegap 构建一个应用程序我正在使用 javascript 提示输入类别名称,效果很好 var newcat=prompt("ADD CATEGORY",""); 我想将其
我正在使用 Anaconda 学习 Python。早些时候我只有 Anaconda Prompt。但是最近通过 更新了 Anaconda 之后 conda update conda 我是来看Anaco
我有一个对话框,其中有多个提示(Prompts.text, Prompts.number, Prompts.Choice,提示.确认)。虽然 Prompts.choice 和 Prompts.conf
我有一个引用参数“Year_Parameter”的值提示,以及一个包含一列(数据项表达式)的列表,该列表以这种方式引用与值提示相同的参数: #prompt('Year_Parameter')# 值提示
我正在尝试从绘制 ZSH shell 提示的函数中将当前光标位置(当前行号和列)读入一个变量中。我的目标是在提示下方显示内容,仅当有足够多的空行不会导致额外滚动时。 在交互式 shell 中,我可以使
有什么(支持的)方法可以做到这一点吗? IIRC 当使用“比 X 更暗”的色调颜色时,它通常会在某个时刻自行切换为白色,但我们的方案似乎处于边缘。 最佳答案 在 iOS5 中可以实现: [[UINav
如果生成的列表对于打开的命令提示符窗口的高度来说太长(就像这个长分支列表),它就会卡在这里。它首先显示适合窗口的内容,然后显示 :,如果按 ↓,您将到达列表的末尾,并显示 (END) 如何摆脱这种情况
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
例如,我想删除 AppData/Roaming/MyFolder/myfile.txt 中的文件。 我使用命令提示符并输入:del %userprofile%/AppData/Roaming/MyFo
例如,我想删除 AppData/Roaming/MyFolder/myfile.txt 中的文件。 我使用命令提示符并输入:del %userprofile%/AppData/Roaming/MyFo
这个问题已经有答案了: Is there a destructor for Java? (24 个回答) 已关闭 8 年前。 我正在将一些 C++ 代码移植到 Java,这些代码使用非常常见的 C++
在android中我定义了一个布局如下: ... 但由于某些原因,当我启动相应的 Activity 时,微调器的 android:promp 文本未显示。为了完整起见
代码是这样的: for(var node=iterator.iterateNext(),origin_background=node.style.background;node;node=iterat
仅当用户在提示中单击取消 时,下面的代码才会运行alert('Please enter your name!');。如果用户未在提示框中输入任何内容并单击 Enter,我试图让代码也运行所述警报。但是
我想知道是否可以根据当前路径或pwd值更改PS1? 例如: cd /home/user/directory1 PS1=[\e[1;32m\u\e[m@\e[1;34m\h\e[m \e[1;33m\W
这是一个奇怪的问题,我无法通过 Google 找到好的答案(当然,我总是有可能会失败)。在我的 bash 提示符下,如果我给提示符的一部分涂上颜色,当我按“向上”键转到上一个命令时,在超过一定数量的字
有没有办法验证javascript中调用window.prompt()显示的提示框的输入textBox的文本? 我的意思是,如果输入文本框中写入的字符串包含数字或我定义的其他非法字符等,则在单击“确定
我正在努力使用 HTML 代码来验证外部 js 文件中 Javascript Prompt() 的输入。我了解调用 Javascript 函数进行验证,并且知道如何编写该函数,但是如何“监听”HTML
我是一名优秀的程序员,十分优秀!