Training language models to follow instructions with human feedback解读
- 前置知识
- 方法
- 数据集
- 结论
前置知识
- GPT的全称是Generative Pre-Trained Transformer,预训练模型自诞生之始,一个备受诟病的问题就是预训练模型的偏见性。因为预训练模型都是通过海量数据在超大参数量级的模型上训练出来的,对比完全由人工规则控制的专家系统来说,预训练模型就像一个黑盒子。没有人能够保证预训练模型不会生成一些包含种族歧视,性别歧视等危险内容,因为它的几十GB甚至几十TB的训练数据里几乎肯定包含类似的训练样本。这也就是InstructGPT和ChatGPT的提出动机,即通过一定方式方法使模型输出完成对齐,论文中用3H概括了它们的优化目标:
有用的(Helpful);可信的(Honest);无害的(Harmless)。 - InstructGPT作为ChatGPT的前身,他们的模型结构,训练方式都完全一致,即都是用了instrcut learning和RLHF指导模型学习。区别可能就是微调的元模型不同(InstructGPT是在GPT3基础上,而ChatGPT是在GPT3.5)
InstructGPT对标GPT3:
1、增强上下文理解:InstructGPT使用prompt对输入的训练数据进行重新的定义和引导,帮助模型更好的理解当下的语境和任务,从而避免误解或忽略特定的上下文信息。
2、排除推广偏见和不当内容:InstructGPT通过人工干预,指导和约束尽量减少模型生成的偏见性言论或不适当内容,提升生成文本的准确性和中立性。 - SFT监督微调(Supervised Fine-Tuning)是一种在大语言模型上进行微调的技术,它利用有标签的数据来调整预训练的语言模型,使其更适合特定的任务。这种方法通常适用于自然语言处理领域,如文本分类、翻译等。以训练语言模型GPT-3为例。GPT-3是一个强大的语言模型,它能够生成连贯的文本,回答问题,甚至编写代码。然而,为了使其能够适应特定的任务,比如编写新闻文章,我们就需要进行SFT监督微调。
首先,我们需要收集一个带有标签的新闻文章数据集。这些数据集包含了各种各样的新闻文章,每篇文章都有一个或多个标签,比如“政治”、“经济”、“体育”等。然后,我们将这个数据集输入到预训练的GPT-3模型中进行监督微调。在这个过程中,模型的学习率会被设置得非常小,以避免在微调过程中破坏掉预训练阶段学到的通用语言知识。经过一段时间的微调后,模型就能够更好地理解新闻文章的语义和结构,从而在编写新闻文章的任务上取得更好的表现。 - RM奖励模型(Reward Model)是一种在大型语言模型(LLM)训练中使用的技术,旨在改进模型输出的质量,使之更符合人类的预期和偏好。具体来说,RM奖励模型通过评估和排序模型生成的文本,引导模型生成更符合人类日常理解习惯和期望的答案。
在训练过程中,RM奖励模型分为两个主要部分:训练数据的获取和模型训练。首先,需要构建一个人类偏好排序的数据集,这通常涉及到人工标注工作,即由人类评估者对模型生成的文本进行评分和排序。这些评分和排序信息随后被用来训练奖励模型,该模型能够学习到哪些文本更受人类偏好,从而在后续的生成任务中指导模型生成更优质的文本。 - RLHF,即人类反馈强化学习(Reinforcement Learning from Human Feedback),是一种结合了人类智慧和机器学习技术的创新方法。这种方法的核心在于利用人类的直接反馈来训练一个“奖励模型”,随后通过强化学习来优化人工智能代理的行为。简而言之,RLHF 让机器学会按照人类的偏好来行动,从而提升其在特定任务中的表现。
RLHF 在大型语言模型(LLM)的训练中扮演着至关重要的角色。例如,ChatGPT 和 Llama 2 等基于 transformer 的现代 LLM 训练流程通常包括三个主要步骤:预训练、监督式微调和对齐。在这些步骤中,RLHF 被用来将对齐阶段与人类偏好结合起来,使模型能够更好地理解和生成对人类有用的响应。 - PPO算法,全称为Proximal Policy Optimization算法,是一种强化学习算法,它属于策略梯度方法的一种,并因其出色的性能和易于实现的特性而被广泛应用于强化学习领域。PPO算法的设计初衷是为了克服传统策略梯度方法的一些缺陷,尤其是针对采样效率低下和训练不稳定的问题。
在PPO算法中,核心思想是限制策略更新时的步长,避免策略变化过大,这样可以维持策略的稳定性和收敛性。具体来说,PPO算法采用了两种主要的策略更新方法:KL散度惩罚(KL penalty)和裁剪法(clipping)。这两种方法都旨在控制新旧策略之间的差异,防止策略更新偏离原始策略太远。 - PPO-ptx中的"ptx"指的是预训练分布(Pre-training Distribution)。这是一种在PPO算法基础上引入的策略,旨在通过结合预训练的知识来改善模型的性能。
在PPO-ptx算法中,预训练分布的概念被用来确保在强化学习过程中,模型不会忘记在预训练阶段学到的知识。这通过在损失函数中引入一项额外的预训练损失(pretrain loss)来实现,这项损失鼓励模型在更新策略时保留预训练阶段学到的知识。
具体来说,PPO-ptx的损失函数由三部分组成:第一部分是奖励模型给出的奖励,第二部分是KL散度奖励,用于约束当前策略与初始策略之间的距离,第三部分就是预训练损失,用于防止策略遗忘预训练阶段学到的知识。
这种结合预训练知识的策略,有助于提高模型在新任务上的泛化能力和学习效率,同时也保证了模型在强化学习过程中的稳定性和可靠性。
方法
- Step1:收集示范数据,进行有监督微调SFT
标注数据:根据prompts(提示,这里就是写的各种各样的问题),人类会撰写一系列demonstrations(演示)作为模型的期望输出。
模型微调:将prompts和人类标注的答案拼在一起,作为人工标注的数据集,然后使用这部分数据集对预训练的GPT-3进行监督微调,得到第一个模型SFT。 - Step2:收集比较数据,训练奖励模型RM
标注数据:生成式标注是很贵的一件事,所以第二步是进行排序式/判别式标注。用上一步得到的SFT模型生成各种问题的答案,标注者(labelers)会对这些输出进行比较和排序(由好到坏,比如图2 D>C>A=B)。
训练模型:基于这个数据集,训练一个RM(reward model)。训练好了之后这个RM模型就可以对生成的答案进行打分,且打出的分数能够满足人工排序的关系。 - Step3:使用强化学习的机制,优化SFT模型,得到最终的RL模型(InstructGPT)
微调模型:将新的标注数据输入到SFT模型得到输出,并将输出输入RM进行打分,通过强化学习来优化SFT模型的参数。具体使用 PPO 针对奖励模型优化策略,使用 RM 的输出作为标量奖励,使用 PPO 算法微调监督策略以优化此奖励。 - RM将 SFT 模型最后一层的 softmax 去掉,即最后一层不用 softmax,改成一个线性层。RM 模型的输入是问题和答案,输出是一个标量即分数。
具体的讲,每个prompt,SFT 模型会随机生成 K个输出,然后它们向每个labeler成对的展示输出结果,也就是每个prompt共展示C2K个结果,然后用户从中选择效果更好的输出。在训练时,InstructGPT将每个prompt的C2K个响应对作为一个batch,这种按prompt为batch的训练方式要比传统的按样本为batch的方式更不容易过拟合,因为这种方式每个prompt会且仅会输入到模型中一次。 - 损失函数:这里使用的是排序中常见的pairwise ranking loss。这是因为人工标注的是答案的顺序,而不是分数,所以中间需要转换一下。这个损失函数的目标是最大化labeler更喜欢的响应和不喜欢的响应之间的差值。
- 不少科研工作者说强化学习并不是一个非常适合应用到预训练模型中,因为很难通过模型的输出内容建立奖励机制。InstructGPT做到了这点,它通过结合人工标注,将强化学习引入到预训练语言模型是这个算法最大的创新点。
由三部分组成:打分损失+KL损失+GPT3预训练损失
数据集
- SFT数据集(step 1):
SFT数据集是用来训练step 1的GPT3模型,即按照GPT3的训练方式对GPT3进行微调。因为GPT3是一个自回归基于提示学习的生成模型,因此SFT数据集也是由提示-答复对组成的样本。
SFT数据一部分来自使用OpenAI的PlayGround的用户,另一部分来自OpenAI雇佣的40名标注工(labeler),在SFT中,标注工作是根据内容自己编写指示,并且要求编写的指示满足下面三点:
简单任务:labeler给出任意一个简单的任务,同时要确保任务的多样性;
Few-shot任务:labeler给出一个指示,以及该指示的多个查询-响应对;
用户相关的:从接口中获取用例,然后让labeler根据这些用例编写指示。
(SFT数据集包含13k个训练提示) - M数据集用来训练step 2的奖励模型,为InstructGPT的训练设置一个奖励目标,要尽可能全面且真实的对齐需要模型生成的内容。很自然的,可以通过人工标注的方式来提供这个奖励,通过人工对可以给那些涉及偏见的生成内容更低的分从而鼓励模型不去生成这些人类不喜欢的内容。InstructGPT的做法是先让模型生成一批候选文本,让后通过labeler根据生成数据的质量对这些生成内容进行排序。
(RM 数据集有 33k 个训练提示) - PPO数据集用来训练强化模型,即InstructGPT。InstructGPT的PPO数据没有进行标注,它均来自GPT-3的API的用户。既又不同用户提供的不同种类的生成任务
结论
- InstructGPT与GPT3相比:
优点:
1.InstructGPT/ChatGPT的效果比GPT-3更加真实
2.InstructGPT/ChatGPT在模型的无害性上比GPT-3效果要有些许提升
3.InstructGPT/ChatGPT具有很强的Coding能力
缺点:
1.InstructGPT会降低模型在通用NLP任务上的效果
2.InstructGPT对指示非常敏感 - 1、仅仅40人的标注团队不够大,而且标注结果会以个人的自我意志为转移。
2、仍然有一些偏见不安全的输出,而且通过某些prompt时可能会产生比同等大小GPT-3更有害的内容。
3、模型输出是否有害取决于部署它的环境;例如,模型要作为数据增强的一部分,使用语言模型生成有害的输出可能是有益的。
4、减轻对齐税,如预训练数据合并到RLHF调优中来,但并不能完全改善性能回归(通用NLP任务的性能下降)
解读到此结束,觉得对您有帮助的话欢迎关注、点赞、收藏和留言交流。
相关文章:

