零、序
2022 年 11 月 30 日,OpenAI 公布了一个基于 GPT-3.5 系列大型语言模型(LLM)微调而成的对话式 AI 模型 ChatGPT。这一模型推出后,引起了市场强烈反响。虽然 ChatGPT 只是一个语言模型,但使用者惊讶地发现,通过与其适当的互动和引导,可以让它创作诗词、编写文案、分析数据,甚至编写和调试代码。
在接下来的两个月中,ChatGPT 的月活跃用户数迅速突破一亿,打破了互联网历史记录,成为史上增长最快的消费者应用。人类从 ChatGPT 中似乎看到了通用 AGI 道路上的一线希望。
ChatGPT 仅仅是一个起点,未来我们可以预期越来越多的大型语言模型将面世供消费者使用。这让我们既兴奋又焦虑。兴奋的是我们可能正在开启和经历着人类历史上的第四次工业革命;焦虑的是此类大型语言模型将极大地改变各行各业特别是泛内容产业的玩法、生态和格局。
本书的目的是帮助读者更好地理解和使用 ChatGPT。即使你对人工智能技术或编程技术一窍不通,也不用担心。我们将用最通俗易懂的语言和例子,教会大家如何高效地使用 ChatGPT。需要注意的是,由于我们会尽量避免技术术语,这也会使得 ChatGPT 的技术细节解读不太准确。但没关系,因为我们的目的是要高效地使用它,仅需要大致了解一些原理即可。
本书共分为三大章:
第一章:主要介绍机器学习、神经网络和大型语言模型的基本原理,不过不会涉及过多的技术细节。读者需要了解每一个名词的含义以及 ChatGPT 大致的工作流程,以便更好地理解后面的内容。
第二章:主要讲解 ChatGPT 的使用技巧,包括提示工程、工作记忆、短期记忆、长期记忆、外部工具以及OpenAI参数详解等。我们将使用通俗易懂的语言和实例,帮助读者快速掌握 ChatGPT 的使用方法。
第三章:主要探讨关于 ChatGPT 的一些哲学思考。我们将结合微软的一篇论文,分析 ChatGPT 相比人类的优势和缺点。此章节旨在启发读者思考大型语言模型对人类的影响,并思考如何合理应用它们。
一、大型语言模型的基本原理
1.1 机器学习与神经网络
1.1.1 演绎与归纳
人类的逻辑推理可以分为两种范式。一种称为 演绎,另一种称为 归纳。
演绎法的提出者是坐标系的发明者,法国人笛卡尔。演绎法的基本思想是在已知原理或假设的前提条件下,通过逻辑推理得出最终的结论。最经典的演绎法应用就是数学公理系统,比如在欧几里得的平面几何中,我们从「两点之间直线最短」等五大公理出发,通过演绎推理,得到了千千万万个有趣的命题和定理。
归纳法的提出者是英国人培根。归纳法是通过观察和实验,由大量的样本数据归纳推理出一般性原理。这是一种「以偏概全」的推理方式。最经典的例子就是牛顿在《自然哲学原理》中提出的万有引力定律。牛顿通过已有的数据,发现物体间存在的引力符合一个统一的公式,于是他将这个有限的经验推广到万物,从而得到了万有引力定律[①]。
在演绎法的这条路上,学者们期望人工智能可以像人一样,根据已有的假设和前提进行逻辑推理。最具代表性的有我国数学家吴文俊教授提出的《几何定理证明》,实现了几何学中从条件到结论的自动演绎推理。但演绎法并非是通向人工智能的康庄大道,在现实中,很多待解决的实际问题无法提前推演出一般性原理,甚至通用的假设都很难总结。目前,人工智能更多的转向了归纳法这条路。
在归纳法的这条路上,人工智能的成果则是百花⻬放,机器学习 就是其中一个有效的实现路径。针对某个具体的问题,机器通过大量但有限的观测数据,归纳出一套解决该问题的方法,并将该方法推广到整个问题(无限数据)上。这就是 机器学习 的最本质思想。
1.1.2 什么是机器学习
什么是机器学习?机器学习是一种使用计算机算法和统计学方法来识别数据模式并从数据中提取知识的方法。利用机器学习我们可以解决非常多的问题,例如垃圾邮件的识别[②]。
![图片[1]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/6bbc34be9a3d7e7.webp)
假设程序员小吴接到垃圾邮件识别这个任务,需要用计算机程序来判断一封邮件是否是垃圾邮件。在任务开始之前,小吴搜集到了很多邮件,其中有部分属于垃圾邮件。
此时小吴有两种方案实现这个程序:
方案一:
根据手里的垃圾邮件数据,人工的去尝试和总结出一些规律,例如邮件中是否含有促销,打折等词语,以此来作为判断垃圾邮件的规则。
方案二:
让计算机自己通过已有的邮件「自动」总结出不同的「规则」,注意这些「规则」可能人类没法理解,然后以此来区分垃圾邮件。
不难看到这两种方案都属于归纳推理。第二种方案就是机器学习。即让计算机自己通过数据来寻找出规律。
需要注意的是,小吴事先搜集的邮件数据应当是有标记的,即需要标记出哪些邮件是垃圾邮件,哪些邮件是正常邮件。我们将邮件称为数据,是否是垃圾邮件称为该数据的 标签。这里的标签的标记需要人类参与,请读者牢记这点。
机器学习的种类有很多,上面举的例子属于机器学习中的一个子类,称为 监督学习。监督学习是指计算机通过人类标记的数据进行学习。
机器学习包含两个阶段,阶段一称为 训练(又被称为学习)。阶段二称为 推断(又被称为预测)。
训练 是指机器学习程序根据数据自动总结「规律」的过程。这个阶段常常需要耗费大量的计算资源和时间成本。
推断 是指当机器学习程序完成训练后,被投入使用的阶段。这阶段消耗的计算和时间一般远小于训练阶段。
1.1.3 什么是神经网络
机器学习有多种实现方法,其中一种被称为 神经网络,它模拟了人类神经系统的工作原理[③],并可用于处理复杂的数据和任务。ChatGPT 正是使用神经网络实现的。
神经网络简单性和复杂性并存。它的简单之处在于它由一些非常简单的基本元素组成;而复杂之处则在于,当这些基本元素组合成大规模的网络时,人类很难理解和分析其运作机制。然而,神奇的是,神经网络的效果非常出色。
下面是一个最简单的神经网络的示意图:
![图片[2]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/8637bd8f9d4f741.webp)
在上图中,每个圆圈代表一个神经元。每个神经元代表一个数据。这个数据可能代表输入,也可能代表神经网络的计算结果。例如,上图中的第一层圆圈表示输入,而第二层则代表神经网络的计算结果。
每条带箭头的边表示神经网络的 权重。权重是神经网络的核心,是计算机通过大量数据自动学习得出的。其中,红色边的权重较为特殊,称为 偏置,对应的神经元永远为 1。
神经网络的运算规则非常简单:下一层神经元的值等于所有与其相连的神经元的值乘以对应的边的权重,然后相加。最后再通过一个非线性函数进行 激活。
例如,在上图中,将输入记作 (�1,�2,�3,�4)(x_1,x_2,x_3,x_4) ,输出记作 (�1,�2,�3)(y_1,y_2,y_3) ,那么上图的神经网络可以用下面的数学公式表示:
(1.1)�1=�10⋅1+�11⋅�1+�12⋅�2+�13⋅�3+�14⋅�4�2=�20⋅1+�21⋅�1+�22⋅�2+�23⋅�3+�24⋅�4�3=�30⋅1+�31⋅�1+�32⋅�2+�33⋅�3+�34⋅�4 \begin{aligned} z_1 = \theta_{10}\cdot 1+\theta_{11}\cdot x_1+\theta_{12}\cdot x_2+\theta_{13}\cdot x_3+\theta_{14}\cdot x_4\\ z_2 = \theta_{20}\cdot1+\theta_{21}\cdot x_1+\theta_{22}\cdot x_2+\theta_{23}\cdot x_3+\theta_{24}\cdot x_4\\ z_3 = \theta_{30}\cdot1+\theta_{31}\cdot x_1+\theta_{32}\cdot x_2+\theta_{33}\cdot x_3+\theta_{34}\cdot x_4 \end{aligned}\tag{1.1}
最后, (�1,�2,�3)(y_1,y_2,y_3) 由 (�1,�2,�3)(z_1,z_2,z_3) 通过下面的公式进行 激活:
(1.2)�1=��1��1+��2+��3�2=��2��1+��2+��3�3=��3��1+��2+��3 \begin{aligned} y_1 = \frac{e^{z_1}}{e^{z_1}+e^{z_2}+e^{z_3}} \\ y_2 = \frac{e^{z_2}}{e^{z_1}+e^{z_2}+e^{z_3}}\\ y_3 = \frac{e^{z_3}}{e^{z_1}+e^{z_2}+e^{z_3}} \end{aligned}\tag{1.2}
在公式 (1.1) 中, �{\theta} 是神经网络学习出来的参数。通过前面章节提到的机器学习技术和大量的数据,神经网络可以自动学习出这些参数。
公式 (1.2) 中的 激活函数 将 (�1,�2,�3)(z_1, z_2, z_3) 规范化为概率值,即 0<��<10<y_i<1 ,且 �1+�2+�3=1y_1+y_2+y_3=1 。这个公式非常重要,因为它可以帮助我们更好地理解 ChatGPT 中需要设置的参数,请读者牢记这个公式。
当你看到这时,恭喜你,现在你已经大致了解了神经网络的运作方式。然而,与前面的例子相比,ChatGPT 使用的神经网络在结构上更加的复杂,在参数数量上更加的庞大。据公开资料显示,ChatGPT 拥有 1750 亿个参数,而我们前面的例子仅有 15 个参数。但没有关系,以上关于神经网络的知识足以应付后面的内容。
1.2 大型语言模型
1.2.1 大型语言模型与自然语言处理
自然语言 是指人类之间沟通交流的语言,它会自然地随文化而演化。例如英语,汉语都属于自然语言。
自然语言在人类社会中占据着非常重要的地位。毫不夸张的说,自然语言的出现极大的促进了人类文明的发展和传承。
首先自然语言帮助人类建立社会联系,人类因此得以沟通协作。其次自然语言促进了人类文化的传承,让人类可以将自己的文化和知识传递给下一代。最后自然语言更是促使了人类的抽象能力,让人类将实体世界中的概念和事物通过语言抽象和表达出来。
所以,让计算机处理和理解自然语言一直是人类梦寐以求的理想。在过去的几十年里,人类一直在尝试用不同的技术方法实现计算机对自然语言的理解。大型语言模型则是最近的佼佼者,它用最朴素的思想和最暴力的手段近乎完美的解决了这个问题。
大型语言模型(Large language model,简称LLM)是指具有海量参数的神经网络模型,它通过大型的神经网络对人类的自然语言数据训练得到。ChatGPT 的出现,不仅证明了大型语言模型能近乎完美的处理和理解人类的自然语言,更让我们看到了实现通用人工智能(AGI)[④] 的希望。
ChatGPT 底层使用的大型语言模型是 GPT-3.5 模型。这是由 OpenAI 自己研发的大型语言模型,已经迭代了 3 次。
在后文中,我们用 GPT 表示 ChatGPT 底层的大型语言模型。
1.2.2 自监督学习与自回归模型
大型语言模型本质上就是神经网络,也就是一种机器学习的方法。根据 1.1.2 小节的讲解。机器学习中的监督学习需要人类帮助标注数据。然而遗憾的是,ChatGPT 底层的大型语言模型参数如此的多,如果使用监督学习,必然需要大量的人类标记数据,这几乎是不可能的。那有没有什么方法可以不用标记数据,直接训练呢?
答案是有的,这种方法称为 自监督学习。首先看一下自监督学习较为学术的定义:
自监督学习主要是利用辅助任务(pretext)从大规模的无监督数据中挖掘自身的监督信息,通过这种构造的监督信息训练模型,从而学习到对下游任务有价值的表征。
举一个不太恰当的例子以帮助读者理解。学生通过做英语题来提升自己的英语应试能力。英语的题目是数据,题目的答案是数据的标签。除了刷题来练习英语的应试能力外,更可以利用看英文电影,听英文音乐,读英文小说的方式间接的加强自身的英文能力。看英文电影,听英文音乐,读英文小说属于辅助任务(pretext),这些数据本身是没有标签信息的(相比于英语应试题目)。
那么 GPT 是如何在人类的文本数据上实现自监督学习的呢?用一句话就可以讲明白:
用文本的前文来预测后文。
例如在下面这段文本中:
我买了一台苹果,然后坐地铁回家。
GPT 模型会将回家两个字掩盖住。将 我买了一台苹果,然后坐地铁
视为数据,回家。
视为标签。 GPT 要做的就是根据前文 我买了一台苹果,然后坐地铁
来预测后文 回家。
。
通过什么预测呢?通过 1.1.2 小节提到的神经网络,但需要注意的是,这个神经网络非常的庞大和复杂 [⑤]。
![图片[3]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/4920a9c9b2006a7.webp)
如上图所示,神经网络输入 我买了一台苹果,然后坐地铁
,然后输出 回家。
。需要注意的是,家
这个字的输出其实依赖的是 我买了一台苹果,然后坐地铁回
,。
的输出其实依赖的是 我买了一台苹果,然后坐地铁回家
。换句话说,上面的这种结构总是通过前面的内容来预测下一个字,下下个字的输出又会依赖上个字的输入。这种预测建模的方法称为自回归,即依赖自己的预测继续预测下一个,所以 GPT 模型又称为 自回归模型。
当然,在训练才开始时,模型常常是预测不准的,此时计算机会通过算法去调整 GPT 的参数,尽量让 GPT 预测的准。通过不断的调整 GPT 的参数,最终得到一个模型。
GPT 使用了多少文本参与训练呢?我们不从得知,只知道它的前身 GPT-3 使用了至少 3000 亿个单词。ChatGPT 使用的只会更多,它不仅使用了自然语言的文本,还加入了人类写的代码。
不难看到,上面的整个过程仍然是归纳的思想,所以并未脱离机器学习的技术路线。
1.2.3 语言模型中的 token
在上一小节,我们其实刻意回避了一个问题。GPT 的输入和输出都是到中文字的粒度吗?注意,GPT 不仅仅能处理中文,它还能处理几乎世界上所有流行的自然语言。所以这告诉我们 GPT 实际的输入和输出并不是像 1.2.2 中那个图的样子。
因此,我们需要引入 token 的概念。token 是自然语言处理的最细粒度。简单点说就是,GPT 的输入是一个个的 token,输出也是一个个的 token。
![图片[4]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/83678dc076f79c5.webp)
GPT 不是适用于某一门语言的大型语言模型,它适用于几乎所有流行的自然语言。所以 GPT 的 token 需要 兼容 几乎人类的所有自然语言,那意味着 GPT 有一个非常全的 token 词汇表,它能表达出所有人类的自然语言。如何实现这个目的呢?
答案是通过 unicode 编码。
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
例如中文中的 你
字对应如下 unicode 编码:
\u4F60
\u
表示后面是一个 unicode 编码,它用 16 进制数表示。4F60
转换成 10 进制对应 20320 ,20320 表示在 unicode 编码中,第 20320 个编码对应的是字是 你
。最后将 20320 转换为 2 进制,得到如下结果:
0100 1111 0110 0000
如果我们直接将 unicode 的编码作为 GPT 中 token 的词表,会存在一些问题。 一方面直接使用 unicode 作为词汇表太大了,另一方面 unicode 自身的粒度有时候太细了,例如 unicode 中的英文编码是以字母粒度进行的。
于是我们会将 unicode 的 2 进制结果以 8 个二进制位为单位进行拆分。例如将 你
拆分成:
0100 1111
和
0110 0000
8 个二进制位只有 256 种可能,换句话说,只需要 256 个 token 的词汇表就能表示所有 unicode。
然而这种方法的词汇表又太小了,编码方法太粗糙了。实际上 GPT 是使用一种称为 BPE (Byte Pair Encoding)的算法,在上面的基础上进一步生成更大的词汇表。
它的基本思想如下,将上述的基础 token (256种可能)做组合,然后统计文本数据中这些组合出现的频率,将频率最大的那些保留下来,形成新的 token 词汇表。因此,通过此方法得到的 token 和文字的映射不一定是一对一的关系。
例如在英文中,red
会被视为一个 token,这个 token 在词汇表中的编号是 13
。注意,这里 red
前有一个空格,在这里「文字」和 token 是多对一[⑥]。
![图片[5]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/08f1db3bdfa5c18.webp)
![图片[6]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/2dceb8e1d624778.webp)
再例如 enlighten
会被视为三个 token,对应的编号分别是 268,2971,268
,在这里「文字」和 token 是一对多[⑥]。
![图片[7]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/083ad733db7f8cb.webp)
![图片[8]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/8a6bc7e248ea59c.webp)
在这里我们不对 BPE 算法做进一步的展开。如果读者想查询 OpenAI 的字符和 token 的映射关系,可以使用该网站查询。
实际上,OpenAI 不仅对自然语言做了 token 的映射,对编程语言中的代码也做了 token 的映射。
![图片[9]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/ef61d180eebddfe.webp)
![图片[10]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/2d0544f892e51c8.webp)
有意思的是,unicode 不仅有自然语言,实际上也包含 emoji 等自然语言之外的符号。这也是为什么 ChatGPT 能理解和回复 emoji 的原因。
![图片[11]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/b2053f8f5679afa.webp)
![图片[12]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/ff601acb8f5a717.webp)
![图片[13]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/1eedf12e9c0e02a.webp)
综上所述, GPT 实际是将我们输入的文字转换成 token,然后通过 GPT 模型预测 token,再将 token 转换成文字,最后再输出给我们。
![图片[14]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/f1b1ceff03edbea.webp)
通过 token 的学习,我相信读者能感觉到 ChatGPT 理解文本的方式和人类并不相同,它在以自己的方式理解这个世界。
1.2.4 自然语言文本生成
1.2.2 中介绍的训练过程是不严谨的,实际上 GPT 的训练过程远比前面说的复杂。1.2.2 中介绍的自监督学习仅仅第一步,后续还有很多其他步骤 [⑦]。
GPT 的训练是很复杂,OpenAI 也并未公布详细的训练细节。作为使用者,我们其实不需要了解太多的训练细节。我们真正需要关心的是模型在预测阶段的细节,因为使用 GPT 的过程,就是模型预测的过程。
正如 1.2.3 小节所言,我们会有一个非常大的 token 词汇表。为了方便读者理解,我们假设 token 和中文汉字以及符号是一一对应的,且这个世界上只有 6 个常用字和符号,如下图所示:
![图片[15]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/536f8984634c349.webp)
在这个词汇表中,第一列表示 token 的编号,第二列表示 token 对应的字符(在我们目前的假设下,token 对应的是汉字或标点符号)。
当我们把 我买了一台苹果,然后坐地铁
输入给模型的时候,模型会产出一个向量。
(-1,0.5,1,2,2,0)
该向量的长度和词汇表的行数一致。作用是拿来预测下一个 token 是什么。其中向量的第 �i 个位置表示词表中的第 �i 个 token 的值。
将这个向量放入公式 (1.2) 计算出新的向量,新的向量的每一个值都在 (0,1) 之间,且和为 1。向量第 �i 个位置的值表示的是对应 token 被选择到的概率。计算过程如下:
(1.4)0.018≈�−1�−1+�0.5+�1+�2+�2+�00.080≈�0.5�−1+�0.5+�1+�2+�2+�00.133≈�1�−1+�0.5+�1+�2+�2+�00.360≈�2�−1+�0.5+�1+�2+�2+�00.360≈�2�−1+�0.5+�1+�2+�2+�00.049≈�0�−1+�0.5+�1+�2+�2+�0\begin{aligned} 0.018 \approx \frac{e^{-1}}{e^{-1}+e^{0.5}+e^{1}+e^{2}+e^{2}+e^{0}} \\ 0.080 \approx \frac{e^{0.5}}{e^{-1}+e^{0.5}+e^{1}+e^{2}+e^{2}+e^{0}} \\ 0.133 \approx \frac{e^{1}}{e^{-1}+e^{0.5}+e^{1}+e^{2}+e^{2}+e^{0}} \\ 0.360 \approx \frac{e^{2}}{e^{-1}+e^{0.5}+e^{1}+e^{2}+e^{2}+e^{0}} \\ 0.360 \approx \frac{e^{2}}{e^{-1}+e^{0.5}+e^{1}+e^{2}+e^{2}+e^{0}} \\ 0.049 \approx \frac{e^{0}}{e^{-1}+e^{0.5}+e^{1}+e^{2}+e^{2}+e^{0}} \\ \end{aligned}\tag{1.4}
当计算完成后,GPT 应该选择哪个 token 作为下一个预测呢?答案是不确定。GPT 会根据计算的概率,采样得到下一个 token,概率越大的 token 被采样到的机会越大。下一个 token 可能采样到 回
也可能采样到 上
甚至可能直接采样到 。
所以 GPT 在生成文本的过程中,会带有一定的随机性,这种随机性使得即使是相同的前文能得到不同的后文生成。当采样得到下一个 token 后,再重复上面的过程,直至采样到表示结束的 token [⑧] 或者被强制停止。
所以在上面的例子中,GPT 可能会生成如下几种结果:
我买了一台苹果,然后坐地铁。
我买了一台苹果,然后坐地铁回家。
我买了一台苹果,然后坐地铁上班。
实际上,在文本生成的过程中 GPT 中有四种采样方式:
方案一: 随机采样
这类采样直接根据神经网络预测的概率采样得到下一个 token。
方案二: 增加了 temperature 参数的随机采样
这类采样将公式 (1.2) 进行了一点变化,引入了超参数 t:
(1.3)�1=��1���1�+��2�+��3��2=��2���1�+��2�+��3��3=��3���1�+��2�+��3� \begin{aligned} y_1 = \frac{e^{\frac{z_1}{t}}}{e^{\frac{z_1}{t}}+e^{\frac{z_2}{t}}+e^{\frac{z_3}{t}}} \\ y_2 = \frac{e^{\frac{z_2}{t}}}{e^{\frac{z_1}{t}}+e^{\frac{z_2}{t}}+e^{\frac{z_3}{t}}}\\ y_3 = \frac{e^{\frac{z_3}{t}}}{e^{\frac{z_1}{t}}+e^{\frac{z_2}{t}}+e^{\frac{z_3}{t}}} \end{aligned}\tag{1.3}
不难看到 (1.3) 和 (1.2) 的区别是引入了参数 �t 。当 �=1t=1 时,(1.2) 和 (1.3) 没有区别。当 �<1t<1 时 , (�1,�2,�3)(y_1,y_2,y_3) 中的相对差异会随着 �t 的变小变得更大,当 �>1t>1 时间, (�1,�2,�3)(y_1,y_2,y_3) 中的相对差异会随着 �t 的变大变得更小。需要注意的是,无论 �t 如何变动,都不会影响 (�1,�2,�3)(y_1,y_2,y_3) 的相对大小。
下面举一个具体的例子方便读者理解。假设 �1=1,�2=2,�3=3z_1=1,z_2=2,z_3=3 ,当 �=1t=1 时:
(1.4)�1=0.09�2=0.24�3=0.67 \begin{aligned} y_1=0.09\\ y_2=0.24\\ y_3=0.67 \end{aligned}\tag{1.4}
当 �=0.5t=0.5 时:
(1.5)�1=0.016�2=0.117�3=0.867 \begin{aligned} y_1=0.016\\ y_2=0.117\\ y_3=0.867 \end{aligned}\tag{1.5}
当 �=0.2t=0.2 时:
(1.6)�1=0.0000451�2=0.00669�3=0.9932 \begin{aligned} y_1=0.0000451\\ y_2=0.00669\\ y_3=0.9932 \end{aligned}\tag{1.6}
当 �=1.5t=1.5 时:
(1.7)�1=0.15�2=0.29�3=0.56 \begin{aligned} y_1=0.15\\ y_2=0.29\\ y_3=0.56 \end{aligned}\tag{1.7}
当 �=2t=2 时:
(1.8)�1=0.186�2=0.307�3=0.506 \begin{aligned} y_1=0.186\\ y_2=0.307\\ y_3=0.506 \end{aligned}\tag{1.8}
下面是可视化的结果:
![图片[16]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/6f60af98d81752d.webp)
不难看到 t 的大小决定了 token 预测分布的陡峭和平缓程度。
一般的,我们将 t 控制在 (0,2) 之间,t 越小不确定性越小,得到的结果越确定,反之得到的结果越发散。因此,当我们需要更加确定的答案时,倾向于调小 t ,当我们需要更加发散的答案时,倾向于调大 t 。
方案三: top n 随机采样
这类随机采样不是在所有候选 token 中采样,而是取概率值最大的前 n 个 token 采样。
例如当我们取 top 2 时,每次只从预测概率值最高的两个中采样得到下一个 token。
方案四: top p 随机采样
top n 随机采样的候选 token 个数是固定的。top p 则是不固定的,这种采样又称为 核采样。我们事先设定一个 (0,1) 之间的 p 值,然后将 token 的预测概率从大到小排序,接着从大到小选择 �k 个 token,使得它们的概率累计值恰好大于 p。
例如在前面的例子中,我们假设事先设定 �=0.85p=0.85 。那么根据前面的规则,我们会选择 回
,上
,。
三个 token。因为它们的预测概率值满足:
(1.9)0.360+0.360+0.133>0.85 0.360+0.360+0.133 > 0.85\tag{1.9}
在下一次的 token 预测中,每个 token 的预测概率一般会有所改变,因此候选 token 的数量不一定还是 3,它是动态调整的。
1.3 自然语言任务的大一统
1.3.1 任务的统一
在 GPT 出现以前,用计算机程序处理自然语言常常会被拆分为一个个的子任务。这些子任务属于不同的领域,需要使用不同的神经网络模型。
大型语言模型属于文本生成任务。人们惊讶的发现,只要大型语言模型的能力足够强,文本生成能将其他所有的自然语言处理子任务统一起来。
例如对于中英的机器翻译任务可以构造成如下的文本生成任务:
![图片[17]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/8e5e16c760c261c.webp)
其中灰色部分是大型语言模型的输入,红色部分来自于大型语言模型的文本生成。
对于文本分类任务(情感分类)可以构造成如下的文本生成任务:
![图片[18]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/35a7c7290812b61.webp)
对于 QA 问答可以构造成如下的文本生成任务:
![图片[19]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/368aa47fe5662d0.webp)
其中 Question
表示问的问题,Answer
表示生成的答案。
甚至对于多轮对话系统,也可以构造成文本生成任务:
![图片[20]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/ce68ff50160ad8b.webp)
����Q_iA_i 表示第 �i 轮的对话历史, �4A_4 表示生成的对话结果。这个例子非常重要,这是 ChatGPT 用文本生成实现多轮对话系统的原理。
1.3.2 参数的统一
实际上,大型语言模型不仅做到了任务的统一,更是做到了参数的统一。在以往,我们需要为不同场景下的具体子任务训练不同参数的模型。例如文本分类这个子任务,有评论的情感分类,垃圾邮件的分类,辱骂评论识别,欺诈短信识别,新闻分类等等。可以说是无穷无尽的。在以往,我们会根据搜集到的具体任务数据对神经网络的参数进行轻微调整,这个过程我们称为 finetune。就好比一个有大学本科学位的大学生,在有了较好的基础知识后(已经学习了好了参数),走上了工作岗位,在新的工作岗位中需要学习新的知识(finetune 神经网络的参数)以适应工作的需要。
然而 finetune 的成本是很大的,特别是对于大型语言模型来说,即需要大量的数据标记成本,也需要算力成本和时间成本。然而,不同场景下任务的需求是不一样的,不可能根据每个任务都去 finetune 模型。能否不进行 finetune 就让模型学习完成不同的任务呢?
答案是可以的,这个神奇的技术称为 上下文学习 (In Context Learning)。它的实现非常简单,只需要给到模型一些引导,将一些事先设定的文本输入到大型语言模型中,就像手把手教人学会某项技能一样,大型语言模型就能神奇的学习到如何处理后续的新任务。
这些事先设定的文本称为 提示(Prompt),我们在后面章节还会进一步讲解。
![图片[21]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/8e170fa9e2c29c3.webp)
这时候,你会发现大型语言模型真的很像有智能的人类,你只需要给他一点引导和提示,就能很快学会如何处理新的任务。
上下文学习可以分为三种情况,它们分别是:
- 零样本学习(zero shot learning)
- 单样本学习(one shot learning)
- 少样本学习(few shot learning)
零样本学习是指提示仅包含提问,不给任何的示例,例如:
评论:我讨厌这个味道。 观点:
单样本学习是指提示除了包含提问,也包含单个示例,例如:
评论:这个食物尝起来很棒 观点:好
评论:我讨厌这个味道。 观点:
少样本学习和单样本学习类似,但包含多个示例,例如前面图片中的提示就是少样本学习。
需要注意的是,无论是哪种上下文学习,它们仍然属于文本生成任务,它结构可表示成如下形式:
![图片[22]-ChatGPT 实用指南(一)-SPHAI人工智能聊天 | GPT-3.5](https://ai.sph.net/wp-content/uploads/2023/04/a0c381f041bc765.webp)
遗憾的是,为什么大型语言模型具有 上下文学习 的能力仍然是一个迷,但这并不妨碍我们使用它。
① 这里描述其实不太准确,准确的描述是,开普勒通过第谷留下的天文观测数据,归纳推理出了 开普勒三大定律。之后,牛顿通过自创的微积分工具,由 开普勒三大定律 演绎推理出了 万有引力定律。
② 垃圾邮件识别是指使用技术手段(如机器学习算法、规则引擎等)自动判断一封电子邮件是否为垃圾邮件,以便过滤掉不需要的邮件。
③ 这里描述其实不太准确,实际上大部分神经网络只是参考了人类神经系统的层级堆叠结构。
④ 通用人工智能(Artificial general intelligence,AGI)是一种假想中的机器智能,它有能力理解或学习任何人类能够完成的智力任务。
⑤ OpenAI 的 GPT 系统模型主要是用的是一种称为 transformer 神经网络的 decoder 部分,这是一种结构非常复杂的神经网络,参数也非常的庞大。
⑥ 在这里,文字是指英文单词,英文中的空格,英文中的标点符号等。
⑦ 例如利用人类标记的问答数据进行 finetune,利用 RLHF(Reinforcement Learning from Human Feedback) 进一步 finetune。关于 finetune 的介绍可参考后面章节的内容。
⑧ 在 OpenAI 中,表示结束的 token 默认是 <|endoftext|>
。
知乎卡卡罗特:https://zhuanlan.zhihu.com/p/620426699
请登录后查看评论内容