万字详解 ChatGPT 原理

Posted by He Zongjiang on 2023-04-11
## 1、什么是 GPT

GPT 全称 Generative Pre-trained Transformer,生成式预训练转化模型。虽然每个字都认识,还是不知道 GPT 是个啥玩意。下面拆解一个每个次的含义。

Generative

生成式,是指给定前文可以自动生成后文,例如输入 “天气真”,可以生成“好”字输出。

Pre-trained

预训练,预先训练过的。GPT3 大约使用了 5000 亿个 token,这里可以把每个 token 是为一个单词,这几乎把互联网上能找到的文本全部都用于 GPT 的训练了。

数据集 token数量(亿)
爬虫数据 4100
网页文本 190
书籍书籍 670
维基百科 30

Transformer

指的是 Transformer 模型,这也目前大语言模型的基石架构。是一种用于自然语言处理任务的深度神经网络架构。

最大的特点是自注意力机制,它可以学习词语之间的关系,并综合不同位置的词语,得出整个序列的含义。这种机制使得 Transformer 架构可以并行地处理整个输入序列,从而加速训练和推理过程。

“Chat” 表示它是一个对话模型,“GPT” 则代表了它是生成式预训练 Transformer 架构构建的。一句话介绍:ChatGPT 是基于给定的文本,生成文本的对话模型。

2、词语接龙

ChatGPT 使用的是 GPT-3.5 架构,既然有 3.5,那么肯定有 GPT-3、GPT-2、GPT-1,只不过前几代都有很明显的缺陷,不是广为人知。

假如向 ChatGPT 输入给定文本:The best thing about AI is its ability to,那么 ChatGPT 会给出可能跟在这段文本后面的单词列表,以及每一个单词的概率:

单词 概率
learn 4.5%
predict 3.5%
make 3.2%
understand 3.1%
do 2.9%

如何确定给定文本 “The best thing about AI is its ability to” 后面紧跟着的单词?

如果一直选择概率最高的单词,如此循环,便会生成一段非常平淡,甚至重复的文章。但如果增加一个随机参数,使其存在一定概率能够使用概率较低的单词,这样就能够生成比较有趣的文章(这个随机参数叫做“温度”,实践发现“温度”数值等于 0.8 时效果比较好)。

GPT-3 及之前的版本都是使用这种方法,给定上文,推理出下文,如此循环,便能给出句子回复。

但如果用这种方训练 ChatGPT 学古诗,就算教不出神经病,也只能教出一个背诗机器,它理解不了诗的美,也创造不出新的诗句。

不仅如此,因为训练数据全部来自书籍、互联网等,如果问一个之前不存在的问题,回答就会一本正经的胡说八道,原因就是它只是根据海量训练数据,计算单词之间的相关性,重复生成下一个单词,并不知道说的话是否符合现实逻辑。

所以这种对 ChatGPT 的解释不能说不对吧,但也有点太简单了,很容易让人觉得 ChatGPT 就是一个死记硬背和暴力穷举的产物,但暴力穷举能真正创造出语言吗?

并不能,更不用说人工智能的绘画工具,已经能够画出惟妙惟肖的小姐姐,ChatGPT 更是可以同时和几亿人谈笑风生,就算暂时还写不出超越李白的诗,但作诗水平吊打一般人类也不成问题了。

3、向量化

ChatGPT 是如何理解人类语言的?要回答这个问题,首先需要知道计算机是如何记录现实世界的。

3.1、什么是向量化

计算机的底层是二进制,我们现实世界的所有问题,如果交给计算机处理,最终都是把它转化成了数学问题。

比如英语的 26 个字母,可以找 52 个数字来代替,26 个数字表示大写,26 个数字表示小写。

要存储一幅画,我们可以把每个像素的颜色表示为红绿蓝(RGB)3 种颜色的组合,而每一种颜色都可以表示为 0~255 的数字,比如红色 R0 表示最浅的红色,R255 表示最深的红,于是一幅画在电脑中,就变成了一大堆数字的组合。

