ChatGPT与GPT
ChatGPT,全称聊天生成预训练转换器(英语:Chat Generative Pre-trainedTransformer),是OpenAI开发的人工智能聊天机器人程序,于2022年11月推出。该程序使用基于GPT-3.5、GPT-4架构的大型语言模型并以强化学习训练。ChatGPT目前仍以文字方式交互,而除了可以用人类自然对话方式来交互,还可以用于甚为复杂的语言工作,包括自动生成文本、自动问答、自动摘要等多种任务。如:在自动文本生成方面,ChatGPT可以根据输入的文本自动生成类似的文本(剧本、歌曲、企划等),在自动问答方面,ChatGPT可以根据输入的问题自动生成答案。还有编写和调试计算机程序的能力。
ChatGPT是基于GPT模型的一种特定应用,是一种针对对话场景的GPT模型微调而来的聊天机器人。
GPT模型是一个可以对输入的自然语言文本进行处理的大型语言模型,可以预测下一个单词、生成文本、回答问题等。ChatGPT是在GPT基础上进行微调,并针对对话场景进行优化的模型。在微调阶段,ChatGPT使用了大量的对话数据,使模型更好地适应了对话场景的特点,如语言风格、对话主题等。
相比于GPT模型,在对话场景中,ChatGPT具有以下优点:
- 更加适应对话场景:ChatGPT在微调阶段针对对话场景进行了优化,使得模型在生成回答、维持对话连贯性等方面表现更好。
- 更加人性化:ChatGPT可以对用户的提问进行理解,并尝试以类似于人类的方式进行回答。
- 更好的交互体验:ChatGPT可以实现”真人对话”的体验,使得用户与机器人之间的交互更加自然、流畅。
GPT简介
GPT(Generative Pretrained Transformer)是由OpenAI公司开发的一种大型语言模型。GPT模型的核心是基于”变换器”(Transformer)架构,这种架构最初是在2017年由Vaswani等人提出的,主要用于处理自然语言处理(NLP)任务。
GPT的工作原理主要包括两个阶段:预训练和微调。
- 在预训练阶段,GPT在大量文本数据上进行训练,学习语言的通用模式和结构。这些文本数据可以包括书籍、文章、网页等。通过这个过程,模型能够学习到大量的词汇、语法规则和语言知识。
- 在微调阶段,GPT可以针对特定的任务进行额外训练。比如,可以在特定类型的文本上进行训练,以优化模型在某一特定领域的表现,如法律文档分析、医学咨询等。
GPT的一个显著特点是其生成能力。它不仅能够理解输入的文本,还能够生成连贯、相关且通常是准确的回答或内容。这使得GPT非常适合用于各种应用,如聊天机器人、内容创作、文本摘要等。
随着技术的发展,OpenAI发布了多个版本的GPT,包括GPT-2、GPT-3、以及更高级的版本。每个新版本通常在模型大小、训练数据和性能方面都有显著的提升。
GPT (Generative Pre-trained Transformer) 是由OpenAI公司开发的一系列自然语言处理模型, 采用多层Transformer结构来预测下一个单词的概率分布, 通过在大型文本语料库中学习到的语言模式来生成自然语言文本。
GPT系列模型主要包括以下版本:
- GPT-1。发布于2018年, 参数规模为17亿。模型采用Transformer进行特征抽取, 首次将Transformer应用于预训练语言模型。预训练的语料库包括英文维基百科、WebText等大规模文本数据。GPT-1是一个单向语言模型, 即它只能根据上下文来生成接下来的文本。
- GPT-2。发布于2019年, 参数规模为15亿。与GPT-1相比, 参数规模大了10倍以上, GPT-2生成的文本质量更高, 更加自然和流畅, 可以生成更长的文本段落。该模型在生成文本方面表现出色, 能够编故事甚至生成假新闻, 但由于其潜在的滥用风险, OpenAI公司选择不公开发布其完整参数和源代码。
- GPT-3。发布于2020年, 参数规模为1750亿。该模型在自然语言处理方面的表现十分出色, 可以完成文本自动补全、将网页描述转换为相应代码、模仿人类叙事等多种任务。GPT-3可以通过少量的样本进行零样本学习, 即在没有进行监督训练的情况下, 可以生成合理的文本结果。GPT-3的出现标志着语言模型的发展进入了一个新的阶段, 其生成的文本质量已经接近人类水平, 在众多领域具有应用潜力, 隐藏的伦理安全问题需引起关注和重视。
- GPT-4。发布于2023年。GPT-4是一个大型多模态模型, 支持图像和文本输入, 再输出文本回复。虽然在许多场景中其表现与人类存在差距, 但GPT-4在某些专业和学术测试中表现出拥有专业人士的水平: 它通过了模拟美国律师资格考试, 且成绩在应试者中排名前10%左右; 在SAT阅读考试中得分排在前7%左右。
OpenAI发布的一份技术报告中介绍了GPT-4的性能、局限性和安全性, 但有关技术架构、模型参数、训练方法以及硬件配置等内容的更多细节并未公开。
GPT-1
在GPT-1之前(和ELMo同一年),传统的NLP模型往往使用大量的数据对有监督的模型进行任务相关的模型训练,但是这种有监督学习的任务存在两个缺点:
- 需要大量的标注数据,高质量的标注数据往往很难获得,因为在很多任务中,标签并不是唯一的或者实例标签并不存在明确的边界;
- 根据一个任务训练的模型很难泛化到其它任务中,这个模型只能叫做”领域专家”而不是真正的理解了NLP。
这里介绍的GPT-1的思想是先通过在无标签的数据上学习一个生成式的语言模型,然后再根据特定热任务进行微调,处理的有监督任务包括
- 自然语言推理(Natural Language Inference或者Textual Entailment):判断两个句子是包含关系(entailment),矛盾关系(contradiction),或者中立关系(neutral);
- 问答和常识推理(Question answering and commonsense reasoning):类似于多选题,输入一个文章,一个问题以及若干个候选答案,输出为每个答案的预测概率;
- 语义相似度(Semantic Similarity):判断两个句子是否语义上市是相关的;
- 分类(Classification):判断输入文本是指定的哪个类别。
将无监督学习左右有监督模型的预训练目标,因此叫做生成式预训练(Generative Pre-training,GPT)。
利用无标签数据的难点
- 设计何种目标函数来学习文本表示。已有的各种目标函数和子任务的相关度比较高,没有说哪一种目标函数特别好。
- 如何有效地把语言模型学到的文本表示迁移到下游子任务上。因为NLP领域的各种任务差别比较大,没有一个统一有效的方式使得一种文本表示能够很好地迁移到各种子任务上。
算法关键
- 无监督训练的模型采用Transformer的decoder,目标函数采用标准的语言模型的目标函数,即通过前文预测下一个词。
- 有监督fine-tune采用标准的分类目标函数。此外,作者发现在有监督训练时额外加上语言模型的目标函数更好,能够提高模型的泛化性和加速模型收敛。
这个目标函数其实是比BERT模型那种完形填空式的语言模型目标函数要难,因为预测未来要比预测中间难。这可能也是导致GPT在训练和效果上比BERT差一些的一个原因。反过来说,如果你的模型真能预测未来,那么要比BERT这种通过完形填空训练的模型的强大很多。
GPT-1的训练
GPT-1的训练分为无监督的预训练和有监督的模型微调,下面进行详细介绍。
无监督预训练
在预训练阶段,GPT-1模型基于大规模的语料进行无监督预训练,得到文本的语义向量。具体来说,GPT-1采用了标准语言模型,即通过上文预测当前的词。
从上图可以看出,GPT-1只使用了Transformer的Decoder结构,而且只是用了Mask Multi-Head Attention。Transformer结构提出是用于机器翻译任务,机器翻译是一个序列到序列的任务,因此Transformer设计了Encoder用于提取源端语言的语义特征,而用Decoder提取目标端语言的语义特征,并生成相对应的译文。GPT-1目标是服务于单序列文本的生成式任务,所以舍弃了关于Encoder部分以及包括Decoder的Encoder-Decoder Attention层(也就是Decoder中的Multi-Head Attention)。
GPT-1保留了Decoder的Masked Multi-Attention层和Feed Forward层,并扩大了网络的规模。将层数扩展到12层,GPT-1还将Attention的维数扩大到768(原来为512),将Attention的头数增加到12层(原来为8层),将Feed Forward层的隐层维数增加到3072(原来为2048),总参数达到1.5亿。而BERT模型和GPT-1的模型区别,就是在图中,BERT是模型当中的Encoder部分,而GPT-1是模型当中的Decoder部分。
对于位置编码的部分,实际上GPT-1和普通的Transformer的区别还是很大的,普通的Transformer的位置编码,是由余弦+正弦的方式学习出来的,而GPT-1中,采用与词向量相似的随机初始化,并在训练中进行更新,即是把每一个位置当作一个要学习的embedding来做。
GPT-1的无监督预训练是基于语言模型进行训练的,给定一个无标签的序列 $\mathcal{U}=\{u_1,\cdots,u_n\}$ ,语言模型的优化目标是最大化下面的似然值:
$$L_1(\mathcal{U})=\sum_i\log P(u_i|u_{i-k},\dots,u_{i-1};\Theta)$$
其中 k 是滑动窗口的大小, P 是条件概率, $\Theta$ 是模型的参数。这些参数使用SGD进行优化。
在GPT-1中,使用了12个transformer块的结构作为解码器,每个transformer块是一个多头的自注意力机制,然后通过全连接得到输出的概率分布。
$$h_0=UW_e+W_p$$
$$h_l=\text{transformer_block}(h_{l-1})\forall i\in[1,n]$$
$$P(u)=\text{softmax}(h_nW_e^T)$$
其中 $U=(u_{-k},\dots,u_{-1}) $是当前时间片的上下文token, n 是层数, $W_e $是词嵌入矩阵, $W_p$ 是位置嵌入矩阵。
有监督微调
接下来在下游任务的fine-tune过程当中,可以看到GPT的各种不一样的玩法。其实仔细的研究一下可以发现,基本上都是一个Transformer+一个线性层来表达的,不同的地方在于模型的输入部分。而需要注意的另外一个细节,是fine-tune的loss函数,既包含了下游任务的loss,也包含了语言模型的loss(预测下一个单词),这么做的目的是在做垂直领域任务的时候,保持着自己本身的这种语言模型的性质,不要把语言本身给忘掉。
针对不同的下游任务,需要对输入进行转换,从而能够适应GPT-1模型结构,如图所示。
(左):transformer的基本结构,(右):GPT-1应用到不同任务上输入数据的变换方式
在开始的时候,我们介绍了GPT-1处理的4个不同的任务,这些任务有的只有一个输入,有的则有多组形式的输入。对于不同的输入,GPT-1有不同的处理方式,具体介绍如下:
- 分类任务:将起始和终止token加入到原始序列两端,输入transformer中得到特征向量,最后经过一个全连接得到预测的概率分布;
- 自然语言推理:将前提(premise)和假设(hypothesis)通过分隔符(Delimiter)隔开,两端加上起始和终止token。再依次通过transformer和全连接得到预测结果;
- 语义相似度:输入的两个句子,正向和反向各拼接一次,然后分别输入给transformer,得到的特征向量拼接后再送给全连接得到预测结果;
- 问答和常识推理:将n 个选项的问题抽象化为 n 个二分类问题,即每个选项分别和内容进行拼接,然后各送入transformer和全连接中,最后选择置信度最高的作为预测结果。
当得到无监督的预训练模型之后,我们将它的值直接应用到有监督任务中。对于一个有标签的数据集 $\mathcal{C} $,每个实例有 m 个输入token:$\{x^1,\dots,x^m\} $,它对于的标签 y 组成。首先将这些token输入到训练好的预训练模型中,得到最终的特征向量$h_l^m $。然后再通过一个全连接层得到预测结果y :
$$P(y|x^1,\dots,x^m)=\text{softmax}(h^m_lW_y)$$
其中 $W_y $为全连接层的参数。有监督的目标则是最大化式的值:
$$L_2(\mathcal{C})=\sum_{x,y}\log P(y|x^1,\dots,x^m)$$
作者并没有直接使用 $L_2$ ,而是向其中加入了$L_1 $,并使用 $\lambda $进行两个任务权值的调整, $\lambda $的值一般为 0.5 :
$$L_3(\mathcal{C})=L_2(\mathcal{C})+\lambda L_1(\mathcal{C})$$
当进行有监督微调的时候,我们只训练输出层的 $W_y$和分隔符(delimiter)的嵌入值。
对于GPT-1感兴趣的小伙伴可以研究一下他的代码minGPT。
GPT-1的数据集
GPT-1使用了BooksCorpus数据集,这个数据集包含 7,0007,000 本没有发布的书籍。作者选这个数据集的原因有二:
- 数据集拥有更长的上下文依赖关系,使得模型能学得更长期的依赖关系;
- 这些书籍因为没有发布,所以很难在下游数据集上见到,更能验证模型的泛化能力。
GPT-1的性能
在有监督学习的12个任务中,GPT-1在9个任务上的表现超过了state-of-the-art的模型。在没有见过数据的zero-shot任务中,GPT-1的模型要比基于LSTM的模型稳定,且随着训练次数的增加,GPT-1的性能也逐渐提升,表明GPT-1有非常强的泛化能力,能够用到和有监督任务无关的其它NLP任务中。GPT-1证明了transformer对学习词向量的强大能力,在GPT-1得到的词向量基础上进行下游任务的学习,能够让下游任务取得更好的泛化能力。对于下游任务的训练,GPT-1往往只需要简单的微调便能取得非常好的效果。
GPT-1在未经微调的任务上虽然也有一定效果,但是其泛化能力远远低于经过微调的有监督任务,说明了GPT-1只是一个简单的领域专家,而非通用的语言学家。
GPT-2
现有基于监督学习训练的模型的泛化性不是很好,在一个任务上训练好的模型也很难迁移到下一个任务上。多任务学习(Multitask learning)是指在训练一个模型时,同时看多个任务的数据集,而且可能通过多个损失函数来达到一个模式在多个任务上都能用的效果,但是在NLP领域用的不多。NLP领域主流的做法还是像GPT-1或BERT那样先在大量无标签数据上预训练语言模型,然后在每个下游任务上进行有监督的fine-tune,但是这样也有两个问题:
- 对于下游的每个任务,还是要重新训练模型
- 需要收集有标签的数据
这样导致在拓展到新任务上时还是有一定的成本。因此,GPT-2提出利用语言模型做下游任务时,不需要下游任务的任何标注信息,即zero-shot设定,也不用训练模型。因此基本实现一劳永逸,训练一个模型,在多个任务上都能用。
在GPT-1中,模型预训练完成之后会在下游任务上微调,在构造不同任务的对应输入时,我们会引入开始符(Start)、分隔符(Delim)、结束符(Extract)。虽然模型在预训练阶段从未见过这些特殊符号,但是毕竟有微调阶段的参数调整,模型会学着慢慢理解这些符号的意思。
在GPT-2中,要做的是zero-shot,也就是没有任何调整的过程了。这时我们在构造输入时就不能用那些在预训练时没有出现过的特殊符号了。所幸自然语言处理的灵活性很强,我们只要把想要模型做的任务”告诉”模型即可,如果有足够量预训练文本支撑,模型想必是能理解我们的要求的。
举个机器翻译的例子,要用GPT-2做zero-shot的机器翻译,只要将输入给模型的文本构造成translate english to chinese, [englist text], [chinese text]就好了。比如:translate english to chinese, [machine learning], [机器学习]。这种做法就是日后鼎鼎大名的prompt。下面还有其他任务的zero-shot形式:
- 问答:question answering prompt+文档+问题+答案: answer the question, document, question, answer。
- 文档总结:summarization prompt+文档+总结:summarize the document, document, summarization。
- 机器翻译任务:translate to french, english text, french text。”translate to french”这三个词可以被认为是一个特殊的分隔符,后面叫Prompt。
- 阅读理解任务:answer the question, document, question, answer
下图所示为GPT-2在不同任务上进行预测时采用的Prompt:
GPT-2和GPT-1的区别在于GPT-2使用了更多的网络参数和更大的数据集,以此来训练一个泛化能力更强的词向量模型。GPT-2相比于GPT-1有如下几点区别:
- 主推zero-shot,而GPT-1为pre-train+fine-tuning;
- 训练数据规模更大,GPT-2为800w文档40G,GPT-1为5GB;
- 模型大小,GPT-2最大15亿参数,GPT-1为1亿参数;
- 模型结构调整,层归一化和参数初始化方式;
- 训练参数,batch_size从64增加到512,上文窗口大小从512增加到1024,等等;
所以GPT-2的核心思想就是,当模型的容量非常大且数据量足够丰富时,仅仅靠语言模型的学习便可以完成其他有监督学习的任务,不需要在下游任务微调。
在模型结构方面,整个GPT-2的模型框架与GPT-1相同,只是做了几个地方的调整,这些调整更多的是被当作训练时的trick,而不作为GPT-2的创新,具体为以下几点:
- 后置层归一化(post-norm)改为前置层归一化(pre-norm)
- 在模型最后一个自注意力层之后,额外增加一个层归一化
- 调整参数的初始化方式,按残差层个数进行缩放,缩放比例为$1:\sqrt{n}$
- 输入序列的最大长度从512扩充到1024
GPT-2进行上述模型调整的主要原因在于,随着模型层数不断增加,梯度消失和梯度爆炸的风险越来越大,这些调整能够减少预训练过程中各层之间的方差变化,使梯度更加稳定。最终GPT-2提供了四种规模的模型,可以看到GPT-2的模型比GPT-1已经提升了一个数量级。其中117M参数等价于GPT-1模型,345M参数模型用于对标同期的BERT-large模型。
GPT-2的目标旨在训练一个泛化能力更强的词向量模型,它并没有对GPT-1的网络进行过多的结构的创新与设计,只是使用了更多的网络参数和更大的数据集。
GPT-2的核心思想
GPT-2的学习目标是使用无监督的预训练模型做有监督的任务。因为文本数据的时序性,一个输出序列可以表示为一系列条件概率的乘积:
$$p(x)=\prod_{i=1}^n p(s_n|s_1,\dots,s_{n-1})$$
上式也可以表示为 $p(s_{n-k},\dots,s_n|s_1,s_2,\dots,s_{n-k-1})$,它的实际意义是根据已知的上文 $input=\{s_1,s_2,\dots,s_{n-k-1}\}$ 预测未知的下文 $output=\{s_{n-k},\dots,s_k\}$,因此语言模型可以表示为 $p(output|input)$。对于一个有监督的任务,它可以建模为$p(output|input,task)$ 的形式。在decaNLP中,他们提出的MQAN模型可以将机器翻译,自然语言推理,语义分析,关系提取等10类任务统一建模为一个分类任务,而无需再为每一个子任务单独设计一个模型。
基于上面的思想,作者认为,当一个语言模型的容量足够大时,它就足以覆盖所有的有监督任务,也就是说所有的有监督学习都是无监督语言模型的一个子集。例如当模型训练完”Micheal Jordan is the best basketball player in the history”语料的语言模型之后,便也学会了(question:”who is the best basketball player in the history?”,answer:”Micheal Jordan”)的Q&A任务。
综上,GPT-2的核心思想概括为:任何有监督任务都是语言模型的一个子集,当模型的容量非常大且数据量足够丰富时,仅仅靠训练语言模型的学习便可以完成其他有监督学习的任务。
为什么移除fine-tune?
理论上,GPT-3也是支持fine-tuning,但是fine-tuning需要利用海量的标注数据进行训练才能获得比较好的效果,但是这样也会造成对其它未训练过的任务上表现差,所以GPT-3并没有尝试fine-tuning。
移除fine-tune必要性:
- 每一个新任务都需要大量的标记数据不利于语言模型的应用的。
- 提升模型表征能力的同时,降低数据分布复杂度是不合理的。比如,大模型并不能在样本外推预测时具有好效果,这说明fine-tune导致模型的泛化性降低了。
- 人类在接触一个下游语言任务时不需要大量样本,只需要一句对新任务的描述或者几个案例。人类这种无缝融合和切换多个任务的能力是当前自然语言技术所欠缺的。
模型移除fine-tune有2个解决方案:
- meta-learning (元学习):模型在训练阶段具备了一系列模式识别的能力和方法,并在预测过程中快速适应一个下游任务。最近的一些研究尝试通过称为 in-context learning(上下文学习,ICL)的方法来实现上述过程,然而效果距离期待的相差甚远。
- Large scale transformers(大规模 transformer):Transformer 语言模型参数的每次增大都会让文本理解能力和其他的 NLP 下游任务的性能得到提升。
此外,有研究指出描述许多下游任务性能的 log 损失能让模型的性能和参数之间服从一个平滑趋势。考虑到 in-context learning 会将学习到的知识和方法存在模型的参数中,本文假设:模型的情境学习能力也会随着参数规模的增长而增长。
GPT-2 的数据集
GPT-2 的文章取自于 Reddit 上高赞的文章,命名为 WebText。数据集共有约 800 万篇文章,累计体积约 40G。为了避免和测试集的冲突,WebText 移除了涉及 Wikipedia 的文章。
GPT-2 的性能
- 在 8 个语言模型任务中,仅仅通过 zero-shot 学习,GPT-2 就有 7 个超过了 state-of-the-art 的方法;
- 在“Children’s Book Test”数据集上的命名实体识别任务中,GPT-2 超过了 state-of-the-art 的方法约 7%;
- “LAMBADA”是测试模型捕捉长期依赖的能力的数据集,GPT-2 将困惑度从 8 降到了 8.6;
- 在阅读理解数据中,GPT-2 超过了 4 个 baseline 模型中的三个;
- 在法译英任务中,GPT-2 在 zero-shot 学习的基础上,超过了大多数的无监督方法,但是比有监督的 state-of-the-art 模型要差;
- GPT-2 在文本总结的表现不理想,但是它的效果也和有监督的模型非常接近。
Zero-Shot 实验
在有些任务上已经接近、超过之前某些有监督的方法;在比较困难的任务上,比如开放域问答,完全还看不到别人的影子。然而,看看曲线末端性能随模型规模提升的趋势,完全没有收敛的意思,这最后一段翘起的曲线,说明还有很大的提升空间。
GPT-2 的最大贡献是验证了通过海量数据和大量参数训练出来的词向量模型有迁移到其它类别任务中而不需要额外的训练。但是很多实验也表明,GPT-2 的无监督学习的能力还有很大的提升空间,甚至在有些任务上的表现不比随机的好。尽管在有些 zero-shot 的任务上的表现不错,但是我们仍不清楚 GPT-2 的这种策略究竟能做成什么样子。GPT-2 表明随着模型容量和数据量的增大,其潜能还有进一步开发的空间,基于这个思想,诞生了我们下面要介绍的 GPT-3。
GPT-3
GPT-3 结构和 GPT-2 一样,但是数据约为 GPT-2 的 1000 倍,模型参数约为 GPT-2 的 100 倍,暴力出奇迹,使得效果很惊艳。
研究表明,在 pretrain+finetune 模型中,当模型适应了下游任务的训练集后,往往会失去对下游任务的 OOD(out-of-distribution)泛化能力,这种能力也被称为 Zero-shot 能力。由于训练集不可能涵盖整个真实分布,而且预测数据的分布也随时间变化而变化,因此模型需要具备 OOD 的能力。通过构建 OOD 测试集,并与 IID(Independent Identically Distribution 指训练集和测试集是同分布但是互相独立)上的表现进行比较,进行了一些实验研究:
- 传统 NN 衰减很大,甚至只有 30%,而 PTM 衰减很小;
- 更大 size 的 PTM,并不一定表现更好;
- PTM 使用的训练数据的规模越大、多样性越强,表现越好,这点在 ChatGPT 的训练集构建中也体现出来了。
GPT-3 不再追求极致的 zero-shot 学习,即不给你任何样例去学习,而是利用少量样本去学习。因为人类也不是不看任何样例学习的,而是通过少量样例就能有效地举一反三。
由于 GPT-3 庞大的体量,在下游任务进行 fine-tune 的成本会很大。因此 GPT-3 作用到下游子任务时,不进行任何的梯度更新或 fine-tune。
整体来看,GPT-3 相比于 GPT-2 有如下几点区别:
- 效果上,超出 GPT-2 非常多,能生成人类难以区分的新闻文章;
- 主推 few-shot,相比于 GPT-2 的 zero-shot,具有很强的创新性;
- 模型结构略微变化,采用 sparse attention 模块;
- 海量训练语料 45TB(清洗后 570GB),相比于 GPT-2 的 40GB;
- 海量模型参数,最大模型为 1750 亿,GPT-2 最大为 15 亿参数;
GPT-3 的训练
预训练
在模型结构上,GPT-3 延续使用 GPT 模型结构,但是引入了 SparseTransformer 中的 sparse attention 模块(稀疏注意力)。
sparse attention 与传统 self-attention(称为 dense attention)的区别在于:
- dense attention:每个 token 之间两两计算 attention,复杂度 $O(n^2)$。
- sparse attention:每个 token 只与其他 token 的一个子集计算 attention,复杂度 $O(n*\log n)$。
具体来说,sparse attention 除了相对距离不超过 k 以及相对距离为 k,2k,3k,…的 token,其他所有 token 的注意力都设为 0,如下图所示:
我们来具体观察一下,实际上图中的第二行就是涉及到的 attention 的 token 内容,可以看出首先关注了附近四个 token,其次是 2k,3k 距离的 token,那么为什么这么做呢?使用 sparse attention 的好处主要有以下两点:
- 减少注意力层的计算复杂度,节约显存和耗时,从而能够处理更长的输入序列
- 具有“局部紧密相关和远程稀疏相关”的特性,对于距离较近的上下文关注更多,对于距离较远的上下文关注较少
但是批判性的角度来讲,肯定是有缺点的,NLP 语言中内容都是有上下文关系的,如此依赖必定会对长文本建模的效果变差。关于 sparse attention 详情可参考《Generating Long Sequences with Sparse Transformers》。最终 GPT-3 在训练过程中得到了如下不同规模的模型:
其中规模最大的模型称为 GPT-3,模型参数量为 1750 亿。
zero-shot/few-shot
GPT-3 是一种语言模型,它可以通过少量的样本进行学习,因此被称为“Few-Shot Learner”。和人类一样,GPT-3 不需要完全不看任何样例就能学习,只需要看一小部分样例就能学会更多的知识。GPT-3 的体量非常庞大,因此在下游任务中进行 fine-tune 的成本很高。为了解决这个问题,GPT-3 使用了“In-Context Learning”的方式,在不进行梯度更新或 fine-tune 的情况下,直接在上下文中进行学习。
如上图所示,GPT-3 在下游任务的评估与预测时,提供了三种不同的方法:
- Zero-shot:仅使用当前任务的自然语言描述,不进行任何梯度更新;
- Few-shot:当前任务的自然语言描述,加上几个简单的输入输出样例,不进行任何梯度更新;
One-shot:当前任务的自然语言描述,加上一个简单的输入输出样例,不进行任何梯度更新;
其中 Few-shot 也被称为 in-context learning,虽然它与 fine-tuning 一样都需要一些有监督标注数据,但是两者的区别是:
- fine-tuning 基于标注数据对模型参数进行更新,而 in-context learning 使用标注数据时不做任何的梯度回传,模型参数不更新;
- in-context learning 依赖的数据量(10~100)远远小于 fine-tuning 一般的数据量;
最终通过大量下游任务实验验证,Few-shot 效果最佳,One-shot 效果次之,Zero-shot 效果最差,这是合乎情理的事情。
上图中,横坐标为模型参数量,纵坐标为任务精度,图中大量灰色线表示不同下游任务,橙色/绿色/蓝色线是下游任务效果的平均值。
这张图显示了随着测试案例数量的增加,模型大小对最终效果的影响。虚线代表没有使用 Prompt(自然语言描述)。可以看到,模型越大,测试案例数量越多,最终效果越好。当测试案例很多时,Prompt 变得不那么重要,因为从案例中也可以推断出任务类型。
这张图显示了任务精度与计算量(模型规模或数据量)之间的关系。要实现线性提高任务效果,通常需要指数级增加模型规模和数据量。也就是说,为了获得更好的效果,我们需要投入更多的计算资源和数据量。
GPT-3 的数据集
GPT-3 的训练数据包括低质量的 CommonCrawl,高质量的 WebText2,Books1,Books2 和 Wikipedia。GPT-3 根据数据集的不同的质量赋予了不同的权值,权值越高的在训练的时候越容易抽样到。相比之下,GPT-2 的训练数据包括了 WebText、BooksCorpus、Stories、Wikipedia 和 ProjectGutenberg 等。为了清理脏数据,OpenAI 做了以下的数据处理部分:
- 使用高质量数据作为正例,训练 LR 分类算法,对 CommonCrawl 的所有文档做初步过滤;
- 利用公开的算法做文档去重,减少冗余数据;
- 加入已知的高质量数据集;
其中“高质量数据”主要是指 BERT、GPT、GPT-2 使用过的数据,最终处理完成后使用的数据规模约 570G。
如上图所示,在实际实验过程中,对不同数据集按照一定的比例进行采样,这个比例不是按照原始数据量多少来划分的,不然这里基本采样到的就都是 commoncrawl 的数据了,可以看到这里 commoncrawl 的数据量比其他几个多很多。进行采样的原因主要考虑到,就算做了一些数据清洗还是觉得 commoncrawl 的数据质量不如其他几个。最终采样的时候,虽然 commoncrawl 的数据量是其他几个数据集的上百倍,但是实际占比是 60%,有 40% 的数据是能够保证质量的。
GPT-3 的性能
仅仅用惊艳很难描述 GPT-3 的优秀表现。首先,在大量的语言模型数据集中,GPT-3 超过了绝大多数的 zero-shot 或者 few-shot 的 state-of-the-art 方法。另外 GPT-3 在很多复杂的 NLP 任务中也超过了 fine-tune 之后的 state-of-the-art 方法,例如闭卷问答,模式解析,机器翻译等。除了这些传统的 NLP 任务,GPT-3 在一些其他的领域也取得了非常震惊的效果,例如进行数学加法,文章生成,编写代码等。
GPT-3 的局限性
GPT-3 虽然很强悍,但是仍旧有局限性:
- 当生成文本长度较长时,GPT-3 还是会出现各种问题,比如重复生成一段话,前后矛盾,逻辑衔接不好等等;
- 模型和结构的局限性,对于某一些任务,比如填空类型的文本任务,使用单向的自回归语言模型确实存在一定的局限性,这时候如果同时考虑上文和下文的话,效果很可能会更好一些;
- 预训练语言模型的通病,在训练时,语料中所有的词都被同等看待,对于一些虚词或无意义的词同样需要花费很多计算量去学习,无法区分学习重点;
- 样本有效性或者利用率过低,训一个模型几乎要把整个互联网上的文本数据全都用起来,这与我们人类学习时所需要的成本存在非常大的差异,这方面也是未来人工智能研究的重点;
- 有一个不太确定的点是,模型到底是在“学习”还是在“记忆”?我们当然希望它能够学习,但是在使用数据量如此大的情况下,很难去判断它到底是什么样的;
- 众所周知,GPT-3 的训练和使用成本都太大了;
- GPT-3 跟很多深度学习模型一样,都是不可解释的,没办法知道模型内部到底是如何作出一系列决策的;
- 模型最终呈现的效果取决于训练数据,这会导致模型会出现各种各样的“偏见”;
GPT-3.5 与 InstructGPT
GPT-3 纵然很强大,但是对于人类的指令理解的不是很好,这也就延伸出了 GPT3.5 诞生的思路。在做下游的任务时,我们发现 GPT-3 有很强大的能力,但是只要人类说的话不属于 GPT-3 的范式,他几乎无法理解。例如,我们说把句子 A 变成句子 B,这种到底是机器翻译呢,还是同语言的转述,都需要让 GPT-3 学习到才是可以的。
在这个背景下,OpenAI 提出了一个概念“Alignment”,意思是模型输出与人类真实意图对齐,符合人类偏好。因此,为了让模型输出与用户意图更加“align”,就有了 InstructGPT 这个工作。
从做研究的角度来讲,其实很多时候人们并不在意“Alignment”问题,只要一个模型在评估的数据集上表现好,那基本就可以说是一个好模型;但是对于工业界来说,一个产品的安全性就显得尤为重要,历史上也出现过不止一次因为某个负面 case,引发社会争议,从而导致整个产品下线的例子,特别是对于大公司来讲,出现一次负面 case 通常是比较严重的。比如之前 google 和 facebook 就都出现过把照片中的黑人识别成黑猩猩的事件,然后随之而来的就是产品的整改,公关道歉之类的。所以从这个角度来讲,OpenAI 做 InstructGPT 的出发点是非常合理且重要的。
InstructGPT 是为解决 LM 有时不能遵循用户意图而诞生的。“不能遵循用户意图”表示 LM 可能会生成不真实、有毒或对用户毫无帮助的输出。主要原因是 LM 的训练目标是预测下一个 token 而不是有帮助地和安全地遵循用户的指令。换句话说,这些模型与其用户没有对齐。这是由于模型的偏见性和数据中存在的一些有毒内容导致模型会输出无用的、有毒的输出(LM 并没有对输出是否无用、是否有毒的监督)。因此,InstructGPT 要做的就是是模型的输出符合人类的意图。这种改进是十分有必要的,尤其是当 LM 被部署在多个应用场景中时。具体而言,InstructGPT 的优化目标有三个(3H):
- Helpful,模型应该帮助用户解决他们的任务;
- Honest,模型不应该编造信息来误导用户;
- Harmless,模型不应对人或环境造成身体、心理或社会伤害。
为了解决上述问题,Fine-tuning 步骤又回到了 InstructGPT,但与传统的 Fine-tuning 不同。
GPT3.5 和 InstructGPT 的关系
GPT3.5 和 InstructGPT 都是基于 GPT 模型的改进版本,在应用场景和技术方向上存在一些不同,但两者并没有直接的关系。
- GPT3.5 是 OpenAI 公司在 2021 年推出的一种基于 GPT-3 模型的改进版本,它增加了更多的训练数据和模型参数,同时通过改进训练过程和优化模型架构,提高了模型的性能和表现。GPT3.5 在各种 NLP 任务中表现出色,如自然语言生成、机器翻译、文本分类等。
- InstructGPT 是由微软亚洲研究院在 2021 年提出的一种基于 GPT 模型的改进版本,旨在为电子商务领域提供更加智能的客户服务。它引入了自主学习的学习机制,可以通过领域内专家的指导,自主学习和理解领域知识,并在客户服务中进行应用。目前,InstructGPT 已被应用于微软的客户服务中心。
虽然 GPT3.5 和 InstructGPT 都是基于 GPT 模型的改进版本,但两者的应用场景和技术方向不同,没有直接的关系。GPT3.5 侧重于提高模型性能和表现,而 InstructGPT 则侧重于结合领域专家的指导,提供更加智能的客户服务。
ChatGPT 是基于 GPT3.5 的基础模型框架,核心变化在于通过真实的调用数据以及人类反馈的强化学习进行训练。ChatGPT3.5 主要用于自然语言处理、机器翻译等任务,而 ChatGPT3.5-Turbo 拥有更强大的强度,可用于更复杂的语言分析,比如情感分析、语法结构分析。所以,ChatGPT 和 GPT3.5 是同一系列的产品,但 ChatGPT 是在 GPT3.5 的基础上进行了改进和优化。
GPT3.5 优点:
- 多功能性:5 可以回答各种问题,提供创意灵感,支持语音识别等多种功能,可以应用于多个领域,如技术支持、智能客服、文本生成等。
- 自然语言处理能力:5 具备较强的自然语言处理能力,可以模拟人类对话,表达思想和感情,提供更加自然流畅的回答。
- 多语种支持:5 支持多种语言,可以满足不同国家和地区的语言需求。
- 智能学习:5 可以通过对大量数据进行学习,不断提高自身的表达能力和回答准确率,具备一定的智能学习能力。
- 便捷性:5 可以通过第三方的应用程序或者网站、OpenAI 提供的 API 或者在 OpenAI 官方网站上使用,使用起来非常便捷。
GPT3.5 缺点:
- 可能存在偏见:由于 5 是通过对大量数据进行学习得到的,可能存在数据偏见的问题。这可能导致 GPT3.5 对某些群体或某些观点的回答存在偏见。
- 缺乏人情味:尽管 5 可以模拟人类对话,但它仍然缺乏真正的情感和人性化,无法像真正的人类一样进行复杂的思考和情感表达。
- 需要大量数据:为了让 5 具备较高的回答准确率和表达能力,需要训练大量的数据,这需要消耗大量的时间和资源。
- 可能存在安全隐患:在使用 5 模型时,需要输入一定的文本或语音数据,这可能会导致个人隐私泄露的风险。
InstructLearning
InstructLearning 是由 Google 提出。InstructLearning 和 PromptLearning 的目的都是去深入挖掘已经具备的知识,并激发出更强的能力。不同的是,Prompt 是激发 LM 的补全能力,例如根据上半句生成下半句,或者是 Cloze;而 InstructLearning 是激发语言模型的理解力,通过给出明显的指令,让模型去做出正确的行动。通过如下例子来理解两种学习方式:
- PromptLearning:给女朋友买了这个项链,她很喜欢,这个项链太\_\_了。
- InstructLearning:判断这句话的情感:给女朋友买了这个项链,她很喜欢。选项:A=好;B=一般;C=差。
InstructLearning 原文对传统 Fine-tuning、PromptLearning 和 Instructiontuning 的对比:
- 传统 Fine-tuning:需要大量任务特定的样本;每个任务都需要 Fine-tuning 一个特别的模型;
- Prompt:通过少数示例或 prompt 工程提升性能;
- Instructiontuning:通过自然语言指令学习执行多个任务。
Instruct-tuning 的一些模版,如下图:
Instruct-tuning 的 Zero-shot 效果如下图所示:
从实验效果来看,1370 亿参数的 FLAN(Pre-training+instructiontuning)比 1750 亿参数的 GPT-3 在各个任务上效果要好,甚至在某些任务上(Translation)比全监督的算法要好,体现了 Instructiontuning 在激发/激活 LM 潜力方面和泛化能力的优越表现。
Instructionlearning 能够进一步将任务编码到模型参数中,在 inference 的时候,模型能够根据 Instruction 中的任务描述,输出与任务相关的结果。其实 LM 本身是生成式模型,PromptLearning 其实是通过使模型在生成答案的时候 condition on Prompt 来区分任务,本质上还是强化了模型的补全能力,而 Instructionlearning 使模型 condition on 对任务更丰富的描述,从而加强对任务的理解。
InstructGPT 的技术方案
关于 InstructGPT 的技术方案,原文分为了三个步骤:有监督微调,奖励模型训练,强化学习训练;实际上可以把它拆分成两种技术方案,一个是有监督微调(SFT),一个是基于人类反馈的强化学习(RLHF)。
Step1 监督策略模型(SFT supervised fine-tuning)
尽管 GPT-3 具有强大的语言处理能力,但它很难理解人类不同类型指令中蕴含的不同意图,并且很难判断生成内容是否是高质量的结果。为了解决这个问题,采取了以下步骤:
- 首先,从测试用户提交的 prompt 中随机抽取一批,然后请专业的标注人员为这些 prompt 给出高质量答案。
- 接下来,我们使用这些<prompt,answer>数据来 Fine-tune GPT-3 模型,以使其初步具备理解人类 prompt 中所包含意图,并根据这个意图给出相对高质量回答的能力。
这一步骤中包含了 1.2 万条训练数据。虽然这个过程是有效的,但显然这还不足以解决所有问题。
在这里使用余弦学习率衰减和残差 dropout 为 0.2 进行了 16 个 epoch 的训练。根据验证集上的 RM 分数进行最终的 SFT 模型选择。论文发现 SFT 模型在第 1 个 epoch 后会出现过拟合情况,然而,后来实验发现训练更多的 epoch 会提高 RM 分数和人类偏好评分,尽管会出现这种过拟合情况。所以看来过拟合即使出现也不影响最终的学习结果。
Step2 训练回报模型(Reward Model, RM)在这个阶段,论文中的研究者的主要目的是通过人工标注训练数据来训练回报模型。对用户提交的prompt进行随机抽样,并使用第一阶段Fine-tune好的冷启动模型,生成K个不同的回答,形成<prompt, answer1>, <prompt, answer2>…. <prompt, answerK>数据。然后,标注人员根据相关性、信息性和有害信息等标准,对K个结果进行排序,生成排序结果数据。接下来,研究者使用这个排序结果数据进行pair-wise learning to rank训练模式,训练回报模型。RM模型接受一个输入<prompt, answer>,给出评价回答质量高低的回报分数Score。对于一对训练数据<answer1, answer2>,假设人工排序中answer1排在answer2前面,那么Loss函数则鼓励RM模型对<prompt, answer1>的打分要比<prompt, answer2>的打分要高。
实际上GPT3.5的RM标注数据,会使用到一些硬性的,主观性不是那么强的指标,例如是否回答问题,是否为低俗色情等等,但是不会完全依赖于这些指标,为什么呢?因为人类的标注都是有很强主观性的,有的人认为是好的答案,有的人就是认为不好,所以并不能通过分数来衡量。那怎么办呢?所以才提出了排名的方式,排名越靠前的越好,这就相当于默认考虑了这些潜在因素。
Step3-强化学习来增强预训练模型(Reinforcement Learning from Human Feedback,RLHF)
InstructGPT采用基于人类反馈的强化学习(RLHF)来不断微调预训练语言模型(LLM),旨在让模型能够更好地理解人类的命令和指令含义,如生成小作文、回答知识问题和进行头脑风暴等。该方法不仅让模型学会判断哪些答案是优质的,而且可以确保生成的答案富含信息、内容丰富、对用户有帮助、无害和不包含歧视信息等多种标准。因此,RLHF是一种有效的方法,可以帮助LLM不断提升性能和适应各种用户需求。
基于SFT得到的模型被用于后续的RLHF做进一步的模型优化。如上图所示,以摘要生成任务为例,详细展示了如何基于人类反馈进行强化学习,最终训练完成得到InstructGPT模型。主要分为三步:
- 收集人类反馈:使用初始化模型对一个样本生成多个不同摘要,人工对多个摘要按效果进行排序,得到一批排好序的摘要样本;
- 训练奖励模型:使用第1步得到的样本集,训练一个模型,该模型输入为一篇文章和对应的一个摘要,模型输出为该摘要的得分;
- 训练策略模型:使用初始化的策略模型生成一篇文章的摘要,然后使用奖励模型对该摘要打分,再使用打分值借助PPO算法重新优化策略模型;
在这个阶段,研究者不需要人工标注数据,而是利用之前学习好的RM模型,通过PPO强化学习来更新预训练模型参数。从用户提交的命令中,随机选择一些新的命令,让PPO模型来生成回答。接着,用RM模型对这些回答进行评估,并给出一个分数作为回报。研究者的目标是训练LLM模型生成的答案能够获得高分数,也就是符合RM标准的高质量回答。最后,根据得到的回报分数来更新PPO模型的参数,以便让LLM模型生成更好的回答。
其实上面说的也是比较笼统的,大致意思是需要强化学习,还有奖励函数来更新语言模型,这么做的原因纯粹是为了让模型知道用户的指令。既然是强化学习,那么我们势必需要强化学习的三要素:策略(policy)、动作空间(action space)和奖励函数(reward function)等基本要素。
显然,策略就是基于该语言模型,接收prompt作为输入,然后输出一系列文本(或文本的概率分布);而动作空间就是词表所有token在所有输出位置的排列组合(单个位置通常有50k左右的token候选);观察空间则是可能的输入token序列(即prompt),显然也相当大,为词表所有token在所有输入位置的排列组合;而奖励函数(reward)则是基于训好的RM模型计算得到初始reward,再叠加上一个约束项来。整个过程如下图所示:
那么具体来说,是如何根据PPO来进行网络更新呢?实际上核心在于新旧两个网络,通过不断拉大新旧两个网络的距离,来让最终的新网络越好。下面是通俗易懂的操作步骤:
- 定义“旧”的策略和“新”的策略。这两个策略都是我们用来指导智能体行动的指南。
- 通过与环境交互,我们可以收集到从当前状态开始采取不同动作所得到的奖励,并计算每个动作的概率比例、价值函数以及优势函数等。这些都是用于评估策略表现的指标。
- 接着,我们会计算新旧策略之间的差异,并使用一个剪切函数来约束更新幅度,以最大程度地提高未来预期回报。
- 将该变化量应用于模型参数中,以更新模型并改进策略。
- 重复上述步骤多次,直到模型收敛为止。
举个例子,假设我们正在训练一个自主驾驶汽车,希望它能够在城市道路上安全地行驶。我们可以使用PPO算法来训练它,让它从当前位置出发,不断采取不同的驾驶决策(如加速、刹车、转弯等),并根据所得到的奖励来调整模型参数。通过重复这个过程,我们可以逐渐改进模型,让自主驾驶汽车学会更好地行驶。
那么问题来了,为什么使用PPO方法来更新GPT3呢?实际上是因为有限的Prompt导致的,我们不能够训练无限多的Prompt,类似于强化学习中无限的环境,所以只能够通过新旧模型预测的差别来进行学习速度上的提升。那么PPO究竟如何应用在GPT-3中呢?
从上图中可以看到,base模型是绿色的,RL Policy是灰色的,他们两个都会根据同样的Prompt来输出不同的结果,而接下来就是把两个模型的Reward分数拉的尽可能的大,使得两个的差别越大越好,所以在下面的公式当中,利用了KL DIvergence来衡量两个模型之间分布的差异。而之后,这个分数会用来更新RL模型,也即是GPT-3,所以RLHF的核心就是利用强化学习的思路来更新GPT的网络。
如果研究者一直重复第二和第三步骤,那么每一轮迭代过后,LLM模型的能力都会变得更强。这是因为第二步骤使用人工标注数据来提高RM模型的能力,第三步骤则利用增强的RM模型对新问题的答案作出更准确的评分,并使用强化学习来鼓励LLM模型学习新的高质量内容。这就像是使用伪标签来扩充高质量训练数据一样,进一步增强了LLM模型的能力。显然,第二和第三步骤相互促进,这就是为什么不断迭代会有持续增强效果的原因。
InstructGPT的数据集
InstructGPT论文中,给出了上述三个步骤,分别制造/标注了多少样本:
- SFT数据集(即第一步人类根据prompt自己写理想的输出,SFT:supervised fine-tuning),包含13K的prompts;
- RM数据集(即第二步用来训练打分模型的数据),包含33K的prompts;
- PPO数据集(即第三步用来训练强化学习PPO模型的数据),包含31K的prompts。
前两步的prompts来自于OpenAI的在线API上的用户使用数据,以及雇佣的标注者手写的。最后一步则全都是从API数据中采样的,
总共加起来也就77K数据,而其中涉及人工的只有46K。GPT-3继续在77K数据上进行了进一步微调得到了InstructGPT。
总的来说,InstructGPT相对于之前的GPT系列,有以下几点值得注意:
- 解决GPT-3的输出与人类意图之间的Align问题;
- 让具备丰富世界知识的大模型,学习“人类偏好”;
- 标注人员明显感觉InstructGPT的输出比GPT-3的输出更好,更可靠;
- InstructGPT在真实性,丰富度上表现更好;
- InstructGPT对有害结果的生成控制的更好,但是对于“偏见”没有明显改善;
- 基于指令微调后,在公开任务测试集上的表现仍然良好;
- InstructGPT有令人意外的泛化性,在缺乏人类指令数据的任务上也表现很好
4.3模型优缺点
GPT3.5作为自然语言处理领域的重要技术之一,具有非常广泛的应用前景和发展潜力。通过对话生成技术,可以实现智能客服、知识问答系统、自然语言生成等多种应用场景,大大提高了人机交互的效率和便利性。随着计算机技术的不断发展和深度学习算法的不断进步,GPT3.5的应用领域也将不断扩展和深化,为人们提供更加先进、高效、智能的自然语言处理服务。
GPT-4
GPT-4(第4代生成式预训练变换模型 Generative Pre-trained Transformer 4)是一个大型多模态模型,能够接受图像和文本输入,并输出文本。GPT4依旧采用Transformer模型结构,具有处理图片的能力,模型结构不再是Decoder-only,而是具有Encoder完成图像的编码。
GPT4模型比GPT3模型参数量增大数倍,模型参数量或接近万亿级别,为了训练GPT4,OpenAI使用了Microsoft的Azure云计算服务,其中包括连接在一起的数千个Nvidia A100图形处理单元或GPU。GPT4在训练策略中提出RBRMS(基于规则的奖励模型)来处理安全性问题。
- 模型规模:GPT-4的规模比GPT-3更大,包括更多的参数和更深的网络结构。随着规模的增加,GPT-4能够捕捉更为复杂的语言模式和语义关系,从而提高对自然语言的理解和生成能力。
- 性能提升:由于规模的扩大,GPT-4相较于GPT-3在多数自然语言处理任务中表现出更高的性能。这包括阅读理解、机器翻译、摘要生成、问答等任务。这意味着GPT-4能够更好地理解用户输入,生成更准确、更自然的回复。
- 训练数据和数据清洗:GPT-4使用了更新、更丰富的训练数据集。相较于GPT-3,GPT-4在数据筛选和清洗方面采取了更为严格的标准,以减少训练数据中的错误信息、过时内容和偏见。
- 微调能力:GPT-4在微调方面的表现优于GPT-3,这意味着使用较少的标签数据,GPT-4就能适应特定任务和领域。这使得GPT-4在个性化定制和特定场景下的应用更为灵活和高效。
- 鲁棒性和可解释性:GPT-4在模型鲁棒性和可解释性方面取得了一定的进展。通过引入新的技术和方法,GPT-4能够更好地处理异常输入、抵抗对抗性攻击,同时提供关于其预测的可解释性。
- 优化资源消耗:虽然GPT-4的规模更大,但OpenAI已经采取了一系列优化措施,以降低模型在训练和推理阶段的资源消耗。这使得GPT-4在保持高性能的同时,降低了计算成本和环境影响。
- 生成策略的改进:GPT-4在生成策略方面进行了优化,提高了输出文本的质量、多样性和可控性。这意味着GPT-4在生成回复时能够更好地满足用户的需求和偏好,同时降低了生成无关、重复或不恰当内容的风险。
- 更广泛的应用领域:得益于性能的提升和优化措施,GPT-4在各种应用领域具有更广泛的适用性。除了传统的自然语言处理任务外,GPT-4还能够应对更复杂的场景,如多模态任务、知识图谱生成等。
- 社区支持与开发工具:随着GPT-4的推出,OpenAI也为开发者提供了更丰富的支持资源和工具,包括API、SDK、预训练模型等。这使得开发者更容易在自己的项目中集成和利用GPT-4。
多模态涌现能力
讲到大语言模型的优势,一般首先要提到这类模型的涌现能力和思维链。这两者是大语言模型不断接近人类的关键特征。
我们之所以认为GPT-4会是具有里程碑意义的一代,正是因为多模态的GPT-4会从视觉角度和视觉-文字语义融合方面涌现出更多的能力。2022-2023年,我们可以认为AI是第一次睁开双眼理解这个世界。
在大型语言模型(LLM)中,涌现能力(Emergent Abilities)是指模型具有从原始训练数据中自动学习并发现新的、更高层次的特征和模式的能力。就中文释义而言,涌现能力也指大语言模型涌现出来的新能力。这有点类似于去超市遇到买二赠一,赠品的质量居然还出乎意料。
与大语言模型(LLM)相比,多模态大语言模型(Multi-modal Large Language Model,MLLM)可实现更好的常识推理性能,跨模态迁移更有利于知识获取,产生更多新的能力,加速了能力的涌现。这些独立模态或跨模态新特征、能力或模式通常不是通过目的明确的编程或训练获得的,而是模型在大量多模态数据中自然而然的学习到的。
▲缩放定律(参数增加后精度损失连续减少)V.S.涌现能力(1010-1011参数后新能力的涌现)
在语言模型发展的早期,通过在更多数据上训练更大的模型,可获得近似连续的精确度提升。(可称为缩放定律/Scaling Laws)到了2015年左右,随着深度学习技术的发展和语料库的增大,模型达到一定的临界规模后,NLP开发者们发现,大语言模型(包括GPT-3、GLaM、LaMDA和Megatron-Turing NLG等)开始表现出一些开发者最开始未能预测的、更复杂的能力和特性,这些新能力和新特性被认为是涌现能力的体现。
在研究GPT-4时,发现GPT-4具备了OpenAI在预训练时和发表的技术报告中并未明确的能力。这些能力都属于涌现出来的能力。
涌现能力是基于深度学习模型的分层结构和权重学习机制实现的。涌现出来的能力可以是基于文本的,也可以是多模态的。我们可以将GPT-4这类大模型的训练视为解方程,每一层神经元(可视为变量组合)的输出都作为下一层神经元的输入,并且模型的每个权重(Weight)都通过强化学习算法进行学习和更新。这种分层的结构和权重学习机制使得深度学习模型能够自动的学习到从原始数据中提取隐含的特征和模式,从而实现涌现能力。
当大语言模型被训练时,通过学习大量的多模态训练数据,并且根据数据中的统计规律和模式自适应的调整其内部参数和结构,从而表现出一些新的能力和特性。这类似于咱们常说的量变引发质变。
涌现能力是大语言模型的重要特性,也是现在火爆的大模型各种能力的理论基础。涌现能力使得GPT-4能够在无需人工干预的情况下,从原始的多模态数据中自动学习到复杂的特征和模式,从而实现更准确和更高效的预测和决策。
涌现能力的另一个重要表现是模型的泛化能力。在没有专门训练过的情况,GPT-4也可以泛化到新的、未知的多模态数据样本上。这种泛化能力取决于模型的结构和训练过程,以及数据的数量和多样性。如果模型具有足够的复杂性和泛化能力,就可以从原始数据中发现新的、未知的特征和模式。
当然,GPT-4涌现出的新能力可能仍有局限性,例如:模型可能产生错误的回答,对某些问题缺乏理解,容易受到输入干扰等。目前认为GPT-4的幻觉与其涌现能力具有相关性。
多模态思维链
思维链(Chain of Thought)可视为大语言模型涌现出来的核心能力之一。之所以现在各类GPT研究火爆,也与模型训练出的思维链可进入实用有密切关系。
思维链形成机制可以解释为模型通过学习大量的语言数据来构建一个关于语言结构和意义的内在表示,通过一系列中间自然语言推理步骤来完成最终输出。思维链是ChatGPT和GPT-4能让大众感觉到语言模型“像人”的关键特性。
虽然GPT-4这些模型并非具备真正的意识或思考能力,但用类似于人的推理方式的思维链来提示语言模型,极大的提高了GPT-4在推理任务上的表现,打破了精调(Fine-tune)的平坦曲线。具备了多模态思维链能力的GPT-4模型具有一定逻辑分析能力,已经不是传统意义上的词汇概率逼近模型。
当然思维链的训练可能并不容易。尽管现在有大量团队进入大语言模型训练领域,但若干年内能找到训练诀窍并完成思维链训练的团队可能不多。对创企来说,完成思维链的训练,才算真正拿到了这波大模型AI竞技的入场券。
通过多模态思维链技术,GPT-4将一个多步骤的问题(例如图表推理)分解为可以单独解决的中间步骤。在解决多步骤推理问题时,模型生成的思维链会模仿人类思维过程。这意味着额外的计算资源被分配给需要更多推理步骤的问题,可以进一步增强GPT-4的表达和推理能力。
一般认为模型的思维推理能力与模型参数大小有正相关趋势,一般是突破一个临界规模(大概62B,B代表10亿),模型才能通过思维链提示的训练获得相应的能力。如果在6B以下,那很可能还只是GPT-2级别的初级模型。另外也有研究表明,在语言训练集中加入编程语言(例如Python编程代码)可提升模型逻辑推理能力。具有思维链推理能力的GPT-4模型可用于简单数学问题、符号操作和常识推理等任务。
GPT-4的多模态思维链是通过观察大量的多模态数据来学习内在表示,然后利用这个表示来生成连续的语言输出的机制。这个过程是通过模型的训练、内在表示的构建和语言输出的生成三个步骤来实现的。
多模态提示工程
多模态大模型(如GPT-4)的提示工程(Prompt Engineering)是指根据特定的目标和语境设计出一系列问题或任务,以便使用大模型生成有关主题或主题领域的连贯和有意义的文本。提示工程的目标是通过精心设计提示以从模型中引出所需的响应,来提高生成文本的质量和相关性。提示工程与思维链的产生密不可分,也是目前自然语言编程的理论基础。
大概在2017-2019年间,语言模型的研究重心逐渐从传统特定领域的有监督学习模式(基于非神经网络或神经网络)转移到预训练模型上。在那时,基于预训练语言模型的研究范式通常是“预训练+精调”(Pre-train + Fine-tune),即在精调阶段,根据下游任务对预训练模型进行微调,以获得更好效果。
但是由于模型越来越大,以及预训练阶段和下游任务之间的差距可能很大,对各个细分领域Fine-tune的计算资源要求、训练数据需求和时间成本也在快速上涨。大量爆发的下游任务也使得175B这个级别模型预训练和精调变得异常复杂。在这种背景下,随着GPT-3的发布,提示工程成为了预训练模型的新方向。形象的说,提示有点类似于老师在学生回答问题时指点回答方向。
GPT-4/GPT-3模型中提示的新范式可归纳为“预训练+提示+预测”(Pre-train + Prompt + Predict)。在这一范式中,各种下游任务被调整为类似预训练任务的形式。通过选取合适的提示,使用者可以控制模型预测输出,从而一个完全预训练模型可以被用来解决多样的下游任务。
这里举一个填充提示的简单例子。(上图)我们从输入x(比如电影评论)开始,然后输出期望值y。其中一个任务是使用提示函数重新模板化此输入,其输出表示为x’。此时语言模型的任务仅仅是预测z值(句子中的一个词)来代替占位符Z。然后对于Z被答案填充的提示,我们将其称为填充提示。通过这一提示方式,在对应细分场景下,语言模型将原来的问题的期望值y(一句话)简化为答案z(一个词)的计算,明显降低了应答的复杂度。
而GPT-4则针对多模态数据集,设计了对应的提示。GPT-4的提示工程涉及几个步骤,包括选择合适的模型架构和参数、设计提示格式和结构、选择合适的任务和训练数据,以及使用选定的提示和数据微调模型。更多GPT-4的提示细节还需等待OpenAI发布。
提示工程同时也提高了语言模型“可操纵性”,即模型根据用户要求更改其行为的能力。例如,用户可以命令GPT-4以不同的风格、语气或内容特征来回答。例如“你是一个唠叨的数据专家”或“你是一个言简意赅的数据专家”来开始提示,让模型解释一个数据科学概念。这里“唠叨”和“言简意赅”操纵了模型回答的语言量。
人类反馈强化学习
OpenAI在其早期的学术报告中公开表示,与人类偏好保持一致,是许多领域人工智能研究和部署的核心组成部分。OpenAI希望通过RLHF技术,模型能倾向出高质量回答,确保模型输出对人类有益,进而保证模型的安全性。就笔者团队分析来看,RLHF也是保持多轮对话不偏离主题的关键保障。
GPT-4/ChatGPT最初引入人类标记员的主要目的是加快训练速度和质量。尽管强化学习技术在很多领域有突出表现,但是仍然存在着许多不足,例如训练收敛速度慢,训练成本高等特点。特别是现实世界中,许多任务的探索成本或数据获取成本很高。如何加快训练效率,是如今强化学习任务待解决的重要问题之一。
这里以TAMER(Training an Agent Manually via Evaluative Reinforcement,评估式强化人工训练代理)框架为例。该框架将人类标记员引入到模型代理(Agents)的学习循环中,可以通过人类向代理提供奖励反馈(即指导Agents进行训练),从而快速达到训练任务目标。
GPT-4的多模态奖励模型(RM)是小号的有监督精调模型(SFT),但在顶部添加了一个新的线性层来预测奖励。奖励模型的输入是原始输入加上SFT模型生成的输出。
在具体实现上,人类标记员扮演对话的用户和人工智能助手,提供多模态对话样本,让模型生成一些回复,然后标记者会对回复选项打分排名,将更好的结果反馈回模型中。代理(Agents)同时从两种反馈模式中学习——人类强化和马尔可夫决策过程奖励作为一个整合的系统,通过奖励策略对模型进行微调并持续迭代。
因为模型仅仅从狭窄分布的训练数据中学习,所以GPT-4中奖励模型只是人类偏好的部分表征,过度的训练反而可能导致奖励模型过拟合(以偏见代替整体),并导致模型训练效果的下降。另一方面,模型的人类标注员可能也无法代表用户所在地区人群的总体偏好。
基于规则的奖励模型
安全是大模型商用的关键要素,OpenAI也投入了大量资源来提高GPT-4的安全性和一致性。包括引入领域专家进行对抗性测试和红队测试,模型辅助的安全流水线以及安全指标的改进。OpenAI引入的领域安全专家达到了50多人,覆盖AI一致性风险、网络安全、生物风险等领域。
与ChatGPT一样,GPT-4也使用了强化学习和人类反馈(RLHF)来微调模型的行为,以产生更符合用户意图的响应。但当给定不安全的输入时,模型可能会生成不良内容,例如提供有关犯罪的建议。另外,模型也可能对安全输入变得过于谨慎,拒绝无害的请求。
GPT-4的安全流水线包括两个主要部分:一组额外的安全相关RLHF训练提示,以及基于规则的奖励模型。
基于规则的奖励模型(Rule-based Reward Model,RBRM)是一组zero-shot迷你GPT-4分类器,根据预定义的规则为特定动作或事件分配奖励。在这种模型中,奖励是根据事先定义的一组规则确定的,而不是从数据中学习得到的。这些分类器在RLHF微调期间为GPT-4策略模型提供额外的奖励信号,以正确的输出行为为目标进行训练,例如拒绝生成有害内容或不拒绝无害的请求。
很多早期的NLP模型和软件就是基于规则的(包括各种早期的智能音箱/”人工智障”),但这类模型在泛化场景下表现不佳,只能回答相对固定的问题,并不具备现在的大语言模型的涌现能力。
GPT-4中使用RBRM的目的是充分借助其优势,即模型中使用的规则可以简单实用一些,建立成本低于常规奖励模型。例如,在象棋等游戏中,规则可能很简单。在更复杂的情况下,规则可能相对复杂,例如为实现特定目标或达到一定的性能水平授予奖励,但总体来说比构建奖励模型的训练数据集成本更低。
规则奖励模型通常用于强化学习,其中代理被训练为采取最大化奖励信号的行动。在这种情况下,规则奖励模型基于代理是否遵循特定规则或实现特定目标,为代理分配奖励。
规则奖励模型的优点允许更多地控制学习过程。通过事先指定规则,开发人员可以引导学习过程,使其专注于特定的行为或结果。
基于规则的奖励模型的主要特点如下:
- 规则的可定义性:根据预先定义的规则来为模型的输出分配奖励。这些规则通常由领域专家或高质量的人类标注员制定,以确保奖励与任务目标和期望行为保持一致。
- 规则的可解释性:奖励模型依赖于明确的规则,这些一般具有较高的可读性和可解释性。以方便开发人员解读和调试模型。
- 规则的可调整性:通过修改或添加新的规则,可以相对容易地调整奖励函数,以适应不同的任务和环境或更复杂的规则。
基于规则的奖励模型也存在一些局限性,包括:
- 缺乏场景泛化能力:因为基于规则的奖励模型严重依赖于预先定义的规则,可能在未知或新的情况下泛化能力较弱,这可能导致模型在面对新的情况时出现幻觉现象或无法做出合适的应答。
- 规则设计的复杂性:例如对于复杂任务,设计适当的规则有可能非常耗时。此外,如果规则过于复杂或内部自相矛盾,可能导致模型训练不出有效的策略。
- 规则的学习效率有下降可能:由于模型需要在给定的规则集合中探索最佳策略,在规则设计不理想的情况下,基于规则的奖励模型可能导致较低的学习效率或过拟合。
近端策略优化(PPO)算法
GPT-4/ChatGPT中的近端策略优化(Proximal Policy Optimization,PPO)算法是一种高效的强化学习优化策略算法,由OpenAI的John Schulman等人于2017年提出。在GPT-4/ChatGPT里的使用应该算是新瓶装旧酒。
PPO的前辈TRPO(Trust Region Policy Optimization)相对复杂,并且与包含噪声(例如Dropout)或参数共享(在策略和价值函数之间,或辅助任务)的架构不兼容。PPO算法试图解决上述问题,以及计算复杂性和难以调整的超参数。PPO通过简化优化问题并限制策略更新的幅度,实现了更高效、更稳定的学习过程,具有实现简单、能同时处理离散\连续动作空间问题、可大规模训练等优势。
PPO算法衍生于早期的策略梯度(Policy Gradient)算法,但通过一些技巧改进了其性能和稳定性,能够处理连续动作空间的问题。PPO在策略更新时限制新策略与旧策略之间的差异,从而确保策略改进的稳定性。这通过在目标函数中引入一个“代理”目标函数来实现,该代理目标函数限制了新策略和旧策略之间的KL散度。
PPO算法的核心思想是在每次迭代中,通过一种称为近端策略优化(Proximal Policy Optimization)的方法来更新策略参数,以最大化预期收益。具体来说,PPO算法采用两个神经网络来表示模型的策略:一个执行动作(Actor),另一个处理奖励(Critic)。在每次迭代中,PPO算法会从环境中采样一批经验数据,并使用这些数据来更新策略参数和价值参数。更新的策略将被ε-clip到一个小区域,以防止可能具有不可恢复危害的巨大更新。换句话说,优化的步伐不能太大也不能过小。
PPO算法的主要特点如下:
- 裁剪的目标函数:PPO通过裁剪策略比率(新策略概率与旧策略概率之比)来限制更新幅度。这种裁剪保证了新策略在旧策略的附近,使得更新更加稳定。
- 重要度采样:PPO利用重要度采样来估计策略梯度,从而可以重复使用之前的经验来更新策略。这使得PPO在数据效率上更具优势。
- 多次更新:PPO算法在每次收集一批数据后,对策略进行多次更新。这可以提高算法的收敛速度和稳定性。
- 简化的优化问题:相比于其他方法,如TRPO,PPO算法将优化问题简化为一阶优化问题,这大大减少了计算复杂性。
多模态幻觉检测
大型语言模型(Large Language Model,LLM)的幻觉(Hallucination)指的是模型生成的输出包含一些与输入不符合的信息,这些信息可能是错误的、无关的或者荒谬的。与人类直觉相反,随着模型变得更加以假乱真,幻觉会变得更加危险。GPT-4等模型的这种幻觉可能会出现在各种类型的任务中,比如文本生成、图文分析和问答系统等。
由于大模型(包括GPT-4)本质上可以视为训练集(人类知识/语言)的有损压缩,因此在模型运行时无法完整复现或者应答原始知识,从而模型的幻觉来自于信息压缩的偏差。多模态幻觉的本质是这种有损压缩偏差的体现,也是通过数学逼近人类语言的必然代价。(类似于压缩后的图像边缘出现不正常的条纹)。
幻觉包括以下几类:
- 含义相关性(Semantic Relatedness)的幻觉:模型生成的输出可能包含与输入语境无关或不相关的单词或短语,这些单词或短语通常是通过模型之前接触过的文本来学习的。
- 语义扩张(Semantic Expansion)的幻觉:模型生成的输出可能包含与输入语境相关但是过于具体或者过于抽象的内容,这些内容也可能是通过模型之前接触过的文本来学习的。
结构错误(StructuralErrors)的幻觉:模型生成的输出可能不符合正确的语言表达或句子结构,这些错误可能是由于模型在生成时遗漏了某些信息,或者将不相关的信息结合在一起导致的。
为了降低幻觉出现的概率,改善模型质量,MetaAI 提出一种幻觉内容检测机制。通过检测生成内容中的幻觉令牌/单词,对生成内容的真实度进行评估,以减少模型幻觉出现的概率。从 GPT-4 的幻觉减少比率来看,猜测类似该技术的方法或已应用在 GPT-4 中。
幻觉是 GPT-4 等大型语言模型中一个重要的问题,通过不断的优化模型和改进训练方法,或增加多模态幻觉语义检测器,研究人员可以逐步提高模型的准确性和稳定性,从而更好地满足各种自然语言处理任务的需求。
关于模型大小
目前 OpenAI 还没有发布 GPT-4 模型大小和结构的具体信息。GPT-4 的技术报告也没有透露这些技术细节,训练数据或训练方法也没有相关信息释放出来。大模型的商业化竞争正愈演愈烈。
GPT-3 是目前最大的知名语言模型之一,包含了 1750 亿(175B)个参数。在 GPT-3 发布之前,最大的语言模型是微软的 TuringNLG 模型,大小为 17 亿(1.7B)个参数。在 GPT-3 发布后不久,OpenAI 团队就曾表示他们计划在未来几年内研发更大的模型。而随着技术和算法的不断发展,GPT-4 模型似乎也应朝着更大的尺寸发展。
另外,GPT-4 的上下文窗口尺寸也较 GPT-3.5 和 GPT-3 增大了不少。2020 年发布的 GPT-3 模型上下文窗口为 2049 个令牌。在 GPT-3.5 中,窗口增加到 4096 个令牌(约 3 页单行英文文本)。GPT-4 有两种尺寸。其中一个(GPT-4-8K)的上下文窗口大小为 8192 个令牌,另一个(GPT-4-32K)可以处理多达 32768 个令牌,大约 50 页文本。
有传言说 GPT-4 模型大概是 GPT-3 的 100 倍或 1000 倍。从训练的角度看,这么大的模型膨胀可能会消耗更多的训练资源和训练周期的过度延长。
根据 ARK 的分析,GPT-4 的执行时间大概是 GPT-3.5 的 3.7 倍。由此我们初步估算 GPT-4 的文本语言部分的大小大约是 62B-650B 之间。根据目前 GPT 模型性能的发展趋势,以及多模态技术的加持,预计 GPT-4 的模型参数大概为 62B-1500B 之间。
参考链接: