资料来源:李沐谈gpt1-3
GPT1:
用transformer的decoder作为base模型在unlabel的模型上做pretraining,然后放到下游任务做finetuning。从时间上来讲是第一个大预训练NLP模型,比bert要早几个月。为了做通用预训练模型,有两个事情要做:
1. 采用auto-regression的模式。这个和后面的bert不一样,因为bert的是用encoder,即全域attention来做的。由于GPT1采用了LM的模式来做预训练,即给定前面的context去预测后面的词(通过attention mask来实现),因此是一个更加通用,但是更加难的生成式任务;而BERT则是完形填空(masked language model, MLM),因此BERT的能力主要是理解,以及插值。这导致BERT在下游任务上可以更好(即在同样为12层以及768dim的情况下,BERT base比GPT1的效果更好),但是BERT在生成,以及AGI上则没有后面的GPT3来的惊艳。
2. 设计预训练任务。理解预训练有助于我们理解这个模型的能力是怎么来的,以及他的能力边界与适用范围。预训练任务把NLP任务抽象成4类,其中entitlment为判断给定premise,判断hypothesis对不对。注意这时候需要用到start,extract等特殊字符,以规范化输入的格式,方面模型利用attention机制来理解输入。
其他的注意点:
1. 在Bookcorpus上训练,模型参数约117M
2. GPT1展现了较强的的zero shot的能力,即仿佛真 的能理解用户的意图,然后生成答案。这能力可能确实来源于auto-regression。更重要的是,他展现了zero-shot能力随着模型大小的增长而上升的曲线,因此让大家对“增大模型,增强能力”来获得一个底气。
3. T5是encoder和decoder都用了。
4. Bert也有next sentence prediction,也类似于auto-regression,不知道为啥后面没有走这个路子了。
总结:之前都是CV的预训练大模型,GPT1通过设计任务,验证了NLP届的大模型也是可能的。
GPT2:
为了与Bert对比,但是可能性能上又没有比Bert强太多,GPT2的叙事开始转向了few-shot以及zero-shot等AGI的能力。下面是技术上的主要改进:
1. 为了实现few-shot,尤其是zero-shot,模型的参数是不会被finetune的,因此没有机会认识special token,因此GPT2去掉了1中的special token(如start,extract等)。而为了使得训练数据结构化,采用了如(answer the question, question,answer),或者是(translate the following language,source language,target languate) 这种形式,即task description,task format这样的数据组织形式来训练,实际上就相当于利用prompt来做训练。由于现实生活中的任务也都是这样的,因此可以expect在inference的时候也具有类似的泛化能力。从底层原理上来讲,prompt之所以能奏效,auto-regression很可能是一个很重要的因素,因为模型必须是根据前文的理解,然后生成后面概率比较高的话。这样的能力是完形填空做不到的,完形填空主要还是做理解,生成下游。
2. 数据:因为common crawl的数据虽然全,但是脏,因此认为不可用;作者们从reddit爬了40G的比较高质量数据(有过upvote)来提升训练的数据量,并且将模型扩大到1542M。数据集为webtext。
3. 用了Byte Pair Encoding (BPE) 来组织脏数据,因此模型可以理解unicode的输入,以及产生unicode的输出。这除了进一步丰富了泛化可能性外,还增加为多语种扫清了障碍。
注意点:
1. 在本文中,prompt还只是一个符号,即":"。这时候的prompt的概念还类似于前面的特殊字符,还没有扩大到task的描述,或者是先导语,比如once upon a time.
2. 模型大小为1.5B, 为GPT1的10倍。
3. GPT2还展示了,随着模型参数的增加,模型的zero-shot能力更强。并且有人认为GPT2在webtext dataset上是underfit的。
总结:有一段时间,我的感想是LLM的研究到后面都变成了heuristic的pretrain task设计,没有了数学在里面。事实上也是如此。但是GPT2的预训练方式还是非常的大胆,跟其他结构化的,task specific的预训练方式相比,更加通用,也有更好的上限,让人惊叹。
GPT3:
GPT3沿着GPT2的技术路线,主要是引入了in-context learning,以及用到了GPT2种没有用的common crawl的数据,为chatgpt的惊人的可扩展性以及few shot learning提供了准备。并且GPT3不追求one-shot,而是回到了few shot的设定,通过in context learning实现短时理解,跟人类更像了。下面是技术:
1. in-context learning 即gpt能够根据给定的一些example,然后模型通过类比example,来更好的理解当前的任务。因此在inference的时候,如果能够给足相关的信息上下文,模型是能理解的。一个解释是模型能够attend到example上,因此能够从一个没有歧义的space来进行生成。这其实是更好的挖掘出预训练模型的潜力的。
注意点:
1. gpt3的模型大小是175B,为GPT2的100倍
2. gpt3其实是一个无状态的,因此每一次都需要给example才能得到好的效果,这个和chatgpt的多轮对话能力不一样。这也成为了gpt3的一个弱点,即没法finetune,对于有数据的用户来说,好像只能每次都把几千个数据作为example提供上去,这无论从数据privacy,还是efficiency上来说都是很有问题的。
3. gpt3在安全性,可控性,可靠性上还是有问题,因此很难直接商业化。
总结:gpt3在训练以及模型上跟gpt2其实是一致的,不一样的只有inference的改变,以及模型规模的改变。
instructGPT(chatgpt):
因为gpt的训练过程是单纯的LM,但是和人类想要的安全性,公平性,以及preference是misalign的。因此为了商用,我们需要把GPT3和商业的需求align起来,这就是reinforcement learning with human feedback (RLHF)。结论就是,在服务人类上的效果更好,在通用的任务上的效果也没有下降(注意,其实这就是finetune与general的tradeoff)。
1. SFT(supervised fine-tune): 在以前的用户提出的需求中(也就是prompt),让40个标注人员写了一些答案。这应该就是最expensive的工作,因为sample比较难找,而符合要求的答案也是需要人来创造(不仅仅是简单的标注)。事实上,正是因为这一部分的工作很expensive,所以才需要第二步的排序。因为排序是比生成可靠的答案容易得多的。这一步的gpt用的是比较小的1.3B的gpt模型,
2. RM模型(reward model):用gpt生成多个答案之后,由人来排序,然后训练了一个排序模型,并且fix下来。由于排序是一个非常specific的简单工作,因此这个模型不需要很大,但效果可以很好。这个模型实际上模拟的是人类标注员对于答案的preference,比如bias,toxic,faireness。这个模型的训练其实是为了第三部的RL做准备的。从下面的loss看到,就是一个比较经典的learning to rank。
这里有一个小讨论,之前的工作都是产生4个答案给人工排序,但是这个工作中产生的是9个答案。原因是因为,实际上排序9个没有比排4个多话多少时间,但是却从C_2_4变成了C_2_9的sample数量,因此大大提高了标注的效率和利用了率。
3. PPO:PPO是RL的其中一种方法。训练loss其实很简单,即把gpt作为policy model,而把第二步的human ranking proxy作为reward model,来提供实时的feedback,使得RL可行。训练过程即:a. 从SFT来boostrap模型。b.给定任务x,让gpt生成答案y,并由RM给一个反馈。loss的后面部分是让RL训练的模型和原始的SFT不要差距太大,以防RM算不准,因此用了一个KL divercence来控制;并且为了保证泛化性能,在最后还是补上了pretrain loss。
总结:instructGPT实际上提供了一个finetune模型的工作流,如果大模型的参数是accessible的话,那么通过这种办法对模型finetune可以得到一个令人类满意的结果。instructgpt是的gpt的迭代变得可能,而且高效。因为每次获取新的数据,或者新的badcase,我们只需要训练比较小的RM(6B)即可,然后由RM去泛化到gpt模型本身。instructGPT的另一个意义在于,让gpt更加像人,因而能通过图灵测试。但是如果数据多的话,可能还是直接微调就好,因为RL本身也有不稳定的地方存在。
Chain of Thought (COT):
Chain of thought是解放LLM的一个探索方向。比如用Let's think step by step,放在prompt的前面。这样LLM就会一步一步地将模型的推理过程generate出来,这对于模型进行reasoning是至关重要的。因为很多情况下,一个复杂的问题让模型直接给出答案,它可能只能胡扯,但是在step by step的prompt的情况下,模型是要保证每一步的答案都是合乎逻辑的,并且后面生成的话也是要跟前面的逻辑自洽(auto-regression+attention的作用),使得模型用了更多的算力(思考时间)来生成答案,因此模型更加可能进行合理的reasoning。具体而言,有两种方法:
1. zero-shot COT: 直接加上let's think step by step
2. Manual COT: 手工构建相关的问题以及推理过程,作为例子输入,进行one-shot/few shot learning.
Auto COT是aston后面的工作,即让采样出一些问题,然后加上"let's think step by step", 让GPT做出一些回答。然后将所有的答案作为few shot example一起输入到gpt中。这样的好处就是,不需要人工构造COT的prompt,把这个过程给自动化。这里难点就是怎么去sample出相似问题,其中一个方法就是让gpt自动生成类似的问题。不过这篇工作则是从一个给定的dataset里面去找相似的问题,现实意义就没那么大了。
Reference:
1. GPT1: Improving Language Understanding by Generative Pre-Training
2. GPT2: Language Models are Unsupervised Multitask Learners
3. GPT3: Language models are few-shot learners
4. Blog: https://medium.com/walmartglobaltech/the-journey-of-open-ai-gpt-models-32d95b7b7fb2
5. InstructGPT: Training language models to follow instructions with human feedback
6. Chain of Thought: Chain-of-Thought Prompting Elicits Reasoning in Large Language Models
7. AUTOMATIC CHAIN OF THOUGHT PROMPTING IN LARGE LANGUAGE MODELS
标签:读后感,系列,训练,GPT2,模型,prompt,gpt,shot,chatgpt From: https://www.cnblogs.com/kunrenzhilu/p/17208364.html