文章目录
GPT
本文总结介绍了GPT-1,GPT-2,GPT-3以及Instruct-GPT,Chat-GPT的技术原理文档
模型 | 发布时间 | 层数 | 头数 | 词向量长度 | 参数量 | 预训练数据量 |
---|---|---|---|---|---|---|
GPT-1 | 2018 年 6 月 | 12 | 12 | 768 | 1.17 亿 | 约 5GB |
GPT-2 | 2019 年 2 月 | 48 | – | 1600 | 15 亿 | 40GB |
GPT-3 | 2020 年 5 月 | 96 | 96 | 12888 | 1,750 亿 | 45TB |
GPT-1
(Improving Language Understanding by Generative Pre-Training)
论文:gpt1:
GPT-1原理介绍
GPT模型主要包含两个阶段,第一个阶段,先利用大量未标注的语料预训练一个语言模型(简单地说,语言模型就是用来计算一个句子的概率的模型,也就是判断一句话是否是人话的概率?),也就是先在没有标签的数据集上训练预训练语言模型,接着,在第二个阶段对预训练好的语言模型进行微改,将其迁移到各种有监督的NLP任务,并对参数进行fine-tuning。(亮点在于微调时只需要改变输入形式,而不需要改变模型结构)
无监督预训练
GPT用的结构和Transformer的encoder、decoder都不一样,encoder是两个线性层,但是没有masked,decoder是三个线性层,有masked。
在GPT中,作者基于一个12层的Transformer decoder作为语言模型的结构,并将decoder的中间那层线性变换删除,其结构和计算过程如下:
GPT用的结构和Transformer的encoder、decoder都不一样,encoder是两个线性层,但是没有masked,decoder是三个线性层,有masked。
fine-tuning(有监督微调)
当语言模型训练结束后,就可以将其迁移到具体的NLP任务中,假设将其迁移到一个文本分类任务中,记此时的数据集为 C ,对于每一个样本,其输入为 x 1 , ….,xm,输出为 y 。对于每一个输入,经过预训练后的语言模型后,可以直接选取最后一层Transformer最后一个时间步的输出向量 h^m,然后在其后面接一层全连接层,即可得到最后的预测标签概率:
若k是上下文窗口的大小。这个式子的含义是让模型看到前面 k个词,然后预测下一个词是什么,再根据真实的下一个词来计算误差,并使用随机梯度下降来训练。本质是希望模型能够根据前 k个词更好地预测下一个词。(语言模型的目标引入到目标函数中)
在具体的NLP任务中,作者在fine-tuning时也把语言模型的目标引入到目标函数中,作为辅助函数,作者发现这样操作可以提高模型的通用能力,并且加速模型收敛
不过,上面这个例子知识对与文本分类任务,如果是对于其他任务,比如文本蕴涵、问答、文本相似度等,那么GPT该如何进行微调呢?
-
文本蕴涵:对于文本蕴涵任务(文本间的推理关系,问题-答案),作者用一个$负号将文本和假设进行拼接,并在拼接后的文本前后加入开始符 start 和结束符 end,然后将拼接后的文本直接传入预训练的语言模型,在模型再接一层线性变换和softmax即可。
-
文本相似度:对于文本相似度任务,由于相似度不需要考虑两个句子的顺序关系,因此,为了反映这一点,作者将两个句子分别与另一个句子进行拼接,中间用“$”进行隔开,并且前后还是加上起始和结束符,然后分别将拼接后的两个长句子传入Transformer,最后分别得到两个句子的向量表示 h l m h_l^mhlm,将这两个向量进行元素相加,然后再接如线性层和softmax层。
-
问答和尝试推理:对于问答和尝试推理任务,首先将本经信息与问题进行拼接,然后再将拼接后的文本一次与每个答案进行拼接,最后依次传入Transformer模型,最后接一层线性层得到每个输入的预测值。
具体的方法可以查看下图,可以发现,对这些任务的微调主要是:
GPT-2
论文:gpt2:
大模型
GPT-2继续沿用了原来在GPT中使用的单向 Transformer 模型,而这篇文章的目的就是尽可能利用单向Transformer的优势,做一些BERT使用的双向Transformer所做不到的事。那就是通过上文生成下文文本。
情境学习(in-context learning):在被给定的几个任务示例或一个任务说明的情况下,模型应该能通过简单预测以补全任务中其他的实例。即,情境学习要求预训练模型要对任务本身进行理解。情境学习三种分类的定义和示例如下:
-
few-shot learning
-
定义:允许输入数条反例和一则任务说明
-
示例:向模型输入“这个任务要求将中文翻译为英文。你好->hello,再见->goodbye,购买->purchase,销售->”,然后要求模型预测下一个输出应该是什么,正确答案应为“sell”。
-
-
one-shot learning
-
定义:只允许输入一条范例和一则任务说明
-
示例:向模型输入“这个任务要求将中文翻译为英文。你好->hello,销售->”,然后要求模型预测下一个输出应该是什么,正确答案应为“sell”。
-
-
zero-shot learning
-
定义:不允许输入任何范例,只允许输入一则任务说明
-
示例:向模型输入“这个任务要求将中文翻译为英文。销售->”,然后要求模型预测下一个输出应该是什么,正确答案应为“sell”。
-
-
相较于GPT的改进:
-
更大的数据,更大的模型,将卖点指向zero-shot(0示例,仅含有任务描述)。
-
去掉了fine-tuning层:不再针对不同的任务进行微调建模,而是不定义模型应该做什么任务,模型自动识别出来需要做什么任务。
-
调整Transformer:将layer normalization放到每个sub-block之前,并在最后一个self-attention后再增加一个layer normalization.
GPT2提出的最重要的思想是“所有的监督学习都是无监督语言模型的一个子集”,这个思想也是提示学习(Prompt Learning的前身)
能做的task:阅读理解、翻译、总结、问答
-
无监督的预训练阶段和GPT相同。
-
zero-shot的 下游任务 (有监督学习)
下游任务转向做zero-shot而放弃微调。相较于GPT,由于缺少fine-tuning阶段,模型没有机会学习Start、Delim、Extract这些特殊的token。因此,GPT使用一种新的输入形态:增加文本提示,后来被称为Prompt
在训练的时候,采用了多任务的方式,不单单只在一个任务上进行学习,而是多个,每一个任务都要保证其损失函数能收敛,不同任务是共享主题Transformer参数的,进一步提升模型的泛化能力,因此在即使没有fine-tuning的情况下,依旧有非常不错的表现。
在fine-tuning有监督任务阶段,GPT-2根据给定输入与任务来做出相应的输出,那么模型就可以表示成下面这个样子: p(output∣input,task)
例如可以直接输入:(“自然语言处理”, 中文翻译)来得到我们需要的结果(“Nature Language Processing”),因此提出的模型可以将机器翻译,自然语言推理,语义分析,关系提取等10类任务统一建模为一个分类任务,而不误再为每一个子任务单独设计一个模型。
大规模无监督训练过程学习到了任务相关的信息。作者是这么认为的:比如下游任务是英文翻译法文,那么如果模型在无监督预训练的过程中看过了引用的那一大段的文字 (这句话 “Mentez mentez, il en restera toujours quelque chose,” which translates as, “Lie lie and something will always remain.” 是训练的语料),那么模型就能够学会 (translate to french, english text, french text) 这样的下游任务。
也就是说,原则上,通过大量的语料训练,语言建模能够学习到一系列下游任务,而不需要明确的监督信息。为什么可以这么讲呢?因为作者认为:下游任务 (有监督训练) 可以视为预训练过程 (无监督训练) 的一个子集。无监督目标的全局最优解也是有监督训练的全局最优解。当预训练规模足够大时,把无监督的任务训练好了,有监督的下游任务即不再需要额外训练,就是所谓的 “Zero-Shot”。
所以下面的问题就变成了:在实践中,我们如何能够优化无监督预训练过程以达到收敛。初步实验证实,足够大的语言模型能够在无监督的预训练过程之后做下游任务,但学习速度比显式监督方法慢得多。
那么最后一个问题就是具体怎么去做下游任务呢?以英文翻译法文为例,我们需要在下游任务时预先告诉模型 “translate English to French”,即给模型一个提示 (Prompt)。
GPT-3
海量参数 大模型
论文:gpt3:
-
提出问题:最近的许多研究都表明pre-train模型搭配下游任务fine-tune在许多情况下效果显著,但是微调过程需要大量的样本。这一框架不符合人类的习惯,人类只需要少量的示例或说明便能适应一个新的NLP下游任务。
-
主要贡献:本文证明了通过增大参数量就能让语言模型显著提高下游任务在Few-shot(仅给定任务说明和少量示例)设置下的性能,即证明了大规模语言模型使用元学习策略的可能和fine-tuning策略的非必要性
-
具体贡献:
-
训练了包含175billion参数(以往非稀疏语言模型的10倍大小)的GPT3自回归语言模型,并在多个数据集上测试没有fine-tune过程的性能表现。
-
虽然GPT3在文本翻译、问答系统、完型填空、新词使用和代数运算等任务表现不错,但在阅读理解和推理任务数据集上的表现仍有待提高。
-
由于GPT-3的训练依赖于大量的网页语料,所以模型在部分测试数据集上可能出现方法论级别的data containation问题。
-
GPT3能够编写出人类难以区分的新闻文章,本文讨论了该能力的社会影响力。
GPT-3采用了不同的学习方法。不需要大量标记数据来推断新问题。相反,它可以不从数据(零次学习 Zero-Shot Learning )中学习,只从一个例子(一次学习 one-Shot Learning)或几个例子中学习。
-
模型移除fine-tune有2个解决方案:
-
meta-learning(如图1.1):模型在训练阶段具备了一系列模式识别的能力和方法,并通过在预测过程中利用这些能力和方法以快速适应一个下游任务。最近的一些研究尝试通过称为in-context learning的方法来实现上述过程,然而效果距离期待的相差甚远。
-
Large scale transformers:Transformer语言模型参数的每一次增大都会让文本理解能力和其他的NLP下游任务的性能得到提升。此外,有研究指出描述许多下游任务性能的log损失能让模型的性能和参数之间服从一个平滑趋势。考虑到in-context learning会将学习到的知识和方法存在模型的参数中,本文假设:模型的情境学习能力也会随着参数规模的增长而增长。
Instruct-GPT
摘要 将语言模型做大并不一定能使其更好地跟随用户的意图。例如,大型语言模型可以生成不真实、有毒或根本无助于用户的输出。换句话说,这些模型并不与其用户对齐。在本文中,我们展示了一种通过与人类反馈进行微调,使语言模型与用户意图在广泛的任务上保持一致的方法。我们从一组标注器编写的提示和通过OpenAI API提交的提示开始,收集了一个标注器演示所需模型行为的数据集,我们使用该数据集使用监督学习对GPT-3进行微调。然后,我们收集了一个模型输出的排序数据集,我们使用该数据集通过人类反馈的强化学习来进一步微调这个监督模型。我们将得到的模型称为InstructGPT。在人类对我们的即时分布的评估中,1.3 B参数InstructGPT模型的输出优于175B GPT-3的输出,尽管其参数少了100倍。 此外,InstructGPT模型在对pu的性能回归最小的情况下,表现出真实性的提高和有毒产出生成的减少
-
收集了一个标注器演示所需模型行为的数据集,我们使用该数据集使用监督学习对GPT-3进行微调
-
收集了一个模型输出的排序数据集,我们使用该数据集通过人类反馈的强化学习来进一步微调这个监督模型
原本训练的目标函数是网上的文本数据中预测下一个词,这和我们想要的内容不匹配,可能会捏造事实
我们就要构造一个真正的语言模型目标函数aline
具体方法:OpenAI使用 RLHF(Reinforcement Learning from Human Feedback,人类反馈强化学习) 技术对 ChatGPT 进行了训练,且加入了更多人工监督进行微调。
GPT有两个目标:
-
提升模型在常见NLP任务上的表现效果;
-
提升模型在其他非典型NLP任务(例如代码编写,数学运算)上的泛化能力。
另外,预训练模型自诞生之始,一个备受诟病的问题就是预训练模型的偏见性。因为预训练模型都是通过海量数据在超大参数量级的模型上训练出来的,对比完全由人工规则控制的专家系统来说,预训练模型就像一个黑盒子。没有人能够保证预训练模型不会生成一些包含种族歧视,性别歧视等危险内容,因为它的几十GB甚至几十TB的训练数据里几乎肯定包含类似的训练样本。这也就是InstructGPT和ChatGPT的提出动机,论文中用3H概括了它们的优化目标:
-
有用的(Helpful);
-
可信的(Honest);
-
无害的(Harmless)。
人工反馈的强化学习(RLHF)
step1:让人写各种各样的问题(prompt)->让人写答案,把这个问题和答案拼成一段话,在GPT3上进行微调,得到的模型称为SFT(有监督的微调)—–(但是人写答案很贵,不能每个答案都给人写,要是这一步生成的答案够多其实可以不用后面两步)
step2:用训练好的预训练模型SFT生成多个答案,让人对这个几个答案好不好进行排序的标注,用这些数据训练一个奖励模型(RM,通给的问题和输出给一个分数,使得这个分数满足人工标注的分数排序
step3:继续微调SFT使其在RM中得分尽量高,最后训练出来的模型就叫Instruct-GPT
CHATGPT
ChatGPT训练过程的三个阶段可以总结如下:
采样和微调:训练过程的第一阶段涉及从提示库中采样并收集人类的响应。然后,在InstructGPT工具的帮助下使用这些数据对预训练的大型语言模型进行微调,以更好地捕捉人类偏好。
采样和训练奖励模型:在第二阶段,使用语言模型生成多个响应,然后根据人类偏好手动排序。然后,这些数据被用于训练一个符合人类偏好的奖励模型(RM)。
基于人类反馈的强化学习:基于阶段1的有监督微调模型和阶段2的奖励模型,使用强化学习算法进一步训练大型语言模型。这一阶段是RLHF训练的核心部分,使用强化学习中的近端策略优化(Proximal Policy Optimization, PPO)算法引入奖励信号,生成更符合人类偏好的内容。
github开源的GPT模型
Colossal AI
模仿chatgpt流程
最近,ColossalAI开源了他们的ChatGPT实现。分享了他们的三步策略,完整实现了ChatGPT核心的技术路线。
基于该项目的三步策略为:
-
第一阶段(stage1_sft.py):SFT监督微调阶段,该开源项目没有实现,这个比较简单,因为ColossalAI无缝支持Huggingface,直接用Huggingface的Trainer函数几行代码轻松实现,从其实现上看,其支持GPT2、OPT和BLOOM模型;
-
第二阶段(stage2_rm.py):奖励模型(RM)训练阶段,即项目Examples里train_reward_model.py部分;
-
第三阶段(stage3_ppo.py):强化学习(RLHF)阶段,即项目train_prompts.py。
三个文件的执行需要放在ColossalAI项目中,其中代码中的cores即原始工程中的chatgpt,cores.nn在原始工程中变成了chatgpt.models。
赞赏微信赞赏 支付宝赞赏