ChatGPT技术原理解析:从RL之PPO算法、RLHF到GPT-N、instructGPT

news/2024/5/19 0:32:01 标签: gpt-3, PPO算法, 强化学习, instructGPT

写在最前面,23年2.27日起,我个人和十来位博士朋友精读100篇ChatGPT相关技术的论文(每天一篇,100天读完100篇,这100篇的论文清单附在本文最后),过程中几乎每天都会不断优化本文,优化记录见本文文末的“后记”中..


前言

自从我那篇Transformer通俗笔记一经发布,然后就不断改、不断找人寻求反馈、不断改,其中一位朋友倪老师(之前我司NLP高级班学员现课程助教老师之一)在谬赞Transformer笔记无懈可击的同时,给我建议到,“后面估计可以尝试尝试在BERT的基础上,讲一讲prompt学习了”

再然后,当我还在各种改Transformer笔记的时候,12月初突然出来了一个ChatGPT刷爆朋友圈,即便很多之前不接触AI的朋友也在问ChatGPT这种类似聊天机器人却远胜一般聊天机器人各种问题(上一次出现这种盛况的还是16年的AlphaGo)。

据我观察,大家问ChatGPT的问题千奇百怪

  • 有的让他算经典的鸡兔同笼问题(一个笼子里装有鸡和兔子,数头的话一共35个头,数脚的话一共94只脚,问笼中分别有多少只鸡和兔子),且也能在和人类自然而流畅的互动中举一反三
  • 有的让其根据要求排查代码bug
    要知道此前debug想寻求帮助要么问人(问熟人用社交软件,问陌生人则类似那种问答网站,持续问一般得付费,毕竟没人乐意持续免费答疑大量技术难题)
    要么Google搜有没人遇到类似的问题(但别人遇到的问题很难与你的百分百一致)
    要么用Codex这类代码软件,但在和人类的互动交互上,还不是那么善解人意

所以ChatGPT就相当于你写代码或各类问题的私人顾问,而这个私人顾问能瞬间、精准理解你的意图,不会让你像用以前那种聊天机器人经常觉得智障甚至对牛弹琴,加之其背后依托的是人类级百科全书式的资料库,所以有人惊呼:ChatGPT会不会替代Google这类搜索引擎。

虽然大部分技术者对待ChatGPT还是比较冷静的,毕竟它给的答案不像权威技术专家那样具备足够的公信力,也不像Google给出来源从而不能比较好的验证其正确程度,但最近遇到的几件事改变了我的一些看法

  1. 这两天我刷到一条新闻:微软欲用 ChatGPT 扶必应“上位”,对抗 Google,导致即便很多技术从业者也不一定淡定了
  2. ChatGPT直接让其所在的公司OpenAI估值翻倍,而我司七月在线的最新一期NLP大课,NLP11也加入了ChatGPT的原理解析
  3. 目前关于ChatGPT中文的资料里,真正能让人一看就懂的非常非常少,当少数文章具备比较好的可读性之后,你又会发现一旦涉及算法细节就千篇一律的泛泛而谈,如果不是泛泛而谈的,则更多堆砌概念和公式
    总之中文资料里,可能因为instructGPT/ChatGPT刚出来不久的缘故,兼顾可读性和细节性的文章少的可怜

考虑到ChatGPT非一蹴而就,而是经过了各个前置技术的发展、迭代、结合而成,故逐一阐述

  • 2017年之前早已有之的一些数学/AI/RL等基础技术,比如微积分、概率统计、最优化、策略梯度、TRPO算法(2015年提出)
  • 2017年6月OpenAI联合DeepMind首次正式提出的RLHF,试图解决的问题是,在奖励函数不够明确的情况下,通过基于人类对事物比较的偏好而非绝对奖励值训练奖励函数,最后通过TRPO算法迭代策略
  • 2017年7月的OpenAI团队提出的对TRPO算法的改进:PPO算法

关于RL所需的微积分/概率统计基础修订在了《概率统计极简入门:通俗理解微积分/期望方差/正态分布前世今生(23修订版)》

关于RL所需的最优化基础修订在了《一文通透优化算法:从梯度下降、SGD到牛顿法、共轭梯度(23修订版)》

关于RL、策略梯度、TRPO、PPO则写在了此文《强化学习极简入门:通俗理解MDP、DP MC TC和值函数、策略梯度、PPO》
且在这篇RL极简入门笔记之前,99%的文章都不会把PPO算法从头推到尾,该文把PPO从零推到尾,按照“RL-策略梯度-重要性采样(重要性权重)-增加基线(避免奖励总为正)-TRPO(加进KL散度约束)-PPO(解决TRPO计算量大的问题)”的顺序逐步介绍每一步推导

  • 2017年6月的Transformer/Self-Attention
    关于transformer/self-attention,除了本文,更可以看下上篇《Transformer通俗笔记:从Word2Vec、Seq2Seq逐步理解到GPT、BERT》
     
  • 2018年6月的GPT(Generative Pre-trained Transformer),其关键构成是基于Transformer-Decoder的Masked Self-Attention
  • 2019年2月的融合prompt learning的GPT2,prompt learning的意义在于小样本也能出大效果
    关于prompt learning,本文后续会进一步完善
  • 2020年5月的GPT3,参数规模到了1750亿,且你可能没想到的是,这一年的9月份OpenAI已经开始研究GPT3与RLHF的结合了,且此时用的策略优化方法为PPO
     
  • 2021年7月的Codex,通过对GPT3进行大量的代码训练迭代而出Codex,从而具备代码/推理能力
  • 2021年9月Google提出的FLAN大模型:基于指令微调技术Instruction Fine-Tuning (IFT)
  • 2022年1月的Google研究者提出的思维链技术(Chain of Thought,简称CoT)
     
  • 2022年3月的OpenAI正式发布instructGPT:GPT3 + 指令学习 + RLHF + PPO,其中,遵循人类指令的学习instruction learning,和prompt learning的核心区别在于instruction learning会提供更多的指令引导模型输出更符合预期的结果,例如
    提示学习:给女朋友买了这个项链,她很喜欢,这个项链太____了
    指令学习:判断这句话的情感:给女朋友买了这个项链,她很喜欢。选项:A=好;B=一般;C=差
    你也可以暂简单理解instruction learning为带人类指令的prompting(且与instruction tuning或IFT意思接近)
  • 2021年第4季度逐步发展而来的GPT3.5,并于22年不断融合Codex、InstructGPT等技术能力
  • 2022年11月的ChatGPT:语言模型层面的核心架构是GPT3.5(基于Transformer-Decoder的Masked Self-Attention且融合了Codex的代码/推理能力、instruction learning等技术) + RLHF + PPO

如你所见,自从1.6日开始写ChatGPT笔记,1.15日发布本文,但为把ChatGPT背后所涉及的关键技术阐述细致、透彻,故本文越写越长,长到最后成了一个系列,有的内容抽离出去独立成文,有的还在不断完善

第一部分 从RL、策略梯度到TRPO、PPO算法、RLHF

再次强调说明下,本第一部分在23年2.10日有个重要修改

  • 2.10日之前,考虑到本文的主旨核心ChatGPT用到了RLHF和PPO,所以本文的第一部分从强化学习讲到PPO算法,毕竟虽然只是想重点介绍下PPO,但写到最后还是把PPO所有相关的前置知识都细致介绍了个遍,不然,总感觉有细节没交待而不够透彻
  • 2.10日之后,又考虑到有些朋友可能对RL细节有所了解,或者更多希望整体了解ChatGPT整体架构而暂不细究其所用的策略迭代算法PPO的前置技术、RL细节

综上,为兼顾两者,且加之为避免本文篇幅过长而影响完读率,故把下面原先第一部分的大部分内容抽取出来放到了新一篇RL笔记里进一步细致阐述:强化学习极简入门:通俗理解MDP、DP MC TC和Q学习、策略梯度、PPO

第一部分 RL基础:什么是RL与MRP、MDP
1.1 入门强化学习所需掌握的基本概念

  • 1.1.1 什么是强化学习:依据策略执行动作-感知状态-得到奖励
  • 1.1.2 RL与监督学习的区别和RL方法的分类

1.2 什么是马尔科夫决策过程

  • 1.2.1 MDP的前置知识:随机过程、马尔可夫过程、马尔可夫奖励
  • 1.2.2 马尔可夫决策过程(MDP):马尔可夫奖励(MRP) + 智能体动作因素

第二部分 RL进阶之三大表格求解法:DP、MC、TD
2.1 动态规划法

  • 2.1.1 什么是动态规划
  • 2.1.2 通过动态规划法求解最优策略

2.2 蒙特卡洛法
2.3 时序差分法及与DP、MC的区别


第三部分 价值学习:从n步Sarsa算法到Q-learning、DQN
3.1 TD(0)控制/Sarsa(0)算法与TD(n)控制/n步Sarsa算法
3.2 Q-learning

  • 3.2.1 重要性采样:让同策略完成到异策略的转变
  • 3.2.2 Sarsa算法与Q-learning更新规则的对比

3.3 DQN


第四部分 策略学习:从策略梯度、Actor-Criti到TRPO、PPO算法
4.1 策略梯度与其突出问题:采样效率低下

  • 4.1.1 什么是策略梯度和梯度计算/更新的流程
  • 4.1.2 避免采样的数据仅能用一次:重要性采样(为采样q解决p从而增加重要性权重)

4.2 优势演员-评论家算法(Advantage Actor-Criti):为避免奖励总为正增加基线
4.3 基于信任区域的TRPO:加进KL散度解决两个分布相差大或步长难以确定的问题

1.4 近端策略优化PPO:解决TRPO的计算量大的问题

如上所述,PPO算法是针对TRPO计算量的大的问题提出来的,正因为PPO基于TRPO的基础上改进,故PPO也解决了策略梯度不好确定学习率Learning rate (或步长Step size) 的问题

毕竟通过上文,我们已经得知

  1. 如果 step size 过大, 学出来的 Policy 会一直乱动,不会收敛;但如果 Step Size 太小,想完成训练,我们会等到地老天荒
  2. 而PPO 利用 New Policy 和 Old Policy 的比例,限制了 New Policy 的更新幅度,让策略梯度对稍微大点的 Step size 不那么敏感

