自从我那篇Transformer通俗笔记一经发布,然后就不断改、不断找人寻求反馈、不断改,其中一位朋友倪老师(之前我司NLP高级班学员现课程助教老师之一)在谬赞Transformer笔记无懈可击的同时,给我建议到,“后面估计可以尝试尝试在BERT的基础上,讲一讲prompt学习了”
再然后,当我还在各种改Transformer笔记的时候,12月初突然出来了一个ChatGPT刷爆朋友圈,即便很多之前不接触AI的朋友也在问ChatGPT这种类似聊天机器人却远胜一般聊天机器人各种问题(上一次出现这种盛况的还是16年的AlphaGo)。
据我观察,大家问ChatGPT的问题千奇百怪
所以ChatGPT就相当于你写代码或各类问题的私人顾问,而这个私人顾问能瞬间、精准理解你的意图,不会让你像用以前那种聊天机器人经常觉得智障甚至对牛弹琴,加之其背后依托的是人类级百科全书式的资料库,所以有人惊呼:ChatGPT会不会替代Google这类搜索引擎。
考虑到ChatGPT非一蹴而就,而是经过了各个前置技术的发展、迭代、结合而成,故逐一阐述
如你所见,自从1.6日开始写ChatGPT笔记,1.15日发布本文,但为把ChatGPT背后所涉及的关键技术阐述细致、透彻,故本文越写越长,长到最后成了一个系列,有的内容抽离出去独立成文,有的还在不断完善
再次强调说明下,本第一部分在23年2.10日有个重要修改
综上,为兼顾两者,且加之为避免本文篇幅过长而影响完读率,故把下面原先第一部分的大部分内容抽取出来放到了新一篇RL笔记里进一步细致阐述:强化学习极简入门:通俗理解MDP、DPMCTC和Q学习、策略梯度、PPO
第一部分RL基础:什么是RL与MRP、MDP1.1入门强化学习所需掌握的基本概念
1.2什么是马尔科夫决策过程
第二部分RL进阶之三大表格求解法:DP、MC、TD2.1动态规划法
2.2蒙特卡洛法2.3时序差分法及与DP、MC的区别
第三部分价值学习:从n步Sarsa算法到Q-learning、DQN3.1TD(0)控制/Sarsa(0)算法与TD(n)控制/n步Sarsa算法3.2Q-learning
3.3DQN
第四部分策略学习:从策略梯度、Actor-Criti到TRPO、PPO算法4.1策略梯度与其突出问题:采样效率低下
如上所述,PPO算法是针对TRPO计算量的大的问题提出来的,正因为PPO基于TRPO的基础上改进,故PPO也解决了策略梯度不好确定学习率Learningrate(或步长Stepsize)的问题
毕竟通过上文,我们已经得知
具体做法是,PPO算法有两个主要的变种:近端策略优化惩罚(PPO-penalty)和近端策略优化裁剪(PPO-clip),其中PPO-penalty和TRPO一样也用上了KL散度约束。
近端策略优化惩罚PPO-penalty的流程如下
总之,近端策略优化惩罚可表示为
当然,如果觉得计算KL散度很复杂,则还有一个PPO2算法,即近端策略优化裁剪PPO-clip,详见RL极简入门一文
虽然RL理论上虽不需要大量标注数据,但实际上它所需求的reward会存在缺陷:
模仿学习的思路是不让模型在人类制定的规则下自己学习,而是让模型模仿人类的行为。而逆强化学习就是模仿学习的其中一种,何谓逆强化学习呢?
实际上,RLHF(ReinforcementLearningwithHumanFeedback)这一概念最早被定义为基于人类反馈的强化学习,它最早是在2008年《TAMER:TraininganAgentManuallyviaEvaluativeReinforcement》一文中被提及的
在2017年前后,深度强化学习(DeepReinforcementLearning)逐渐发展并流行起来,如你所见,2017年6月由OpenAI联合GoogleDeepMind一块推出:基于人类偏好的深度强化学习《DeepReinforcementLearningfromHumanPreferences》,也简称RLHF
当让一个强化学习智能体探索环境并与之交互(比如Atari游戏),RLHF的核心步骤如下图所示:
再之后,OpenAI团队通过下述两篇论文进一步阐述了RLHF
NLP自发展以来,先后经历了4种任务处理范式
在GPT被提出之前
在上一篇Transformer笔记中,我们已经了解到:GPT是“GenerativePre-TrainingTransformer”的简称,从名字看其含义是指的生成式的预训练,它和BERT都是(无监督)预训练-(监督)微调模式的典型代表
由于Decoder具备文本生成能力,故作为侧重生成式任务的GPT选择了TransformerDecoder部分作为核心架构
其中的关键便是这个Self-Attention,模型通过自注意力机制可以学习序列中不同位置之间的依赖关系,即在处理每个位置的信息时,模型会考虑序列中和该位置的信息有关联的其他所有位置上的信息,这种机制使得模型能够有效地处理长距离依赖关系
之后对每个token都进行上述同样的三步操作,最终会得到每个token新的表示向量,新向量中包含该token的上下文信息,之后再将这些数据传给Transformer组件的下一个子层:前馈神经网络
更多细节可以看下上篇BERT笔记(特别是此前还不了解Transformer的),或此文:图解注意力机制
虽然GPT1的预训练加微调的范式仅需要少量的微调和些许的架构改动,但能不能有一种模型完全不需要对下游任务进行适配就可以表现优异?GPT2便是在往这个方向努力:不微调但给模型一定的参考样例以帮助模型推断如何根据任务输入生成相应的任务输出
最终,针对小样本/零样本的N-shotLearning应运而生,分为如下三种
此外,只需将自然语言的任务示例和提示信息作为上下文输入给GPT-2,它就可以在小样本的情况下执行任何NLP任务,包括所谓的完形填空任务,比如
假如我要判断“我喜欢这个电影"这句话的情感(“正面"或者"负面"),原有的任务形式是把他看成一个分类问题
输入:我喜欢这个电影
输出:“正面"或者"负面"
而如果用GPT2去解决的话,任务可以变成“完形填空",
输入:我喜欢这个电影,整体上来看,这是一个__的电影
输出:“有趣的"或者"无聊的"
加的这句提示“整体上来看,这是一个__的电影”对于让模型输出人类期望的输出有很大的帮助。
这个所谓的提示用NLP的术语表达就是prompt,即给预训练语言模型的一个线索/提示,帮助它可以更好的理解人类的问题例如有人忘记了某篇古诗,我们给予特定的提示,他就可以想起来,例如当有人说:
大家自然而然地会想起来下一句诗:黄河入海流
亦或者,搜索引擎,可以根据我们的输入,进行输出的提示:
GPT3简单来说,就是规模大、有钱多金、效果出奇好,具体而言,它的参数规模达到了1750亿,并且使用45TB数据进行训练(当然,GPT3论文中说道:constituting45TBofcompressedplaintextbeforefilteringand570GBafterfiltering,roughlyequivalentto400billionbyte-pair-encodedtokens),其预训练任务就是“句子接龙”,给定前文持续预测下一个字,而且更为关键的是,在小样本的情况下,其性能表现一度超越SOTA模型
为形象描述,举一个GPT3在0样本、单样本、少量样本下的机器翻译使用范例,如下图
零样本下模型没法通过样本去学习/修正,但即便是少样本下,也有工作试图证明InContextLearning并没有从样本中学习,比如“RethinkingtheRoleofDemonstrations:WhatMakesIn-ContextLearningWork”,它发现了:
OpenAI的GPT3虽然不再微调模型(pre-training+prompt),但Google依然坚持预训练+微调的模式
2021年9月,谷歌的研究者们在此篇论文中《FinetunedLanguageModelsAreZero-ShotLearners》提出了基于InstructionFine-Tuning(指令微调,简称IFT)的FLAN大模型,极大地提升了大语言模型的理解能力与多任务能力,且其在很多任务上的零样本学习能力超过GPT3(毕竟指令微调的目标之一即是致力于improvingzero-shotgeneralizationtotasksthatwerenotseenintraining),最终达到的效果就是:遵循人类指令,举一反三地完成任务
有两点值得注意的是
至于IFT的数据通常是由人工手写指令和语言模型引导的指令实例的集合,这些指令数据由三个主要组成部分组成:指令、输入和输出,对于给定的指令,可以有多个输入和输出实例
相比于GPT-3,且区别在于Finetune,FLAN的核心思想是,当面对给定的任务A时,首先将模型在大量的其他不同类型的任务比如B、C、D...上进行微调,微调的方式是将任务的指令与数据进行拼接(可以理解为一种Prompt),随后给出任务A的指令,直接进行推断,如下图所示
例如,我们的最终目标是推理任务
相当于通过指令微调之后,模型可以更好的做之前预训练时没见过的新任务且降低了对prompt的敏感度(某些场景下不一定非得设计特定prompt才能激发模型更好的回答)
这或许也启发了OpenAI重新注意到了微调这一模式(毕竟如上文所述,原本GPT3在预训练之后已彻底放弃再微调模型),从而在InstructGPT中针对GPT3做Supervisedfine-tuning(简称SFT)
为让大语言模型进一步具备解决数学推理问题的能力,22年1月,谷歌大脑团队的JasonWei、XuezhiWang等人提出了最新的Prompting机制——ChainofThought(简称CoT),简言之就是给模型推理步骤的prompt,让其学习人类如何一步步思考/推理,从而让模型具备基本的推理能力,最终可以求解一些简单甚至相对复杂的数学推理能力
以下是一个示例(下图左侧为standardprompting,下图右侧为基于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%左右
据OpenAI官网对GPT3.5的介绍,GPT3.5从2021年第四季度开始就混合使用文本和代码进行训练,我们来看下GPT3.5的各个系列模型及其各自的发展演变脉络图
基于GPT3的发展路线:一条是侧重代码/推理的Codex,一条侧重理解人类的instructGPT
基于GPT3.5的发展路线:增强代码/推理能力且更懂人类终于迭代出ChatGPT
通过OpenAI公布的ChatGPT训练图可知,ChatGPT的训练流程与InstructGPT是一致的,差异只在于
23年3月14日(国内3.15凌晨),OpenAI正式对外发布自从22年8月份便开始训练的GPT4,之前订阅ChatGPTplus版的可以直接体验GPT4
根据OpenAI官网发布的《GPT-4TechnicalReport》可知
此外,通过GPT4的技术报告第60页可知,其训练方式和基于GPT3的instructGPT或基于GPT3.5的ChatGPT初版的训练方式如出一辙
先收集数据
接下来三个步骤(具体下文第三部分详述)
至于GPT4背后多模态的能力起源与发展历史,23年4月将新启一篇博客:详述DTER、DDPM、VisionTransformer、CLIP、SwinTransformer、DALL·E2、StableDiffusion、BEiT-3、VisualChatGPT、GPT4等..
根据InstructGPT的原始论文可知,InstructGPT的训练分为三个阶段(有监督微调“经过无监督预训练好的GPT3”、然后基于人类偏好排序的数据训练一个奖励模型、最终在最大化奖励的目标下通过PPO算法来优化策略):
另值得一提的是,上文反复提到策略,那怎么理解这个经常在RL中出现的“策略”呢,举几个例子
此外,可能有读者疑问,InstructGPT使用RLHF的思路,只是为了训练出一个奖励函数么?事实上,还有额外多方面的用途
因此,通过人工干预微调GPT,使其输出对用户友好(避免乱说话),且更好的和人类对话,所以,对InstructGPT的简单理解,可以是基于人类偏好的深度强化学习(RLHF)手段微调的GPT。
接下来,我们分别具体阐述上面的阶段1、阶段2、阶段3。
阶段1的本质就是使用监督学习方法对GPT-3模型进行微调(回归到预训练-微调模式),具体使用labelerdemonstrations作为训练数据,具体微调过程中
训练RM的核心是由人类对SFT生成的多个输出(基于同一个输入)进行排序,再用来训练RM。按照模仿学习的定义,直观上的理解可以是,RM在模仿人类对回答语句的排序思路。
为了更具体的说明,我们代入一个场景,假设你向一个六岁小孩解释什么是登陆月球或什么是RL,如下图
针对这个损失函数需要逐一说明的是
值得一提的是,通过在训练集上进行了一个周期(epoch)的训练,选择了学习率(lr)为9e-6,且采用余弦学习率调度策略,在训练结束时,学习率降低至初始值的10%。
最终,通过这种形式的梯度回传,RM逐渐学会了给D这类语句以高排名甚至打出一个高分,给A、B以低排名甚至打出一个低分,从而模仿到了人类偏好。到了这一步,不妨可以这么简单理解RLHF:所谓的基于人类偏好的深度强化学习,某种意义上来说,就是由人类的偏好来充当reward
简而言之,阶段3可以用下图形象化表示
具体而言,instructGPT原始论文中的目标函数如下所示
这里我们先从自然语言任务中最基本的语言模型简单说起。一个语言模型大概是说,当你给定前面的若干个词后,它会给你下一个词;而当你有了下一个词后,它会再给你接一个词,以此递推
对应到强化学习的框架中,环境从某种意义上说被直接被奖励模型RM取代了,如下图
这里我们明白了在语言模型场景下强化学习的状态和动作对应什么,那么奖励Reward呢?由于上文已经分析过instructGPT的目标函数了,这里就不再赘述,直接上图:
这个细节在InstructGPT的论文中并没有给出。幸运的是,上文提到过的这篇论文《LearningfromsummarizefromHumanfeedback》中的一个引脚标注给出了这个疑问的答案
换言之,只有在ChatGPT输出了EOStoken的时候,整个轨迹才结束(EOStoken是NLP中用来表示一段话结束的标志)
总结上文,可得
考虑到多轮对话场景里,存在某一轮对话中的代词指向上一轮对话中的某个人或物的可能,为此,ChatGPT多轮对话的核心关键是
虽说GPT3在2020年就出来了,但OpenAI并未开源,所以直到一年半后以后才有国内外各个团队比如DeepMind等陆续复现出来,这些大厂的复现代码我们自然无法窥知一二,毕竟人家也未开源出来
再到后来基于GPT3的InstructGPT、基于GPT3.5的ChatGPT初版(GPT3.5的参数规模也尚无准确定论)、GPT4均未开源,OpenAI不再open,好在Meta等公司或研究者开源出了一系列类ChatGPT项目,本部分针对其中部分做下简要推荐..
...
为避免本文篇幅再次过长,本第4部分余下的内容已抽取出去独立成文,请点击:
事实上,可能很多朋友也已经意识到,本文的前大部分内容里,GPT-N理解起来相对轻松(包括Transformer通过理解上篇BERT笔记不算特别复杂),而instructGPT/ChatGPT的整体架构思想也不算复杂,但其中涉及到的RL部分则让想深挖细节的初学者变得立马吃力起来(除非你已“入一定门”,或者你有课程/老师可以不断问),比如一个PPO算法,要真正把这个概念讲清楚、讲透彻且从零推到尾则没那么容易了。