但我们要表示一个「人」呢?

可以用这样的一组数字:01807520

看不懂?简单解释一下:第一个数字表示性别,0 是男,1 是女;第二个数字表示身高;第三个数字表示体重;第四个数字表示年龄。

你觉得这样的表示太简单?没有把握你的优秀特征?

没问题,我们可以增加维度,比如你的体脂率、肤色、三维、发色、爱好、学历、收入、城市等等,所有这些都可以表示成数字,维度越多,定义就越准确,通过这些维度筛选出来的人,跟你的相似度就越高。

这样就把一个「人」变成一串数字,计算机就可以识别出这个人了。

3.2、为什么要向量化

量化后的空间结构,展现出了一定的规律。有助于模型利用数学计算向量空间里的距离,去捕捉不同词在语义和语法等方面的相似性。

举个例子,我们只画两个维度:身高和体重。在这样的一个坐标里,所有和 [180,75] 这个点接近的位置,都是体型和你相似的人,并且增加更多的维度,衡量标准就越多,在高维度的坐标系里,就能够更多地通过空间关系,理解每一个人的特征。

词语也是一样的,只不过更抽象,表示的维度也更不容易被总结出来,但如果我们把它们放在一个很高维度的坐标里,那么就会发现意义相近的词语,它们的空间可能就会更近。因此词向量不仅可以帮模型理解词的语义,也可以捕捉词与词之间的复杂关系。

例如:

  1. 「男人与国王的差异」和「女人与女王的差异」是相似的;
  2. 「男人与男孩的差异」和「女人与女孩的差异」也是相似的;
  3. 「国王」减去「男人」再加上「女人」得出的向量和「女王」的位置非常接近。

3.3、训练

这件事情说起来很简单,但实际上可能很难,前面说了需要把词语放到一个合适维度的坐标中,还要能正确地标注每个词语在空间中的位置,但是怎么找到这些维度,怎么找到词语的空间位置呢?这就是人工智能要干的事情了。

比如我们预先准备一个 50 维度的坐标,准备放 1 万个词。先把这 1 万个词随便扔到坐标里,说的专业一点点,就是随机产生每个词的向量,然后到语料库中随便拎一句语料出来,让电脑玩词语接龙,找到第一个词和第二个词,把它们的向量拿过来计算。

因为向量是可以计算的,所以我们就可以知道,每次计算出来的数和正确结果差距有多大,这个就是损失函数,训练目的就是要让这个差距越来越小,这是有数学方法可以逼近正确结果的,这个过程叫做收敛。

在给了足够多的语言以后,这 1 万个词都训练了好多遍了,于是每个词都找到了自己在坐标里的正确位置,词的向量化工作就结束了。

这个工作不新鲜了,2013 年谷歌就发布了著名的 word2vec 模型(Efficient Estimation of Word Representations in Vector Space),看名字你就知道了,就是专门把词向量化的。

但是既然词向量已经能够帮助电脑理解每个词的意思。为什么直到 10 年以后,我们才看到了自然语言理解的春天?

那是因为到现在为止,我们只做了第一步:词的向量化;还有第二步没有做,那就是信息压缩与特征提取。

没有做特征提取,就相当于没有找到正确的规律,用错误的规律去训练,那么最后找到的词向量也就是错误的,也就是说这些词其实并没有找到,自己在向量空间中的正确位置。

4、一切的开始:Attention 和 Transformer

多年以来,人类一直在用循环神经网络 RNN,基本训练方法跟前面说的差不多,就是把前面多少个词作为输入,让电脑去猜下一个词,离下一个词越近的词权重就越高,而越远的词影响就越小。

RNN

但这不仅让电脑会遗忘掉太远的词,而且很多时候提取不出正确的特征。如果用这种方法去训练,是无法找到正确的词向量。后来 Transformer 踏着七彩祥云出现了。

他有能力学习输入序列里所有词的相关性和上下文,不会受到短时记忆的影响,能做到这一点的关键在于自注意力机制。也正如论文标题所说 Attention Is All You Need 注意力就是你所需要的一切。

