“
「 Rust 与 LLM」 是本合集的主题系列之一,本文为番外篇第一篇。阅读本系列文章不需要有数学基础。
本合集将优先完成该主题系列文章,所以其他主题的文章优先级将降低。
「 Rust 与 LLM」主题系列将专注于自然语言处理、 Transfomer 架构和大模型相关内容,依托 Rust 开源生态和 HuggingFace 的相关 Rust 库,探秘从模型训练到模型部署、模型量化与 WebAssembly 轻量化部署的技术原理。
“
原版视频:https://www.youtube.com/watch?v=zjkBMFhNj\_g&t=3s
相应 slides:https://drive.google.com/file/d/1pxx\_ZI7O-Nwl7ZLNk5hI3WzAsTLwvNU7/view?pli=1
本文为该视频内容的精简文字版,不是视频内容一比一的文字复刻。
该视频作者 Andrej Karpathy[1],在斯坦福大学获得了计算机科学博士学位,师从著名的计算机科学家、人工智能研究员李飞飞教授。研究主要集中在深度学习、卷积神经网络和计算机视觉领域。曾在Google Brain 实习,参与了 TensorFlow 的开发。此外,他还是一位著名的开源软件贡献者,开发了一些流行的深度学习库和教程,如 ConvNetJS(一个用于训练深度学习模型的 JavaScript 库)和 cs231n(斯坦福大学的一门计算机视觉与深度学习课程)。
Andrej Karpathy 最初任职于 OpenAI 公司,担任研究科学家的职位,主要关注深度学习、强化学习和生成模型等领域的研究。在他的领导下,OpenAI 团队取得了一系列重要的研究成果。而后,在2017年,Karpathy 加入特斯拉,担任 Autopilot 人工智能的主管,负责领导自动驾驶汽车的深度学习和计算机视觉方面的研究。他在特斯拉的工作使得自动驾驶汽车在图像识别[2]、环境感知和决策制定方面取得了重要的进展。2022 年 7 月,Karpathy 从特斯拉离职,并在接下来的几个月里,发表了一个详解反向传播的课程 、一份重写的 minGPT 库、一份从零开始构建 GPT 模型的完整教程等众多学习材料。
而后于 2023 年 重新加入 OpenAi,和团队共同推出了ChatGPT模型。2024 年又离开 OpenAI 了。
总之,Andrej Karpathy 是一位在深度学习和计算机视觉领域具有广泛影响力和贡献的研工程师,他对于 LLM 的理解一定是处于业界巅峰水平。
在前面两篇《LLM 入门之旅》发布之后,第二天就看到 Andrej 发布了他新录制的《Let's build the GPT Tokenizer》最新视频,就是从分词器开始讲解大模型。
这足以证明我们的《LLM 入门之旅》从分词器开始是非常正确的,实属与大佬不谋而何,正好赶上了大佬的分享,大家可以配合此视频学习分词器了。
拿 Meta AI 开源的大模型 Llama-2-70b
来说,大语言模型本质就是两个文件:500 行 C 代码组成的 run.c
模型架构文件和 parameters 权重参数文件(大概 140 GB)。70b
就是指 700 亿个参数。
模型架构可以用任何语言实现,C/Cpp/Python,当然也包括 Rust 语言。大语言模型架构本质是一个神经网络架构。
而权重参数更是大模型的精华,可以说模型训练的最终结果就是这参数。想要构建一个 700 亿参数级别文件,需要从互联网抓取获取大约 10TB 的文本,并将它们汇总在一起。然后,需要准备 6000 个专门用于计算工作负载的计算机 GPU[3] 集群,并运行大约 12 天,花费大约 200 万美元,对于这700亿参数,每一个参数被存储为2 byte,700亿参数共计 140 GB,我们也可以近似将该过程看成一个有损压缩文本的过程。
那神经网络和权重参数如何一起发挥作用?神经网络基本上就是预测文本序列的下一个词。
向大模型输入cat sat on a
文本时,神经网络将发挥作用,而上述训练出来的参数,则分散在整个神经网络中,并由“神经元”将其相互连接,并以某种方式触发,然后就会得到一个关于下一个词是什么的预测,例如在这种情况下,这个神经网络可能会预测,在这个上下文中,下一个词可能是"mat(地垫)",概率约为 97%,概率最高,所以输出了“mat”。
对于 ChatGPT 这种大模型来说,等价于它把全人类的知识集(它能拿到的)压缩成权重参数。所以你也可以把这种神经网络训练看成一种数据压缩方法。大模型不是对训练数据集的完全复制,而可以看作是有损压缩。
“
题外话:所以,Transfomer 架构应该可以理解为是一种「压缩」与「解压」的过程。一个脑洞:如果大模型能做到“无损”压缩,是否可以消除幻觉。
模型一旦训练完成,就可以进行模型推理。
Andrej 把模型推理的过程形容为一场 "Dream",因为大模型可以生成虚构的代码、文件和图画。所谓 Dream,也就是一场幻觉。大模型的推理过程同样不是复制数据集的内容,而是从它从数据中学来的形式(或说模式)来进行内容生成。
如上图。生成的 Java 代码、亚马逊商品或者维基百科介绍的某种鱼,都是它的幻觉。
研发人员知道神经网络是什么结构,也知道数据集内容是什么,同样也知道训练出来的权重参数是什么,但是,研发人员并不知道大模型在训练中学到了什么,即,不知道这些参数做的事情是什么,也不知道这些参数之间如何协调等,这就是所谓的「神经网络黑盒」(被视为一种“经验工具”),因为一切都是大模型的一场「梦」。只不过有些生成的内容正好与现实相符。我们无法百分百地决定大模型的生成内容一定是我们想要的答案。
“
题外话:所以现在要使用大语言模型,要配合 Prompt 工程。
为了更好地让大语言模型执行下一个单词的预测任务,就需要对大模型遍布整个神经网络的几十亿几百亿参数进行调整和优化。虽然神经网络对于研发人员是黑盒,但是如何调整优化这些参数的方法已经被研发人员掌握了,这就是微调(finetuning)。
最初训练的模型是预训练模型,也叫基础模型(Base Model)。这个阶段的特点是训练的数据集要求不是很高,相对来说比较宽泛,比如互联网上能拿到的一些数据。所以它的幻觉比较严重,无法应用到生产环境。微调就是在预训练基础上,拿更加高质量的数据集,对其再次做精细化训练。微调阶段的训练成本要比预训练低很多。
“
题外话:这就是为什么现在很多大模型创业公司都拿着开源预训练大模型来定制化微调。
微调成本低廉,训练周期短(一般为几天),也不是一次微调就能得到理想的模型,所以微调是一个不断迭代的过程。
“
题外话:用我自己(人脑)学习 Rust 或者 大模型 的过程来做个类比。
预训练阶段:我在互联网上大范围地(不分资料质量)阅读和 Rust 语言 或 神经网络、大模型相关学习资料,形成对大模型的一个初步的理解(心智模型)。这个阶段,我们的学习周期一定会相对比较吃力,花费的时间也很长。
微调阶段:找到互联网上质量最高的 Rust 或 LLM 学习资源,比如 ,学习来自创造 ChatGPT 的团队 leader Andrej 的大模型视频,对我之前学到的关于大模型工作机制的心智模型进行进一步微调,以便这个心智模型对细节和流程的准确性理解更深。这个阶段相对比较轻松,但它是一个不断迭代的过程。
所以,人类的学习方法也和大模型训练过程相当类似。
微调出来的叫助手模型(Assistant Model)。
微调阶段具体也可分为两个阶段:
监督微调阶段。使用“指令-输出”对作为数据集,而非文本,就像一问一答那样对大模型进行微调。
比较(comparisons) 阶段,如下图:
这个 比较微调 实际上是基于 RLHF(人类反馈的强化学习) 的对齐(Alignment),这种对齐过程有助于确保模型的输出更加符合人类的价值观、道德标准和期望。
RLHF(Reinforcement Learning from Human Feedback)的实施涉及几个关键步骤,旨在通过人类反馈来训练和优化模型。以下是RLHF实施的一般步骤:
数据准备:收集并准备大量的训练数据,这些数据可以是文本、图像或其他形式的数据,取决于模型的应用场景。
模型训练:使用这些数据在大规模模型上进行预训练,目的是让模型学会基本的数据表示和处理能力。
设计反馈机制:确定如何从人类评估者收集反馈。这可能包括直接的偏好评价、错误标注、解释性反馈或比较多个输出选项。
实施反馈收集:通过界面或调查形式,让人类评估者与模型的输出交互,并收集他们的反馈。这一步骤要确保反馈的多样性和公正性。
训练数据准备:将收集到的人类反馈转化为强化学习训练过程中的奖励信号或训练数据。
模型优化:利用强化学习算法根据人类反馈调整和优化模型的行为。这可能包括使用策略梯度方法、Q学习或其他适用的强化学习技术。
微调模型:在特定任务或数据集上进一步微调优化后的模型,以提高其在特定领域的表现。
迭代改进:重复收集人类反馈和基于此反馈进行模型优化的过程。每一轮迭代都旨在进一步提升模型的性能和对人类反馈的适应性。
性能评估:在独立的测试集上评估模型的性能,确保模型改进是有效的,并且没有引入不希望的行为。
部署:将优化后的模型部署到实际应用中,同时监控其表现和收集用户反馈,以便未来的迭代和改进。
“
题外话:在使用 ChatGPT 过程中有时也会生成两种答案供用户选择,或者让用户对答案点赞是否有帮助,这些应该是 ChatGPT 在做对齐数据收集。
长远来看, LLM 的发展遵循一个重要概念尺度定律(Scaling Law) 。
尺度定律指的是模型能力与模型尺度之间的渐近关系。具体来说,模型能力为模型的损失函数,模型尺度则指模型参数量、训练数据量、训练步数等,所谓尺度定律,就是研究损失函数跟参数量、数据量、训练步数等变量的大致关系。
尺度定律意味着,只要在更多的数据上训练更大的模型,那么准确度就会不断的上升,无需去改进其内部底层算法。这无疑是一个令人激动的现象,因为它暗示人类只要用足够的算力和足够多的时间,会得到多个更令人激动的模型,可谓未来可期。
尺度定律像是一种战略方向。而当下的战术是改进大模型的能力。
1. 发展系统2思考模型
在《思考,快与慢》一书中普及了人类拥有的两种思维模式:
系统一(System 1)
,快速、直觉且情绪化的本能性思维
系统二(System 2)
,较慢、较具计划性且更仰赖逻辑的慢思维
而 LLM 目前只有系统一思维,即,本能性思维。
那也就意味着它们不能直接对一个问题做出充分的思考并推理出各种可能性,LLM只是按顺序输入单词,依赖于神经网络,预测出下一个单词,只是在一个概率性铺就的轨迹上“行驶”。
但是在实际生产应用时,我们更希望大模型可以像系统二思维模式一样,可以更深入地思考问题,反思和表述。
所以现在只能通过 Prompt 来让它这样做:「我不需要立刻得到答案,思考一下,再给出我关于xxx问题的答案」。这会有一定效果的,但是我们其实更倾向于让大模型能够自己本身就拥有系统二思维。
“
题外话:现在 AIatMeta[4] 应该给出了一种为大模型增加系统二思维的方法,见论文: 系统2注意力[5]。还有一种方法是使用 CoT (思维链)和 知识图谱[6]。
2. 模型的自我提升
著名的AlphaGo ( DeepMind 开发的一个围棋程序),在训练过程中有两个主要阶段,第一个版本称为 AlphaGo Fan:在大量人类玩家进行过的对局中,过滤出表现非常好的游戏对局,去模仿这些玩家动作,就会生成一个优秀的围棋程序,但它不能超越人类,最高也只能与人类持平。为了解决这一问题,DeepMind 找到了一种方式来超越人类,即自我提升(Self Improvement)。
大型语言模型(LLMs)在开放式文本生成任务中展示出了卓越的能力。然而,LLM的训练方式类似于 AlohaGo 的第一阶段,还需要手工标注。为了解决这一挑战,提出了各种方法来提高 LLM 的性能。越来越多的关注点集中在使 LLM 能够自我改进其回应质量上,从而减少对广泛的人工注释工作的依赖,以收集多样化和高质量的训练数据。
相比于通用领域,在垂直的领域中更有可能通过自我提升的模式去优化语言模型。那么就会出现这样的一种情况:每个特定领域都有一个适用于该领域且甚至超越人类水平的“专家“,但是并没有一个”专家“可以覆盖于各领域。现在的 GPTs Store 已经可以发现这种趋势了。
3. 其他挑战
LLM OS
LLM 安全
Prompt injection
等等,这里就不细说了。感兴趣可以关注原视频内容。
本文由 OpenAI 工程师 Andrej 权威解读了大模型的原理和未来发展,让我们对大模型建立了一个初步的概念。为我们后面的大模型入门之旅做好铺垫。下一篇会继续带来 Andrej 对于分词器的解读。