Training language models to follow instructions with human feedback解读
前置知识方法数据集结论 前置知识 GPT的全称是Generative Pre-Trained Transformer,预训练模型自诞生之始,一个备受诟病的问题就是预训练模型的偏见性。因为预训练模型都是通过海量数据在超大参数量级的模型上训练出来的,对比完全由人工规则…...
线性回归矩阵求解和梯度求解
正规方程求解线性回归 首先正规方程如下: Θ ( X T X ) − 1 X T y \begin{equation} \Theta (X^T X)^{-1} X^T y \end{equation} Θ(XTX)−1XTy 接下来通过线性代数的角度理解这个问题。 二维空间 在二维空间上,有两个向量 a a a和 b b b&…...

M3U8不知道如何转MP4?包能学会的4种格式转换教学!
在流媒体视频大量生产的今天,M3U8作为一种基于HTTP Live Streaming(HLS)协议的播放列表格式,广泛应用于网络视频直播和点播中。它包含了媒体播放列表的信息,指向了视频文件被分割成的多个TS(Transport Stre…...
C++第4课——swap、switch-case-for循环(含视频讲解)
文章目录 1、课程代码2、课程视频 1、课程代码 #include<iostream> using namespace std; int main(){/* //第一个任务:学会swap int a,b,c;//从小到大排序输出 升序 cin>>a>>b>>c;//5 4 3if(a>b)swap(a,b);//4 5 3 swap()函数是用于交…...

大数据新视界 -- 大数据大厂之大数据重塑影视娱乐产业的未来(4 - 4)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

在Java中,需要每120分钟刷新一次的`assetoken`,并且你想使用Redis作为缓存来存储和管理这个令牌
学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把手教你开发炫酷的vbs脚本制作(完善中……) 4、牛逼哄哄的 IDEA编程利器技巧(编写中……) 5、面经吐血整理的 面试技…...
linux网络编程7——协程设计原理与汇编实现
文章目录 协程设计原理与汇编实现1. 协程概念2. 协程的实现2.1 setjmp2.2 ucontext2.3 汇编实现2.4 优缺点2.5 实现协程原语2.5.1 create()2.5.2 yield()2.5.3 resume()2.5.4 exit()2.5.5 switch()2.5.6 sleep() 2.6 协程调度器 3. 利用hook使用协程版本的库函数学习参考 协程设…...

Ubuntu22.04版本左右,扩充用户可使用内存
1 取得root权限后,输入命令 lsblk 查看所有磁盘和分区,找到想要替换用户可使用文件夹内存的磁盘和分区。若没有进行分区,并转为所需要的分区数据类型,先进行分区与格式化,过程自行查阅。 扩充替换过程,例如…...

基于ArcMap中Python 批量处理栅格数据(以按掩膜提取为例)
注:图片来源于公众号,公众号也是我自己的。 ArcMap中的python编辑器是很多本科生使用ArcMap时容易忽略的一个工具,本人最近正在读一本书《ArcGIS Python 编程基础与应用》,在此和大家分享、交流一些相关的知识。 这篇文章主要分享…...
【flink】之集成mybatis对mysql进行读写
背景: 在现代大数据应用中,数据的高效处理和存储是核心需求之一。Flink作为一款强大的流处理框架,能够处理大规模的实时数据流,提供丰富的数据处理功能,如窗口操作、连接操作、聚合操作等。而MyBatis则是一款优秀的持…...
Java设计模式—观察者模式详解
引言 模式角色 UML图 示例代码 应用场景 优点 缺点 结论 引言 观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知…...

【Cri-Dockerd】安装cri-dockerd
cri-dockerd的作用: 在k8s1.24之前。k8s会通过dockershim来调用docker进行容器运行时containerd,并且会自动安装dockershim,但是从1.24版本之前k8s为了降低容器运行时的调用的复杂度和效率,直接调用containerd了,并且…...

GCC及GDB的使用
参考视频及博客 https://www.bilibili.com/video/BV1EK411g7Li/?spm_id_from333.999.0.0&vd_sourceb3723521e243814388688d813c9d475f https://www.bilibili.com/video/BV1ei4y1V758/?buvidXU932919AEC08339E30CE57D39A2BABF6A44F&from_spmidsearch.search-result.0…...

大数据新视界 -- 大数据大厂之大数据重塑影视娱乐产业的未来(4 - 3)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

数据结构——基础知识补充
1.队列 1.普通队列 queue.Queue 是 Python 标准库 queue 模块中的一个类,适用于多线程环境。它实现了线程安全的 FIFO(先进先出)队列。 2.双端队列 双端队列(Deque,Double-Ended Queue)是一种具有队列和…...
只有.git文件夹时如何恢复项目
有时候误删文件但由于.git是隐藏文件夹而幸存,或者项目太大,单单甩给你一个.git文件夹让你自己恢复整个项目,该怎么办呢? 不用担心,只要进行以下步骤,即可把原项目重新搭建起来: 创建一个文件…...
anchor、anchor box、bounding box之间关系
最近学YOLO接触到这些概念,一下子有点蒙,简单总结一下。 anchor和anchor box Anchor:表示一组预定义的尺寸比例,用来代表常见物体的宽高比。可以把它看成是一个模板或规格,定义了物体框的“形状”和“比例”ÿ…...

代码随想录算法训练营第三十天 | 452.用最少数量的箭引爆气球 435.无重叠区间 763.划分字母区间
LeetCode 452.用最少数量的箭引爆气球: 文章链接 题目链接:452.用最少数量的箭引爆气球 思路: 气球的区间有重叠部分,只要弓箭从重叠部分射出来,那么就能减少所使用的弓箭数 **局部最优:**只要有重叠部分…...

海亮科技亮相第84届中国教装展 尽显生于校园 长于校园教育基因
10月25日,第84届中国教育装备展示会(以下简称“教装展”)在昆明滇池国际会展中心开幕。作为国内教育装备领域规模最大、影响最广的专业展会,本届教装展以“数字赋能教育,创新引领未来”为主题,为教育领域新…...
C语言数据结构学习:栈
C语言 数据结构学习 汇总入口: C语言数据结构学习:[汇总] 1. 栈 栈,实际上是一种特殊的线性表。这里使用的是链表栈,链表栈的博客:C语言数据结构学习:单链表 2. 栈的特点 只能在一端进行存取操作&#x…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...
webpack面试题
面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...