在一句话中,每一个词语和其他词语的关系是有远有近的,只有正确理解了这种关系,我们才能够正确地理解与意义,Transformer 用一种自注意力机制,巧妙地解决了这个问题。

Transformer 分为两部分:编码器和解码器。

4.1、编码器

编码器的第一层——嵌入层——就是上文提到的把词转换为向量。

嵌入层

下一步是对向量进行位置编码,Transformer 的一项关键机是位置编码。

位置编码

一个词在句子的不同位置,可能有着不同的意思,所以 AI 要做的不仅仅是知道每个词的意思,还需要知道每个词在句子中的位置。

位置编码就是把各个词在文本里位置的向量,和上一步得到词向量相加,然后把得到的结果传给编码器。这样做的意义是模型既可以理解每个词的意义,又能够捕捉词在句子中的位置,从而理解不同词之间的顺序关系。

接下来就到了编码器这个核心部分。

编码器的主要任务是把输入转换成一种更抽象的表示形式,这个表示形式也是向量,里面既保留了输入文本的词汇信息和顺序关系,也捕捉了语法语义上的关键特征,捕捉关键特征的核心是编码器的自注意力机制:模型在处理每个词的时候,不仅会关注这个词本身和它附近的词,还会关注输入序列中所有其他词

例如:
张三看到这篇文章很喜欢,抑制不住深深的喜爱,伸手给了一个()
A、点赞
B、大嘴巴子

通过自注意力机制发现,「喜欢」「深深的喜爱」和「点赞」的相似度较高。于是后面应该选 A。

也正如 Transformer 论文标题所说——Attention is all you need——注意力就是你所需要的一切自注意力机制,通过计算每对词之间的相关性,来决定注意力权重,如果两个词之间的相关性更强,它们之间的注意力权重就会更高。

简单来说就是每两个向量对应的位置分别相乘,因为两个向量点乘后得到的值越大,它们的夹角就越小,也就是说它们的方向相似度就越高。

这就与人类对句子的理解过程非常类似了,我们看一句话时,也是找句子中的重点词汇。因为看到「喜欢」「喜爱」这些词所以选择了「点赞」。AI 也是通过自注意力机制,对语言进行压缩与信息提取,最终选择了「点赞」。

当然,最开始词向量就是随便给的,所以得出的结果当然也很随便,但是不要紧,人工智能最大的好处就是可以不断训练,找到最优解,于是 ai 会不断地猜,猜出来的结果通过损失函数不断反馈回来,再根据损失值不断调整最初的向量和权重,直到找到正确答案,这个过程叫做收敛,最后就能知道在一句话中知道每个词与其他词之间的相似性。

4.2、 解码器

看完编码器,接下来看解码器的部分,它是大语言模型生成一个个词的关键。

首先和编码器一样,文本要经过我们已经了解过的,嵌入层和位置编码,然后被输入进多头自注意力层。解码器不仅会把来自编码器的,输入序列的抽象表示作为输入,还会把之前已经生成的文本也作为输入,来保持输出的连贯性和上下文相关性。

但它和编码器里的自注意层有点不一样,编码器会关注输入序列里所有其他词,但解码器中自注意力只会关注当前词和它前面的其他词,后面的词要被遮住,不去关注,这样做是为了确保解码器生成文本时,遵循正确的时间顺序,不能给他偷看到后面,在预测下一个词时只使用前面的词。

这种类型的多头自注意力,叫做带掩码的多头自注意力,但掩码多头自注意力,是针对已生成的输出序列的。

后面还有个多头自注意力层,这里就是前面编码器所输出的输入序列的抽象,表示所派上用场的地方,注意力会捕捉编码器的输出和解码器即将生成的输出之间的对应关系,从而将原始输入序列的信息,融合到输出序列的生成过程中。

解码器的最后阶段包含一个线性层和一个 softmax 层,他们俩加一块的作用是把解码器输出的表示转化为词汇表的概率分布。

