一切都是统计概率-ChatGPT的背后
date
Aug 18, 2023
slug
20230818
status
Published
tags
沉思录
summary
统计学习的原理,就是把所有信息掰开揉碎了,塞给机器。机器在做判断时,更多是预测下一个元素出现的概率。
type
Post
▎一切都是统计概率
人工智能历史的发展,大致可以分为几个阶段:
- 符号阶段(20世纪50年代-70年代)
- 学习阶段(20世纪70年代-90年代)
- 统计阶段(20世纪90年代-21世纪初)
- 深度学习阶段(21世纪初-)
在符号阶段,早期的科学家试图找出人类推理的法则,并且让机器学会这些逻辑。我们怎么思考计算的,机器也要怎么思考计算。这一阶段当然也有成果,但科学家们发现了最大的问题:我们无法把世间万物的知识和法则都灌输给机器,很多信息是无法良好抽象的(被称为形式主义),也很难批量地输入。因此早期的人工智能往往解决确定性的问题,比如下棋,棋谱的输入是可控的,下棋的规则也是可控的。
当科学家们发觉这点困难后,机器需要自我学习就提上了日程。起初,科学家们还是想让机器通过归纳演绎这种推理的手段学习,比如使用决策树算法,发现依然很难(这被称为基于规则的机器学习)。有一派的科学家,就致力于统计学习的方法了(基于统计的机器学习)。
统计学习的原理,就是把所有信息掰开揉碎了,塞给机器。机器在做判断时,更多是预测下一个元素出现的概率。如果是语句,那就是预测单词;如果是绘图,那就是预测像素。
比如,机器手里有半句话:The best thing about AI is its ability to
它会搜寻所有的预料库,查阅接下来出现哪个单词的概率更高。
然后写出来。这是一个极简的例子,实际操作,当然要复杂得多,有时未必会选择概率最高的词汇。
那么深度学习是什么意思呢?它引入了神经网络的算法,让机器学习可以接受的概率预测的复杂度提升了,也可以说同样效果的计算和存储成本大大降低了。这是一个黑盒,跟符号派是南辕北辙的两种范式。但它很有效果,也是如今所有大模型所采用的方法。
再回到开始说的四大阶段,也可以简化为两大阶段:
- 基于规则的阶段;
- 基于统计的阶段。
说到 ChatGPT,没错,哪怕很多人恐惧于它是否有意识、惊叹于它多么聪明和耐心,但它的运作原理,依然还是「靠猜」。就像一个经典的比喻,它就像一个读遍了世间所有信息的三岁小孩,不懂任何道理和规则,但它可以谈吐如流。
▎计算概率
预测是要看当前的内容为前提条件下,各种内容的概率,那这个概率怎么计算呢?
这里我们就要引入一个概念 n-grams。
如果是 Bi-grams/2-grams,意思就是我们只关心词对出现的概率。比如:
当 to 出现时, be 出现的概率。
如果是 Tri-grams/3-grams,意思就是我们关心3个词同时出现的概率。比如:
当 to be 出现时,or 出现的概率。
像这个句子:
The cat is running away。
2-grams 的方式是计算以下词对的概率:The 出现时,cat 出现的概率cat 出现时,is 出现的概率is 出现时,running 出现的概率running 出现时,away 出现的概率
3-grams 的方式是计算以下词对的概率:The 和 cat 出现时,is 出现的概率cat 和 is 出现时,running 出现的概率is 和 running 出现时,away 出现的概率
很显然,n-grams 中的 n 足够长的话,预测出来的句子的可靠性就会更高。
但是,他们遇到了符号派当年试图把知识塞进机器同样的问题:数据量过于庞大。
如今互联网上流传的信息里,已经有大约千亿级的单词量,在数字化的书籍里,也有至少 1000 亿的单词。而哪怕我们退而求其次,只计算 40000 个常用单词(英文),所需的 2-gram 的概率统计量是多少呢?16 亿。
如果是 3-gram,则会变成 600000 亿。如果是 20-gram,这个统计量会比宇宙中的所有物理粒子加起来还要多。这是永远不可能被机器记录的。
所以,机器并不能直接「查表」。而是通过「搭建模型」来对概率本身进行预测,也可以说是预测之上的预测了。
▎神经网络模型
在中学物理里,我们就体会过最简易的模型搭建。比如,一个炮弹从不同的高度落下所需要的时间,根据统计数据,我们能得到一张图:
我们如果用一条线拟合的话,大概是这样:
看起来不够准确。于是我们可以用更复杂一些的公式拟合,比如
而神经网络的逻辑,与此相通。
我们拿最简单的一个课题来举例,机器识别图像中出现的数字。记录世界上每个手写数字的像素分布,显然是不可能也不高效的。于是机器可以训练着记住大概的「规律」,也就是对于每个位置的像素来说,给哪个数字加「权重」。
当整个画面中央没有像素点时,就可以考虑给「0」加个权重,因为大多数 0 中间就是空的;同时可以给很多数字减权重。每个像素点的权重情况,加总起来就可以预测数字。
要达成这个数字识别的效果的神经元,大约需要 2160 个。最原始的数字识别机器叫做「感知机」,早在 1957 年就被制造出来了。
为什么到这些年神经网络才能再次焕发新春?简单粗暴地说,就是计算机性能随着产业发展,而达到了全新的层次。体会下上图中最早的感知机的连线,若是没有如今的 GPU,根本是无法想象的。
区分猫和狗是对人来说无比轻松的课题,对于机器来说,则需要 60650 个神经元。神经元与神经元之间在多个层次上需要形成网络,是一个根本画不出来的多维复杂矩阵,因为维度就有 60650 个。
而且到这个程度,你会发现我们是无法解释过程中发生了什么的(科学家和工程师们也无法解释)。因为神经网络是一个完全的黑盒,且机器并不像人一样去理解事物。
设想一下,我们分辨猫和狗,可能的流程是:先看到是动物 - 判断出是小型动物 - 看到五官或者毛皮的样子 - 判断出是狗或者猫。
机器并非如此,它关注的点是当前人类无法理解的。
- 比如在第一层,通过机器的关注点,可以意识到它是在看大致的轮廓:
- 到了第 10 层,已经完全不知道它在看什么了:
而我们做的,就是把一堆猫和狗的图片给机器看,并且告诉它哪些是猫、哪些是狗。是为训练过程。
在这个过程中,机器整理出了一堆的跟
一样的参数公式。大量的参数公式,就构成了一个模型。
所以常听到说 GPT-3 达到了 1750 亿个参数量,指的就是这个神经网络的公式,具备了 1750 亿个权重。
▎把文本变成数字:Embeddings
我们刚刚讨论的是图像的处理,在图像处理上有效果很好的卷积神经网络(CNN)。而在文本处理上,也需要有特别的处理。道理很简单,神经网络本质上处理的全部都是数字,我们要有一个有效的方法,让文本也能高效地在神经网络里流通。
Embeddings 就是一种表征「附近」的方法。就像前面说的,我们记录不同词语之间共同出现的概率,不如干脆有一个附近的概念,让不同的词语的关系,变成向量距离。
例如,这就是一个简化 2D 版本的词语 embedding 的结果:
这个是为了可视化方便做成了二维的。但很显然,机器可以处理非常大规模的维度的向量,在各个维度上,一个词语和另一个词语,都可以有距离。
那么这个所谓的「距离」该怎么计算呢?
可以还是拿简单的手写数字图像举例,这里是一个真实的 11 层的数字识别神经网络(这里不关心实现细节):
除了最后一层,在每一层我们都可以计算一个数值,该数值大概可以理解为机器关心的不同的特征维度(类比到人类关心的点,就是这个数字是否是闭合的?比划之间有没有交叉?等等)。
当每层特征计算之后,都会有一个数值给每个输入值。于是我们可以用不同的颜色来代表值的大小,这样对不同的手写数字,就有了一个 embedding 的特征:
使用相同的方法,我们就能计算文本在多个维度下的特征值了。单词的特征,明显会比数字要多。这就是 GPT-2 的三个词语的 embedding 的值:
而 ChatGPT 的逻辑是,每次生成的文本(不仅仅是当下的单词,回想下上文提到的 2-grams)都会生成一个 embedding 的向量,去匹配更可能出现的单词。这就是让文本变得可计算的方法。
说个题外话,ChatGPT 严格来说不是处理单词的,而是处理单词的模块(也就是常说的 tokens),比如 pre、ing、ized 等组成部分也会单独处理。
▎ChatGPT 的运转逻辑
如刚刚所说,在 ChatGPT 中,「猜词」的过程是这么运作的:
- 首先,到目前为止所有的文本(tokens),都生成各自的 embedding 数组(即上文的那个颜色深浅各异的图)。
- 接下来,这些数组都通过神经网络的方式(也就是在大神经网络之下的独立功能神经网络),再次 embedding 成一个新的向量组。
- 最后,根据新的向量组的最后一部分,生成一个有大约 50000 个数值的数组,这些值代表着最初我们提到的——统计概率。
这里面提到的向量组的长度(前面用案例展示过数字和单词的向量组长度),也就意味着效果的优劣了。GPT-2 的长度是 768,而 GPT-3 直接跃升到了 12288。
在 embedding 的过程中,Transformer 起到了很关键的作用。Transformer 是 Google在 2017 年提出的算法。向前溯源,Transformer 中用到的 Attention 机制由 Bengio 团队在2014 年提出。
在把当前文本的所有 tokens 用 embedding 算出向量组之后,会有一些 attention blocks 开始工作。在 GPT-2 中有 12 个,在 GPT-3 中有 96 个。
它们的任务,是去寻找之前文本中相对重要的那些部分。回想一下,n-grams 机制是,n 越大,代表可以回想(参考)的部分就越多。attention blocks 可以考虑到全部的文本,不受 n 的限制,甚至它会把词汇之间的距离都默认为 1,可以考虑到距离很远的词汇之间的关联,让整个文本之间都互相产生影响,为词汇加权之后把这些因素也添加进新的向量数组当中。算是非常有效的一种处理长文本特征的方法。
这样得到的向量数组,就是最终的向量数组,用它来得到真正要预测的 tokens 的概率数组。
了解了这种计算逻辑,我们就知道,ChatGPT 在计算时都在做什么了。其实每个输出的 token(有的是单词,有的是单词的模块),都是在对当下的特征向量组进行计算,把当下的 token 加入进去,embedding 形成新的向量组。且由于存在着 1750 亿个权重,接下来出现的这个 token 也必须是完成了 1750 亿次计算才得到的。
所以,下次在用 ChatGPT 认为它太慢时,不妨想一想,它已经在努力了。