一、大语言模型(LLM)
什么是大语言模型?
以 Meta AI Llama 系列第二代产品 llama-2-70B 为例,拥有 700 亿参数。该系列模型还包含多个其他规模的版本,分别是 70 亿、130 亿、340 亿和 700 亿参数规模。Llama 系列模型广受欢迎,因为它也许是开源模型里最权威最强大的模型之一。Meta 公开了模型的权重、架构和相关论文等一系列资料,让任何人都可以轻松的研究和使用这些模型。
不像其他一些闭源的模型,比如 ChatGPT,其所有权归 OpenAI 所有,其模型权重和架构等信息从未公开,人们也只能通过网络界面或 API 来付费使用。
Llama 系列的模型,每个版本只由两个文件组成:参数文件和运行这些参数的代码。参数文件里包含了神经网络的权重信息。因为该模型包含了 700 亿的参数量,每个参数存储成 2 个字节(float16 格式),因此整个参数文件大约是 140GB。对于这么一大堆参数,我们需要编写对应的代码来运行这些参数。代码可以用 C 或者 Python 或者其他任何语言编写。以 C 语言为例,大概只需要 500 行左右的代码量,无需其他依赖项,就可以搭建神经网络然后运行这些参数。
所以手握这两个文件,再加上一台电脑,就可以搭建起来这么一套完全独立的系统,甚至无需网络。把这两个文件放在同一个目录下,然后编译 C 代码,得到一个二进制文件。该二进制文件可以访问参数文件,将该二进制文件运行起来,就可以与模型进行交互了。
1. 模型训练:700 亿参数的由来
上述演示的过程,是如何使用已有的模型文件,即模型的推理过程。其中的 C 代码、神经网络架构以及前向计算过程都可以通过了解其算法来理解。而真正的魔法在于如何获取这 700 亿个参数。模型的训练过程比推理过程复杂得多,计算量极大。
以 llama-2-70B 为例,大概需要从互联网抓取约 10TB 的文本,将这些文本放到一个 GPU 集群上去执行神经网络的训练过程。整个训练过程大概需要 6000 块 GPU,训练大约 12 天,成本 200 万美元。这个过程可以理解成将互联网上的原始文本压缩成一个 zip 文件,也就是参数文件。这个文件 140GB,大概 100 倍的压缩比,但是跟 zip 文件的无损压缩还不同,模型训练是有损压缩,我们最终得到的不是所有知识的完整副本。
以当前最先进的标准来看,上面这些数字还只是基础级别。如果是当前最先进的模型,比如 ChatGPT、Claude 或 Bard 等,这些数字可能是 10 倍之多,训练成本可能是数千万美元甚至数亿美元,以及非常大的 GPU 集群和数据集。获取这些参数的过程非常复杂,而一旦拥有了这些参数,运行这些参数的成本则相对低了很多。
回到主题,这些参数组成了一个大的神经网络,这个神经网络究竟在做什么呢?它的基本任务就是预估一段文本序列中下一个单词。我们可以给模型输入一段文字:"我的猫跳上了",分布在网络中的各个参数以其已经定义好的方式进行指定的计算。每个参数都会贡献自己的一份力量,而参数的值可以理解成其重要程度。最终模型会输出下一个词的概率,比如我们可以得到,下一个词是【桌子】的概率是 97%。这就是这个神经网络的基本功能。从数学上可以证明,在预测和压缩之间存在一种密切的关系,如果可以根据给出的一段文字准确的预估下一个单词,这种能力就可以完美的用来压缩数据集。
预估下一个单词看似是一个简单的任务,但对模型来讲其实是一个非常强大的目标,它会迫使模型学习大量的世界知识,并将这些知识压缩在所有的参数中。比如下面这个维基百科的页面,标红部分为信息量较大的单词。设想模型目标是预估下一个单词,那模型需要学习大量的知识并存储在参数里,包括 Ruth Handler 的生平,她是谁,她做了什么等。模型就是通过从海量文本中不断执行预估下一个词的任务,不断调整每个参数的值,来完成知识压缩的目的,而最终确定的 700 亿参数的值,就是压缩这些文本的结果。
2. 模型 Dreams
一旦训练好这些模型,使用就异常简单。模型推理过程就是根据人为提供的文本(称之为 prompt)和已经生成的单词,不断生成下一个单词的过程。这个过程不断迭代,最终生成一篇文章。这个过程称之为模型做梦(Dreams),因为这个生成过程相对自由,并不是一个确定性的过程。
由于模型是对世界知识的有损压缩,它记住了这个世界的一些知识、一些文本形式、一些固有搭配等。模型会综合利用这些知识、文本形式和固有搭配,来复用或者重新组合创造出新的形式。有些东西它能记住,有些东西它记不住,而我们也不知道它记住了哪些,因此也无法完全确定它生成的结果哪些是正确的,哪些是做梦梦到的。在很多时候,生成的内容像是它从见到的数据分布中梦出来的幻觉,而另一些时候又会惊叹于它可以完美完成我们的任务,就这么神奇。
3. 模型如何工作
关于这个神经网络是如何完成预估下一个词的任务的,这里有点复杂。常见的架构是 Transformer。
这个模型的神奇之处在于我们可以完全了解其架构,也知道在模型训练的各个阶段执行了什么样的数学运算,但是难点在于,数百亿甚至数千亿的参数分布在整个网络里,应该如何迭代式的调整每一个参数,可以让它们共同合作更好的完成预估下一个单词的任务。最终,我们其实也不知道这些参数究竟在干啥,它们是如何协作来使预估下一个单词的任务完成的越来越好的。
既然很难从微观角度了解每个参数的作用,那我们可以尝试从更高的层次上来思考网络在做什么。训练好的模型内部构建并维护了一套知识数据库,但这个知识库有时候会显得有些奇怪。比如我们去问 ChatGPT,去问 GPT-4(这可能是目前最好的模型了),汤姆·汉克斯的母亲是谁,它会告诉你是玛丽·李·菲佛,这是对的,但如果你问玛丽·李·菲佛的儿子是谁,它会告诉你不知道。这种单向和一维的知识是非常奇怪的,很难去理解这种现象。我们能衡量的更多是这个模型是否有效,以及概率多大等。
总的来说,模型的工作过程并不是确定性的,有时候也很难理解。它不像工程学科,比如汽车,我们对其中的每个部件都了解,其每个动作及结果都可完全预估。我们没办法确切了解模型是如何工作的,虽然有模型可解释性这个研究方向,试图弄清楚模型的所有部件的工作机制,但就目前来讲,某种程度上也许可以做到这一点,但还无法完全做到。所以模型的训练、使用和评估,更多是经验性的,通过给模型不同的输入来观察它生成的文本,并以此来衡量这个模型的效果,仅此而已。


