【深度学习】ChatGPT
本文基于Andrej Karpathy(OpenAI 联合创始人,曾担任特斯拉的人工智能和自动驾驶视觉主管)在Microsoft Build 2023上的演讲整理而成(完整的视频在文末,直接拖到文章底部),主要分为2大部分:
1.如何训练GPT(可以理解为AI Assistant)
2.如何使用GPT
GPT assistant的训练过程可以分为四个阶段:「预训练、监督微调、奖励建模和强化学习」。在「预训练」阶段,使用大规模互联网数据集和成千上万的GPU花费数月时间训练transformer-based神经网络,即常说的基础模型。
之后使用高质量的问答数据进一步「监督微调」模型,这些数据通常是人工标注的问答数据,数量可到几万到几十万级别。再接下来进行「奖励建模」,让模型学习评估不同回复的质量。它利用比较不同回复的方式获得人类反馈,构建一个奖励模型,可以对新生成的文本进行质量评分。最后,利用奖励模型进行强化学习,得到最终的助手模型。强化学习阶段则利用奖励模型产生的文本质量评分,通过强化学习的方式进一步提升回复文本的质量,使其更加符合人类的要求。
基础模型、监督微调模型和强化学习微调模型有什么区别?基础模型更具创造力,生成的结果更多样,适用于生成创作;监督微调后的模型更擅长解决具体问题,但创造力较弱;强化学习微调后的模型生成质量最高,但训练难度大。
如何通过提示工程有效地使用GPT assistant模型?输入的提示应提供充足的上下文和确切的意图说明,明确指出期望的表现结果,也可以补充展示示例,引导模型一步步思考。此外,充分利用模型的一致性并要求模型进行反思,还可以使用工具弥补模型的局限。提示工程在做的事情其实是弥补模型与人类大脑认知上的差异。
目前的最佳实践是先尝试提示工程的各种手段,如果还不够用再考虑微调,包括SFT和RLHF。微调模型门槛更高,需要更多专业知识。
当前模型也存在局限,目前适合将其应用于低风险场景,辅助人类完成工作。以GPT-4为代表的LLM是了不起的工作,其所包含的知识量非常惊人,但也需要认识到其局限性,在符合社会主义核心价值观的场景下善加利用。
1.如何训练GPT
GPT模型的训练分为「预训练、有监督微调、奖励建模和强化学习」四个阶段,具体如下图所示:
上述4个阶段对应三种类型: 「基础模型(Base model)、有监督微调模型(SFT)和强化学习人类反馈模型(RLHF)」 。以下对这4个阶段详细说明。
1.1 预训练
基础模型只进行过预训练,没有经过后续的调优,它具有通用的语言建模能力,可以生成连贯、语法正确且多样性强的文本,但针对特定任务的处理能力较弱。
1.1.1 数据
预训练阶段需要使用大量的互联网语料,比如网站、书籍、论文等网页数据。这些数据量级非常大,可以达到数十亿甚至上百亿的量级。在这么大的数据集上,通过transformer等网络结构,进行无监督的语言模型预训练,学习语言的统计规律。这一阶段需要使用大量的计算资源,比如成千上万的GPU进行并行计算,持续时间可以长达几周到几个月。预训练的目的是学习通用的语言表示能力,可应用于下游任务。
首先,需要收集大量的数据。以下为 Meta 公司发布的 LLaMA 预训练基础模型所使用的混合数据:
可以大致看到这些数据集合中涉及的数据集种类,包括 Common Crawl(网页爬虫数据),C4(也是网页爬虫数据), 然后还有一些高质量的数据集,例如:GitHub、维基百科、图书、ArXiv、StackExchange 等。这些混在一起,然后按照一定的比例采样,这就形成了预训练GPT模型的训练集。
1.1.2 Tokenization
在用这些数据进行预训练之前,需要进行一个预处理步骤:Tokenization (分词/标记化)。本质是将文本转变成计算机可处理的整数序列。
1.2.3 参数和超参
以上大致就是预训练阶段相关参数或者超参的数量级。词汇表的大小通常是 1万 个 token。上下文长度通常是 2000、4000 现在甚至是 10万。这决定了 GPT 在尝试预测序列中下一个整数时需要查阅的最大整数数量。此外,可以看到大致的参数量,比如说,LLaMA 有 650 亿个参数。尽管与 GPT3 的 1750 亿个参数相比,LLaMA 只有 650 亿个参数,但 LLaMA 是更强大的模型,直观来说,这是因为「模型训练的时间明显更长」,在这种情况下,是 1.4 万亿个 token,而不仅仅是 3000 亿个 token。因此,不能仅仅通过模型包含的参数数量来判断一个模型的强大程度。
此外,上表也展示一些Transformer-based模型的一些超参数,包括header的数量、维度大小、层数等等。例如,为了训练llama 65B 模型,Meta 使用了 2000 个 GPU,训练了大约 21 天,花费了大约几百万美元。这就是预训练阶段大致的一个数量级。
1.1.4 如何预训练
在预训练时把已经整数化的 token 打包成批次的方式送入 transformer ,这些打包成数组的一个批次就是一个batch size,记为B(批次大小)。下图示例中,这些训练样本按行堆叠,B 乘以 T,T 是最大上下文长度。
以上长度为10的上下文长度仅仅是示例,真实场景中这个数字可以是 2000、4000等等。在将文档打包成一个batch size时,需要用一些特殊的token来分隔它们。这些特殊token作为文本结束符其实是在告诉 transformer 模型新的文档从哪里开始。在下面的示例中:
绿色单元格能够看到其前面的所有token,这里是指所有的黄色token。将整个上下文输入到 transformer 网络中。transformer 将尝试预测序列的下一个 token,在这个例子中是指红色单元格位置的token。当调整模型参数,每一个单元格的预测分布都会有些许不同。例如,如果词汇表有 50257 个 token,那么就会有这么多的数字对应的概率,即每个token都有一个概率值。这就是一个概率分布,表示接下来可能的预测任何token的概率。在上图示例中,接下来会预测的token整数值是513(即上图的红色单元格)。需要注意的是,基于现有的语料,我们是知道红色单元格上面应该出现的token数值具体是哪个。因此,我们所以可以使用这个作为监督源(或者说标准结果)来更新transformer模型的参数。在一个batch size 内,每行都是一个样本数据,每个样本数据都并行地执行上述预测下一个token的逻辑。其他batch size内的数据同理处理,试图让 transformer 正确预测序列中接下来的 token 是什么。
1.1.5 如何使用预训练模型
预训练模型在语言建模的过程中学会了非常强大的通用表示,且在你感兴趣的下游任务进行微调时非常有效。举个例子,如果你对情感分类感兴趣,上古的经典方法是收集一堆正面和负面的情感数据,然后训练一个NLP模型。但BERT时代的方法是先忽略情感分类,先去做大规模语言模型的预训练,预训练得到大的Transformer模型后,只需要有少量的情感分类示例,就可以非常有效地微调模型,从而良好地执行情感分类任务。其原因是Transformer-based模型在预训练阶段为了预测下一个token,必须理解很多关于文本结构和其中所有不同概念的信息。这就是 GPT-1。
在GPT-2时代,人们注意到,比微调更好的方法是,我们可以非常有效地引导这些模型。因为这些都是语言模型,它们的目标只有一个:完成文档的续写或者补全(completion),所以实际上可以通过排列这些虚假的文档来欺骗它们执行任务。
例如,有一些段落,然后像做"问答、问答、问答"这样的操作,这叫做少量样本提示(Few-shot prompt)。比如,上图中的「Q: How old is Catherine?A: 54」),然后我们做提问,比如上图中的「where does she live?」。当 Transformer 试图本着语言模型的特性完成文档时,它实际上是在回答我们的问题。这是对基础模型进行提示工程的示例,让它认为它在模仿文档,通过这种方式欺骗它执行任务。其实是将任务仿造成文本补齐或者续写的样子。
这开启了一个新时代,这是「提示优于微调」的时代。在实践过程发现,在许多问题上这种方式都非常有效,甚至无需训练任何神经网络,无需进行微调。
需要指出的一点是,此时得到的基础模型并不是助手模型(见下图)。它们并不是真的想回答你的问题,而只想完成文档的续写。所以,如果你要求模型,“写一首关于面包和奶酪的诗”,它只会用更多的问题来回答你的问题。它只是在完成它认为是文档后文的东西。但是,可以用特定的方式提示(prompt)base模型来完成上述任务,如下图右子图所示:我们甚至可以欺骗基础模型使其成为一个助手模型。
比如,可以创建一些特定的少量提示(few-shot prompt),使文档看起来像是人类和助手正在交换信息:
然后把你的真实意图查询放在最后,基础模型会像一个有用的助手一样为自己设定条件并回答你的查询。尽管确实可以如此操作,但这并不是很可靠,在实践中并不是特别有效。
因此,有一条不同的路径来制作真正的GPT助手,而不仅仅是把基础模型视为文档的续写者。这就引出有监督的微调阶段!
1.2 监督微调
有监督微调模型是在基础预训练模型的基础上,使用额外的有标签的数据进一步进行微调,使其适应特定的下游任务,比如问答。它可以生成针对特定的问题进行回答。
在有监督微调阶段,需要收集少量(几万条)但高质量的数据集,这些数据由提示(prompt)和高质量响应组成。同样对这些数据进行语言建模,此时算法上没有任何改变。训练后,得到一个SFT模型(有监督的微调模型),此时可以实际部署这些模型,它们是真正的助手,并且在某种程度上是有用的。以下是SFT训练数据的示例:
人工想出的一些随机的提示(prompt),例如:「你能写一段关于经济学中的「垄断」的简短介绍吗?」,然后按照Labeling instruction(标注文档)人工写出符合要求的高质量回应。在撰写这些回应时,撰写人员需要遵循标注文档,比如要求书写有帮助的、真实的、无害的回答。
1.3 奖励建模
做完SFT之后,进入「RLHF」,即"从人类反馈中强化学习",它包括「奖励建模和强化学习」。奖励建模通过学习人类对不同回复质量的判断,构建一个自动评估回复质量的模型。强化学习则利用这个奖励模型,通过加强生成高奖励文本的概率,从而提升回复的整体质量。因此,强化学习人类反馈模型可以生成质量更高、更符合人类要求的回复。
在「奖励建模」步骤中,要做的是「将数据转变为比较形式」。以下是一个数据示例:
比如用相同的提示,让模型编写一个程序或函数。上述示例是要求检查给定的字符串是否是回文(正读和反读都相同的单词、句子或者数字序列)。用已经训练好的 SFT 模型,创建多个完成项(completion,也译为补全),即多个回复。在该示例中,SFT模型创建了3个完成项,然后人工对这些完成项进行排序:
其实这种比较操作是非常困难的,可能需要花费几个小时的人工才能完成单个提示之下完成对之间的比较。在对这些完成项之间的所有可能对进行排序之后,最终得到全部completion的排序。
上述示意图中三行prompt都相同,但是完成项completion不同,黄色 token 由 SFT 模型生成,在最后添加一个特殊token(绿色表示)用以输出代表奖励。基本上只监督绿色 token 在transformer的输出,transformer 会预测相同提示(prompt)下各个完成项completion的得分。因此基本上对每个完成项的质量做出了估计,也就有了模型对各个完成项completion排名的基本事实。通过设计损失函数就可以纠正错误排名,从而训练模型,使得模型做出与来自人类的比较事实数据相一致的奖励预测。奖励模型,就是让我们能够评估一个提示的完成效果有多好。
1.4 强化学习
训练得到的「奖励模型」不能直接将其部署,因为它本身并不能很好地作为一个助手使用,所以需要引入强化学习。奖励模型对于接下来的强化学习阶段非常有用,因为它可以为给定提示Prompt的任意完成项打分。在强化学习过程中要做的是,通过获取大量的提示,然后根据奖励模型进行强化学习。
具体怎么做的呢?以下图为例说明。
相同提示prompt排列成行,使用SFT模型生成一些完成项(黄色token),然后添加表示奖励的特殊token,根据奖励模型获取对应完成项的奖励。需要注意的是,现在使用的奖励模型参数是固定的,不再变化。奖励模型给出每个提示下的每个完成项的得分,然后用相同的语言建模设计损失函数,对黄色token进行训练,从而调整生成的黄色token,使其被奖励模型打高分。核心是根据奖励模型对指示的奖励来衡量语言建模的目标。
举个例子,上图第一行中,奖励模型认为这是一个得分相当高的完成项。因此在第一行中采样的所有token都将得到强化,他们在未来将得到更高的概率。相反,在第二行中,奖励模型非常不喜欢这个完成项,给出的打分是-1.2。因此,在第二行中采样的每一个token在后续都将得到稍微更低的概率。在许多提示prompt,许多批次中反复做这个操作,最终得到一个策略。这个策略在这里创建黄色token,这基本上是所有的完成项,所有这些完成项都将根据上一阶段训练的奖励模型得到高分。以上就是 RLHF 流程。
经历RLHF后,会得到一个可以部署的模型,比如ChatGPT就是一个RLHF模型,Vicuna-13B(俗称小羊驼模型)等,这些都是 SFT 模型。综上,整个过程会经历3个模型过程:基础模型、SFT模型和RLHF模型。
之所以做RLHF,那是因为它能进一步提升效果。研究表明,与基础模型、SFT 模型相比,人类基本上更喜欢来自 RLHF 模型的生成结果。
那为什么RLHF的效果更好?目前并没有定论,一个可能的原因,比较比生成更容易。做比较还是做生成,难易程度不同。以生成一首古诗为例,假设让一个模型写一首关于春天的七言绝句。如果你是一个试图提供训练数据的承包商,那么想象一下作为一个收集SFT数据的承包商。你应该如何创建一首关于春天的七言绝句呢?你可能就是不擅长这个,但是如果给你几首现成的七言绝句,你可能能够分辨出更喜欢其中的哪一首。因此,判断哪一个更优是一个更简单的任务。这种不对称性使得「比较」可能是一个更好的方式,可以更好地利用你作为人的判断,从而创建一个稍微更好的模型。
当然,RLHF 模型并不是在所有情况下都比基础模型好。RLHF会损失一些熵,这意味着它输出比基础模型变化更少的样本。基础模型有很高的熵,会给出多样性的输出,创造性更强。基础模型好比是一个阅尽世间一切,但心智宛如孩童,容易异想天开不受拘束;SFT和RLHF模型则是受过各种应试教育,思维容易受限于各种规则。
2.如何使用GPT
针对大语言模型如GPT模型,精心设计输入提示以生成高质量输出,是当前研究的热点。这需要考虑模型本身的认知特点,采取逐步推理、提供明确上下文和示例、引导使用工具等技巧。与人类思考不同,GPT更像基于提示进行序列生成。提示工程相较模型微调更简便高效,但微调在某些场景下效果更佳。GPT有偏见、错误、知识局限等问题,不能完全依赖,应当有监督地把它当作创作助手,与人类协同。总体而言,GPT适用于风险较低的应用,可以作为知识来源,但关键决策还需人类判断。我们应视其为写作或思考的伙伴,发挥双方优势,共同提高效率。
2.1 思考差异
现在,以一个具体的场景来展示。假设你正在撰写一篇文章或博客文章,你打算在文章的末尾写这样一句话:"加利福尼亚的人口是阿拉斯加的 53 倍。" 当你创建这样的句子时,你的内心独白在幕后进行了大量的工作,比如人口数据查阅、数值比对、倍数计算等等,最终才能够书写出"加利福尼亚的人口是阿拉斯加的 53 倍。"这段文字。但是,当训练GPT时,这样的句子看起来是什么样子呢?
从GPT的角度,这只是一个 token 序列。GPT 在读取或生成这些 token 时,只是一个个地处理,每个处理的块大约需要相同的计算量。而这些transformer并不是浅网络(比如可能有80层)。这个transformer 会尽其所能进行模仿,但显然,这个过程和你所经历思考过程非常不同。特别是,在最后的成果中,在我们创建的数据集中,然后最终输入到 LLMs 中,所有的内心独白都被完全剥离。GPT会查看每一个token,并且在每一个上面花费相同的计算量。所以,我们不能期望它在每一个 token 上做太多的工作。这些 transformers 就像 token 模拟器。它们不知道自己不知道什么,不知道自己在哪方面做得好或做得不好,只是尽力模仿下一个token。它们缺乏循环反思的能力,不进行任何合理性检查。默认情况下,它们不会在过程中纠正自己的错误,只是采样生成token 序列。它们的大脑中没有单独的内心独白流,只是在评估当下正在发生的事情。
当然,这种方式有一些认知优势,通过数百亿的参数,存储一个非常大的事实基础知识,且涵盖了大量的领域。虽然存储大量事实耗费了巨大的存储空间,但是这种方式也有一个相对较长且完美的工作记忆。通过内部的自注意力机制,无论多长的上下文内容都可以立即获取到。从这一点看,其记忆机制似乎很完美,但它能够获取的上下文长度其实受限于真实条件。在这个长度范围内 transformer都可以直接访问,可以无损地记住在其上下文窗口内的任何内容。提示(Prompt)只是为了弥补大脑和大语言模型这两种架构之间的认知差异。
2.2 思维链
对于涉及推理任务时,不能期望 Transformer 在每个 token 上做太多的推理。因此,必须真正地将推理扩展到更多更多的token。很多时候不能给 Transformer 一个非常复杂的问题,然后期望它在一个 token 中就找到答案。对它来说,时间根本不够。这些 Transformer 需要更多token来"思考"。将任务拆解成多个步骤,prompt的方式激发内在独白,然后让更多token参与推理过程。
例如,少样本提示(few-shot prompt),告诉 Transformer 在回答问题时应该展示它的工作过程。如果给出一些例子,Transformer 就会模仿那个模板,最终在评估方面会表现得更好。此外,可以通过说“让我们一步步地思考”(let's think step by step)来引导模型做出这种行为。这会使 Transformer 进入展示工作的状态,整体上在每个 token 上的计算会减少,结果也会更成功。
2.3 多尝试
如果发现没有成功,可以尝试多次,然后选一个最好的或者进行多数投票。Transformer 在预测下一个 token 的过程中, 可能会采样到一个不太好的token,此时可能会走入一种死胡同式的推理。与人类思考不同,Transformer模型不能从中恢复过来,他们被他们采样的每一个 token 困住了。因此,即使他们知道这个序列不会成功,他们也会继续这个序列。
2.4 思考,快与慢
实际上,LLM 知道自己是否搞砸了。假设让模型生成一个不押韵的诗,它可能会给你一个诗,但实际上它押韵了。但事实证明,特别是对于更大的模型,比如 GPT-4,你可以直接问它,你是否完成了任务?
可以看出GPT-4 非常清楚它没有完成任务,它会告诉你,"不,我实际上没有完成任务。让我再试一次"。因此,需要在提示prompt中弥补这一点。你必须让它去检查。如果你不要求它检查,它不会自己去检查。它只是一个 Token 模拟器。更一般来说,很多这些技术都属于重建慢思考系统的范畴。丹尼尔·卡尼曼的《思考,快与慢》提到人类有2种思考方式:
(1)快思考是一个快速的、自动的过程,这种过程与LLM采样Token相类似。快思考(System 1)是指我们大部分时候所使用的直觉性、自动化的思考方式。它是一种快速、无意识、几乎是自动化的思维方式,可以迅速做出判断和决策。快思考依赖于我们在经验中积累的模式、直觉和启发式,它可以帮助我们在日常生活中快速做出反应,省去了深思熟虑的过程。
(2)慢思考是大脑中更慢、更深思熟虑的规划部分。慢思考(System 2)则是一种更为深入、有意识的思考方式,需要付出更多的认知努力。慢思考涉及到逻辑推理、分析、比较和控制注意力等高级认知过程。它需要我们有意识地集中注意力,进行深思熟虑,进行复杂的问题解决和决策。
卡尼曼认为,快思考和慢思考在我们日常生活中发挥着不同的作用。快思考可以帮助我们在熟悉的环境中快速做出决策,但有时也容易受到认知偏差和错误的影响。而慢思考则更适用于复杂的问题和不熟悉的情境,它可以帮助我们更深入地思考、避免错误和偏见,并做出更明智的决策。
通过理解快思考和慢思考之间的差异,我们可以更好地认识到我们的思考方式,并在需要时灵活地运用它们,以提高我们的决策质量和思维能力。
在上图的"思维树"(Tree of Thought)这篇论文中作者提出了为任何给定的提示维护多个完成项(completions),然后也会在整个过程中对它们进行评分,保留那些进行得比较顺利且有意义的。很多人尝试利用提示工程,基本上是希望让 LLM 恢复一些大脑中具有的能力。比如AlphaGo在下围棋时有一个放置下一个棋子的策略,这个策略最初是通过模仿人类来训练的。但除了这个策略,它也会进行蒙特卡洛树搜索。基本上,它会在脑中演绎出一些可能性,并对它们进行评估,只保留那些效果很好的可能性。思维树这就像是文本版的AlphaGo。
2.5 Chain/Agent
下图的右子图,来自这篇名为 ReAct 的论文 ,其中他们将提示的答案结构化为一系列的思考、行动、观察、思考、行动、观察。这是一个全面的推演,一种回答查询的思考过程。在这些动作中,模型也被允许使用工具。
在左边,是Auto-GPT,这是一个允许LLM保持任务列表并继续递归分解任务的项目。虽然项目很有启发性,但是Karpathy不认为这目前工作得很好,也不建议在实际应用中使用它。Karpathy只是认为这是一种可以从中汲取灵感的东西,认为随着时间的推移,这种启发会逐渐显现出来。这就像给模型一种慢思考的思考方式一样。
2.6.要求表现好
当 transformer 训练时的训练集有一整个性能质量范围,例如,可能有某种物理问题的提示或者类似的东西,可能有一个完全错误的学生解答,但也可能有一个极其正确的专家答案。Transformer 不能区分低质量和高质量的解决方案,只是它们知道两种解决方案,但默认情况下,它们只是基于语言模型训练,从而模仿所有的解决方案。在测试时,实际上我们必须要求模型有好表现。
在上面的例子中,尝试了各种提示,「let's think step by step」非常强大,因为它在许多 Token 上展开了推理。但是,「更好的提示方法是:「让我们一步一步地解决这个问题,确定我们有正确的答案」」。因此,这有点像是对获得正确答案的条件。这实际上使得 transformer 表现得更好,此时transformer不必在低质量的解决方案上分散其概率。比如说,用这类Prompt:「你是这个主题的权威专家」,「假设你的智商超过了 120」等等。但是不要试图要求太高的智商,因为如果要求智商超过了,可能会超出数据分布,或者更糟糕的是,可能在一些科幻内容的数据分布中,它会开始进行一些科幻角色扮演或者类似的东西。因此,必须找到合适的智商。
2.7 工具与插件
当我们解决问题时,对于不擅长的部分,我们会依赖于工具,对于LLM同理适用。比如为其提供计算器、代码解释器等工具,以及进行搜索的能力。再次重审的是,transformer在默认情况下可能不知道它们不知道的东西。你甚至可能想在提示中告诉 transformer,比如:「你在心算方面并不是很好,每当你需要进行大数的加法、乘法或其他操作时,请使用计算器。以下如何使用计算器的,使用这个 token 组合,等等等等。」你必须真正地写出来。因为模型默认情况下并不知道它擅长什么或不擅长什么。我们「从一个只能检索的世界转变到了完全依赖 LLM 记忆」的世界。但实际上,这两者之间还有检索增强模型(RAG),它在实践中表现得非常好。
正如前文所提到的,Transformer 的上下文窗口是其工作记忆。如果能将与任务相关的任何信息加载到工作记忆中,模型就会表现得非常好,在此它可以立即访问所有的记忆。所以,很多人对检索增强生成非常感兴趣。
在上图的底部,有一个 LLaMA 索引的例子, 它有一个数据连接器,可以连接到各种类型的数据。可以索引所有这些数据,并使得 LLM 可访问它。大概的流程:
(1)取相关的文档,将它们分成块
(2)将它们全部embedding化
(3)将其存储在向量DB中
(4)在测试时,对向量DB进行一些查询,获取与任务相关的块
(5)将它们填充到提示中,然后生成。
2.8 微调
虽然通过提示工程可以取得目标成果,但也可以进一步考虑微调模型。微调模型意味着实际上要改变模型的权重。在实践中做到这一点变得越来越容易,这是因为最近开发了许多技术,例如LoRA这样的参数高效微调技术确保只需训练模型的小部分稀疏片段。模型的大部分被保持在基础模型的状态,只有一部分被允许改变。只调整模型的小部分,算力成本变得更低。此外,由于模型大部分是固定的,可以用非常低的精度来计算那些部分,因为它们不会被梯度下降更新,这也使得整个过程更为高效。
SFT(有监督的微调)相对建议,因为只是继续做语言模型的任务,相对简单明。而RLHF(基于人类反馈的强化学习)是非常具有研究性的领域,甚至很难使之有效工作。因此,不建议有人试图自己做RLHF实现,它非常不稳定,非常难以训练,目前不是很适合初学者。当然,它也可能仍然在快速变化,未来尚未可知。
9.使用建议
1.最好的性能目前来自 GPT-4 模型,这是迄今为止最强大的模型,所以用它就对了。
2.使用非常详细的提示词,包含任务上下文、相关信息和指令。沿着这样的思路思考:如果他们不能给你回邮件,你会告诉他什么?但是也要记住,任务承包商是人,他们有内心想法、他们非常聪明,等等。LLMs 并不具有这些品质,所以确保几乎考虑到 LLMs 的心理,并针对此设计提示。
3.多多参考大量的提示工程技术,在这些提示中检索并添加任何相关的上下文和信息。其中一些在上面的幻灯片中有所强调,但这也是一个非常大的领域,只是建议网上寻找提示工程技术,那里有很多内容。
4.尝试使用少样本提示(few-shots)。这指的是你不只是想问,你还想尽可能地展示(你想要的),给它举例子,如果可以的话,帮助它真正理解你的意思。
5.尝试使用工具和插件来分担 LLM 本身难以完成的任务。
6.不仅要考虑单个提示和答案,还要考虑潜在的链条(chain)和反思,以及如何将它们粘合在一起,以及如何制作多样本等。
7.最后,如果你认为你已经最大地优化了提示工程的效果,试试微调模型以适应你的应用程序,但预计这会更慢并且涉及更多内容。
8.然后这里有一个专家级别的研究区域,那就是RLHF,如果你能使它工作的话。目前引入RLHF确实比 SFT 工作得更好一些。但是再次提醒,这非常复杂。为了优化你的成本,尝试探索容量较低的模型或更短的提示等。
10.局限性
当下的 LLM 有很多局限性。
1.模型可能存在偏见。他们可能会编造,产生幻觉信息,他们可能存在推理错误,他们可能在整个应用类别中都感到困扰。
2.知识的有效期。比如ChatGPT可能不知道2021 年 9 月之后的任何信息。
3.容易受到大范围的攻击,这些攻击每天都在 Twitter 上发布,包括提示注入、越狱攻击、数据投毒攻击等。
建议是在风险较低的应用中使用LLMs,总是将它们与人类的监督结合使用,将它们作为灵感和建议的来源,考虑copilot(副驾驶)这样的使用模式,而不是完全自主地作为执行任务的代理。
3.总结
本文主要介绍GPT模型的训练方法,包括预训练、监督微调、奖励建模和强化学习这四个阶段。不同微调模型具备不同特点,基础模型更富创造力,而强化学习微调后可获得最高质量的回复。在使用GPT的使用,可以利用提示工程技巧,比如提供充足上下文、引导模型步步思考等。当前模型依然存在各种局限,人类应谨慎而有效地将其应用于低风险的协作场景中,不能轻视其潜在风险。总体而言,本文系统地介绍了GPT训练的全流程和具体应用中的各种关键技巧。
reference:
1.万字长文细说ChatGPT的前世今生
相关文章:

【深度学习】ChatGPT
本文基于Andrej Karpathy(OpenAI 联合创始人,曾担任特斯拉的人工智能和自动驾驶视觉主管)在Microsoft Build 2023上的演讲整理而成(完整的视频在文末,直接拖到文章底部),主要分为2大部分: 1.如何训练GPT(可…...

爬虫--爬取自己想去的目的的车票信息
前言: 本篇文章主要作为一个爬虫项目的小练习,来给大家进行一下爬虫的大致分析过程以及来帮助大家在以后的爬虫编写中有一个更加清晰的认识。 一:环境配置 Python版本:3.7 IDE:PyCharm 所需库:requests࿰…...

Metinfo6.0.0任意文件读取【漏洞复现】
文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现代码审计漏洞点 1.5、深度利用EXP编写 1.6、漏洞挖掘1.7修复建议 1.1、漏洞描述 漏洞名称:MetInfo任意文件读取 漏洞简介:MetInfo是一套使用PHP和MySQL开发的内容管理系统,其…...

Postgresql JSON对象和数组查询
文章目录 一. Postgresql 9.5以下版本1.1 简单查询(缺陷:数组必须指定下标,不推荐)1.1.1 模糊查询1.1.2 等值匹配1.1.3 时间搜索1.1.4 在列表1.1.5 包含 1.2 多层级JSONArray(推荐)1.2.1 模糊查询1.2.2 模糊查询 NOT1.2.3 等值匹配…...
搭配购买——并查集+01背包
Joe觉得云朵很美,决定去山上的商店买一些云朵。 商店里有 n 朵云,云朵被编号为 1,2,…,n,并且每朵云都有一个价值。但是商店老板跟他说,一些云朵要搭配来买才好,所以买一朵云则与这朵云有搭配的云都要买。但是Joe的钱有…...

JVM调优指令参数
常用命令查找文档站点:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.html -XX:PrintFlagsInitial 输出所有参数的名称和默认值,默认不包括Diagnostic和Experimental的参数。可以配合 -XX:UnlockDiagnosticVMOptions和-XX:UnlockEx…...

数据结构入门 — 队列
本文属于数据结构专栏文章,适合数据结构入门者学习,涵盖数据结构基础的知识和内容体系,文章在介绍数据结构时会配合上动图演示,方便初学者在学习数据结构时理解和学习,了解数据结构系列专栏点击下方链接。 博客主页&am…...

MongoDB - 安装
一、Docker安装MongoDB 1. 安装 安装版本: 7.0.0 docker run -itd --name mongodb -v C:\\data\\mongodb\\data:/data/db -p 27017:27017 mongo:7.0.0 --auth-v: 将容器目录/data/db映射到本地C:\\data\\mongodb\\data目录,防止容器删除数据丢失-p: 端口映射--aut…...

Qt应用开发(基础篇)——颜色选择器 QColorDialog
一、前言 QColorDialog类继承于QDialog,是一个设计用来选择颜色的对话框部件。 对话框窗口 QDialog QColorDialog颜色选择器一般用来让用户选择颜色,比如画图工具中选择画笔的颜色、刷子的颜色等。你可以使用静态函数QColorDialog::getColor()直接显示对…...

vscode 清除全部的console.log
在放页面的大文件夹view上面右键点击在文件夹中查找 console.log.*$ 注意:要选择使用正则匹配 替换为 " " (空字符串)...

UG\NX CAM二次开发 插入工序 UF_OPER_create
文章作者:代工 来源网站:NX CAM二次开发专栏 简介: UG\NX CAM二次开发 插入工序 UF_OPER_create 效果: 代码: void MyClass::do_it() {tag_t setup_tag=NULL_TAG;UF_SETUP_ask_setup(&setup_tag);if (setup_tag==NULL_TAG){uc1601("请先初始化加工环境…...
C++指针、指针函数、函数指针、类指针
1、指针变量 #include <iostream>using namespace std;int main () {int var 20; // 实际变量的声明int *ip; // 指针变量的声明ip &var; // 在指针变量中存储 var 的地址cout << "Value of var variable: ";cout << var …...
图:最短路径问题(BFS算法,Dijkstra算法,Floyd算法)
1 .单源最短路径 1.BFS算法(无权图) 使用广度优先遍历实现一个顶点到达其他所有顶点的最短路径。 注:无权图可以视为一种特殊的带权图,只是每条边的权值都为1。 1.算法思路: 定义一个数组存储每个结点与当前的结点的最短距离,定义一个数组…...

栈和队列篇
目录 一、栈 1.栈的概念及结构 1.1栈的概念 1.2栈的结构示意图 2.栈的实现 2.1支持动态增长的栈的结构 2.2压栈(入栈) 2.3出栈 2.4支持动态增长的栈的代码实现 二、队列 1.队列的概念及结构 1.1队列的概念 1.2队列的结构示意图 2.队列的实…...

分享一个vue-slot插槽使用场景
需求再现 <el-table-column align"center" label"状态" prop"mitStatus" show-overflow-tooltip />在这里,我想对于状态进行一个三目判断,如果为0那就是进行中,否则就是已完成,期初我是这样写…...

Qt应用开发(基础篇)——进度对话框 QProgressDialog
一、前言 QProgressDialog类继承于QDialog,是Qt设计用来反馈进度的对话框。 对话框QDialog QProgressDialog提供了一个进度条,表示当前程序的某操作的执行进度,让用户知道操作依旧在激活状态,配合按钮,用户就可以随时终…...

基于SpringBoot2的后台业务管理系统
概述 SpringBoot-Plus 是一个适合大系统拆分成小系统的架构,java快速开发平台,或者是一个微服务系统。其中加入了Thymeleaf数据模板语言代替了之前的JSP页面方式。页面展示采用Layui前端框架,包含了用户管理,角色管理,…...

Jmeter(三十):并发测试(设置集合点)
集合点:让所有请求在不满足条件的时候处于等待状态。 如:我集合点设置为50,那么不满足50个请求的时候,这些请求都会集合在一起,处于等待状态,当达到50的时候,就一起执行。从而达到并发的效果。 那么Jmeter中可以通过同步定时器 Synchronizing Timer 来完成。 Number …...

Flink的checkpoint是怎么实现的?
分析&回答 Checkpoint介绍 Checkpoint容错机制是Flink可靠性的基石,可以保证Flink集群在某个算子因为某些原因(如 异常退出)出现故障时,能够将整个应用流图的状态恢复到故障之前的某一状态,保证应用流图状态的一致性。Flink的Checkpoint机制原理来自“Chandy-Lamport alg…...

ubuntu上安装nginx
这篇文章主要介绍怎么在ubuntu上安装nginx服务器,并进行一些简单的配置。 第一步:准备好一台ubuntu操作系统的虚拟机 注意:如果你还没有安装好ubuntu,个人推荐阅读以下文章完成unbutu安装,vm的版本不用刻意安装文章中…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...