这个词汇表的概率分布代表下一个被生成词的概率,那么有些词的概率就会比其他的高,在大多数情况下,模型会选择概率最高的词作为下一个输出。

那现在我们知道了:**解码器本质上是在猜下一个最可能的输出,至于输出是否符合客观事实,无从得知,**所以能经常看到模型一本正经的胡说八道。

特别是在做一些数学计算,例如 123 * 456 等于多少?456 后面经常出现的词可能是 789,所以 AI 大概率就会回答 789,但这很明显是个错误答案。

5、Transformer 后续发展

因为 Transformer 本质是一个语言翻译模型,所以整个模型是由编码器和解码器两部分组成的,而这两部分的训练方法略有不同。

「编码器」考验的是对语言的理解,所以它使用的训练方法是完形填空,他给出前后文,把中间的字挖掉,让电脑去猜。

而「解码器」是要根据意思翻译成另外一种语言,所以他考验的是语言的生成,训练方法是词语接龙。

后来 Google 和 OpenAI 分别拿走了编码器和解码器,搞出了自己的语言模型。Google 重在语言理解叫做 BERT,而 OpenAI 重在语言生成就是 GPT,也就是 ChatGPT 的前身。

看到这里你可能明白了,ChatGPT 本身其实就是一个语言模型,它被制造出来的根本目的并不是解决实际问题,而是怎么把话说得漂亮。

而它把话说漂亮的诀窍其实也并不高深,就是根据上文的内容,去推测下一个词应该是什么,然后把这个词加进去,继续推测下一个词是什么,在不断的推测过程中,把词连成句子。

它只关心说出来的话像不像人话,并不关心是不是正确,之所以我们在很多时候觉得他说的很有道理,只是因为他看过太多的语料库,在它所有的训练语料中,正确的说法是概率最大的那种而已。

6、通用人工智能

ChatGPT 是如何成为如今大杀四方的通用人工智能的呢?

最重要的原因就是 OpenAI 赌对了方向。

OpenAI 创立之初的愿景就是要做通用人工智能,但如何能够做出通用人工智能,其实是没有答案的。

在几年前,人工智能领域还是各种专业人工智能的天下,比如围棋,比如图像识别,比如玩游戏设计模型,然后获得一个好成绩,名扬天下。

直到 Transformer 出来,才选定了自然语言理解作为方向。

这是一个非常正确的选择,**因为语言才是理解整个人类社会最重要的工具,人类的几千年文明史,几乎所有的显性知识的载体都是语言,**而人类相互之间的交流最重要的渠道也是语言,所以如果电脑能够理解语言,就相当于他获得了理解整个人类,文明成果的能力,也获得了和人类无缝交流的能力,所以要产生通用人工智能语言,一定是最初的突破口。

为什么最终只有 OpenAI 走了出来?

因为只有 OpenAI 是冲着通用人工智能去的,在 BERT 和 GPT1 出来的时,BERT 各方面性能完全吊打 GPT1。这时 OpenAI 面临两种选择:第一是根据特定场景优化模型的算法,提升模型的性能,搞出一个性能更高的模型;第二是增加训练次数,增加词向量的维度,增加训练数据,也就是搞一个更大的模型出来。OpenAI 选择了后者,他们笃定通用人工智能需要泛化到更多的场景,因此需要更大的参数和更大的数据量,果然又赌对了。

在模型参数规模达到 1000 亿量级的时候,神奇的现象产生了,一些语言模型本来不应该具备的能力忽然产生了(GPT 有意识吗?),这种现象叫做涌现,自此 OpenAI 路高歌猛进和其他公司彻底拉开了距离。

为什么提出 Transformer 的 Google 没有搞出通用人工智能呢?

因为 Google 本身是搜索起家,而 BERT 是使用完形填空模式,可以更好的适配搜索引擎,能让 Google 在搜索上更上一层楼,所以 Google 的重点都在 BERT 模型上。最终结果是让原本的优势变成了新一轮竞争中的劣势。

2022 年底,ChatGPT 问世技惊四座,后面的故事大家都知道。