具体做法是,PPO算法有两个主要的变种:近端策略优化惩罚(PPO-penalty)和近端策略优化裁剪(PPO-clip),其中PPO-penalty和TRPO一样也用上了KL散度约束。

近端策略优化惩罚PPO-penalty的流程如下

  1. 首先,明确目标函数,咱们需要优化gif.latex?J%5E%7B%5Ctheta%5E%7B%5Cprime%7D%7D%28%5Ctheta%29,让其最大化

    J^{\theta^{\prime}}(\theta)=\mathbb{E}_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{p_{\theta}\left(a_{t} \mid s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} \mid s_{t}\right)} A^{\theta^{\prime}}\left(s_{t}, a_{t}\right)\right]

    『注:如果你想仔细抠接下来各种公式但一上来就被上面这个弄迷糊了,说明还是需要先看下上文说过的这篇RL极简入门,而一旦踏入RL,便得做好两万五千里的准备,当然,如果只是想了解ChatGPT背后大概的技术原理,可以不用细抠PPO的公式怎么来的,不影响你对ChatGPT整体架构的理解,且下文会讲其在ChatGPT中是如何运用的』

  2. 接下来,先初始化一个策略的参数\theta,在每一个迭代里面,我们用前一个训练的迭代得到的actor的参数\theta '与环境交互,采样到大量状态-动作对, 根据\theta '交互的结果,估测A^{\theta '}(s_t,a_t)

  3. 由于目标函数牵涉到重要性采样,而在做重要性采样的时候,gif.latex?p_%7B%5Ctheta%7D%5Cleft%28a_%7Bt%7D%20%7C%20s_%7Bt%7D%5Cright%29不能与gif.latex?p_%7B%5Ctheta%27%7D%5Cleft%28a_%7Bt%7D%20%7C%20s_%7Bt%7D%5Cright%29相差太多,所以需要在训练的时候加个约束,这个约束就好像正则化的项一样,是 gif.latex?%5Ctheta与 gif.latex?%5Ctheta%27输出动作的 KL散度,用于衡量 gif.latex?%5Ctheta 与 gif.latex?%5Ctheta%27 的相似程度,我们希望在训练的过程中,学习出的 gif.latex?%5Ctheta 与 gif.latex?%5Ctheta%27 越相似越好
    所以需要最后使用 PPO 的优化公式:\\J_{\mathrm{PPO}}^{\theta^{\prime}}(\theta)=J^{\theta^{\prime}}(\theta)-\beta \mathrm{KL}\left(\theta, \theta^{\prime}\right)


    当然,也可以把上述那两个公式合二为一『如此可以更直观的看出,PPO-penalty把KL散度约束作为惩罚项放在了目标函数中(可用梯度上升的方法去最大化它),此举相对TRPO减少了计算量』

    gif.latex?%5Cbegin%7Baligned%7D%20%26J_%7B%5Cmathrm%7BPPO%7D%7D%5E%7B%5Ctheta%5E%7B%5Cprime%7D%7D%28%5Ctheta%29%3D%5Cmathbb%7BE%7D_%7B%5Cleft%28s_%7Bt%7D%2C%20a_%7Bt%7D%5Cright%29%20%5Csim%20%5Cpi_%7B%5Ctheta%5E%7B%5Cprime%7D%7D%7D%5Cleft%5B%5Cfrac%7Bp_%7B%5Ctheta%7D%5Cleft%28a_%7Bt%7D%20%5Cmid%20s_%7Bt%7D%5Cright%29%7D%7Bp_%7B%5Ctheta%5E%7B%5Cprime%7D%7D%5Cleft%28a_%7Bt%7D%20%5Cmid%20s_%7Bt%7D%5Cright%29%7D%20A%5E%7B%5Ctheta%5E%7B%5Cprime%7D%7D%5Cleft%28s_%7Bt%7D%2C%20a_%7Bt%7D%5Cright%29%5Cright%5D%20%5Cend%7Baligned%7D%20-%5Cbeta%20%5Cmathrm%7BKL%7D%5Cleft%28%5Ctheta%2C%20%5Ctheta%5E%7B%5Cprime%7D%5Cright%29

上述流程有一个细节并没有讲到,即gif.latex?%5Cbeta是怎么取值的呢,事实上,gif.latex?%5Cbeta是可以动态调整的,故称之为自适应KL惩罚(adaptive KL penalty),具体而言

  • 先设一个可以接受的 KL 散度的最大值KL_{max}
    假设优化完\\J_{\mathrm{PPO}}^{\theta^{\prime}}(\theta)=J^{\theta^{\prime}}(\theta)-\beta \mathrm{KL}\left(\theta, \theta^{\prime}\right)以后,KL 散度值太大导致\mathrm{KL}(\theta,\theta')>\mathrm{KL}_{\max},意味着 gif.latex?%5Cthetagif.latex?%5Ctheta%27差距过大(即学习率/步长过大),也就代表后面惩罚的项\beta \mathrm{KL}(\theta ,\theta ')惩罚效果太弱而没有发挥作用,故增大惩罚把gif.latex?%5Cbeta增大
  • 再设一个 KL 散度的最小值KL_{min}
    如果优化完\\J_{\mathrm{PPO}}^{\theta^{\prime}}(\theta)=J^{\theta^{\prime}}(\theta)-\beta \mathrm{KL}\left(\theta, \theta^{\prime}\right)以后,KL散度值比最小值还要小导致\mathrm{KL}(\theta,\theta')< {KL}_{\min},意味着 gif.latex?%5Ctheta与 gif.latex?%5Ctheta%27 差距过小,也就代表后面这一项\beta \mathrm{KL}(\theta ,\theta ')的惩罚效果太强了,我们怕它只优化后一项,使gif.latex?%5Ctheta与 gif.latex?%5Ctheta%27 一样,这不是我们想要的,所以减小惩罚即减小gif.latex?%5Cbeta

总之,近端策略优化惩罚可表示为

\begin{aligned} &J_{\text{PPO}}^{\theta'}(\theta)=J^{\theta'}(\theta)-\beta \text{KL}\left(\theta, \theta'\right) \\ &J^{\theta'}(\theta) \approx \sum_{\left(s_{t}, a_{t}\right)} \frac{p_{\theta}\left(a_{t} \mid s_{t}\right)}{p_{\theta'}\left(a_{t} \mid s_{t}\right)} A^{\theta'}\left(s_{t}, a_{t}\right)\end{aligned}

当然,如果觉得计算 KL散度很复杂,则还有一个PPO2算法,即近端策略优化裁剪PPO-clip,详见RL极简入门一文

1.5 模仿学习(逆强化学习)思路下的RLHF:从人类反馈中学习

1.5.1 什么是模仿学习(逆强化学习)

虽然RL理论上虽不需要大量标注数据,但实际上它所需求的reward会存在缺陷:

  1. 比如游戏AI中,reward的制定非常困难,可能要制定成百上千条游戏规则,这并不比标注大量数据来得容易,又比如自动驾驶的多步决策(sequential decision)场景中,学习器很难频繁地获得reward,容易累计误差导致一些严重的事故

    d031d2873feecc4c67cf7d45ece4386e.png

  2. 再比如聊天机器人方面,不好定义什么是好的对话、什么是不好的对话,当然,对此可以收集很多人类的对话当做范例,如此,模仿学习思路下的从人来反馈中学习(对应论文为:Deep Reinforcement Learning from Human Preferences 2017,简称RLHF)应运而生
    RLHF试图解决的问题是,在奖励函数不够明确的情况下,通过基于人类对事物比较的偏好而非绝对奖励值训练奖励函数

模仿学习的思路是不让模型在人类制定的规则下自己学习,而是让模型模仿人类的行为。而逆强化学习就是模仿学习的其中一种,何谓逆强化学习呢?

  • 原来的强化学习里,有Environment和Reward Model(由奖励函数推出什么样的策略/动作是最好的),但逆强化学习没有奖励函数,只有一些人类/专家的示范,怎么办呢
  • 可以通过人类标注数据训练得到Reward Model(相当于有了人类标注数据,则相信它是不错的,然后反推人类因为什么样的奖励函数才会采取这些行为)
  • 有了奖励函数之后,就可以使用一般的强化学习的方法去找出最优策略/动作

1.5.2 RLHF:从人类反馈中学习

关于RLHF,你可能会看到有些文章说是Google DeepMind推出的,有些文章呢,说是OpenAI推出的,莫衷一是,实际上RLHF最早于2017年6月由OpenAI联合Google DeepMind一块推出,对应的论文为《Deep Reinforcement Learning from Human Preferences》

当让一个强化学习智能体探索环境并与之交互(比如Atari游戏),RLHF的核心步骤如下图所示:

  1. 首先,智能体的一对1-2秒的行为片段定期地回馈给人类操作员,人类基于偏好对智能体的行为作出某种偏好性的选择评判
  2. 接着,人类这种基于偏好的选择评判被预测器(reward predictor)来预测奖励函数
  3. 智能体通过预测器预测出的奖励函数作出更优的行为(毕竟智能体要最大化奖励嘛)

再之后,OpenAI团队通过下述两篇论文进一步阐述了RLHF

  • Fine-Tuning Language Models from Human Preferences (Zieglar et al. 2019)
    在Reward model的训练中,我们需要人的参与,human labelers给policy模型生成的文本打分,这个分数作为reward model学习的标签

    Reward mode训练好后,那么在训练policy model时,Reward model便可以完全取代human labeler打分,分数作为信号传给policy model,再利用OpenAI默认的策略优化算法PPO来训练

  • Learning to summarize with human feedback (Stiennon et al., 2020)
    如你所见,OpenAI团队在2020年9月的这篇论文里就已经提出了类似instructGPT/ChatGPT的训练模式:

    1 根据人工标注数据微调监督模型
    所谓微调,即指当我们预训练出一个语言模型后,为了更好的让它完成咱们手头上的任务,会通过一定的样例/样本对该模型的参数做一定的调整或适配
    2 训练一个奖励函数(下文会详述reward的这个损失函数,这里暂且做个粗略理解,即相当于reward不再是人直接给了,而是用高质量标注训练一个好的reward模型)

    loss(r_\theta) = -E_{(x,y_0,y_1,i)\sim D}[log( \sigma (r_\theta(x, y_i) - r_\theta(x, y_{1-i}))]

    3 有了reward,接下来便可以通过PPO优化原始监督模型的策略(下文也会详细阐述这个公式)

    R(x, y) = r_\theta (x, y) - \beta log\left [ \pi _{\phi}^{RL}(y|x)/\pi _{}^{SFT}(y|x) \right ]

再之后?再之后经过后续一系列的工作,最终OpenAI于2022年3月份通过这篇论文《Training language models to follow instructions with human feedback》提出了ChatGPT的前身——InstructGPT(下文详述),发现没有,没有一个好的工作是一蹴而就的

第二部分 从GPT/GPT2到GPT3:微调到prompt学习的过渡

2.1 GPT:基于Transformer Decoder预训练 + 微调/Finetune

NLP自发展以来,先后经历了4种任务处理范式

  1. 第一种范式,非神经网络时代的完全监督学习(Fully Supervised Learning, Non-Neural Network)
    具体而言,即手工设计一系列特征模板,来输入模型。模型对任务的处理结果高度依赖于特征模板的设计,同时也高度依赖领域专家的知识。举个例子,比如对于条件随机场CRF模型,业界甚至有一个专门的库CRF++帮助自动生成大量的随机模板然后输入模型进行训练,从而避免对领域专家的过度依赖
  2. 第二范式,基于神经网络的完全监督学习(Fully Supervised Learning, Neural Network)
    神经网络学派开始流行以后,处理范式基本基本是预训练后的词嵌入表征 + 模型架构的调整,在这个时期,一方面的工作在词嵌入上,比如NNLM/CBOW/SKIP/GRAM/GLOVE/ELMO等,另一方面的工作则在模型架构上,比如BI-LSTM/SEQ2SEQ架构在神经机器翻译领域NMT的应用等
  3. 第三范式,预训练-微调范式 (Pre-train、Fine-tune)
    相比于第二范式而言,第三范式的优点在于更进一步减少了人工的参与,不再需要对于每个任务采取不同的模型架构,而是在超大的文本数据集上预训练一个具备泛化能力的通用的模型,然后再根据下游任务本身的特点对模型进行针对性的微调即可,比如GPT1模型
  4. 第四范式,预训练、提示、预测范式(Pre-train、Prompt、Predict)
    在这个过程我们往往不对预训练语言模型改动太多,我们希望是通过对合适prompt的利用将下游任务建模的方式重新定义,这则是GPT2、GPT3的特点

2.1.1 GPT = Multi-Head Attention层 + Feed forward层 + 求和与归一化的前置LN层 + 残差

在上一篇Transformer笔记中,我们已经了解到:GPT是“Generative Pre-Training”的简称,从名字看其含义是指的生成式的预训练。它和BERT都是预训练-微调模式的典型代表,第二阶段之所以叫微调是因为在这个阶段用的数据量远远小于第一阶段,并且基本没有更改模型架构和引入过多新的参数

由于Decoder具备文本生成能力,故作为侧重生成式任务的GPT选择了Transformer Decoder部分作为核心架构

61a6cc2a71dd2e3b126ff058cd5d045e.png

不过,与原始的Transformer Decoder相比,GPT所用的结构删除了Encoder-Decoder Attention,只保留了多头注意力层Multi-Head Attention层和前馈神经网络Feed forward层,最后再加上求和与归一化的前置LN层 + 残差,其中的关键便是这个Masked Self-Attention

2.1.2 什么是Self-Attention与Masked Self-Attention

所谓自注意力,即指当我们需要用到自注意力编码单词X_1,X_2,X_3,X_4的时候,会按下面几个步骤依次处理(配图来自此文)

  1. 为每个单词路径创建Query、Key、Value,具体做法就是每个单词的表示向量和对应的权重矩阵(W^Q,W^K,W^V)做矩阵乘法

  2. 对于每个输入token,使用其Query向量对其他所有的token的Key向量进行评分,获得注意力分数,比如通过X_1q_1向量,分别与X_1,X_2,X_3,X_4k_1,k_2,k_3,k_4向量分别做点乘,最终得到X_1在各个单词X_1,X_2,X_3,X_4上的注意力分数:20% 10% 50% 20%

  3. 将Value向量乘以上一步得到的注意力分数(相当于对当下单词而言,不同单词重要性的权重),之后加起来,从而获得所有token的加权和

之后对每个token都进行上述同样的三步操作,最终会得到每个token新的表示向量,新向量中包含该token的上下文信息,之后再将这些数据传给Transformer组件的下一个子层:前馈神经网络

至于所谓Masked Self-Attention就是在处理当前词的时候看不到后面的词。举个例子,处理“it”的时候,注意力机制看不到“it”后面的词,但会关注到“it”前面词中的“a robot”,继而注意力会计算三个词“it”、“a”、“robot”的向量及其attention分数的加权和

更多细节可以看下上篇BERT笔记(特别是此前还不了解Transformer的),或此文:图解注意力机制

2.2 GPT2承1启3:基于prompt尝试舍弃微调 直接Zero-shot Learning

虽然GPT1的预训练加微调的范式仅需要少量的微调和些许的架构改动,但能不能有一种模型完全不需要对下游任务进行适配就可以表现优异?GPT2便是在往这个方向努力:不微调但给模型一定的参考样例以帮助模型推断如何根据任务输入生成相应的任务输出

最终,针对小样本/零样本的N-shot Learning应运而生,分为如下三种

  • Zero-shot Learning (零样本学习),是指在没有任何训练样本进行微调的情况下,让预训练语言模型完成特定任务
    相当于不再使用二阶段训练模式(预训练+微调),而是彻底放弃了微调阶段,仅通过大规模多领域的数据预训练,让模型在Zero-shot Learming的设置下自己学会解决多任务的问题,而且效果还不错(虽然GPT2通过Zero-shot Learming在有些任务的表现上尚且还不如SOTA模型,但基本超越了一些简单模型,说明潜力巨大),你说神不神奇?

    这就好比以前我们刚开始学解题时,听老师讲了一系列知识和方法之后,老师为了让我们更好的解题,在正式答题考试之前,会先通过几个样题让我们找找感觉,方便在样题中微调或修正对所学知识/方法的理解,Zero-shot Learming则相当于没有练手/预热、没有参考样例/演示/范本,学完知识/方法之后直接答题!
  • One shot Learning (单样本学习),顾名思义,是指在只有一个样本/示例的情况下,预训练语言模型完成特定任务
  • Few-shot Learning (少样本或小样本学习),类似的,是指在只有少量样本/示例的情况下,预训练语言模型完成特定任务

此外,只需将自然语言的任务示例和提示信息作为上下文输入给GPT-2,它就可以在小样本的情况下执行任何NLP任务,包括所谓的完形填空任务,比如

假如我要判断“我喜欢这个电影" 这句话的情感(“正面" 或者 "负面"),原有的任务形式是把他看成一个分类问题

输入:我喜欢这个电影

输出:“正面" 或者 "负面"

而如果用GPT2去解决的话,任务可以变成“完形填空",

输入:我喜欢这个电影,整体上来看,这是一个 __ 的电影

输出:“有趣的" 或者 "无聊的"

加的这句提示“整体上来看,这是一个 __ 的电影”对于让模型输出人类期望的输出有很大的帮助。

这个所谓的提示用NLP的术语表达就是prompt,即给预训练语言模型的一个线索/提示,帮助它可以更好的理解人类的问题
例如有人忘记了某篇古诗,我们给予特定的提示,他就可以想起来,例如当有人说:

白日依山尽

大家自然而然地会想起来下一句诗:黄河入海流

亦或者,搜索引擎,可以根据我们的输入,进行输出的提示:

2.3 GPT3:In-context learning正式开启prompt新范式(小样本学习)

2.3.1 GPT3在0样本、单样本、小样本下的突出能力

GPT3简单来说,就是规模大、有钱多金、效果出奇好,具体而言,它的参数规模达到了1750亿,并且使用45TB数据进行训练,其预训练任务就是“句子接龙”,给定前文持续预测下一个字,而且只要有少量的文本数据就能作为模型的训练数据,而且更为关键的是,在小样本的情况下,其性能表现一度超越SOTA模型

为形象描述,举一个GPT3在0样本、单样本、少量样本下的机器翻译使用范例,如下图

b74c354d63fc4bb1bd8fa73b87739185.png

  • 图中右侧是普通模型微调的过程,模型通过大量训练预料进行训练,然后基于特定的任务数据进行梯度迭代更新(gradient update),训练至收敛后的模型才具备良好的翻译能力
  • 图中左侧是GPT3分别在0样本(只给出任务描述)、单样本(只给出任务描述+一个翻译样本)、小样本(给出任务描述+少量样本)的情况下所展示出的能力
    一方面,是小样本的情况下,也远少于微调过程所需要的训练数据,说白了,就是在同等训练数据下,GPT的性能远高于微调模式的SOTA模型
    二方面,人们一度惊讶于其在0样本下如此强大的学习能力,使得很多人去研究背后的n Context Learning

    毕竟,如张俊林老师所说,我们知道普通模型微调的原理:拿这些例子当作训练数据,利用反向传播去修正LLM的模型参数,而修正模型参数这个动作,确实体现了LLM从这些例子学习的过程
    但是,In Context Learning只是拿出例子让LLM看了一眼,并没有根据例子,用反向传播去修正LLM模型参数的动作,就要求它去预测新例子,但既然没有修正模型参数,这意味着貌似LLM并未经历一个学习过程,如果没有经历学习过程,那它为何能够做到仅看一眼,就能预测对新例子呢

2.3.2 In Context Learning(ICL)背后的玄机:隐性微调?

试图证明In Context Learning没有从例子中学习的工作是“Rethinking the Role of Demonstrations: What Makes In-Context Learning Work?”。它发现了:

  1. 在提供给LLM的样本示例<x_i,y_i>中,y_i是否是x_i对应的正确答案其实并不重要,如果我们把正确答案y_i替换成随机的另外一个答案 y_j,这并不影响In Context Learning的效果

    比如下图中,无论是分类任务(图中上部分),还是多项选择任务(图中下部分),随机标注设置下(红)模型表现均和正确标注(黄)表现相当,且明显超过没有in-context样本的zero-shot设置(蓝)

    这起码说明了一点:In Context Learning并没有提供给LLM那个从x映射到 y 的映射函数信息:y=f(x),否则的话你乱换正确标签,肯定会扰乱这个 y=f(x)映射函数,也就是说,In Context Learning并未学习这个输入空间到输出空间的映射过程
  2. 真正对In Context Learning影响比较大的是:xy的分布,也就是输入文本 x 的分布和候选答案 y 有哪些,如果你改变这两个分布,比如把 y 替换成候选答案之外的内容,则In Context Learning效果急剧下降
    总之,这个工作证明了In Context Learning并未学习映射函数,但是输入和输出的分布很重要,这两个不能乱改

有些工作认为LLM还是从给出的示例学习了这个映射函数y=f(x),不过是种隐式地学习

  • 比如“What learning algorithm is in-context learning? Investigations with linear models”认为Transformer能够隐式地从示例中学习 xy 的映射过程,它的激活函数中包含了一些简单映射函数,而LLM通过示例能够激发对应的那一个
  • 而“Why Can GPT Learn In-Context? Language Models Secretly Perform Gradient Descent as Meta-Optimizers”这篇文章则将ICL看作是一种隐式的Fine-tuning

总而言之,目前这还是一个未解之谜

2.4 Prompt技术的升级与创新:指令微调技术(IFT)与思维链技术(CoT)

2.4.2 Google提出FLAN大模型:基于指令微调技术Instruction Fine-Tuning (IFT)

2021年,谷歌的研究者们在此篇论文中《Finetuned Language Models Are Zero-Shot Learners》提出了FLAN大模型,其基于Instruction Fine-Tuning(指令微调,简称IFT)的方式,极大地提升了大语言模型的理解能力,达到的效果就是:遵循人类指令,举一反三地完成任务

IFT的数据通常是由人工手写指令和语言模型引导的指令实例的集合,这些指令数据由三个主要组成部分组成:指令、输入和输出,对于给定的指令,可以有多个输入和输出实例

相比于GPT-3,且区别在于Finetune,FLAN的核心思想是,当面对给定的任务A时,首先将模型在大量的其他不同类型的任务比如B、C、D...上进行微调,微调的方式是将任务的指令与数据进行拼接(可以理解为一种Prompt),随后给出任务A的指令,直接进行推断,如下图所示

例如,我们的最终目标是推理任务

  1. FLAN首先讲语言模型在其他任务上进行微调,包括给定任务指令的翻译、常识推理、情感分类等
    在面对翻译任务时可以给出指令“请把这句话翻译成西班牙语”
    在面对常识推理任务时可以给出指令“请预测下面可能发生的情况”
  2. 而当模型根据这些“指令”完成了微调阶段的各种任务后(将指令拼接在微调数据的前面),在面对从未见过的最终需要的自然语言推理任务的指令“这段话能从假设中推导出来吗?” 时,就能更好地调动出已有的知识回答问题

2.4.1 基于思维链(Chain-of-thought)技术下的prompt

为让大语言模型进一步具备解决数学推理问题的能力,22年1月,谷歌大脑团队的Jason Wei、Xuezhi Wang等人提出了最新的Prompting机制——Chain of Thought(简称CoT),简言之就是给模型推理步骤的prompt,让其学习人类如何一步步思考/推理,从而让模型具备基本的推理能力,最终可以求解一些简单甚至相对复杂的数学推理能力

以下是一个示例(下图左侧为standard prompting,下图右侧为基于Cot的prompt,高亮部分为chain-of-thought),模型在引入基于Cot技术的prompt的引导下,一步一步算出了正确答案,有没有一种眼前一亮的感觉?相当于模型具备了逻辑推理能力

那效果如何呢,作者对比了标准prompting、基于Cot技术的prompting分别在这三个大语言模型LaMDA、GPT、PaLM(除了GPT由openAI发布,另外两个均由Google发布)上的测试结果,测试发现:具有540B参数的PaLM模型可以在一个代表小学水平的数学推理问题集GSM8K(GSM8K最初由OpenAI于2021年10月提出)上的准确率达到了60.1%左右

很快,这项技术引起了很多人的关注,比如不论是few-shot还是zero-shot,在加入Cot技术之后,都能回答此前不能回答的某些数学推理问题,甚至出现了风靡一时的“let's think step by step”的梗(通过该条语句可以激发模型的推理能力)

2.5 GPT3到GPT3.5:从instructGPT到ChatGPT的迭代过程

据OpenAI官网对GPT3.5的介绍,GPT3.5从2021年第四季度开始就混合使用文本和代码进行训练,我们来看下GPT3.5的各个系列模型及其各自的发展演变脉络图

基于GPT3的发展路线:一条是侧重代码/推理的Codex,一条侧重理解人类的instructGPT

  • 第一条线:为了具备代码/推理能力:GPT3 + 代码训练 = Codex
    2020 年5-6月,OpenAI先后发布了
    GPT3的论文《Language Models are Few-Shot Learners》
    GPT-3的最大规模的版本——175B(1750亿参数)大小的API Davinci(有着2048个词的上下文窗口),此时的GPT3还只能写一些简单的代码和做一些简单的数学题

    2021 年7月,OpenAI发布Codex的论文《Evaluating Large Language Models Trained on Code》,其中初始的Codex是根据120亿参数的GPT-3变体进行微调的,且通过对159GB的Python代码进行代码训练
    后来这个120 亿参数的模型演变成OpenAI API中的code-cushman-001,且大众意外的发现,它具备较强的代码/推理能力

    代码能力好理解,通过大量的代码训练,但其推理能力是如何获取到的呢,其中关键在于很多代码是为了解决数学推理问题,训练中可以用『类似后续22年年初Google一些研究者定义的CoT技术』获取推理能力,当然,此时文本上的能力尚且偏弱
  • 第二条线:为了更好理解人类:GPT3 + 指令学习 + RLHF = instructGPT
    上文第一部分已经提到过,根据OpenAI的这篇论文《Learning to summarize with human feedback (Stiennon et al., 2020)》可知,2020年openAI便再研究GPT3与RLHF的结合了,但此时还是会经常一本正经的胡说八道,且很容易输出负面甚至带有危害的内容(毕竟人类言论中存在不少不友好的言论)

    在OpenAI于2021年彻底加强Codex之后,终于有时间解决模型与人类对话的问题了,于是在2022年3月,OpenAI发布遵循人类指令学习的论文(指令学习可以认为就是指令微调instruct tuning):Training language models to follow instructions with human feedback,这就是instructGPT,且把RLHF用得更好了
    其核心API就是instruct-davinci-beta和text-davinci-001(当然,文本上的能力不错但代码/推理上的能力偏弱)

基于GPT3.5的发展路线:增强代码/推理能力且更懂人类终于迭代出ChatGPT

  • 首先,融合代码/推理与理解人类的能力,且基于code-cushman-002迭代出text-davinci-002
    2022年4月至7月,OpenAI开始对code-davinci-002(有着8192个词的上下文窗口)模型进行Beta测试,也称其为Codex(当配备完善的思维链时,其在GSM8K等数学测试数据上的表现十分优异)
    2022 年5-6月发布的text-davinci-002是一个基于code-davinci-002的有监督指令微调(即在code-davinci-002基础上加入supervised instruction tuning) 模型
    在text-davinci-002上面进行指令微调很可能降低了模型的上下文学习能力,但是增强了模型的零样本能力(更懂人类)
  • 其次,为了进一步理解人类:text-davinci-002 + RLHF = text-davinci-003/ChatGPT
    text-davinci-003、ChatGPT都是基于text-davinci-002基础上改进的基于人类反馈的强化学习的指令微调模型 (instruction tuning with reinforcement learning from human feedback)

    text-davinci-003 恢复了一些在text-davinci-002中丢失的部分上下文学习能力(比如在微调的时候混入了语言建模) 并进一步改进了零样本能力(得益于RLHF,生成更加符合人类期待的反馈或者说模型与人类对齐)

    至于ChatGPT则更不用说了,其对应的API为gpt-3.5-turbo(由23年3.2日OpenAI最新发布)
    \rightarrow  代码/推理能力强大,考虑到Codex学习了大量的开源代码,由此是不也能理解为何ChatGPT具备那么强大的编码及debug能力了,且训练代码中包含不少解决数学问题的代码,加上对代码注释的学习(基于一些代码和代码描述的样式/范例使用类似CoT这样的技术学习),是不是也就能学会代码背后的推理能力呢
    \rightarrow  而且理解人类的能力前所未有

2.6 ChatGPT与InstructGPT的差别:基于GPT3还是GPT3.5微调

通过OpenAI公布的ChatGPT训练图可知,ChatGPT的训练流程与InstructGPT是一致的,差异只在于

  • InstructGPT(有1.3B 6B 175B参数的版本),是在GPT-3(原始的GPT3有1.3B 2.7B 6.7B 13B 175B等8个参数大小的版本)上做Fine-Tune
  • ChatGPT是在GPT-3.5上做Fine-Tune

第三部分 InstructGPT/ChatGPT训练三阶段及多轮对话能力

3.1 InstructGPT训练三阶段

3.1.1 ChatGPT的前身之InstructGPT:基于RLHF手段微调的GPT

根据instructGPT的原始论文可知,InstructGPT的训练分为三个阶段(总体上结合了监督学习和强化学习,先是监督学习让GPT3有一个大致的微调方向,然后用RL中的PPO算法来更新微调过的GPT3的参数):

  1. 阶段1:利用人类的问答数据去对GPT3进行有监督训练出SFT模型(作为baseline)
    首先,OpenAI是先设计了一个prompt dataset,里面有大量的提示样本,给出了各种各样的任务描述,其次,找了一个团队对这个prompt dataset进行标注(本质就是人工回答问题)

    最后,用这个13k大小的数据集(问题-答案对)比如<x_1,y_1>,<x_2,y_2>,<x_3,y_3>\cdots <x_n,y_n>微调GPT3,这个微调好的GPT3我们称之为SFT模型(监督微调,全称Supervised fine-tuning,简称SFT),它作为baseline具备了最基本的预测能力

    \rightarrow  说白了,让人类就一些问题写出人工答案,再把这些问题和答案丢给模型学习,这便是有监督训练,但人类不可能针对所有问题都写出答案给到模型(如果人类能把所有问题都标注/回答了,那还要模型干嘛,^_^)
    \rightarrow  所以我们需要让模型学到人类的喜爱偏好(训练出一个RM模型代替人类当裁判,避免让实验人员守在电脑前对模型吐出来的结果不停地打分)
    \rightarrow  继而在遵循这种喜爱偏好下生成人类期待的答案,想达到这个效果就是得让模型明确什么是更好的输出,怎么明确?通过奖惩!

  2. 阶段2:通过RLHF的思路训练一个奖励模型RM
    首先通过『移除了最后一层unembedding layer的上一阶段的SFT模型』初始化出我们的RM模型,且最后大小缩减到6B
    然后回答一个规模大小为33k的数据集的一些问题比如x_{n+1},接着针对各个模型对每个问题收集4个不同的输出从而获取4个回答<y_{n+1}^{1},y_{n+1}^{2},y_{n+1}^{3},y_{n+1}^{4}>
    接着人工对这4个回答的好坏进行标注且排序,排序的结果用来训练一个奖励模型RM,具体做法就是学习排序结果从而理解人类的偏好
    但通过人来标注/排序的结果训练出奖励模型之后怎么用呢,这就是训练阶段3要做的事情

  3. 阶段3:通过训练好的RM模型预测结果且通过PPO算法优化模型策略
    首先让第一阶段微调好的SFT模型初始化出一个PPO模型(可理解为带着RL且初始版本为SFT的模型,后续通过PPO算法迭代策略。若不了解什么是RL的务必先看下本文第一部分强调过的:RL极简入门)
    然后去回答规模大小为31k且不带人类任何标注的一些问题比如x_{n+2}
    此时不再让人工评估好坏,而是让阶段2训练好的奖励模型RM去给PPO模型的预测结果比如<y_{n+2}^{1},y_{n+2}^{2},y_{n+2}^{3},y_{n+2}^{4}>进行打分进而排序(看是否优质,比如是否迎合人类偏好)
    之后通过不断更大化奖励而优化PPO模型的生成策略(策略更好 回答更好),策略优化的过程中使用PPO算法
    最后,根据优化后的策略再次生成 \rightarrow RM再评估 \rightarrow模型再优化后再生成,如此循环进行,直到策略最优为止,更多细节下文详述

值得一提的是,上文反反复复提到策略,那怎么理解这个经常在RL中出现的“策略”呢,举几个例子

  • 类似于一个人做事如果有好的策略或方法论,他便能有更好的行为或效率,从而把事情做更好
  • 再比如一家公司如果有好的经营策略,这家公司便能有更好的经营结果,从而取得更好的业绩
  • 对于模型也是一样的,如果它有更好的生成策略,它便能给人类提供更好的回答

此外,可能有读者疑问,InstructGPT之所以使用RLHF的思路,只是为了训练奖励函数么?事实上,还有额外多方面的用途

  1. 一方面是为了尽可能地对齐(Alignment)GPT的输出与对用户友好的语言逻辑,即微调出一个用户友好型GPT
    以往的GPT训练,都是基于大量无标注的语料,这些语料通常收集自充斥大量“行话”、“黑话”的互联网中,这样训练出来的语言模型,它可能会有虚假的、恶意的或者有负面情绪等问题的输出
  2. 二方面,为了更好的理解人类的意图

因此,通过人工干预微调GPT,使其输出对用户友好(避免乱说话),且更好的和人类对话,所以,对InstructGPT的简单理解,可以是基于人类反馈的强化学习(RLHF)手段微调的GPT。

接下来,我们分别具体阐述上面的阶段2、阶段3。

3.1.2 instructGPT训练阶段2:如何对多个输出排序及如何训练RM模型

可能又有读者有疑问了,即instructGPT中,人类对模型的多个输出做个排序,为什么就能够提供监督信号,或者说在训练RM时如何怎么做到loss的梯度回传?

训练RM的核心是由人类对SFT生成的多个输出(基于同一个输入)进行排序,再用来训练RM。按照模仿学习的定义,直观上的理解可以是,RM在模仿人类对语句的排序思路,说白了,就是上文提到过的RLHF。

那么到底是如何模仿的呢,或者说如何实现梯度回传?

这里我们代入一个场景,假设你向一个六岁小孩解释什么是登陆月球或什么是RL,如下图

  1. SFT生成了ABCD四个回答语句,然后人类对照着Prompt输入(即提问)来对4个回答的好坏做出合适的排序,如D>C>A=B
  2. 为了让RM学到人类偏好(即排序),可以4个语句两两组合分别计算loss再相加取均值,即分别计算gif.latex?C_%7B4%7D%5E%7B2%7D个即6个loss,具体的loss形式如下图:

    gif.latex?%5Ctext%7Bloss%7D%28%5Ctheta%29%3D-%5Cfrac%7B1%7D%7B%20%28_%7B2%7D%5E%7BK%7D%5Ctextrm%7B%7D%29%20%7DE_%7B%28x%2Cy_w%2Cy_l%29%5Csim%20D%7D%5B%5Clog%28%5Csigma%28r_%5Ctheta%28x%2Cy_w%29-r_%5Ctheta%28x%2Cy_l%29%29%29%5D

针对这个损失函数需要逐一说明的是

  1. 这是一个常见的排序模型, r_\theta (x,y)是RM模型,其中gif.latex?x是提示Prompt输入,gif.latex?y是SFT的预测输出(比如gif.latex?y_%7Bw%7D/gif.latex?y_%7Bl%7D),从而随机生成K个输出(4\leq K \leq 9),然后针对K个输出做gif.latex?%28_%7B2%7D%5E%7BK%7D%5Ctextrm%29次比较,比如4个输出有6次比较,9个输出有36次比较,gif.latex?D是人类比较的数据集

    有一点要提下的是,RLHF中的rank就好比监督学习中的弱标注——它并不提供直接的监督信号。但通过学习简单的排序,RM可以学到人类的偏好
    为何是排序,而非直接打分呢,道理很简单,排序相比打分更容易接近客观事实,即不同的标注员,打分的偏好会有很大的差异(比如同样一段精彩的文本,有人认为可以打1.0,但有人认为只能打0.8),而这种差异就会导致出现大量的噪声样本,若改成排序,则不同标注员的排序一致性相比打分一致性就大大提升了
  2. 首先把你的问题gif.latex?x和答案gif.latex?y_%7Bw%7D放进奖励函数gif.latex?r_%7B%5Ctheta%20%7D中,再把问题gif.latex?xgif.latex?y_%7Bl%7D也放进奖励函数gif.latex?r_%7B%5Ctheta%20%7D中,然后分别输出,假定gif.latex?y_%7Bw%7D是语句组合对中相对gif.latex?y_%7Bl%7D排序更高的,所以两者一减(这里面使用的是交叉熵损失函数,奖励的差异表示一种应答比另一种应答更受人类标注者青睐的对数概率),我们希望相减的结果越大越好
  3. 最后通过Logitech函数变成一个loss函数,而因为loss函数最前面加了一个负号,相当于最大化上面第2点最后相减的结果gif.latex?r_%7B%5Ctheta%20%7D(gif.latex?x,gif.latex?y_%7Bw%7D) − gif.latex?r_%7B%5Ctheta%20%7D (gif.latex?x,y_l)等于是最小化这个loss函数

如此,通过这种形式的梯度回传,RM逐渐学会了给D这类语句以高排名甚至打出一个高分,给A、B以低排名甚至打出一个低分,从而模仿到了人类偏好。到了这一步,不妨可以这么简单理解RLHF:所谓的基于人类反馈的强化学习,某种意义上来说,就是由人类的偏好来充当reward

1b37ed859770ba388d86273e3c7c6517.png

3.1.3 instructGPT训练阶段3:如何通过PPO算法进一步优化模型的策略

简而言之,阶段3可以用下图形象化表示

78055db0e39e623f2e2b7b4efa4b3593.png

具体而言,instructGPT原始论文中的目标函数如下所示

InstructGPT这篇论文吧,对大家实在是太友好了,友好到全篇论文就只给了两个公式(奖励函数的损失函数以及上面这个目标函数),关键这两个公式都还只是简写,针对objective(\phi)这个目标函数在和交大张老师及七月在线赵、倪等老师核对之后,发现实际中真正要算的时候,需要如下展开下

\begin{aligned} objective(\phi ) &= E_{(x,y)\sim D_{\pi _{\phi }^{RL}}} [r_\theta (x,y) - \beta log(\pi _{\phi }^{RL}(y|x) / \pi ^{SFT}(y|x) )] + \gamma E_{x\sim D_{pretrain}} [log(\pi _{\phi }^{RL})] \\&= E_{(x,y)\sim D_{\pi _{ }^{SFT}}} [\frac{\pi _{\phi }^{RL}(y|x)}{\pi ^{SFT}(y|x)}r_\theta (x,y) - \beta log(\pi _{\phi }^{RL}(y|x) / \pi ^{SFT}(y|x) )] + \gamma E_{x\sim D_{pretrain}} [log(\pi _{\phi }^{RL})] \end{aligned}

为何呢?考虑到大部分文章在分析上面的目标函数时基本都是人云亦云、一带而过,故再逐一拆接下这个目标函数,分为三个部分

  1. 第一部分是gif.latex?r_%7B%5Ctheta%20%7D%28x%2Cy%29,相当于阶段2中根据人类偏好学习出来的RM模型,从而基于“最大化奖励”这个目标下不断优化策略gif.latex?%5Cpi_%7B%5Cphi%7D%5E%7BRL%7D
  2. 第二部分则是用KL散度对比RL学到的策略gif.latex?%5Cpi_%7B%5Cphi%7D%5E%7BRL%7D和原始策略gif.latex?%5Cpi%20%5E%7BSFT%7D的某种差距,一开始时,gif.latex?%5Cpi_%7B%5Cphi%7D%5E%7BRL%7D的初始化值就是gif.latex?%5Cpi%20%5E%7BSFT%7D,咱们希望它俩之间的差距不至于太大

    怎么避免它两相差太多呢?这就是PPO要做的事情(通过KL散度衡量两个策略的概率分布之间的差距,从而使得咱们在优化策略时限制参数更新的范围)

    gif.latex?%5Cbegin%7Baligned%7D%20%26J_%7B%5Cmathrm%7BPPO%7D%7D%5E%7B%5Ctheta%5E%7B%5Cprime%7D%7D%28%5Ctheta%29%3D%5Cmathbb%7BE%7D_%7B%5Cleft%28s_%7Bt%7D%2C%20a_%7Bt%7D%5Cright%29%20%5Csim%20%5Cpi_%7B%5Ctheta%5E%7B%5Cprime%7D%7D%7D%5Cleft%5B%5Cfrac%7Bp_%7B%5Ctheta%7D%5Cleft%28a_%7Bt%7D%20%5Cmid%20s_%7Bt%7D%5Cright%29%7D%7Bp_%7B%5Ctheta%5E%7B%5Cprime%7D%7D%5Cleft%28a_%7Bt%7D%20%5Cmid%20s_%7Bt%7D%5Cright%29%7D%20A%5E%7B%5Ctheta%5E%7B%5Cprime%7D%7D%5Cleft%28s_%7Bt%7D%2C%20a_%7Bt%7D%5Cright%29%5Cright%5D%20%5Cend%7Baligned%7D%20-%5Cbeta%20%5Cmathrm%7BKL%7D%5Cleft%28%5Ctheta%2C%20%5Ctheta%5E%7B%5Cprime%7D%5Cright%29

    其中, KL奖励系数gif.latex?%5Cbeta控制 KL 惩罚

    好,接下来,重点来了,简言之,gif.latex?%5Cpi_%7B%5Cphi%7D%5E%7BRL%7D/gif.latex?%5Cpi%20%5E%7BSFT%7DPPO算法表达式中的\theta /\theta '一一对应,比如与环境交互的\theta '等同于原始策略gif.latex?%5Cpi%20%5E%7BSFT%7D,具体而言,有以下4点
     已经掌握人类偏好的RM模型一旦判定现有回答的不够好,便得更新gif.latex?%5Cpi_%7B%5Cphi%7D%5E%7BRL%7D,但如果gif.latex?%5Cpi_%7B%5Cphi%7D%5E%7BRL%7D一旦变化,会导致后续\bar{R}_{\theta}=\mathbb{E}_{\tau \sim p_{\theta}(\tau)}\left[R(\tau) \nabla \log p_{\theta}(\tau)\right]计算一系列问答评分时中的p_\theta (\tau )发生变化(策略一变轨迹必变),进而已采样的问答数据

    <x_{n+2},\left \{ y_{n+2}^{1},y_{n+2}^{2},y_{n+2}^{3},y_{n+2}^{4} \right \}><x_{n+3},\cdots ><x_{n+4},\cdots ><x_{n+5},\cdots >

    便没法继续使用,而只能不断采样一批批新的问答数据(更新gif.latex?%5Cpi_%7B%5Cphi%7D%5E%7BRL%7D后,得采样新一批数据;再更新gif.latex?%5Cpi_%7B%5Cphi%7D%5E%7BRL%7D后,再采样新一批数据..)

     为避免gif.latex?%5Cpi_%7B%5Cphi%7D%5E%7BRL%7D一更新便只能重复采样一批批新问答数据,说白了,保护(数据)现场,我们改让gif.latex?%5Cpi%20%5E%7BSFT%7D去和环境交互『gif.latex?%5Cpi%20%5E%7BSFT%7D始终固定住不变,且基于重要性采样的原则,增加重要性权重\frac{\pi _{\phi }^{RL}(y|x)}{\pi ^{SFT}(y|x)}
    然后为了最大化奖励而不断迭代gif.latex?%5Cpi_%7B%5Cphi%7D%5E%7BRL%7D(相当于在策略gif.latex?%5Cpi_%7B%5Cphi%7D%5E%7BRL%7D下模型回答的好不好始终由RM模型评判),迭代过程中可重复用已有数据反复验证

     迭代中我们追求整个目标函数objective(\phi)最大化,等同于要求\beta log(\pi _{\phi }^{RL}(y|x)/\pi ^{SFT}(y|x))最小(毕竟KL散度越小代表两个策略之间的差距越小)
    至于如果忘了KL散度公式的具体表达或者忘了怎么推导而来的,可以看下RL极简入门关于TRPO的部分

    \begin{aligned} D_{KL}(p||q) &= H(p,q) - H(p) \\&= -\sum p(x)logq(x) + \sum p(x)logp(x) \\&= -\sum p(x)log\frac{q(x)}{p(x)} \\&= \sum p(x)log\frac{p(x)}{q(x)} \end{aligned}

     直到gif.latex?%5Cpi_%7B%5Cphi%7D%5E%7BRL%7D迭代出最优策略(是否最优裁判RM模型说了算)
  3. 第三部分是加在最后边的偏置项,其中, gif.latex?D_%7Bpretrai%7D是预训练分布,预训练损失系数gif.latex?%5Cgamma控制预训练梯度的强度,且gif.latex?%5Cgamma设置为0则称为PPO模型,否则称为PPO-ptx模型
    之所以加最后的这个偏置项,是防止ChatGPT在RL的训练过程中过度优化,从而避免过于放飞自我,通过某种刁钻的方式取悦人类,而不是老老实实地根据人类的问题给出正确答案

3.2 InstructGPT如何更好的构建多轮对话能力

这里我们先从自然语言任务中最基本的语言模型简单说起。一个语言模型大概是说,当你给定前面的若干个词后,它会给你下一个词;而当你有了下一个词后,它会再给你接一个词,以此递推

这就好比我们使用手机输入法,你打出一些词句后,输入法会提供若干个候选词——这里的手机输入法其实就是一个语言模型。那么如何利用这个最基本的语言模型来建模多轮对话问题呢?

  1. 实际上,我们向ChatGPT提出的问题,可以看成是下图的输入gif.latex?X,然后我们可以将ChatGPT给出的答案抽象成下图的输出gif.latex?Y
  2. 而ChatGPT这类语言模型,提供了若干个类似手机输入法的“候选句”,每个候选句对应的概率不一
  3. 所谓的语言模型的训练,其实就是让模型调整候选句对应的概率,使我们人类希望输出的候选句的概率尽可能大,而不希望输出的概率尽可能小

4ea27677bac93469d6143a5161d5b037.png

强化学习中,我们有智能体/模型和环境交互这样的范式。但是在ChatGPT所使用的训练方式中,环境从某种意义上说被直接被奖励模型RM取代了,如下图

725d62dd8d0f2997cc2329d5a50977bc.png

  1. 图中的状态State是之前提到的输入语句gif.latex?X,而当智能体拿到一个gif.latex?X,它给出的动作action其实是下一个单词gif.latex?x_%7Bk%7D。注意,GPT确实可以输出一整句话gif.latex?X,但其实要完成这个最终的输出,需要做若干次如图所示的action
  2. 当环境(或RM)接收到它给出的单词gif.latex?x_%7Bk%7D后,会把这个单词放到已有的单词序列gif.latex?X末尾,然后再把这个新的单词序列还给智能体,之后依次类推
  3. 打个比方,这里的智能体就是手机输入法,而环境就是使用输入法的用户。用户所做的事情,就是当输入法给出一系列候选词后,基于某种偏好选择某个词,然后让手机输入法再去猜下一个词,直到输入法把整个句子猜出来为止

这里我们明白了在语言模型场景下强化学习的状态和动作对应什么,那么奖励Reward呢?由于上文已经分析过instructGPT的目标函数了,这里就不再赘述,直接上图:

300d2c30d66a2fc2c9a96a2535790a19.png

至此,还有一个细节问题,即奖励函数是对整个输入语句gif.latex?X和整个输出语句gif.latex?Y而言的,而我们又在之前讨论过,智能体是根据一个一个词来去拼凑出整个回答的。图中的奖赏函数只能给出完整回答的奖赏,那么在智能体生成回答的过程中,每个动作action给出的词gif.latex?x_%7Bk%7D对应的奖赏是什么呢?

这个细节在InstructGPT的论文中并没有给出。幸运的是,上文提到过的这篇论文《Learning from summarize from Human feedback》中的一个引脚标注给出了这个疑问的答案

论文里说,奖赏模型只在最终生成回答之后才给出奖赏,在中间的过程中是不给出奖赏的。在这里论文里没有使用回答一词,而是使用总结一词,因为它的任务是将一篇长文章进行归纳总结

换言之,只有在ChatGPT输出了EOS token的时候,整个轨迹才结束(EOS token是NLP中用来表示一段话结束的标志)

总结上文,可得

  1. 由于多轮对话要求语言模型有记忆性,因此无法直接使用RL,问题出在奖赏函数中:ChatGPT的奖励函数是针对GPT的一整个输入语句gif.latex?X和一整个输出语句gif.latex?Y而言的,而ChatGPT的语言模型在强化学习的训练策略中,每个action其实输出的是一个个词语
  2. 因此,OpenAI的团队可能是采取不对序列的中间生成给予reward的方式解决上文提到的矛盾

考虑到多轮对话场景里,存在某一轮对话中的代词指向上一轮对话中的某个人或物的可能,为此,ChatGPT多轮对话的核心关键是

  1. “基于Transformer的生成式模型”GPT3/GPT3.5足够强大
    在回答用户问题的过程中,每段对话都是一个个序列
    把之前的部分对话内容(对历史对话数据的规模做个限制,比如限制在8K大小)都保存下来,和当前的输入一起作为输入给模型,这些信息被编码成一个向量作为模型的输入

    且得益于Transformer的自注意力机制,使得模型能够理解不同对话历史之间的依赖关系,并在生成回答时考虑到之前的对话历史
    此外,模型还使用位置编码来区分每个对话历史的位置,确保模型可以正确地捕捉到对话历史的顺序信息
  2. 其次,为加强多轮对话能力,instructGPT/ChatGPT在训练的时候就引入了大量多轮对话的数据

3.3 低成本实现ChatGPT迷你版训练过程的开源项目

虽说GPT3在2020年就出来了,但OpenAI并未开源,所以直到一年半后以后才有国内外各个团队比如DeepMind等陆续复现出来,这些大厂的复现代码我们自然无法窥知一二,毕竟人家也未开源出来

但GitHub上有一个基于Colossal-AI低成本实现ChatGPT迷你版训练过程的开源项目(基于GPT3 + RLHF + PPO)则可以看下,虽只是类似GPT3与RLHF的结合(如本文开头所说,OpenAI早在2020年便已经对外宣布GPT3与RLHF的研究了),但可以增进我们对ChatGPT的理解

毕竟ChatGPT现在没论文、没开源,连所基于的GPT3.5的参数规模尚无准确定论,所以只能通过GPT3 + RLHF来推测或研究ChatGPT之其中一二,但该项目有几个不错的特点

  1. 很多同学一看到DL,便会想到大数据,而数据量一大,还用CPU处理的话很可能训练一个小任务都得半天,而如果用GPU跑,可能一两分钟就出来了。于此,在深度学习大火的那几年,特别是AlphaGo出来的16年起,我司七月在线便分别为VIP、AI系统大课、在职提升大课、求职/论文/申博/留学1V1辅导提供GPU云平台进行实战训练

    但如果想训练OpenAI原生的1750亿参数版本的GPT3,就不只是有GPU就完事了,而是得用64张AI 100(即便经过一系列内存开销上的优化,也得至少32张AI 100,单张AI 100售价10万以上,且现在还经常没货),这样的硬件要求是大部分个人是无法具备的,所以该开源项目提供了单GPU、独立4/8-GPUs 的ChatGPT迷你版
  2. 如下代码所示,启动简单
    from chatgpt.nn import GPTActor, GPTCritic, RewardModel
    from chatgpt.trainer import PPOTrainer
    from chatgpt.trainer.strategies import ColossalAIStrategy
    
    strategy = ColossalAIStrategy(stage=3, placement_policy='cuda')
    
    with strategy.model_init_context():
        actor = GPTActor().cuda()
        critic = GPTCritic().cuda()
        initial_model = deepcopy(actor).cuda()
        reward_model = RewardModel(deepcopy(critic.model)).cuda()
    
    trainer = PPOTrainer(strategy, actor, critic, reward_model, initial_model, ...)
    trainer.fit(prompts)
  3. 训练过程明确清晰,如下图(由于上文已经详细介绍过ChatGPT的训练步骤,故不再赘述)

此外,据钟博士在我所维护的『Machine Learning读书会群』里所说,Colossal-AI的并行效率确实不错,是新加坡的一个初创团队推出的,但目前尚没有团队采用Colossal-AI框架来做主训练框架训练175b级别的超大模型,可以再了解下Meta家训练OPT用的Metaseq

后记(含修改/优化/完善记录)

事实上,可能很多朋友也已经意识到,本文的前大部分内容里,GPT-N理解起来相对轻松(包括Transformer通过理解上篇BERT笔记不算特别复杂),而instructGPT/ChatGPT的整体架构思想也不算复杂,但其中涉及到的RL部分则让想深挖细节的初学者变得立马吃力起来(除非你已“入一定门”,或者你有课程/老师可以不断问),比如一个PPO算法,要真正把这个概念讲清楚、讲透彻且从零推到尾则没那么容易了。

以下是本文的部分修改/优化/完善记录

  1. 开始第一大阶段的修改
    1.22日,优化关于“instructGPT:如何基于RLHF运用到多轮对话场景”中的部分描述
    且为避免篇幅过长而影响完读率,权衡之下把扩展阅读下的SeqGAN相关内容删除
  2. 1.27日,修改此部分内容:“instructGPT/ChatGPT:如何更好的构建多轮对话能力”,之前的阐述没在点子上
  3. 2.9日,受正在编写的微积分和概率统计笔记的启发:把公式、定理、概念、技术放在历史这个大背景下阐述会让读者理解更为深刻,故,在本文开头前沿里,新增ChatGPT各个前置技术的发展、迭代、结合,并依据这些前置技术的先后提出顺序重新编排全文结构
  4. 2.10日,把第一部分中的大部分RL细节抽取出来放到新一篇笔记《RL极简入门》里
  5. 2.15日,针对本文开头所梳理的ChatGPT各项前置技术的推出时间从年份细化到月份,新增“RLHF:从人类反馈中学习”,及“低成本实现ChatGPT低配版训练过程的开源项目”
  6. 2.16日,为更一目了然,进一步完善本文对自注意力机制的阐述
  7. 2.17日,进一步完善本文对RLHF的阐述,比如新增对两篇RLHF相关论文的介绍
  8. 2.21日,根据instructGPT原始论文,修正大量同类解读中针对“ChatGPT训练三步骤”也存在的不够精准的个别描述
  9. 2.22日,新增关于“Prompt技术的升级与创新:指令微调技术(IFT)与思维链技术(CoT)”的部分
  10. 进入第二大阶段的修改
    2.25日,新增关于"GPT3到GPT3.5:从instructGPT到ChatGPT的迭代过程"的部分

    相比前几天有了质的提升
    ​之前哪怕修改十几次也都是1.x版本,今天的这个版本可以称之为2.0版本了,还会不断完善
  11. 2.26日,修正instructGPT/ChatGPT训练三步骤中“gif.latex?%5Cpi_%7B%5Cphi%7D%5E%7BRL%7D/gif.latex?%5Cpi%20%5E%7BSFT%7DPPO算法表达式中\theta /\theta '的对应关系”
    且修正为:SFT就是基线模型 最后不用去更新它的策略gif.latex?%5Cpi%20%5E%7BSFT%7D,更新的是论文中命名为PPO模型的策略gif.latex?%5Cpi_%7B%5Cphi%7D%5E%7BRL%7D
  12. 2.28日,修正对one-shot和few-shot的描述,相当于one-shot相当于就一个样本/示例,few-shot就是少量样本/示例
    且在本文最后附上了“ChatGPT相关技术的100篇论文必读榜”
  13. 3.1日,修正训练RM模型的描述中个别不够准确的措辞,比如通过人类的排序而非打分去训练奖励函数/模型
    且删除关于“近端策略优化裁剪PPO-clip”的介绍,毕竟详细的可以查看另一篇RL极简入门
  14. 3.2日,考虑到本文一读者留言说,“第三部分的objective(\phi),其中RL是需要更新的模型,而SFT是代替RL采样的不变的模型。那么为什么数学期望的下标的是RL,这不是意味着对正在更新的模型采样吗?如果是这样那PPO还有什么意义呢?”
    故为方便大家一目了然,已把该目标函数展开了下
  15. 3.3日,在本文第二部分开头补充“NLP自发展以来先后经历的4种任务处理范式”
  16. //待更..

为了写本笔记,过去两个月翻了大量中英文资料/paper(中间一度花了大量时间去深入RL),大部分时间读的更多是中文资料,2月最后几天读的更多是英文paper,正是2月底这最后几天对ChatGPT背后技术原理的研究才真正进入状态(后还组建了一个“ChatGPT之100篇论文阅读组”,我和10来位博士、业界大佬从23年2.27日起100天读完ChatGPT相关技术的100篇论文,榜单见本文最后),当然 还在不断深入,由此而感慨: 

  • 读的论文越多,你会发现大部分人对ChatGPT的技术解读都是不够准确或全面的,毕竟很多人因各种主观/客观原因导致 并未去深入了解
  • 因为100天100篇这个任务,让自己有史以来一篇一篇一行一行读100篇,​之前看的比较散 不系统 抠的也不细
    比如回顾“Attention is all you need”这篇后,对优化上一篇Transformer笔记便有了很多心得

总之,读的论文越多,博客内相关笔记的质量将飞速提升 自己的技术研究能力也能有巨大飞跃

参考文献与推荐阅读

  1. BERT通俗笔记:从Word2Vec/Transformer逐步理解到BERT,July
  2. 《预训练语言模型》,电子工业出版
  3. GPT3原始论文:Language Models are Few-Shot Learners,这是翻译之一
  4. GPT,GPT-2,GPT-3 论文精读,2018年6月份OpenAI提出GPT(当年10月份Google提出BERT),随后2019年2月14日推出GPT2,20年年中推出GPT3,此文介绍了GPT发家史
  5.  此外,写过图解Word2vec、图解transformer的Jay Alammar也写过:图解GPT2(其翻译版)、图解GPT3(其翻译版)

  6. GPT系列论文阅读笔记,300行代码实现GPT:GitHub - karpathy/minGPT: A minimal PyTorch re-implementation of the OpenAI GPT (Generative Pretrained Transformer) training

  7. OpenAI关于对GPT3.5的介绍:https://beta.openai.com/docs/model-index-for-researchers
  8. prompt提示学习(一)简要介绍
  9. CMU刘鹏飞:近代自然语言处理技术发展的“第四范式”
  10. 大模型prompt Turing技术上,这是针对这次分享的解读
  11. NLP小样本学习:如何用20条数据完成文本分类,此外,小样本学习也是七月NLP高级班上重点讲的技术之一,最新一期NLP11则加入了ChatGPT背后原理的解析
  12. 【论文解读】in-context learning到底在学啥?
  13. 万字拆解!追溯ChatGPT各项能力的起源
  14. A Survey for In-context Learning,这是对该论文的解读,该论文作者之一维护的一个Paper List for In-context Learning
  15. 首次提出instruction turning的FLAN原始论文:FINETUNED LANGUAGE MODELS ARE ZERO-SHOT LEARNERS,这是解读之一
    此外,FLAN-T5原始论文:Scaling Instruction-Finetuned Language Models,这是对T5的解读之一
  16. GPT-3.5 + ChatGPT: An illustrated overview - Life Architect
  17. Chain-of-Thought Prompting Elicits Reasoning in Large Language Models,思维链技术的开山之作,这是针对该篇论文的来自亚马逊一研究者的解读(YouTube),这是针对该篇论文的解读笔记,这是关于Cot的一些关键paper,这是T5作者之一关于Cot的分享之一
  18. Large Language Models are Zero-Shot Reasoners,来自东京大学和Google的研究者
  19. Multimodal Chain-of-Thought Reasoning in Language Models,来自亚马逊的研究者
  20. Large Language Models Are Reasoning Teachers,提出了 Fine-tune-CoT 方法,旨在利用非常大的语言模型 (LMs) 的CoT推理能力来教导小模型如何解决复杂任务
  21. PLM 是做题家吗?一文速览预训练语言模型数学推理能力新进展
  22. 有了Chain of Thought Prompting,大模型能做逻辑推理吗?
  23. 热点解读:大模型的突现能力和ChatGPT引爆的范式转变
  24. 通向AGI之路:大型语言模型(LLM)技术精要,张俊林
  25. Codex介绍页面:OpenAI Codex,Codex原始论文:Evaluating Large Language Models Trained on Code,另这是针对Codex原始论文的解读
  26. PPO原始论文:Proximal Policy Optimization Algorithms
  27. PPO算法解读(英文2篇):解读1 RL — Proximal Policy Optimization (PPO) Explained、解读2 Proximal Policy Optimization (PPO)
  28. PPO算法解读(中文3篇):Easy RL上关于PPO的详解、详解近端策略优化、详解深度强化学习 PPO算法
  29. PPO算法实现:https://github.com/lvwerra/trl
  30. 如何选择深度强化学习算法?MuZero/SAC/PPO/TD3/DDPG/DQN/等
  31. Google搜索:instructGPT如何基于PPO算法进行训练,出来的一系列文章
  32. InstructGPT原始论文(确实有68页,^_^):Training language models to follow instructions with human feedback,我是23年2.28日首次基本完整看完
  33. InstructGPT 论文精读,来自动手学深度学习一书作者李沐的解读
  34. ChatGPT原理猜想(1)--从InstructGPT讲起,ChatGPT原理猜想(2)--InstructGPT深入学习
  35. ChatGPT: Optimizing Language Models for Dialogue,OpenAI关于ChatGPT的官方发布页面
  36. ChatGPT会取代搜索引擎吗,张俊林
  37. Illustrating Reinforcement Learning from Human Feedback (RLHF),另这是中文翻译版之一
  38. OpenAI联合DeepMind发布全新研究:根据人类反馈进行强化学习,表明2017年便开始研究RLHF了
  39. 基于人类偏好的深度强化学习(Deep reinforcement learning from human preferences),这是翻译版之一,这是解读之一
  40. 《Learning from summarize from Human feedback》,这篇博客是对这篇论文的解读之一
  41. HuggingFace的视频分享:RL from Human Feedback- From Zero to chatGPT,这是文字解读:ChatGPT 背后的“功臣”——RLHF 技术详解
  42. OpenAI's InstructGPT: Aligning Language Models with Human Intent
  43. 不忽悠的ChatGPT,作者Ben
  44. 别光顾着玩,让我来告诉你ChatGPT的原理,来自B站UP主弗兰克甜
  45. 浅析ChatGPT的原理及应用,此外,这里还有一篇外文解读:How ChatGPT actually works
  46. Role of RL in Text Generation by GAN(强化学习在生成对抗网络文本生成中扮演的角色)
  47. 抱抱脸:ChatGPT背后的算法——RLHF
  48. 关于指令微调等关键技术:What Makes a Dialog Agent Useful?,这是此文的翻译版
  49. 谷歌FLAN-T5作者亲讲:5400亿参数,1800个任务,如何实现大语言模型“自我改进”
  50. 为什么chatgpt的上下文连续对话能力得到了大幅度提升?
  51. LaMDA: Language Models for Dialog Applications,Google对话机器人LaMDA原始英文论文
  52. https://github.com/hpcaitech/ColossalAI/tree/main/applications/ChatGPT
  53. https://www.hpc-ai.tech/blog/colossal-ai-chatgpt
  54. 技术小白能看懂的ChatGPT原理介绍

附录:ChatGPT相关技术的必读论文100篇(转载请注明出处)

  1. Attention Is All You Need,Transformer原始论文
  2. GPT:Improving Language Understanding by Generative Pre-Training
    GPT2:Language Models are Unsupervised Multitask Learners
  3. GPT3原始论文:Language Models are Few-Shot Learners
  4. ICL原始论文
  5. Evaluating Large Language Models Trained on Code,Codex原始论文
    预测当前序列的最后一个词时 可以选取概率最大的词(softmax最高的值),但没法全局最优且不具备多样性,当然 可以使用束搜索 一次性获取多个解
    论文中用的是核采样,预测的各个词根据概率从大到小排序,选取前些个概率加起来为95%的词
  6. CoT原始论文:Chain-of-Thought Prompting Elicits Reasoning in Large Language Models
    28 Jan 2022 · Jason Wei, Xuezhi Wang, Dale Schuurmans, Maarten Bosma, Brian Ichter, Fei Xia, Ed Chi, Quoc Le, Denny Zhou
    也从侧面印证,instructGPT从22年1月份之前 就开始迭代了
  7. Training language models to follow instructions with human feedback
    instructGPT原始论文

  8. RLHF原始论文
  9. PPO原始论文
  10. 《Finetuned Language Models Are Zero-Shot Learners》,2021年9月Google提出FLAN大模型,其基于Instruction Fine-Tuning
  11. Scaling Instruction-Finetuned Language Models,Flan-T5(2022年10月)
  12. LLaMA: Open and Efficient Foundation Language Models,2023年2月Meta发布了全新的650亿参数大语言模型LLaMA,开源,大部分任务的效果好于2020年的GPT-3
  13. Language Is Not All You Need: Aligning Perception with Language Models,微软最新发布的多模态大语言模型论文
  14. GLM: General Language Model Pretraining with Autoregressive Blank Infilling,国内唐杰团队的

  15. A Comprehensive Survey on Pretrained Foundation Models: A History from BERT to ChatGPT:https://arxiv.org/pdf/2302.09419,预训练基础模型的演变史
  16. LaMDA: Language Models for Dialog Applications,Google在21年发布的对话模型
  17. Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer
  18. Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing,作者来自CMU的刘鹏飞,这是相关资源
  19. Multimodal Chain-of-Thought Reasoning in Language Models
    23年2月,亚马逊的研究者则在这篇论文里提出了基于多模态思维链技术改进语言模型复杂推理能力的思想,号称小模型也能吊打GPT3,^_^
  20. Offsite-Tuning: Transfer Learning without Full Model
    对于许多的私有基础模型,数据所有者必须与模型所有者分享他们的数据以微调模型,这是非常昂贵的,并引起了隐私问题(双向的,一个怕泄露模型,一个怕泄露数据)
  21. Emergent Abilities of Large Language Models
    Google 22年8月份发的,探讨大语言模型的涌现能力

  22. Large Language Models are Zero-Shot Reasoners
    来自东京大学和谷歌的工作,关于预训练大型语言模型的推理能力的探究,“Let's think step by step”的梗即来源于此篇论文
  23. PaLM: Scaling Language Modeling with Pathways,这是翻译之一
    22年4月发布,是Google的Pathways架构或openAI GPT2/3提出的小样本学习的进一步扩展
  24. // 23年2.27日起,本榜单几乎每天更新中

http://www.niftyadmin.cn/n/126453.html

相关文章

【需求响应】基于数据驱动的需求响应优化及预测研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…

java_Day003

1.while循环与for循环 while循环里面一般写的是boolean类型的判断 &#xff08;1&#xff09;累加思想_for &#xff08;2&#xff09;统计思想&#xff08;计数思想&#xff09;_while //sum i; sum sum i; //sum - i; sum sum - i; //sum * i; sum sum * i; //sum / i; …

内存泄漏分析及规避方法

啥是内存泄漏&#xff1f;内存泄漏就是堆内存中的某些对象&#xff0c;你虽然不再使用它们了&#xff0c;但是垃圾回收器还回收不了他们&#xff0c;长此以往内存就慢慢耗没了。内存泄漏怎么检测&#xff1f;如果你的服务经常占用内存很大&#xff0c;慢慢隔一段时间需要重启一…

【华为OD机试真题java、python、c++、jsNode】最多颜色的车辆【2022 Q4 100分】(95%通过)

代码请进行一定修改后使用,本代码保证100%通过率。本文章提供java、python、c++、jsNode四种代码 题目描述 在一个狭小的路口,每秒只能通过一辆车,假好车辆的颜色只有 3 种,找出 N 秒内经过的最多颜色的车辆数量。 三种颜色编号为0 ,1 ,2 输入描述 第一行输入的是通过…

珠海先达盈致数据智能监控器+SaaS平台 轻松实现注塑生产管控

数据智能监控器 兼容市面上99%的注塑设备 直接读取设备生产数据与状态&#xff0c;如&#xff1a;计划产出、实际产出、累计产出、停机、节拍、线利用率、直通率、停产时间、工单状态、OEE、注胶时间…… 产品功能价值 ◎ OEE不达标报警&#xff0c;一手掌握生产效能 ◎ 首…

华为OD机试真题Python实现【投篮大赛】真题+解题思路+代码(20222023)

投篮大赛 题目 你现在是一场采用特殊赛制投篮大赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。 比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则: 整数 x …

linux c语言之静态链表的使用

#ifndef _MULTI_TIMER_H_ #define _MULTI_TIMER_H_ #include <stdint.h> #include <stddef.h> #include <stdio.h>

buffer它到底做了个啥,源码级分析linux内核的文件系统的缓冲区

最近一直在学习linux内核源码&#xff0c;总结一下 https://github.com/xiaozhang8tuo/linux-kernel-0.11 自己整理过的带注释的源码。 为什么要有buffer ​ 高速缓冲区是文件系统访问块设备中数据的必经要道(PS:如果所有程序结果都不落盘&#xff0c;只是int a, a直接在主存…