1、文章简要

  1. 一张图,纵览大模型技术全景。
  2. 串讲85个技术概念,理清知识脉络。
  3. 引出154个精选提问,开启提问式学习。

img

学习新技术的最大障碍,往往不是技术难度,而是难以察觉自身知识体系的缺口。在大模型辅助学习的场景下,精准提问是获取高质量解答的前提,但明确 “该问什么” 成为关键。因此,构建 “技术地图” 尤为重要,它能帮助我们建立完整知识架构,锁定核心学习内容。

理想的技术地图应是 “热力地图”。学习需要分清主次、把握深浅,热力地图不仅标注知识分布,还能量化知识的重要程度,明确学习优先级。

为绘制这张热力地图,笔者协同大模型智能体,收集 5000 道大模型技术岗位中英文面试题,通过高频词提取,依据知识点出现频次构建热力分布模型。该地图既是全域知识图谱,也是学习优先级指南。

基于此地图,本文第二至四章呈现完整学习笔记,涵盖三章十一节、85 个核心技术概念。在大模型辅助下,依托清晰学习线索,即可开启 “提问式学习”。文中 154 个真实提问示例,推荐使用 ChatGPT-4o 等模型获取深度解答。这些提问预计可触发近 30 万字优质内容,为读者打开全新认知窗口。

二、大模型原理

2.1 神经网络

2024年的诺贝尔奖,史上第一次颁发给了计算机科学家,诺贝尔物理学奖和诺贝尔化学奖都颁发给了在人工智能领域作出重要贡献的人。获得诺贝尔物理学奖的辛顿(Hinton)在1986年发表了反向传播算法论文,掀起了神经网络的发展热潮。随后的近40年,神经网络仍然经历了多次的高潮和低谷,直至发展到今天的各种大模型。

人类起初通过模仿鸟的方式来探索飞行,到探索智能时也同样试图模仿生物大脑,用神经网络(Neural Network)模拟人类的学习过程。神经网络由一层一层的节点(或叫神经元)组成,每个节点通常都是一个非常简单的计算单元(叫激活函数),而层与层之间是通过带有权重的边来连接,形成了网络。

img

推理过程(也叫前馈过程)就是数据从最左侧输入,每个神经元都从自己左侧的边得到输入信号,通过简单的数学运算后,把结果再向右侧输出,直到从最右侧输出最终结果。而如果发现最右侧输出的结果与正确答案不一致,则计算出“误差”(或叫损失),反过来从最右侧往左一层一层地根据误差来调整网络中的参数,这就是“学习”过程,也就是反向传播过程。

下方是一个真实的神经网络案例,是一个从图像识别数字的神经网络。左侧输入一个手写的“6”的图像,经过神经网络的前馈过程,右侧正确输出了“6”的识别结果。

img

提问:

  • 如果把神经网络比作一个公司,则神经网络中的输入层、隐藏层、激活函数、输出层、反向传播这些都对应公司的什么部门或什么流程?

神经网络的节点的摆放和连接方式,决定了神经网络的架构,而不同架构的神经网络体现不同的能力和特点,因此学者们不断探索和尝试各种不同架构的神经网络。

上面这个神经网络是神经网络最基本的类型,叫前馈神经网络(Feedforward Neural Network, FNN)。前馈神经网络的结构非常简单,信息从输入层经过一系列隐藏层传递到输出层,单向流动,没有环路。每一层的节点与下一层的所有节点相连,但不连接到同一层或前面层的任何节点。

提问:

  • 前馈神经网络在特征学习中是如何自动找到数据的隐式结构的?

  • 为什么说多层前馈神经网络是“通用函数逼近器”?这有什么现实意义?

  • 为什么神经网络能否实现逻辑异或运算是一件非常重要的事情?这有什么背景?

这种简单的结构,实际应用时自然也存在很多问题。比如应用在图像识别领域时,缺乏平移不变性(translation invariance)。什么意思呢?比如我们学会辨认狗之后,当看到一幅画时,不管狗是在画的左边还是右边,我们都能认出它是狗,因为我们有平移不变性的能力。但前馈神经网络不一样,对它来说“左边的狗”和“右边的狗”是完全不同的物种,学习辨认了“左边的狗”之后,当狗出现在右边时,还得重新学习辨认“右边的狗”。这可不太聪明。

img

为此,学者们对神经网络结构进行了一个改进,提出了卷积神经网络(Convolutional Neural Network, CNN),它由卷积层、池化层、全连接层组成。在卷积层,一个卷积核(Convolution Kernel)在图像上滑动进行卷积操作,检测某一特征是否在图像的不同位置出现。比如上图中的一个眼睛形状的卷积核,在图像中滑动,检测出有两处匹配的地方。这样的方法能够实现平移不变性,眼睛形状的卷积核我们只要学习到一个,那么未来这个形状不管出现在哪里,我们都能匹配到。一个卷积层会有多个卷积核,可以想象还有鼻子形状的卷积核、嘴巴形状的卷积核,还可能有肤色卷积核。这样的卷积层又会有多层,一层一层逐步构建越来越复杂的特征表示,比如到更高层次的卷积层学习到的特征可能会是人的胖瘦、性别、种族等等。

现代卷积神经网络的基本框架是杨立昆(Yann LeCun)在1989年第一次提出,他设计的LeNet-5卷积神经网络应用于手写的邮政编码识别场景,获得了巨大的成功。杨立昆也是与辛顿齐名的三位深度学习泰斗之一,法国计算机科学家,2018年图领奖得主,现任Facebook首席AI科学家,并且有不错的中文名。卷积神经网络在图像识别领域几乎是独树一帜的存在,到今天图像识别领域的应用大部分都有使用卷积神经网络,比如几乎所有的自动驾驶公司都会在视觉感知层使用卷积神经网络。

提问:

  • 卷积神经网络并不是杨立昆第一个提出来的,为什么说到卷积神经网络都认为是杨立昆的贡献?LeNet与之前的卷积神经网络相比,有什么不同?

  • 池化层在卷积神经网络有什么必要性?只有卷积层而没有池化层会有什么问题?

  • 卷积神经网络是如何模仿人类视觉系统来处理图像的?在这当中,局部感受野、共享权重的概念有哪些生物学上的启发?

图像识别场景需要平移不变性,卷积神经网络中共享权重的卷积核带来了这一能力。而在自然语言处理的场景中,我们需要的是另一个能力,时间依赖性(temporal dependency)。这些名字都好抽象,这又是什么意思呢?

时间依赖性具体来说体现在两个方面。以自然语言处理场景为例,第一个方面是捕捉序列特征,要能够学习到语法结构。“他养了一条狗”,这句话前面的每一个字都暗示着后面是“狗”。第二个方面则有点像图像识别中的平移不变性,只是在自然语言处理中是体现在序列中的平移不变。“他养了一条狗”和“狗是人类的好朋友”,这两句话中“狗”出现在序列中不同的位置,但表达同一个含义,如何理解“狗”不应该需要重复学习。

img

循环神经网络(Recurrent Neural Network, RNN)就是为处理序列数据设计的。它的网络结构中包含循环连接,能够处理序列数据并保留过去的信息,通过隐藏状态的循环连接把历史信息传递到下一个时间步骤。上图中左侧就是一个最基本的循环神经网络,x是输入层,h是隐藏层,o是输出层,注意隐藏层的输出v通过循环连接再次进入隐藏层的输入端,与输入序列x中的下一个数据点u一起形成隐藏层的输入。如果世界上存在“星际穿越”电影中所说的“四维物种”,则“它们”看到的循环神经网络在时间序列上展开之后的网络结构会是图的右侧的样子。

循环神经网络的结构带来了时间依赖性的能力,这使得它在自然语言处理、时间序列预测等序列处理任务中表现出色。不过基本的循环神经网络存在梯度消失、梯度爆炸的问题,限制了它捕捉时间步上较长依赖关系的能力。通俗地说,它像金鱼一样只有7秒钟的记忆,不太聪明。

提问:

  • 即使在前馈神经网络,当整个序列输入到神经网络之后,神经网络仍然能够学习到序列中不同位置之间的关系。那时间依赖性为什么一定需要循环神经网络?(提示:动态序列长度、时间步权重共享)

  • 为什么循环神经网络容易出现梯度消失或梯度爆炸的问题?

因此,学者们对循环神经网络的结构进行了改进,提出了长短记忆网络(Long Short-Term Memory, LSTM)。长短记忆网络为每个神经元引入了明确的“记忆开关”,明确控制遗忘、记忆、输出三个动作,以免在反向传播过程中梯度多次传播逐渐衰减导致“记忆”随着消失。这三个动作具体什么时候进行,这本身也是通过训练过程学习的,也就是说,这三个开关也是神经网络的一部分。

长短记忆网络在序列处理,尤其在捕捉序列中更长时间范围内的依赖关系时有出色的表现。长短记忆网络不仅在机器翻译、语音识别方面有广泛的引用,在股票价格预测、天气预测、基因序列分析等方面也有很多探索。

提问:

  • 长短记忆网络是如何解决循环神经网络中的梯度消失问题?能不能用一个简单的生活比喻来解释“遗忘门”和“记忆单元”的作用?

  • 梯度爆炸问题,为什么一定要引入门控机制?能否用激活函数或者训练算法的改进来解决?

  • 为什么要手工设计长短记忆网络结构?足够大的循环神经网络经过充分训练之后,是否能够自动演变成长短记忆网络,不同的节点学会扮演不同的角色?

不过长短记忆网络善于捕捉长程依赖关系,这也只是相对于裸循环神经网络来说的。长短记忆网络归根结底仍然是循环神经网络结构,当输入序列变得越来越长的时候,它也避免不了先前的记忆变得越来越模糊的问题。

如果以翻译任务的场景来直观地理解这个局限性的话,这好比先给我们读一段中文,让我们听完之后把它翻译成英文说出来。我们的大脑像长短记忆网络一样,知道哪些信息是重要的信息,在听的过程当中对重要的信息主动开启记忆开关,存储到记忆单元。但大脑内存容量终究有限,如果一口气给我们读太长一段输入,我们仍然无法准确记住每一个细节,等听完之后很多先前的信息变得模糊,最后翻译输出的时候只能输出个大致内容,甚至有些重要信息也可能会出现偏差。

要解决这个问题,方法也挺清楚。俗话说“好记性不如烂笔头”,我们边听边把听到的内容记录下来,写到本子上,这就是同声翻译员使用的办法。随后开始翻译,我们边看笔记边进行翻译,这里就需要注意力机制了。

2.2 注意力机制

img

图源:Sora生成

“注意力”对我们来说并不陌生。在一个繁忙的城市街头,一位妇女牵着一个小孩在过马路。她要关注红绿灯,要关注来回车辆,同时要关注小孩的活动,这是她在“过马路”场景会进行的“注意力”分配。为什么会这么分配注意力呢?因为这有助于她安全地通过马路。她是怎么知道这么分配注意力是有助于安全呢?通过长时间持续不断的学习改进。我们一生一直都在各种不同的场景学习注意力分配方式。

还有小时候听说“青蛙只能看见运动的物体”,是因为青蛙的视觉系统对运动特别敏感。这有助于它躲避捕食者和捕捉猎物,因为运动的物体通常更具有威胁性,或者是食物。这也是一个“注意力机制”,是刻在基因里的注意力机制。

那怎么用注意力来提升长文本翻译能力呢?

前面说到,为了能够准确翻译长文本,我们会边听边把内容记录到笔记上。接下来我们开始进行翻译,随着我们翻译的进度,我们的“注意力”也在笔记中持续移动。翻译到中间任何一个地方,我们的注意力会聚焦到笔记中接下来要翻译的内容相关的地方。

约书亚·本吉奥(Yoshua Bengio)的团队在2014年发表的论文《Neural Machine Translation by Jointly Learning to Align and Translate》中第一次引入了类似的笔记+注意力的方法到循环神经网络。具体来说,把需要翻译的文本输入到循环神经网络实现的编码器,把输入序列依次输入到编码器的过程当中,把编码器在每一个时间步的最后一层隐藏状态都存下来(这相当于我们边听边记录的笔记),等输入结束后把所存下来的所有历史隐藏状态全部提供给解码器。而解码器在边翻译边输出时,通过“注意力机制”按需关注对应时间步的隐藏状态。这一“简单”的算法在英译法的评测任务中已经能打平当时最先进的基于短语的统计机器翻译系统。

注意力机制(Attention Mechanism)简单理解就是一个信息筛选,根据当下场景需要,分辨哪些信息是重要的,哪些信息应该忽略。这个既熟悉又抽象的“注意力”,在机器学习算法中具体是怎么实现的呢?

img

这是最常用的注意力公式。不明白这些数学符号是什么意思没关系,我们只需要知道注意力就是Q、K、V这三个变量的一个函数就够了。这三个变量具体是什么意思?它们是从信息检索领域借鉴而来。Query就是查询,我们关注的问题,或者说就是我们的“注意力”。每个信息都有一个对应的键Key和值Value,如果一条信息的Key与我们的Query匹配(Q和K的点积较大),意味着这是我们应该关注的信息,我们将给它的Value以较高的权重。还是太抽象了。

我们拿我们求医的场景类比一下。比如,我最近有持续咳嗽,那么“持续咳嗽”这个症状是我的Query。我分别咨询呼吸科、内科、皮肤科三个科室的大夫,三个科室的大夫分别作出了诊断和治疗建议,这里每个大夫的科室就是Key,大夫作出的诊断和治疗建议是Value。现在,我根据症状和科室的匹配度(Query和Key的点积),对三个诊断进行加权汇总(Value的加权合)。这个场景中,根据“持续咳嗽”这个症状,呼吸科的“注意力权重”是80%,内科是15%,皮肤科是5%,所以我主要采纳了呼吸科大夫的诊断和治疗建议,适当借鉴了内科的建议,忽略了皮肤科的诊断。

提问:

  • 常见的注意力计算方式有哪些?各自有什么特点和利弊?

  • 点积注意力计算公式中,Query和Key的点积为什么要除以一个根号dk?这有什么作用?

  • 闪存注意力是什么?解决什么问题?怎么做到的?

第一次引入到循环神经网络并在翻译任务中表现出色的注意力机制,也叫交叉注意力机制(Cross Attention),因为它是用来捕获输入序列和输出序列之间的关系,即解码器在解码过程当中对编码器的所有隐藏状态进行注意力权重计算。

而人们很快意识到,序列内部的关系也非常重要。比如"The chicken didn’t cross the street because it was too tired.“这句话中"it"指代什么?可能是"chicken”,也可能是"street",不过从"because it was too tired"来看,应该是指代"chicken"。要正确理解这句话,模型需要对同一序列中的词之间的依赖关系有全局理解。因此,研究者们又引入了自注意力机制(Self-Attention Mechanism),以帮助机器能更准确地理解原文。

提问:

  • 歪个楼,"Why did the chicken cross the street?"是什么梗?

  • 为什么自注意力能够显著提升捕捉长距离依赖的能力?

  • 为什么说自注意力机制有较高的计算和内存需求?实践中有哪些工程优化方法?

当然,很多时候我们需要同时关注一个事务的多个方面。比如在前面求医的例子当中,除了以症状为Query来计算我们对不同科室医生的注意力权重之外,我们可能还会用“权威性”为Query来计算对不同职级医生的注意力权重。也许呼吸科医生是主治医师,而内科医生是知名专家,综合考虑方向匹配度和医生权威性,得到的结论可能有所不同。

在自然语言的理解中也存在多个语言理解层次的挑战。例如在上面的一只鸡过马路的例子中,涉及到主语和代词的关联(it指代chicken),涉及到因果关系的理解(because it was too tired),涉及到语法结构解析(because it was too tired修饰didn’t cross the street)。因此,研究者们又引入了多头注意力机制(Multi-Head Attention),来捕捉输入数据的不同部分或特征的关系,从而增强模型的表示能力和灵活性。

提问:

  • 如果是软注意力机制,本身就可以把注意力分配到多个对象上。为什么还需要多头注意力才能捕捉不同的特征?

  • 多查询注意力又是什么?它和多头注意力是什么关系?

“注意力”是一个蛮神奇的东西,发现如果我们能学会把注意力放在正确的地方,往往我们对事物也已经形成了正确的理解。研究者们发现也不再需要用循环神经网络来实现编码器了,只要把自注意力机制堆上去,模型在学习捕捉序列内不同单词之间的关联关系的过程当中,对整个文本已经形成了非常成熟精准的理解。因此有了Vaswani等人在2017年发表的《Attention Is All You Need》论文,俗称Transformer,自注意力和多头注意力就是在这篇论文中第一次被提出。

2.3 Transformer

Transformer论文发表之前注意力机制已经存在,并成功应用于循环神经网络的改进。Transformer是把注意力机制推到了新的高度,用注意力机制把循环神经网络本身也替代掉了,整个神经网络中核心部件只剩下了注意力机制,用“注意力学习”替代了一切学习。

Transformer相比循环神经网络,计算量反而增加了。如果输入序列的长度是N,则循环神经网络的计算复杂度是O(N),而Transformer的计算复杂度是O(N^2),所以Transformer比循环神经网络更“慢”。不过Transformer废弃了循环神经网络中的循环依赖,采用了自注意力机制来进行学习,而自注意力的计算中所有位置的计算是相互独立的,所以可以并行处理,不再像循环神经网络那样逐时间步只能一步一步串行处理。这就可以让我们用资源换时间,投入一万倍的算力进去就能加快速度一万倍,就有机会“大力出奇迹”了。难怪提出Transformer的正是财大气粗的Google,也在摩尔定律持续了40多年后的今天。

提问:

  • 模型的计算复杂度还和参数数量和层数有关,那通常使用的Transformer和循环神经网络,综合考虑的整体计算量对比是怎么样的?

  • Transformer相比循环神经网络,计算复杂度增加了,但有说训练反而会更快,这是为什么?

那Transformer的作者们是不是富二代碰上了时代的好运?那实际情况就比这复杂得多了。

img

上图就是Transformer架构。仅从架构图也能感受到,它涉及大量细节。这个架构图到处都可以看到,但很少有真正讲清楚它的细节。而了解它的每一个细节仅仅是第一步,了解完之后反而会产生更多的疑问。这里为什么会这么设计?灵感是怎么来的?背后都有哪些考虑?还有哪些其他方式?各自的利弊如何?了解的越多,越发感叹它的精妙。

在中个彩票都需要凭本事的年代,好运一定是留给有充分准备的人。要能设计出Transformer这样能够顺应时代的技术架构,背后需要深厚的理论洞察、丰富的实践经验、准确的趋势判断。“大力出奇迹”的前提是方向要对,算力只是放大器,如果自身实力不够,只会砸资源,那死的更快。

虽然说“你只需要注意力”,但实际Transformer架构除了注意力之外,还有位置编码、前馈神经网络、残差连接、归一化、激活函数等组件。在这里我们简单了解一下这些组件的作用。

这第一个就是位置编码(Positional Encoding),它为Transformer提供输入序列中每个词的位置信息。

img

自然语言理解中,词的位置不同,整句话的含义也不一样。比如,“猫追老鼠”是现实,“老鼠追猫”就是动画片。在循环神经网络中,通过顺序处理输入序列加循环依赖的网络结构来隐式的捕捉词语之间的位置关系,形成正确理解。而Transformer的自注意力机制,打破了这种时序依赖,每个词语都是独立地关注其他所有的词语,这使得不同的词语可以并行计算各自的注意力,但同时也失去了词语的位置信息,无法区分“猫追老鼠”和“老鼠追猫”。因此,需要引入位置编码来补充词语在序列中的位置信息。

一个幼稚的方法就是采用自然数序列作为位置编码,比如把“猫追老鼠”变成(猫-1)、(追-2)、(老鼠-3)这三个词元输入给Transformer。当然,实际上用的比这复杂,Transformer论文中使用的是正弦和余弦位置编码(Sinusoidal Positional Encoding),因为它具有连续性和周期性优势。

提问:

  • 自然数序列作为位置编码,有什么问题?

  • 位置编码的连续性和周期性带来什么好处?

  • 位置编码向量应该怎么结合到输入向量?两个向量相加?还是两个向量拼接?

不过自然数序列也好,正玄和余玄也好,都是绝对位置编码(Absolute Positional Encoding),提供的是一个词元在序列当中绝对位置信息。但实际上自然语言理解中,词元之间的相对位置(比如“「老鼠」这个词在「猫」这个词的后面”)往往比绝对位置(比如“「老鼠」这个词在句子中的第3个位置”)重要。

因此,在后续的改进中人们引入了相对位置编码(Relative Positional Encoding)。具体来说,在计算注意力的时候,对于每对查询(Query)和键(Key),除计算它们之间的注意力得分之外,再根据它们之间的相对距离来调整注意力得分,为每一对不同的相对位置分配一个权重,以此影响最终的注意力得分。

提问:

  • 绝对位置编码中,编码之间的差值等于相对位置,模型就不能自己学习通过编码之间的差值来计算相对距离吗?

  • Transformer架构如何获得像循环神经网络一样的时间依赖性的能力?

相对位置编码也有很多种不同的探索,不过目前GPT-4和LLaMA等许多现代大模型使用的是旋转位置编码(Rotary Position Embedding,RoPE)。它的核心思想是,在输入序列的每一个位置乘上一个旋转矩阵,通过这种方式保持序列的相对位置信息。

img

旋转位置编码是苏建林等人在2021年第一次提出,而后迅速被主流大语言模型采用。苏建林的“科学空间”( https://spaces.ac.cn/ )是一个非常有深度和技术性的博客,他从16岁(2009年)开始写,至今仍在保持更新。

提问:

  • 旋转位置编码为什么能够成为现代大语言模型的标准?

  • 为什么说旋转位置编码尤其适合多头注意力机制?

  • 为什么不把位置编码设计成可学习的参数,也通过训练形成一套位置编码?

前馈神经网络(Feed-Forward Neural Network,FFN)是下一个组件。注意力机制主要是基于线性变换,而任何线性变换的组合结果还是线性变换,因此仅通过注意力机制是无法学习深层次的特征的。接在注意力层后面的前馈神经网络层,引入了非线性变换,增强模型的表示能力,使其能够捕捉到更复杂的特征组合。Transformer的前馈神经网络由两层全连接网络组成。

img

提问:Transformer架构中的前馈神经网络为什么使用两层结构?不是一层也不是三层或者更多?

前馈神经网络的隐藏层和输出层中间,会有激活函数(Activation Function),应用到隐藏层神经元的输出上,非线性因素正是由这个激活函数引入的,帮助模型学习复杂模式。

img

早期的激活函数有Sigmoid和Tanh,但这些函数容易导致梯度消失问题。在2010年,辛顿把整流线性单元(Rectified Linear Unit,ReLU)激活函数应用到受限玻尔兹曼机(Restricted Boltzman Machine,RBM),它不仅简单高效,还能有效缓解了梯度消失问题,因此迅速成为深度神经网络中的标准选择。Transformer架构使用的激活函数也是ReLU。不过现代大模型(如GPT-4、LLaMA等)通常使用高斯误差线性单元(Gaussian Error Linear Unit,GELU)作为激活函数。

提问:

  • 为什么现代大模型使用GELU而不是ReLU作为激活函数?

  • 不同的激活函数都有什么不同的特点?如何根据场景进行选择?

注意力和前馈神经网络是Transformer架构的核心组件。不过Transformer架构图中可以看到,注意力和前馈神经网络的旁边,都有一条绕过它们直接把输入信息传递到下一个框的“飞线”。这是做什么呢?

img

这个“飞线”就是残差连接(Residual Connection)。这是深度学习模型中的一种结构设计,最初由何恺明等人在2015年提出,以解决深层神经网络训练中的退化问题。残差连接把输入直接简单相加到变换后的输出(即H(x)=F(x)+x),这样的“恒等映射”为神经网络提供了一个很好的起点,这个起点就是“输入本身”,而网络只需要学习残差(输出和输入之间的差异),学习如何从输入中补充必要的修改。在Transformer架构中,残差连接帮助缓解训练中的梯度消失问题,提高训练效率。

提问:

  • 残差连接如何帮助缓解Transformer的梯度消失问题?

  • 跳跃连接按理比残差连接更加灵活,为什么在实践中更多还是使用残差连接?

  • “恒等映射”有什么独特之处?为什么在深度神经网络中它会有特殊意义,而不是任何其他的映射?

再回到Transformer架构图,注意力和前馈神经网络的输出,分别与各自的残差连接汇聚之后,经过了归一化(Normalization,Norm)。归一化就是对数据的分布进行调整,通常调整为均值为0,方差为1,保持数据在一个相似的尺度上。这有助于加速模型训练的收敛速度,防止梯度消失或爆炸问题。

2015年,Ioffe和Szegedy提出了批量归一化(Batch Normalization),用于卷积神经网络进行图像处理,这是归一化技术的重要里程碑。批量归一化通过在每个小批量的训练数据内对每个特征进行归一化,减少内部协变量偏移,实现了更快的训练和更好的泛化能力。

而在Transformer架构中使用的是层归一化(Layer Normalization),在2016年辛顿团队提出。层归一化针对神经网络的一层神经元,以每个样本为单位,对所有神经元进行归一化。层归一化不同于批量归一化,不依赖于小批量的统计信息,更适合处理序列数据,因此常用于自然语言处理场景。

不过把数据分布标准化到均值为0,方差为1,可能会限制模型的表达能力。因此,通常又会引入两个可训练的参数,γ(缩放因子)和β(偏移因子),对标准化之后的特征再进行缩放和偏移,使特征恢复原始表达能力。

提问:

  • 同一样本的不同特征,取值可能分别来自不同的分布,而层归一化对不同的特征取值胡乱进行归一化,这怎么会有用呢?

  • 为什么Transformer模型使用层归一化而不是批量归一化?

  • 先进行标准化,而后又通过缩放因子和偏移因子进行恢复,这岂不是又回去了?要这样归一化的意义在哪里?

  • 残差连接和层归一化之间有什么互动关系?

到这里我们对Transformer的基本结构有了一些简单的了解。不难看出,围绕它的注意力机制还有大量的细节共同组成Transformer架构。Transformer的成功,不仅需要一个创新,还需要方方面面扎实的落地实现。也可以预期,这只是一个开始,Transformer架构还有很多探索空间,研究者们还会不断地对它进行迭代改进。

提问:

  • Transformer架构输出前最后有一个Softmax层,这是做什么的?

  • GPT-3有1750亿个参数,这是怎么算出来的?

2.4 模型架构

说到模型,各种名称满天飞。预训练模型和生成模型姑且先当我知道是什么。那自回归模型是什么?因果语言模型呢?扩散模型?这些模型都是干啥的,为啥这么多模型。

Transformer也好卷积神经网络也好,都是深度学习的基本算法,而这些算法在实际应用过程当中,为解决不同的问题需要不同的“产品化”,采用不同的训练、推理架构,产出不同的模型。好比电机和汽油发动机都是引擎,但根据不同的场景和需要,会做成轿车、跑车、吊车等不同的产品。

  • 模型按任务类型划分

模型首先按照它的任务类型来划分,就是看它“干什么”。机器学习模型,包括但不限于大模型,主要做两件事,分类、生成。

判别模型(Discriminative Model)是做分类任务的模型,根据输入数据,输出分类标签。比如邮件服务器判断一个新邮件是不是垃圾邮件,要不要把它直接放到垃圾收件箱,就是用判别模型进行。比如输入一张图片,看图中有没有红绿灯,以及当前亮的是红灯还是绿灯,以此来决定自动驾驶的车要不要继续向前开。还有一个不那么显然的例子,目前市面上主流的智能音箱,能够直接用语言对话,能问时间能问天气能放音乐,听着像是“生成模型”,但实际上是通过判别模型来把用户的需求分类成几个预设的“意图”,再根据意图类别选择同样预设的“话术模板”来回答,实则为判别模型。实现判别模型常见的机器学习算法有逻辑回归、支持向量机、卷积神经网络等。

提问:Transformer能用来实现判别模型吗?为什么多数判别模型都不用Transformer?

生成模型(Generative Model)是做生成任务的模型。废话,这我懂,生成文本、生成图片、还有生成视频这些嘛。对,但不完全是。企业级的理解应该是“通过学习数据分布来生成新数据的模型”,就是说我用什么数据训练,它输出一样类型的数据。文本、图片、视频的确是生成模型最常见的应用场景,但也有其他场景也是使用生成模型。比如,在销量预测的工作中,用以往长时间大量的销量历史进行训练,模型输出未来12个月按月的销量预测,也是生成模型。

还有一些模型是做“理解”任务,我们叫嵌入模型(Embedding Model)。这怎么理解呢?这些模型输出的是“理解”结果,即嵌入向量(Embedding)。不过嵌入向量往往只是中间结果,“理解”之后还是要做具体的事情。如果嵌入向量后面接一个分类器(最简单比如接一个Softmax激活函数),就能用来进行分类,成了判别模型。如果嵌入向量后面接一个解码器(Decoder),就能用来进行生成,成了生成模型。嵌入向量之间的距离还代表两者内容的“相似度”,因此嵌入向量也可以用来作为索引,进行相似内容的检索。这种神奇的嵌入模型,典型代表是Google的BERT模型。BERT是一个掩码语言模型(Masked Language Model, MLM),这是用它的训练方法命名的。它通过自监督学习方法进行训练,具体来说,在输入文本中随机掩盖部分词语,并训练模型根据上下文预测这些缺失词语,从而理解语言的语义结构。

  • 生成模型按技术架构划分

能进行生成任务的生成模型,给我们打开了新的应用场景和无限的想象空间。而生成模型有多种不同的实现方式,我们根据生成模型的训练、推理的技术架构,把模型进一步分成几类。

自回归模型(Autoregressive Model, AR)的历史可以追溯到20世纪早期,最初主要用于经济学和统计学领域,分析和预测时间序列数据。它通过利用当前的数据序列来预测下一个数据点,再把所预测的数据点加到现有的数据序列,继续预测下一个数据点。比如要预测某产品未来12个月的销量,模型根据过去一段时间的销量趋势,先预测下一个月的销量,再把所预测的下一个月销量数据加到销量趋势中,继续预测再下一个月的销量,依次重复12次得到未来12个月的销量。这就是所谓的“自回归”。自回归积分滑动平均模型(AutoRegressive Integrated Moving Average, ARIMA)是典型的例子,广泛用于销量预测、股票走势预测等时间序列分析场景。

当然,不只是时间序列有自回归性,自然语言也有自回归性,我们写一段文字往往都是从左到右,一个字一个字地“续写”。自回归思想应用到自然语言场景,生成自然语言的自回归模型就是因果语言模型(Causal Language Model, CLM),大家通常说的“大语言模型”(如GPT)就是因果语言模型(原来我们是在这里)。这个名字让我有点困惑。为什么不是叫“自回归”语言模型?“因果”又是什么意思?

因果语言模型,这是相对于掩码语言模型所说的。2018年Google发布BERT模型,在文本分类、实体识别等任务上表现非常出色。BERT就是掩码语言模型,它是通过“填空题”进行训练,一句文本中间随机把一个单词换成空格,让模型根据空格前面和后面的上下文,预测空格里面应该填的词语。BERT发布后,掩码语言模型迅速成为了先进语言模型的代表,Google再一次证明它是技术革命的灯塔。而此时,因果语言模型的代表GPT-1,它说出来的话还经常像精神病患者的自言自语。大家纷纷认为同时参考前文和后文双向上下文的掩码语言模型,相比于严格只参考前文来预测下一个词,强调先“前因”再“后果”的因果语言模型,当然会有更强的理解能力,有结构性优势。直到2020年OpenAI发布GPT3,展现了因果语言模型颠覆性的自然语言生成能力,发现大模型竟能说出各种出乎意料的专业、幽默、哲理的话。这时候大家又觉得只会填空和分类,说不出一句完整顺畅的话的掩码语言模型,是存在结构性缺陷的。从此,OpenAI也成为了新的灯塔。

提问:为什么因果语言模型的生成能力能够显著超越掩码语言模型?

前缀语言模型(Prefix Language Model, PLM)是因果语言模型的一种扩展。它在因果语言模型基础之上,在训练时和推理时都额外引入了固定上下文前缀作为输入条件,以用来指导模型的生成过程,完成指定的任务。比如常见的前缀有“翻译文本:”、“总结一下内容:”、“补全以下代码:”等等,用来明确指导模型通过生成要完成什么任务。不过因果语言模型我们也很少让它从一张白纸开始生成,而是先提供提示语,明确要它完成的任务,这里提示语可以看做是“动态前缀”。

提问:因果语言模型通过“动态前缀”提示语能完成前缀语言模型的任务,还需要前缀语言模型吗?

我们回到生成模型的划分,序列到序列模型(Sequence-to-Sequence Model, Seq2Seq)是不同于自回归模型的另外一种生成方式,根据一个输入序列,生成一个输出序列。比如自然语言翻译,根据一个语言的输入,翻译成另一个语言输出。比如语音识别,根据语音音频的输入,输出识别的文字。序列到序列模型由两个部分组成,把输入序列转化为计算机“理解”后的上下文向量的编码器(Encoder),和把上下文向量再转化成所需要的输出序列的解码器(Decoder)。Google的T5模型和Facebook的BART模型是典型的序列到序列的语言模型,这两个模型都是2019年发布的,都是基于Transformer架构实现。不过原先用序列到序列模型解决的很多问题(如翻译、摘要生成),现在因果语言模型有显著更优的表现。

提问:为什么因果语言模型在翻译、摘要生成等场景的效果能超越序列到序列模型?

生成对抗网络(Generative Adversarial Network, GAN)则基于一个有趣的架构进行训练。它由卷积神经网络实现的生成器(Generator)和判别器(Discriminator)组成,生成器生成尽可能逼真的假样本,随后把生成的假样本和真实样本混合在一起,让判别器辨别真假样本,两者在对抗中不断优化,使生成器能够生成以假乱真的样本,判别器的辨别能力也不断提升。这个设计的巧妙在于,与生成器一起不断进步的判别器,实际上扮演了生成器的损失函数的角色,判别器对假样本的概率判断就是生成器的损失,以此损失通过反向传播更新生成器的参数。这样的设计使得它不需要标注数据,可基于海量的无标注样本进行训练,大力出奇迹。生成对抗网络在2014年被提出,随后主要在图像和视频生成领域应用,主要特点是生成的图像有出色的清晰度和细节,但存在生成的图像多样性不足的问题,也叫模式坍塌(mode collapse)问题。

提问:

  • 生成对抗网络的生成器需要什么输入?条件生成对抗网络是什么?

  • 生成对抗网络有训练不稳定的问题是为什么?

  • 生成对抗网络为什么会有模式坍塌问题?有人说这个现象体现了KPI导向的管理方式弊端,是什么意思?

变分自编码器(Variational Autoencoder, VAE)则采用了另外一种结构,在生成内容的多样性上有更好的表现。它由编码器和解码器组成,编码器把输入数据“压缩”到潜在空间(latent space),输出潜在变量(latent variable)的概率分布,解码器则从潜在变量的概率分布采样一个潜在向量(latent variable),从潜在向量重建原始数据,模型的训练目标是最小化重建误差,让重建结果尽可能接近输入数据。这里在编码器和解码器中间引入的潜在变量采样环节,使得变分自编码器的潜在空间具有连续性,也最终使得它的生成内容有多样性。(妈呀这说的都是啥玩意儿)

提问:变分自编码器的两个核心思想(“压缩”输入数据、潜在变量的概率分布)太抽象了,很难理解。能否用画家绘画的场景,类比一下给个形象的解释?

提问:

  • “输入数据压缩到潜在空间”是什么意思?为什么说生成模型本质上是对世界数据的“压缩”?

  • 为什么说自编码器不是生成模型,而变分自编码器却是生成模型?是什么差别造成的?

  • 重参数技巧(reparameterization trick)是什么?为什么变分自编码器需要这个?

变分自编码器也有它的缺点,用它来生成的图像偏模糊,缺乏细节。有没有办法结合变分自编码器的“创意”优势和生成对抗网络的“质感”优势呢?Deepfake结合了这两个模型,它先用变分自编码器生成一个有创意但质感一般的图像,再接一个生成对抗网络对图像的质感进行迭代。网上各种明星换脸视频、伪造政治人物讲话视频,都是用Deepfake生成的。

不过要说图像和视频生成,那必须得提到下一个模型了。风靡全球的图像生成应用Stable Diffusion、MidJourney、DALL-E,惊艳所有人的OpenAI视频生成应用Sora,都是基于这个模型 – 扩散模型(Diffusion Model, DM)。

扩散模型基于一个简单朴素的想法,它由前向扩散过程和逆向扩散过程组成:

img

前向扩散过程从左到右,一张猫咪的图片经过不断给它加噪声,直到最后变成完全随机噪声,图像变成最简单的数学分布(比如高斯分布)。这样做有什么意义呢?重点来了,接下来就是逆向扩散过程,从右到左,就是要让模型学习如何从一个噪声图像,逐步去除噪声,一步一步到最终得到显得“自然”的图像。前向扩散过程本质上为模型训练生成了大量的训练样本。

相比变分自编码器和生成对抗网络,扩散模型可谓是满身优点。它不但兼具生成内容多样性和高质感的优点,它训练还稳定,而且还更善于完成条件生成任务(比如基于一段文本来生成图像)。因此,它迅速占领了图像和视频生成领域的应用。

提问:

  • 为什么逐步去燥过程能让扩散模型的训练比变分自编码器更稳定?

  • 为什么扩散模型更适合条件生成任务?

  • 模型按训练阶段划分

如今,预训练+微调范式广泛普及,成为大语言模型训练的标准方法。模型先在海量数据上进行预训练,学习通用的特征和知识(如基础的语法、结构、常用模式),然后在特定任务上进行微调,以适应具体的应用场景。这好比我们学习成为厨师,先花时间学习基础的烹饪技能(如何切菜、调味、掌握火候等等),然后开始学习特定的菜系(比如中餐、西餐或者甜点制作)。

预训练模型(Pre-trained Model)是经过预训练阶段产出的模型,具备了基础的能力,有很好的可塑性。不过因为还没有为任何特定场景进行微调,我们通常也不会直接拿预训练模型构建产品。OpenAI的davinci-002就是GPT-3的预训练模型,我们很少直接接触,甚至可能都没有听说过。我们使用的ChatGPT是预训练模型经过了大量“你是一个有用的助手”系列任务的微调之后的产品。

提问:为什么预训练+微调范式成了大语言模型训练的标准范式?

三、大模型训练

基于Transformer架构的大语言模型,与以往其他的模型相比“智能度”体现出代际的差别。在办公、医疗、教育等各种领域中初步的应用实验表明,在很多场景下大模型甚至体现出超过一般专业人士的能力。这样的“智能”到底来自哪里?

前面我们也初步了解过Transformer架构,仔细看它每一个组件,绝大部分是由加法和乘法组成的线性变换,加上一点激活函数,真没有什么“秘密”在里面。那“智能”到底藏在哪里?

“智能”不但需要正确的结构,还需要正确的训练。著名的“狼孩”例子表明,即使同样为人类,如果从小生长在狼群当中,他也会像狼一样四肢行走、狼嚎、吃生肉,不会人类的语言。人之所以成为人,不仅仅因为大脑是人类的大脑,更离不开我们从小开始一路受到的教育,即“训练”。当然,“结构”仍然是重要的,哪怕在哺乳动物当中大脑结构算是最接近人类的大猩猩,我们不管如何“训练”,都无法培养它成为一个人。

Transformer架构,要说还有一个秘密就是参数的数量非常非常非常多。“训练”就是不断调整这些参数的值,使得它们经过一系列看似非常基本的加法、乘法、激活函数的数学运算之后,最终能够智能地回答我们提的任何问题。如此奥妙的“训练”到底是怎么进行的呢?

现代的大语言模型,训练过程从宏观地说,大致以预训练、监督微调、基于人类反馈的强化学习三大阶段组成。

提问:如果把训练一个大语言模型的预训练、监督微调、基于人类反馈的强化学习三大阶段,类比到一个人的成长过程,分别怎么对应?

3.1 预训练

预训练(Pre-train)是大语言模型训练的第一步,这一环节使用海量的数据对模型进行初步训练,以便模型学习通用知识,是大模型获得“智能”的最关键的训练环节。这也是最烧钱的一步,通常约98%的算力会在这一环节消耗。以Meta发布的LLaMA 3.1 405B模型为例,该模型有4050亿个参数,训练使用了16000张英伟达H100 GPU卡组成的集群(GPT-4o估算市场价约7.5亿美元),在15万亿词元的数据集上进行训练,训练耗时54天。

提问:Meta用来训练LLaMA 3.1 405B用的16000张Nvidia H100 GPU组成的集群,估算它的市场价大约是多少?

模型预训练的过程,和我们学习一项新技能的过程很相似。比如,我们怎么学习投篮?即使之前没摸过一次篮球,没关系,上来先试投一把,看看球最后落到哪里,离篮筐差多少。随后根据球与篮筐的差距,反推球的轨迹,反推手臂的姿势和力度,反推腿的弹跳力度等等,根据分析结果调整姿势,再投一把。如此反复迭代练习,直到球能投进篮筐位置。

只不过,模型预训练时练习的任务是下一个词元预测(Next Token Prediction)。假如我们的训练语料库中有句话是“我喜欢吃苹果”,训练时我们向模型输入“我喜欢吃__”,要模型在后面下划线处填词。与我们学习投篮一样,模型也是先自己试着(胡乱)填一把,比如说填了“钥匙”。“我喜欢吃钥匙”有点离谱,没关系,接下来就要训练模型了。我们计算“钥匙”和“苹果”相差多少,然后从模型输出层反向逐层推算每一层每一个参数错了多少,最后根据推算结果对每个参数进行适当的调整。这样就是完成了一轮迭代,接下来反复进行上述的练习+调整过程,直到模型能输出让人满意的结果为止。

预训练基本就是这样的步骤:

技术概念 投篮 下一个词元预测
前向传播 试着投篮 试着填词
损失计算 篮球离篮筐差多远 “钥匙”和“苹果”差多远
反向传播 分析球的轨迹,手臂的姿势,腿的弹跳力度等等 反向逐层推算每一层每一个参数差了多少
参数更新 调整手臂姿势、弹跳力度 参数更新
梯度下降法 如上反复迭代练习 如上反复迭代练习
  • 损失函数

img

前向传播之后模型输出的结果(ŷ)与期望结果(y)有多大差异,即上图中的第4步,需要有一个定量的衡量标准,这就需要我们设计一个损失函数(loss function)。我们把模型输出的结果和期望结果输入到损失函数,损失函数要输出一个损失值,代表两者的差异有多大。模型训练的目标就是通过不断调整参数,把损失值降到尽可能地低。所以设计损失函数的关键就是能够定量衡量“差了多少”,让它能够指导模型训练往正确的方向前进。

这样的损失函数怎么设计呢?损失函数的设计和任务形态紧密相关。

如果是“投篮”任务,则损失函数可以定义为篮球错过篮筐的距离。错过距离越大则差异越大,错过距离不断缩小则越来越接近成功,直到错过距离降到零就是投篮成功了。

如果是销量、股票价格等连续值的预测,即回归任务,损失函数的设计也是比较直接。常用的损失函数是均方差(Mean Squared Error,MSE),它计算预测值和实际值之差的平方的平均值。或者更简单一点,平均绝对误差(Mean Absolute Error,MAE)。

那大语言模型预训练的损失函数怎么设计呢?“钥匙”和“苹果”差多远,这怎么算?

“下一个词元预测”实际上是分类任务,因为我们限定“下一个词元”只能选自我们的词汇表中,所以模型实际上是在预测下一个词元是词汇表中的哪一个词,做的是选择题。我们再看Transformer架构图,输出前最后一层有Softmax函数,Softmax函数输出一个和我们词汇表一样大小的概率分布(全加起来等于1),表示词汇表中的每一个词元是下一个词元的概率。

比如上面“我喜欢吃苹果”的例子,假如我们的词汇表很简单,只有【吃、苹果、我、喜欢、钥匙】五个词元组成,大模型输出的是(0.09,0.24,0.16,0.22,0.29),其中“钥匙”的概率0.29是最大值,因此我们解读为这一次的预测结果是“钥匙”。但实际我们期望是“苹果”,如果还是用一样的概率分布来表示,则应该是(0,1,0,0,0),即“苹果”对应的位置是1之外,其他全部是0,这是我们期望模型输出的概率分布。那么,我们需要的损失函数就是能衡量模型输出的概率分布和期望的概率分布之间差多少的函数,交叉熵损失函数(Cross-Entropy Loss)就是适合这个场景。

不过有时候下一个词元也不是只有一种可能,比如我除了喜欢吃苹果,我也喜欢吃巧克力,所以期望的概率分布也不是有一项为1其他全是0,而是苹果和巧克力分别都有对应的概率,加起来等于1。KL散度(Kullback-Leibler Divergence)适合作为这个场景的损失函数。

提问:

  • 假如有一个“幼稚”的损失函数,给词汇表中的每个词汇按照词典顺序赋予自然数序列的编号,然后损失定义为模型输出的词元和期望词元两个词元的编号之差绝对值,这个“幼稚”损失函数用于大语言模型预训练,都会有什么问题?

  • 为什么要用交叉熵损失函数来算两个概率分布之间的差异?如果用欧几里得距离或者余弦相似度作为损失函数,有什么问题?

  • 常见的损失函数都有哪些?分别有什么优缺点?如何根据场景选择合适的损失函数?

  • 在实现交叉熵损失计算时,可能会遇到什么数值稳定性问题?如何通过对数技巧(log-sum-exp技巧)来解决这些问题?

  • 反向传播

img

计算完损失之后,就是反向传播(Backpropagation)过程。反向传播的基本思想是通过链式法则(Chain Rule),从输出层开始逐层向前计算损失函数对每个参数的梯度。

链式法则是微积分的基本定理,用于计算复合函数的导数。我们的神经网络每一个神经元是一个函数,每一层的神经元是一个基于前一层神经元的输出的函数,也就是复合函数。链式法则告诉我们,复合函数的导数可以先分别计算各个部分的导数,再按照一定规则进行组合来计算。前提是每个子函数本身都是可导,如果我们留意前馈神经网络、注意力机制、激活函数、Softmax,都是由可导的变换组成,这是精心设计的。

计算每个参数的梯度有什么用呢?一个参数的梯度相当于这个参数对损失函数的影响程度,提示了在当前状态下应该如何调整这个参数,能够减少损失,改进模型。简单说,梯度指向了在该点下降最快的方向。我们来看看。

img

假如我们有一个特别简单的模型,只有θ0和θ1两个参数,J(θ0,θ1)就是损失函数,假设两个参数不同取值的情况下对应的损失如上图的曲面。一开始,我们运气不好,θ0取值0.7,θ1取值0.5,我们的起点在接近山顶损失值较高的位置,而我们希望通过不断调整两个参数,到达损失值最低的山底。因此我们计算当前位置下损失函数分别对每个参数的梯度,由这些梯度组成的向量相当于提示了下一步的方向,即图上的绿色箭头。

提问:

  • 如果是循环神经网络,反向传播怎么实现呢?

  • ReLU激活函数并不是全程可导,不影响反向传播吗?

不过知道下一步的方向只是万里长征的第一步,我们要怎样一步一步前进直到到达山底?这就需要我们设计一个前进策略,即优化算法。

  • 梯度下降法

既然我们在哪儿都能算出下一步的方向,那一个显然的策略就是“走一步算一步”直到走下山为止。这就是梯度下降法(Gradient Descent),通过不断沿着梯度调整参数,使模型的损失逐步减少,最终使损失达到最小值。

img

然而预训练的现实比这残酷,有两个原因。

第一是我们没有上帝视角,我们只有一个小手电筒。从上帝视角看着山貌的全景地形图,似乎下山的路比较显然,但如果我们在伸手不见五指的黑夜,手里只拿着一个小手电筒,要在深山里面找下山路,那就非常困难了。模型训练就像我们拿着小手电筒,我们计算的梯度只相当于让我们看到周围几米内的地形,而对于目的地在哪个方向,还有多远,完全不清楚。

第二是高纬度空间中地形更加复杂。前面举例的只有θ0和θ1两个参数的模型,其损失函数表面是一个三维空间的山,而现实中的大语言模型动不动百亿甚至千亿参数,损失函数表面对应千亿维度空间里面的“山”,这种“山”是怎样一种“地形”呢?想象都无法想象。

所以在这样一个残酷的现实中,梯度下降法一个常见的问题是陷入到局部的“坑”或者“平原”之后容易停滞不前。因为一旦进入到一个坑或者平原,从所站的地方环顾周围眼下已经没有“下降”的方向了。

不过一般来说,我们不会在下山路上走到一个小坑就会认为到达了山底,我们会顺着此前下山的“大方向”继续前行看看。基于这样的理念,提出了动量法(Momentum)。动量法如其名,为我们引入“惯性”:如果在某个方向上,梯度的方向连续一段时间都保持一致,那么我们倾向于继续沿着这个方向更新参数,这能帮助我们跨越一些局部的“坑”或者“平原”。

而另一种理念认为,如果某个方向的梯度历史很大,这个可能是一个较为重要的方向,需要慢下来更仔细地探索。AdaGrad(Adaptive Gradient)实现了这个理念,它根据梯度的历史平方累积作为权重,进行“刹车减速”。不过“梯度的历史平方累积”容易导致刹车越踩越深,所以RMSProp(Root Mean Squared Propagation)在AdaGrad基础上进行了改进,采用了指数衰减的方式平滑梯度的平方累积。RMSProp非常适合在稀疏梯度的情况中有效地调整每个参数的更新幅度。

乍一听动量法和RMSProp的理念互相矛盾,动量法认为“长期趋势上要保持惯性”,RMSProp认为“坡度大的方向要踩刹车”,听起来一个说要踩油门,一个说要踩刹车。其实两者并不矛盾,动量法的侧重点在于「方向」,对于有持续下降的方向应当保持探索,不应该因为碰到一个小坑而轻易放弃。RMSProp的侧重点在于「速度」,对于陡峭的方向,尤其如果坡度频繁变化,地形复杂,则应该慢下来,仔细探索,以免错过重要的点。

Adam(Adaptive Moment Estimation)结合动量法和RMSProp的思想,使用了衰减的梯度累积来增加惯性,同时用衰减的梯度平方累积来作为刹车控制速度。Adam因为结合了两者优势,迅速成为了优化算法的标准选择。GPT-3、LLaMA等先进大语言模型,就是使用了AdamW(Adam with Weight Decay)进行的预训练。AdamW是Adam的一个变种,引入了权重衰减以实现更好的正则化效果。

img

5种梯度下降方法的动画:梯度下降(青色),动量法(品红色),AdaGrad(白色),RMSProp(绿色),Adam(蓝色)。左侧的凹陷是全局最小值;右侧的凹陷是局部最小值。

还有一个问题需要考虑,要用多少样本来计算损失和梯度。

按理说,我们应该用整个训练数据集进行损失和梯度的计算,相当于所有样本的平均损失和梯度,这个方法叫批量梯度下降(Batch Gradient Descent)。这种方法虽然理论上正确,但使用海量规模数据集进行训练的场景,每一次的梯度计算开销太大,完全不现实。

随机梯度下降(Stochastic Gradient Descent, SGD)则每次只使用一个样本计算梯度并进行参数更新,核心思想是每次用一个随机样本来近似计算整体的梯度。随机梯度下降虽然效率确实高了,但毕竟是“随机”,会导致更新的不稳定,也难免走弯路。

两者折中一下,就是小批量梯度下降(Mini-batch Gradient Descent),每一步使用一个小批量样本来更新参数,既提高了效率,又减少了波动。

实践中,现代大语言模型通常采用的方法是小批量梯度下降+AdamW。

提问:

  • 为什么梯度下降法能找到函数的极小值?背后的数学原理是什么?

  • 随机梯度下降加上动量法之后,相当于具有了批次更新的特点。那么它与小批量下降相比,有什么优劣?

  • 权重初始化

有了梯度下降法,我们就可以通过不断迭代改进的方式对模型进行训练,直到它变得足够聪明了。那么只剩下一个问题,供我训练的“婴儿模型”哪里来?

权重初始化就是创造“婴儿模型”的过程,或者说以下山问题类比的话,如何选择起点的问题。起初我们对山貌一无所知,所以实际上对起点的选择也没什么太好的策略,因此通常会“随便选”,全靠后续的梯度下降法来达到期望的目的地。随机初始化(Random Initialization)就是“随便选”策略,用随机数来初始化模型的权重。或者高斯初始化(Gaussian Initialization),同样也是用随机数进行初始化,只是从高斯分布中采样随机值来初始化。

提问:

  • 作为优秀的程序员,参数不应该全部初始化为0吗?模型参数都初始化为0,会有什么问题?

  • 权重初始化时,随机数从均匀分布采样和高斯分布采样,对训练产生什么差别?

在深度学习早期,简单的随机初始化工作的很好,但随着神经网络变得越来越深,开始出现梯度消失或梯度爆炸的问题,导致训练困难。在反向传播中,梯度是逐层相乘传播的,所以在深层神经网络中梯度很容易指数级衰减或者指数级增长,表现为接近输入层的神经元梯度要么趋近于零导致权重无法更新,要么梯度变得过大直到溢出。

提问:

  • 从理论上来说,如果我们用BigInteger的分子和分母来表示一个参数,那么梯度消失和梯度爆炸问题还会存在吗?

  • 有哪些常用的方法可以有效缓解梯度消失或梯度爆炸的问题?

为了改善深层网络的训练,Glorot和Bengio在2010年提出了Xavier初始化,它的基本思想是保持每一层输入和输出的方差一致,从而避免信号在层间传递时缩小或放大过多。当时深度神经网络主流的激活函数是Sigmoid和Tanh,因此Xavier初始化也是为使用了这两种激活函数的神经网络设计的。

随后ReLU成为深度神经网络的主流激活函数,因此2015年何恺明等人提出了He初始化,是基于Xavier初始化的改进,目的也是为了保持每一层输入和输出的方差一致,只是适配了ReLU激活函数。现代大语言模型通常采用GELU激活函数,He初始化仍然适用这类激活函数。

提问:

  • 如何基于数学原理推导Xavier初始化公式?

  • 为什么Xavier初始化可以通过数学原理推导,而He初始化只能靠实验试出来呢?

  • Transformer架构已经有层归一化来调整输出的均值和方差,为什么权重初始化还需要He初始化?

  • 分词

经常会说到「大模型上下文长度」,我们知道这是大模型一次能处理的文本的长度上限,谁能支持更长的上下文这也是模型之间重要的竞争维度。不过具体说到“GPT-4o的上下文长度是128K tokens”,这里token具体是什么呢?这是说上下文长度是128K个字符?还是说128K个单词?

token实际上是大模型的“字符”。英语以26个字母为字符,中文以汉字为字符,大模型也有自己的字符,token就是大模型的字符。token在中文有很多不同的翻译,常见的有“词元”或者“标记”,本文中统一采用“词元”。有一些文章甚至翻译成“令牌”,这是错误的翻译。我们写代码调用在线API的时候通常需要用token来进行身份认证,这个叫令牌,但此token非彼token,两者没有任何关系,只是在英语中复用了同一个单词。

分词(Tokenization)就是把人类语言的输入序列拆分成一个个小单元,转化为以词元组成的序列的过程,以便于输入大模型处理。

字符级分词(Character-level Tokenization)是最简单的做法,它直接采用人类语言的字符作为词元。比如“GPT is unbelievably smart”,分词后的结果为[“G”, “P”, “T”, " ", “i”, “s”, " ", “u”, “n”, “b”, “e”, “l”, “i”, “e”, “v”, “a”, “b”, “l”, “y”, " ", “s”, “m”, “a”, “r”, “t”]。

字符级分词虽然简单,但因为单个字符不具有任何语义信息,建模难度增加,模型训练变得困难。字符级分词也会导致同样的文本转化成词元序列之后的序列长度变得更长,这会增加推理过程的计算量。试想,如果我们阅读英文文本的时候,被迫要一个字符一个字符地阅读,会显著增加阅读难度,非常影响阅读速度。

提问:

  • 字符级分词是具体如何导致模型训练变得更加困难?

  • Transformer架构的模型,它的计算复杂度与输入序列的长度形成什么关系?

单词级分词(Word-level Tokenization)是自然的下一步,比如在英语中以空格和标点符号为分隔符进行分词,每个单词作为一个词元。“GPT is unbelievably smart”经过单词级分词后的结果为[“GPT”, “is”, “unbelievably”, “smart”]。

单词级分词保留了语义单元的完整性,也会有效缩短输入词元序列的长度。不过因为它依赖固定的词汇表,碰到不在词典中的未登录词(out-of-vocabulary word)的时候无法理解。比如最近流行的“doomscrolling”,指在社交媒体上不断地滚动浏览负面新闻,上瘾到无法停止。而且它还带来新的问题,词汇表太大。英语中如果包含所有罕见词,词汇量有几十万甚至上百万,意味着大模型要面对一样规模的词元表,词元表的规模又会直接影响训练和推理环节的计算量和内存需求。还有,在中文、日文等没有明确空格的语言中,单词分词不仅需要额外的复杂分词器,还可能因误分词导致歧义,比如“南京市长江大桥”。

提问:词汇表太大对大模型产生多大的影响?

折中这两者,就是子词分词(Subword Tokenization)。“GPT is unbelievably smart”经过子词分词后,一种可能的结果是[“GPT”, “is”, “un”, “believ”, “ably”, “smart”],注意其中的“unbelievably”是如何被拆成三个组成部分,即子词。即使“unbelievably”本身并不在词典中,拆成三个组成部分后模型可以通过融会贯通“un-likely”、“notice-ably”、“believe”等词语学习,分别掌握每个子词的含义,进而能够正确理解“unbelievably”。

这样的子词是怎么拆出来的呢?字符对编码(Byte-Pair Encoding,BPE)是子词分词最常用的方法,它先用字符级分词作为初始词汇表,通过不断把出现频率最高的字符对合并为一个新的词来扩充词汇表,直到词汇表达到预定的大小。如果熟悉哈夫曼编码,会觉得字符对编码与它有异曲同工之妙。是的,字符对编码就是一种数据压缩的启发式方法,通过合并频繁共现的字符对,以有限的词汇表大小,达到对输入序列最好的“压缩”效果。

字符对编码是现代大语言模型分词的标配,GPT、LLaMA等都采用了字符对编码。以GPT-4o为例,它的词汇表规模有近20万,平均每个词元(即子词)约对应4个字符。

提问:

  • 字符对编码如何支持中文?汉字有超过10万,仅初始词汇表本身就已经太大了。

  • 算法题,字符对编码过程中,如何高效计算高频共现字符对?

WordPiece也是一种基于频率的分词方法,2016年由Google提出,它是对BPE的一个改进。WordPiece的目标是最大化训练数据的似然性,会更关注词的构成,能够更好地捕捉到语言的结构特征。Google的BERT模型采用的就是WordPiece。

提问:

  • WordPiece的目标是最大化训练数据的似然性,能用人话讲解一下是什么意思吗?WordPiece与字符对编码的做法具体有什么不同?

  • WordPiece既然是字符对编码的改进,应该是更先进的方法。为什么GPT、LLaMA等现代大语言模型大多还是采用字符对编码?

img

分词完之后,还需要从词嵌入矩阵查找词元对应的词嵌入,这词嵌入向量是我们最终向大模型提供的输入。传统的自然语言理解任务中,词嵌入的训练往往单独进行(使用Word2Vec、GloVe等方法),但现代大语言模型中词嵌入矩阵通常是模型的一部分,在预训练过程中同步训练词嵌入矩阵,因此可以认为分词后的词元就是大模型的输入。

提问:

  • 大语言模型如何在预训练过程中同步训练词嵌入矩阵?

  • GPT-3在输入的词嵌入和输出层的权重矩阵共享参数,那么反向传播时共享参数的梯度具体是怎么计算的?

到这里,大语言模型的预训练整个过程可以完整串起来了:权重初始化、分词、前向传播、损失计算、反向传播、梯度下降。

3.2 超参数调优

掌握了预训练的标准作业流程,不代表我们能训练好一个大模型。训练大模型像做一盘清蒸鱼一样,即使拿的是一样的菜谱,优秀的厨师和一般的厨师做出来的结果有巨大的不同。

核心原因就在于超参数调优(Hyperparameter Tuning),简称「调参」。超参数是那些在模型训练流程中不通过算法自动学习,而需要我们在训练开始之前要手动配置的参数,例如学习率、批量大小、网络结构(如层数和神经元数)等。即使是同样的数据、同样的模型架构、同样的优化算法,我们配置的超参数不同,训练结果可以是天差地别。

如果说模型参数的优化是拿着小手电筒找下山的路,那超参数调优是连手电筒都没有,全凭直觉和经验摸黑下山。预训练一个大语言模型,涉及到数十种超参数,不仅探索空间庞大、相互影响复杂,调优过程中的试错性、计算资源的限制、任务差异等因素都导致了超参数调优的高难度。超参数调优,更像是一门艺术而不是科学,非常考验师傅的手艺,也因此被形容为「炼丹」 – 只有太上老君知道最后是怎么调出来的。

提问:模型参数可以用梯度下降法学习,超参数为什么不能通过算法学习,需要人工调优?

  • 拟合

我们为什么而读书?最终是为了实现中华民族伟大复兴。不过在当下作为阶段性目标,是为了在高考能考到更好的分数。大模型训练也如此,最终是为了成为“人类有用的助手”,但当下阶段性目标是为了「拟合」。

拟合(Fitting)就是让模型通过训练使得能够尽可能准确地完成设定任务。大语言模型预训练的训练任务是「下一个词元预测」,所以如果模型拟合的好,它就能够较为准确地预测下一个词元。而如果要定量地评估一个模型拟合的有多好,就要看通过损失函数计算的损失值了。模型在数据集整体的损失值代表了模型对数据集拟合的有多好,这是对模型最直接的考试。

所以,超参数调优就是如何选择一组最佳的超参数,让模型拟合得最好,即整体损失值最低。

事实上,我们在训练模型的过程当中,每训练一个轮次就会测算一次整体损失值,以监控随着训练的推进,模型拟合的效果如何变化。就好比我们高考前每三个月一次模拟考试,评估学习效果。把随着训练轮次的损失值变化画成一个曲线,就是损失曲线(loss curve)。

img

上图是一个理想的损失曲线,随着训练轮次的推进,损失逐渐值逐渐下降,不断接近于零。这是拟合比较好的情况。

提问:随着训练轮次的损失值变化曲线,其中的损失值具体是怎么计算的呢?每一个训练轮次后需要基于全量数据单独进行损失计算吗?还是以训练过程的副产品的方式产出?

img

那这一个就是欠拟合(Underfitting)了,虽然开始损失值有所下降,但整体还处在高位,并且长期趋势看着不太能够降下来的样子。这就是一个训练失败的结果。

不过模型训练中最头痛的问题不是欠拟合,而是过拟合(Overfitting)。拟合的好怎么是个问题呢?就怕它全靠死记硬背,见过的题背答案,但不理解概念,稍微变换一下就不会。所以我们一般会从数据集中划出一小部分数据(如10%)作为验证集,剩余数据集作为训练集。我们只用训练集的数据对大模型进行训练,而验证集作为大模型“没见过”的考题,检测它是否真的掌握了规律而不是简单地背诵答案。

img

上图是一个呈现过拟合的损失曲线,训练集的损失值不断下降,看似拟合的很好,但验证集的损失值到后面反而开始上升。

除了死记硬背外,“学到错误的规律”是过拟合的另一种常见原因。有个机器学习任务是根据图像区分狼和狗,但由于训练数据的图像中狼经常出现在雪地背景而狗较少出现在雪地中,模型实际上学到了用雪地背景来判断狼还是狗。这种情况下看似模型在训练数据集中的表现很好,但实际并没有真正学到狼和狗的本质特征,换一个场景如果把狼和狗放在一个背景下,模型就不会区分了。

比“学到错误的规律”还要离谱的过拟合是“偶然当做必然”。比如,把今天感冒的原因归结为“昨晚梦见掉牙了”,而不是看到流感横行的冬季昨天还和一帮人KTV。迷信的人过度依赖偶然性或特定的事件,忽略整体和更广泛的规律,模型如果过度关注数据中的噪声或局部特征,会和迷信的人一样,偶然当做必然,结果也是过拟合。

提问:

  • 除了通过验证集的性能下降来判断过拟合,还有哪些方法或定量指标可以帮助检测过拟合?

  • 如果你是一个老师,如何避免学生对某一类型题目的“过拟合”,从而能够更好地应对不同类型的问题?

  • 如何从统计学的角度分析过拟合产生的原因?

当然,实际的损失曲线往往长得没有这么丝滑。经验丰富的师傅见过各种奇形怪状的损失曲线,像老中医把脉一样通过损失曲线的形状,判断问题可能出在哪里。

img

提问:学习曲线和损失曲线有什么差别?学习曲线如何帮助大语言模型预训练?

  • 优化器超参数

梯度下降法可以直观地理解为“看一步、走一步”,这“走一步”是具体走多少?这就由一个我们设置的超参数 – 学习率(learning rate)来决定。学习率的设置有点麻烦,设置的太小就走的太慢(损失曲线下降缓慢、欠拟合),而设置的太大就容易错过目标点(损失曲线上下震荡、不收敛)。如何选择合适的学习率以平衡模型训练的收敛速度和稳定性,这就是学习率调整需要做的事情。

不过不管选择多大的学习率,固定学习率总是不能适应训练的不同阶段。理想的策略是离目标远的时候步长大一点,离目标越来越近的时候小步走。就像打高尔夫一样,一开始通过大力挥杆来获得更远的击球距离,当球接近球洞时要控制力度,选择精确的短打技术。学习率衰减(learning rate decay)实现了这样一种学习率调整策略,它在训练过程中逐渐减小学习率,帮助模型在接近最优解的时候进行更细致的调整。

提问:学习率衰减都有哪些不同的衰减策略?不同的衰减策略各有怎样的利弊?实际应用中如何进行选择?

上一节梯度下降法当中介绍的动量法、Adam等优化算法,其实也是在调整学习率,它们根据每个参数的梯度和历史调整每个参数的学习率,实现的是自适应学习率。不过自适应学习率和学习率衰减并不冲突,自适应学习率是调整每个参数的学习率,实现的是每个参数的“个性化学习率”,而学习率衰减调整的是全局学习率,决定整体的步长基线。

学习率循环(cyclical learning rate)是另一种学习率调整策略,通过周期性地增加和减少学习率,而不是简单地衰减,可以帮助模型跳出局部最优解,探索更多的参数空间。

学习率预热(learning rate warmup)是在训练的初期从一个较小的值开始逐步增加学习率,在训练进行到5%或10%进度时达到预设的最大值。训练初期模型参数还处在随机初始化状态,使用较小的学习率可以避免模型参数更新过快,导致训练不稳定。

在实践中,大语言模型的预训练通常采用 学习率预热 + 学习率衰减 + AdamW优化器 的组合策略。当然,优化器选择了AdamW,则还有β1(动量)和β2(梯度的平方衰减)超参数需要调优。

提问:如果采用了学习率预热+学习率衰减+AdamW优化器的策略,具体都有哪些相关的超参数需要调优?这些超参数有没有可借鉴的行业经验值?

上一节中介绍,大语言模型预训练通常采用小批量梯度下降法,因此批量大小(batch size)是下一个需要调优的超参数。较小的批量大小可以提高模型的泛化能力和噪声鲁棒性,但训练速度慢。较大的批量加快训练速度,但可能在局部最优收敛,并且需要更多内存。

在实践中,通常还会结合梯度累积(gradient accumulation),即累计多个小批量的梯度,并最终进行一次参数更新。这样的策略使得无需一次性处理所有数据,有效控制了内存需求,同时模拟更大批量的效果。另外,批量大小也可以动态调整,在训练初期使用较小的批量大小进行预热,然后逐渐增大批量大小。

提问:

  • 批量大小的选择如何反过来影响学习率和训练轮次的调整?

  • 较小的批量会让梯度估计含有一定的噪声和随机性,为什么反而会提高模型的泛化能力?

  • 较小的批量会使得参数更新更加频繁,为什么训练速度反而会更慢?

  • 更大的批量需要更多的内存,如何根据批量大小估算需要多少内存?

  • 既然可以梯度累积,并且梯度累积还不需要额外的内存,为什么还需要小批量?简单点随机梯度下降法+梯度累积,有什么问题?

训练轮数(epochs)超参数决定了训练数据我们“学几遍”,决定了每个数据点被处理的次数,也会决定模型训练的持续时间。训练轮数过少会导致学习不充分欠拟合,训练轮数过多可能会导致模型过拟合训练数据,还会浪费宝贵的计算资源。大语言模型预训练中也有时候用训练步数(steps)来衡量训练量而不是训练轮数,训练步数是指优化器进行的参数更新次数。合适的训练轮数与模型大小、数据集大小、学习率等因素相关,实践中有采用固定步数的策略,也有根据模型在验证集上的损失变化灵活决定何时停止训练。

还有,为了防止发生梯度爆炸而导致训练失败,可以设置一个梯度裁剪阈值,当任何参数的梯度超过裁剪阈值时对其进行简单的裁剪,这是梯度裁剪(gradient clipping)方法。

  • 模型架构超参数

模型架构超参数决定模型复杂度,它影响模型的表达能力和过拟合风险。复杂度太低的模型表达能力不足,容易欠拟合。复杂度太高的模型容易过于拟合训练数据中的噪声,导致过拟合。

Transformer架构的模型中,较为重要的模型架构超参数有网络层数、隐藏层大小、注意力头数、前馈网络的维度。这些超参数又怎么调优呢?

这就要说到最近比较时髦的缩放定律(Scaling Law)了。说到缩放定律,我们通俗地理解为“更大的模型、更多的数据、更强的算力,带来更好的模型性能”,或者简单理解为“大力出奇迹”。这个理解并没有错,但OpenAI在2020年发表的介绍缩放定律的论文《Scaling Laws for Neural Language Models》不止这点信息量。

论文中说到,通过大量的实验发现,模型通过训练能达到的最佳损失值,基本上与模型规模、数据集规模、算力投入呈现幂律缩放关系,其中一些趋势跨越了七个数量级仍然成立。并且,模型规模、数据集规模、算力投入之间存在一个最佳的黄金比例。

论文中还说到,两个同样规模的模型(参数总量一样),其他架构细节(如网络层数、隐藏层大小等)在较大范围内影响较小。可以理解为,模型参数总量这一个数字,基本能代表模型复杂度。难怪我们说大模型第一个关注的都是参数总量,比如GPT-3是1750亿参数,LLaMA 3.1 8B是80亿参数等等。

结合这两点,模型架构超参数的确定思路就清楚了:

  1. 先确定能搜刮多少规模的数据集,能购买并投入多少的算力。
  2. 根据数据集规模和算力投入,计算最佳模型规模,确定参数总量。
  3. 根据参数总量,合理分配网络层数、隐藏层大小、注意力头数、前馈网络的维度等架构细节。

提问:

  • 如果我确定了要训练100亿参数的大语言模型,怎样确定合理的网络层数、隐藏层大小、注意力头数、前馈网络的维度等架构细节超参数?

  • 根据缩放定律,工业界正在不断比拼训练更大的模型。接下来,数据集规模和算力投入两个因素中,哪个会首先成为行业的瓶颈?

  • 自缩放定律发布以来,有哪些打破缩放定律的新的技术变革?

此外,位置编码、激活函数的选择也会影响模型的性能,也是需要通过实验进行调优。

  • 正则化超参数

如果没有正则化技术,我们将只能从过度聪明至迷信的过拟合模型,和不够聪明至肤浅的欠拟合模型当中二选一。幸亏有正则化,我们可以训练聪明的大模型,同时防止它过拟合。正则化(Regularization)通过损失函数中增加一个额外的惩罚项来约束模型复杂度,防止模型过拟合,提高模型在未见数据上的泛化能力。

上学的时候老师说,考试中如果一道题目的推导过程过于复杂,就应该怀疑一下是不是做错了,正确的做法往往不会太复杂。这是有一定道理的,如果模型在进行一个预测的时候,需要涉及到过多的特征过于复杂的计算,有可能是因为没有学到正确的规律。

L1正则化(L1 Regularization,也叫Lasso正则化)就是基于这样的理念,在损失函数中增加模型权重的绝对值和(λ * Σ|wi|)作为惩罚项,惩罚参数的绝对值,促使许多模型权重变为零,使得模型变得稀疏。权重变为零相当于特征筛选,因为它强迫某些不重要的特征不参与预测。

L2正则化(L2 Regularization,也叫Ridge正则化)则向损失函数引入权重的平方和(λ * Σ(wi^2)),惩罚参数的平方,抑制模型权重变得过大,使得权重更平滑,从而防止个别特征对模型有过大的贡献,减少模型对训练数据中的小波动或者异常值的过度敏感。

L1正则化和L2正则化,都有一个超参数需要调优,就是正则化强度,通常用λ来表示。正则化强度决定了损失函数和正则化项之间的平衡,较大的λ会导致模型更加简单,可能导致欠拟合,而较小的λ允许模型更多的自由度,可能导致过拟合。

提问:

  • 为什么L1正则化会让一些权重变零,倾向于产生稀疏矩阵,而L2正则化则倾向于将权重缩小,但一般不会使它们变为零?背后的数学原理是什么?

  • L1正则化和L2正则化看着很像,它们对模型训练的影响有什么不同?

丢弃法(Dropout)是深度学习中非常重要的正则化技术,是辛顿团队2014年在《Dropout: A Simple Way to Prevent Neural Networks from Overfitting》论文中提出。它在训练时随机丢弃神经网络中的部分神经元不参与计算,迫使模型每次训练时都有不同的结构进行学习,从而避免网络过度依赖某些特定神经元或连接,减少过拟合。就如论文标题所说,它是“一个简单的方法”,实践中在语音识别、图像分类等多种不同的任务场景都表现出突破性的效果,显著超过了很多人的预期,让大家对这项技术感到惊讶。这就是深度学习泰斗之首的辛顿,简单的方法带来出奇的效果,影响深远。也再次印证,正确答案往往是简洁的。

丢弃法也有一个超参数需要调整,就是丢弃率,通常采用0.2到0.5之间的一个值。合适的丢弃率受很多因素的影响,包括模型的复杂度、数据量、任务类型、网络层级和层的类型,以及与其他正则化方法的配合等等,需要在实际训练过程中找到最合适的取值。

  • 调参技术

如果一定要说调参的技术,倒也有一些,诸如网格搜索、随机搜索、贝叶斯搜索。不过这些顶多都是语法糖级别的技术,只是为调参工作稍微降低点操作成本,并没有什么神奇的功效。

比如网格搜索,就是我们把要调的超参数每个的取值范围配置好,它会帮我们把所有超参数的所有取值组合挨个试一遍,每一个超参数组合都要完整训练一个模型,得出这个超参数组合的训练效果。有时候所有可能的超参数组合实在太多,那就是随机搜索,在所有组合中随机采样一定数量的组合,最后从这些超参数组合中选出效果最好的一组。贝叶斯搜索稍微更聪明一点,它是一个启发式的方法,通过利用已经尝试过的超参数组合来构建一个模型,推断最有可能产生最佳结果的区域,来引导后续的搜索过程。

这些调参方法都是需要根据超参数不同的取值组合训练一个模型看效果,而大模型训练一次的成本就极其昂贵,不可能让我们尝试很多组合。因此,像原子弹研发一样,需要在小当量进行大量的实验,积累经验和数据,再根据这些经验来推导最后要生产的大当量模型的最佳超参数组合。

不过即使是小当量实验,仍然也是需要不少资源的。因此,借鉴已有的行业经验和前人的研究成果非常重要。比如,提出缩放定律的《Scaling Laws for Neural Language Models》论文,进行的大量小当量实验,耗资估计上千万美元,给大家分享了宝贵的实验数据。

3.3 对齐训练

img

经过预训练生成的模型我们叫基础模型(Foundation Model)。基础模型虽然已经具备很强的智能,但它是个怪物,行为诡异,普通用户并不知道应该如何驾驭它。

例如,如果我们问一个问题,通常我们的期望是得到一个答案。但基础模型是基于“下一个词元预测”任务进行的训练,它只会进行「续写」,不一定回答问题。比如,我们问“如何制作饺子?”,基础模型续写的结果有可能为:

  1. “冬至了该吃饺子了。”
  2. “如何制作馒头?如何制作包子?”
  3. “将调味好的馅料包入饺子皮中,捏紧后煮熟。”

从基础模型的角度,这三种都是符合训练任务的续写,而如果作为我们的助手,对我们更有帮助的是第三种结果。

另外,基础模型还可能输出不合适甚至有害的内容。基础模型因为基于海量的互联网公开信息进行的训练,网上的内容质量参差不齐,有很多好内容,也有很多错误、虚假、恶意、暴力等不良内容,基础模型该学的不该学的都会学。因此,也需要我们引导基础模型,要输出有帮助且无害的内容。

总之,基础模型像狼一样,聪明、有力量、有敏锐的嗅觉,但又非常野性,很难与人类协调合作。通过对齐训练,狼变得更加温顺,能理解人类的需求,能执行复杂的任务,最终托变成我们的好朋友–狗。

  • 监督微调

监督微调(Supervised Fine-Tuning,SFT)是对齐训练的第一步,在这一步我们用示范数据集对模型进行训练,模型通过模仿示范数据来学习。

监督微调的核心就在示范数据集。示范数据集通常是人工精心编辑的“问题-回答”对,是对给定的问题,我们希望一个优秀的人工智能助手应该给出的答案。比如OpenAI对GPT-3进行监督微调所用的示范数据集,由约13000个问答对组成,问题的类型涵盖写作、开放问答、脑暴、聊天等10多个人工智能助手会通常碰到的场景。这些问题的答案由40位众包标注人员书写,这些标注人员大多数都有大学以上的学历。

img

上图是OpenAI示范数据集的一个真实案例。这个例子中,提示语是让大模型用“Serendipity”这个单词组一个句子。没有经过对齐训练的GPT-3预训练模型所续写的结果,果然不出所料,并没有按照要求组句,而是像调皮的小孩一样变着说法重复了一下要求。标注人示范回答就是用来对GPT-3进行对齐训练用的示范数据集中的答案,而经过对齐训练的InstructGPT确实给出了一个符合要求的回答。不过注意到,InstructGPT的回答并不与标注人的答案一模一样,因为模型并不是简单地记住示范数据集中的具体答案,它是学习训练数据中的模式并灵活运用到所有回答当中。

img

上图是OpenAI的大模型线上API收到的提示语按照应用场景的分布,揭示用户需求的分布情况。为了使大模型更好适配用户需求,监督微调的示范数据集也会参考这个需求分布来构造。除了通用的问答之外,还有改写、总结、分类等类型的任务,这类任务的提示语中前面通常包含一段描述该任务的共同前缀,即“指令描述”。因此,基于这样的示范数据集进行的监督微调,也叫指令微调(Instruction Fine-Tuning,IFT)。

有了示范数据集之后,具体的训练方法倒是基本与预训练一样。具体来说,把示范数据集作为语料,仍然用“下一个词元预测”任务对模型进行进一步的训练。唯一的差别是“下一个词元预测”跳过问题描述部分的文本,从回答的第一个字开始进行。

监督微调是对齐模型行为非常有效的训练办法,所以往往也是对齐训练的第一步。但它有它的局限性,最主要的问题是过于依赖高质量的标注数据,试想要为“怎么制作饺子”写一个高质量的示范回答是颇费时间的。因此,它往往数量上较为有限,主要用来引导模型学习做一个“人工智能助手”大致应该是什么样子,但无法覆盖到做一个优秀的人工智能助手所需要的方方面面。

提问:

  • 监督微调的关键就在示范数据集,那么示范数据集中的提问是怎么来呢?如何提高提问集的质量?

  • 既然监督微调训练方式与预训练一样,都是下一个词元预测,为什么需要进行额外的监督微调,而不是把示范数据集也一并加到预训练数据集一起训练?

  • 基于人类反馈的强化学习

示范的成本很高,但反馈就可以容易很多。比如拿学做菜做例子,要能够示范,本身就得是专业的厨师,并且得颇费一番功夫才能进行一次高质量的示范。而作为用户提供反馈就容易多了,“这个菜太油了” “这个菜卖相不错”,甚至更简单点“这一桌菜我最喜欢这一道”。

同理,要示范如何做一个人工智能助手很难,但我作为用户向人工智能助手提问时,它的回答对我是否有帮助,还是较容易反馈的。这样的反馈就可以广泛大量收集。

img

如果ChatGPT用的多,偶尔会碰到像上方截图一样的回答 – 它会提供两个版本的答案,并询问你更喜欢哪一个答案。这就是在收集用户的偏好反馈,随后会用偏好数据通过强化学习对模型进行对齐训练。这个方法整体叫基于人类反馈的强化学习(Reinforcement Learning from Human Feedback,RLHF),它大幅降低了人类反馈的成本,使得收集大量广泛的反馈变得可能。不过RLHF有它的难点,就是强化学习。

强化学习(Reinforcement Learning)并不是一个具体的算法,它是一种机器学习的范式,有很多种不同的算法去实现,它们的共同点是通过交互和奖励机制来学习最优的行为策略。先后打败了人类围棋冠军李世石和柯洁的阿尔法狗(AlphaGo),就是用强化学习进行训练的。

基于人类反馈的强化学习,主要以如下步骤组成:

  1. 收集大量的人类反馈,反馈形式通常为“A和B两个答案哪个更好?”。
  2. 基于人类反馈数据,以预训练语言模型为基础,训练一个奖励模型(Reward Model)。奖励模型学习人类的偏好,在后续的训练中,奖励模型可以代替人类进行偏好打分。
  3. 以预训练模型为基础,训练一个策略模型(Policy Model)。训练过程为:对于每一个提问,策略模型试着给出不同版本的答案,奖励模型代表人类对不同的答案进行偏好打分,再根据打分结果用近端策略优化(Proximal Policy Optimization,PPO)算法训练策略模型。
  4. 经过多轮优化和训练后的策略模型,就是最终的完成对齐训练的大模型。

强化学习是一个高难度的机器学习方法,不仅因为它背后的数学原理复杂,更是因为它有很高的实操难度。即使是机器学习专业选手,强化学习方法不容易“炼”成功,其中的各种细节设计、参数调优都是需要丰富的实践经验,就不再展开(wǒ shuǐ píng yǒu xiàn)。

提问:

  • 为什么不直接拿人类反馈进行训练,比如拿人类偏好的答案进行监督微调,而是先训练一个奖励模型,再用奖励模型训练大模型?

  • RLHF中,奖励模型的损失函数怎么设计?如何对准确性、有用性、创造性、有害性等不同维度的偏好进行建模?

  • 为什么训练完奖励模型之后,不直接拿奖励模型偏好的结果进行监督微调,而是进行强化学习?

  • 为什么会发生奖励黑客行为(Reward Hacking)?如何避免奖励黑客?

  • RLHF中,如何判断探索和利用存在失衡?如何把握探索和利用的平衡?

  • 近段策略优化算法的原理是什么?

3.4 工程优化

img

一个完美的建筑设计图,还需要精湛的施工工艺,最终才能构建出功能与美观兼备的建筑。大模型算法(注意力机制、Transformer架构等)作为重要的技术突破,改变了自然语言处理、计算机视觉等领域的技术格局,但它的成功与普及还需要精湛的工程优化。

我们往往认为发明创造是改变世界的关键,而忽视扎实实践的重要性。我们小时候都听过瓦特看着“水壶冒蒸汽”的现象发明了蒸汽机的故事,而事实上在瓦特之前蒸汽机早就存在。在1712年纽科门已经开发了能够输出持续动力的蒸汽机并且成功商用,而利用蒸汽动力的历史甚至可以追溯到公元一世纪。纽科门蒸汽机开发50多年后,在1764年瓦特对纽科门蒸汽机进行了改进,引入了分离冷凝器来解决蒸汽机效率低的问题,并且还用双作用缸进一步提升了输出功率。瓦特对蒸汽机的改进就是一种工程优化,“瓦特改进了蒸汽机”听着就没有“瓦特发明了蒸汽机”让人激动,但这才是开启了工业革命的关键里程碑。

远的不说,就看我们现在手上的智能手机。乔布斯作为智能手机的缔造者,他的创新精神和产品理念被广为流传,被大家公认为改变了世界的企业家。而早在1998年就加入苹果负责全球运营和销售的二号人物库克,他的故事感兴趣的人就没那么多了。直到2011年乔布斯英年早逝,库克走到前台,才逐渐开始被人了解。库克主导苹果的供应链管理、生产流程优化和全球化,他的卓越的执行力和管理能力,也是智能手机改变世界必不可少的一部分。

大模型的工程优化涉及到分布式训练、显存优化、模型优化等方面的工作,对大模型算法能够在有限的硬件资源下顺利运行至关重要,其中有大量的微创新机会待我们挖掘。前段时间风靡全球的国产DeepSeek大模型,就在工程优化方面进行了很多独到的创新,让全世界对“中国制造”刮目相看。

  • 分布式训练

大模型训练动不动就要在几千台机器上训练,各大厂都在争先恐后地建设「万卡集群」,大力出奇迹靠的就是分布式训练,毫无疑问这也是大模型研发最烧钱的工作。

任何分布式系统都是解决两个核心问题,任务如何分割、结果如何聚合,都面临三个共同的挑战,通讯同步、负载均衡、容错性。分布式训练同理,围绕训练如何并行、参数如何汇总这两个核心问题,工程师们探索了不同的模式。

img

数据并行(Data Parallelism)是最容易想到,也相对容易实现的方法。把训练数据分割成多个小批量,每个机器分别拿一部分训练数据,训练一个完整的模型副本,机器之间定期同步参数更新,以此聚合训练结果。

提问:分布式训练的数据并行中梯度或参数如何进行同步?不同的同步方法各有怎样的利弊?

数据并行虽然能让我们用更大的训练数据集进行训练,但它仍然需要一台机器运行一个完整的模型副本,这大大限制了可训练的模型规模。以当前大模型训练常用的NVIDIA H100 GPU为例,它的80GB显存只够我们训练百亿参数量级的模型。因此,不可避免需要模型并行(Model Parallelism)。

img

模型怎么分割比较好呢?一个比较自然的分割方法就是按层划分,大模型通常由几十层或者上百层Transformer块组成,把不同的层放在不同的机器上,由多台机器整体组成一个模型副本。不过这又有另外一个问题,前向传播和反向传播过程中计算都是一层一层进行,意味着每次只有一台机器忙乎,其他机器都得等着那一层计算结束。为了提高利用率,再引入流水线作业。

img

流水线并行(Pipeline Parallelism)还是把模型按层划分,只是第一台机器结束它所负责层的计算,把结果传给第二台机器之后,它并不闲着,而是继续开始下一批数据的计算,把训练过程流水线串起来,显著改善计算资源的利用率。这个方法可以让我们训练千亿参数量级的模型。

提问:

  • 如何通过监控发现流水线并行中负载不均衡、流水线气泡、通讯延迟等问题?

  • 如何确定流水线并行的最佳切分点?在流水线并行中,如何处理不同阶段的负载不均问题?

  • 流水线并行中,如果一个节点发生故障,整体流程会受什么影响?应对这种情况有哪些容错机制?

img

img

如果模型再大,比如要训练万亿参数量级的模型,哪怕是一层神经网络都已经无法完整放在一台机器,就需要进一步切分了。一层神经网络中主要是矩阵运算,所以需要用张量并行(Tensor Parallelism)把矩阵运算进行切分。

提问:张量并行中,计算图的划分和机器资源的分配是静态的还是动态的?

在实践中,训练千亿甚至万亿参数量级的大模型时,数据并行、流水线并行、张量并行三种并行方式会结合使用,因此也叫三维并行(3D Parallelism)。

分布式训练已经是现代大模型训练中的标准基础设施,因此已经有很多先人的积累供我们使用,并不需要从头造轮子。PyTorch和TensorFlow作为最常用的两个深度学习框架,支持丰富的分布式训练功能。微软的DeepSpeed是基于PyTorch开发的高效训练优化库,通过ZeRO等优化技术,能支持上万亿参数量级的大模型训练。

还有一种特殊的并行方式,就是专家并行,训练混合专家模型(Mixture of Experts, MoE)。混合专家模型的核心思想是“分治”。与其让一个大模型去学习所有的数据,不如把任务分配给多个专家,每个专家负责擅长的部分,从而提高整体效率。混合专家模型通常被比喻为人类社会中各行各业的分工协作。这样的比喻虽然形象,但也有一定的误导性。

img

混合专家模型并不是由多个独立的大模型组成,它仍然是单个大模型,只是把Transformer块中的前馈神经网络部分替换成了多个前馈神经网络(图中的FFN1 ~ FFN4)加上门控网络(图中的Router),而其他部分(自注意力机制等)保持不变。在进行训练和推理时,对于每一个输入的词元,由门控网络来决定该词元由哪个(或者哪几个)专家来处理,只有被门控网络激活的专家(即对应的前馈神经网络)需要处理该词元。

专家之间的分工是怎么形成的呢?

并不像人类社会的团队一样,事先划分好了不同的专业方向,大家按各自选择的专业学习。混合专家模型的训练中,门控网络和各个专家模型起初的状态都是“随机”的,在通过梯度下降法不断训练当中,门控网络和专家模型逐渐自行形成一套分工。实际形成的分工也并不是我们想象的那样,不同的专家按照领域分工(比如数学、生物、法律等等),而是更多从词元的粒度形成分工,比如一个专家负责处理标点符号,一个专家负责处理数字,一个专家负责处理动词等等。看来,计算机世界的分工方式和人类的分工并不一样。

提问:

  • 混合专家模型中的门控网络通常是什么结构?它是如何学习到每个词元应该让哪个专家模型来处理?

  • 为什么混合专家模型中,专家之间形成的分工更多是词元级别的,如不同的专家分别负责标点符号、数字、动词等等,而不是领域级别的,如数学、生物、法律?为什么计算机模型会与人类社会形成不同的分工方式?

  • 混合专家模型的训练中,专家会不会出现马太效应?有些专家起初表现稍好于其他专家,门控机制分发更多的词元给他,而因此得到更多的训练,与其他专家越来越拉开差距?

因为混合专家模型每次只激活模型中的一部分参数,相比同等参数量级的稠密模型,它的训练和推理所需要的计算量都有倍数的降低。所以换个角度,在同等算力的前提下,我们可以训练参数量级更高的模型。这是很有意义的,因为模型的参数量级基本决定了模型的表达能力,决定了模型的知识和智能的“容量”。

GPT-4的发布是大语言模型发展中的一个关键里程碑。虽然OpenAI并没有透露GPT-4的技术参数,但外界普遍猜测它是一个混合专家模型,由16个专家模型组成,参数总量达到1.76万亿。要是没有混合专家模型,训练一个1.76万亿参数的稠密模型,至少在目前的算力条件下是无法想象的。

Mixtral 8x7B是首个有影响力的开源的混合专家模型。就如它的名称,它由8个70亿参数的专家模型组成,总参数量为467亿。推理时,它每次激活2个专家,相当于129亿参数的模型。Mixtral 8x7B并不是一个特别大的大模型,但它的意义在于证明了“三个臭皮匠赛过诸葛亮”,总参数量为467亿的混合专家模型,在评测中表现出超过总参数量700亿的LLaMA 2 70B模型。

提问:

  • Mixtral 8x7B的总参数量为什么是467亿而不是560亿?每次激活2个专家,为什么相当于129亿参数模型而不是140亿参数模型?

  • 如果门控网络是硬路由,比如从8个专家挑选最合适的2个专家,这样的topK函数并不可导,如何用梯度下降法训练?

DeepSeek自从v2开始就采用混合专家模型,他们家最先进的推理模型DeepSeek R1也是混合专家模型,6710亿的参数总量,每次推理激活其中的370亿参数。

提问:

  • DeepSeek-R1的混合专家模型是如何实现有效的“通用+专用”混合?这样的设计解决什么问题?
  • 显存优化

如果说分布式训练是研究怎么烧大钱出奇迹,显存优化是研究怎么精打细算。资源投入一旦上了规模,很多细小的优化乘以规模以后收益都能超过临界值,变得值得投入。

为什么精打细算从显存切入呢?

因为算力通常是软限制,而存储是硬限制。具体来说,给定同等的机器资源,想获得2倍的算力就是把训练时间拉长到2倍,但没有任何办法获得2倍的显存。当然,理论上可以再把CPU内存用起来,但CPU内存的访问带宽相比显存慢了几十倍,这就不只是影响“2倍”的事了。所以,能训练多大规模的大模型,通常需要根据显存容量来倒推。

训练一个70B参数的模型,需要多少显存?

假如参数用的是单精度浮点数,则每个参数占4个字节,70B的参数就相当于280GB。一张NVIDIA H100卡的显存是80GB,看起来4张卡就能装进一个70B的模型了?

事实比这残酷多了。如果不做任何优化,预训练一个70B的模型,显存需要装下以下几个部分:

  1. 280GB的模型参数,存单精度浮点数。
  2. 280GB的梯度值,存单精度浮点数。
  3. 560GB的优化器状态,假设用AdamW优化器。
  4. 214405GB的激活值,假设8K上下文长度、128的批量大小、80层Transformer块、8192的隐藏层维度、28674的前馈网络中间层维度、64个注意力头、128的注意力头维度。

提问:

  • 大模型预训练的时候,除了模型参数之外,显存中都还需要存哪些信息?

  • 预训练LLaMA 3 70B模型需要多少显存?预训练需要多少显存,都和哪些因素有关?如何详细估算预训练需要的显存大小?

加起来总共约216TB,需要近3000张H100显卡。这有点夸张了,这才不到千亿参数的模型,按照这个方法要想训练万亿参数甚至十万亿参数的模型,首富都玩不起了。我们看看能做哪些优化。

这里大头是激活值,这是因为前向传播时计算的激活值,在反向传播计算梯度的时候需要用到。不过不一定所有的激活值都存下来,其实可以选择性地存储一部分中间激活值作为中间检查点,在反向传播的时候没有保存的激活值按需从上一个中间检查点重新计算,可以减少显存使用。这个方法叫梯度检查点(Gradient Checkpointing),是用计算换空间的方法。

提问:

  • 反向传播时的梯度计算,为什么需要用到前向传播的激活值?是不是所有神经元的输出都需要用到?

  • 预训练需要的显存构成中,激活值为什么占这么多空间?Transformer模型中都需要存哪些激活值?

激活值占这么多空间,是因为每一层Transformer块内部还有好几层计算组成,每一层的激活值都需要保存。这其中占空间比较大的一层是自注意力的输出,因为这部分随着上下文长度平方级增长,所以一个较好的策略是这部分激活值不在显存中保存,而是在反向传播时重新计算。经过这个优化之后,激活值占的空间从214405GB可以减少到38483GB,少了一个数量级,而计算量只增加约30%-40%。

提问:

  • 关于预训练过程中需要保存激活值,能不能每一层Transformer块只保存它的输入参数,其他激活值都在反向传播时重新计算?这个方法能把激活值占空间优化多少?对计算量有多大影响?

  • 梯度检查点可以节省激活值所占的显存,它优化幅度的理论上限是多少?Transformer模型中是否能达到接近上限的优化幅度?

不过38483GB的激活值仍然是大头。一个重要的原因是因为为了梯度的稳定性我们采用了128的批量,这会导致需要我们同时存128个批量的激活值。我们可以采用梯度累积(gradient accumulation)方法,采用4的小批量,计算一个小批量的梯度,并把梯度累积起来,直到累积到128个批量的梯度,再进行梯度更新。这个方法能把激活值所占的空间进一步优化到1203GB,差不多到了合理的水平了。

提问:

  • 使用梯度累积法计算的梯度,和不使用梯度累积法计算的梯度,结果是否等价?

  • 梯度累积法中,假如全局批量大小是128,则小批量多大比较合适?小批量为1是不是最省显存?这有什么弊端吗?

还有一个可以优化的地方。传统上,神经网络模型在训练的时候通常使用单精度浮点数(FP32)进行计算,每个参数占4个字节。但随着模型规模增大,混合精度训练(Mixed Precision Training)成为了有效的优化策略,除了少数重要的地方仍然使用FP32之外,其他地方用FP16或者BF16代替。

img

提问:

  • 混合精度训练中,如何判断哪些参数应该用FP32,哪些参数可以用BF16?

  • 动态损失缩放如何帮助混合精度训练避免数值精度问题?

实践中,梯度值和优化器状态会仍然使用FP32,而模型参数和激活值都可以用BF16。采用混合精度训练之后,模型参数从280GB变成140GB,激活值从1203GB进一步下降到601GB。

截止到这里,综合运用梯度检查点、梯度累积、混合精度计算之后,预训练70B参数模型需要的显存从原先的216TB优化到约1.6TB,约20张H100卡就能训练了。这是一个相对合理的水平,预训练一个模型需要多少显存,一个简单快捷的估算是模型参数的10倍,1.6TB是140GB的约11倍,符合这个快捷估算。

不过实际训练时,为了能够在海量的数据进行训练,同时加快训练速度,通常采用数据并行。所以训练70B模型,仍然会用到上千张甚至更大规模的H100卡集群。

  • 模型压缩

大模型不仅预训练烧钱,推理的成本也往往不菲。为了能够促进更广泛的应用,可以通过模型压缩的方法来减少模型的大小和计算复杂度,同时尽可能维持模型原有的效果。模型压缩可以显著减少存储需求和推理成本,使得成本敏感场景的应用和私有化部署变得可能,甚至在移动设备等硬件受限的场景也能实现实时的推理。

提问:为什么大模型能够“压缩”,而同时不显著降低模型的效果呢?是否有可能从理论上测算出一个模型的“压缩”潜力?

量化(Quantization)几乎成了开源模型的标配。道理还是和混合精度训练一样,模型的计算可以不需要那么高的精度,数值有些误差没关系,只要最后输出的“下一个词元”概率分布中不同词元之间的概率排序能够保持就行。

img

直观的感知一下量化就像上面的图。左侧是高彩色原图,高彩色图像中每个像素是一个24比特的数值(红绿蓝每个颜色用一个8比特的整数表示,8*3=24)。而右边是被「量化」的图像,图像下方有8个颜色的“调色板”,图片中的所有像素都是从这8个颜色当中取一个,因此把“调色板”配为词典之后,图片中的每个像素就可以用一个3比特的数值表示了(2^3=8)。「量化」的图像只有原图的1/8大小(3比特/24比特),从视觉上确实也看得出一些噪点,但毫不影响我们看得出它是一个可口的曲曲饼干。

混合精度训练中我们把部分计算从单精度浮点数(FP32)降低到半精度浮点数(FP16或BF16),而推理环节的精度要求就更低,量化过程会把参数降低到8比特整数(INT8),甚至更低。FP32降低到BF16好理解,两者能表示的数值范围都一样,只是精度不同,只需要把小数点下若干位后面的部分抹掉就行,但FP32如何降低到INT8呢?

img

FP32的参数量化成INT8的过程,可以简单理解为缩放+偏移,通过缩放把原值的最大值减最小值的范围对齐到INT8能表示的范围,通过偏移把中心点对齐到零点。缩放因子和偏移量相当于是「词典」,用来把量化后的INT8整数还原到损失一定精度的FP32原值。同理,不止于INT8,还能量化到INT4,甚至到INT2都有可能。量化版本的大模型通常用Qx来代表量化程度,比如Q4就是量化到INT4的版本。

提问:为什么模型量化采用缩放+偏移这种最简单的转化方式?有没有别的更好的转化方式能达到更好的“压缩”效果?比如图像压缩采用傅里叶变换?

GGUF(GPT-Generated Unified Format)实现了这样的量化策略,它把参数按照每32或者64个组成一个块,对每一块独立进行缩放+偏移。选择32或者64是因为它能够很好地利用现代CPU的缓存机制和向量化指令(SIMD),所以GGUF是CPU友好的量化方法,让没有GPU的人也能跑得起大模型,进一步降低了运行大模型的门槛。著名的开源大模型,如LLaMA、DeepSeek、Mistral等,都有GGUF格式的量化版本,并且提供Q2到Q8各种不同程度的量化版本。

GPTQ(Generalized Post-Training Quantization)则抛弃了CPU的包袱,专为GPU设计,并且通过激活感知量化和误差补偿等技巧来降低量化过程中的精度损失。GPTQ也是应用广泛,知名的开源大模型都能找到GPTQ的量化版本(或者GPTQ改进版的AWQ或EXL2)。得益于它的优化技巧,GPTQ量化模型在同等量化等级下通常比GGUF有更好的表现。以LLaMA 3.1 70B的模型为例,它的GPTQ的量化模型中,Q8版本的效果与原始的FP16版本几乎无衰减,Q4版本也具备非常好的可用性,甚至Q2版本也具有一定的可用性。

提问:

  • 不同的参数在量化中是否会区别对待?实践中,哪些类型的参数会进行更激进的量化,哪些类型的参数会更加保守?

  • 除了量化参数,激活值要不要进行量化?对激活值进行量化有什么意义?

  • 量化模型的推理是怎么进行的?需要通过额外的计算先把参数还原到浮点数吗?还是可以直接进行运算?

  • 量化感知训练相比训练后量化,为什么能够带来更好的量化后效果?

  • 小参数量的原始模型和大参数量的量化模型,假如两个模型实际文件大小相同,哪个模型更有可能会有更好的表现?

如果量化是把模型参数的精度降低,那模型剪枝(Model Pruning)就直接对神经网络中冗余或不重要的参数进行裁剪。

img

英伟达发布的Minitron-4B模型就是通过对15B的模型进行剪枝得到的,通过如下4个步骤:

  1. 正常训练一个15B的模型。
  2. 对于模型内部每一层中的每一个神经元、注意力头进行重要度评估,评估它对最终结果的影响大小。
  3. 把神经元、注意力头按照重要度从高到低进行排序。
  4. 把神经元、注意力头根据重要度进行裁剪,把模型整体裁剪到目标大小。

相比于模型剪枝简单粗暴地把对最终输出贡献不大的神经元进行裁剪,那么低秩分解(Low-Rank Decomposition)则利用矩阵分解来压缩模型。大语言模型中,自注意力机制的权重和前馈神经网络的权重,都是大矩阵。而如果愿意接受一定程度的精度损失,大矩阵可以分解为两个小矩阵的乘积,可以用两个小矩阵替代原先的大矩阵。TensorGPT采用了这样的方法,成功把GPT-2模型压缩到约一半的大小。

提问:在模型压缩方法中,为什么量化获得了广泛的应用,而模型剪枝和低秩分解较少有成功的案例?

常规的模型压缩方法能够带来的压缩幅度都有上限,压缩比例通常不超过2:1左右,哪怕是把优化做的比较极致的AWQ量化(GPTQ的改进版),超过4:1的压缩比例后模型表现开始出现明显下降,比例超过8:1之后可用性会有较大影响了。而如果我们想得到一个能够在移动端等受限设备运行的大模型,几倍的压缩比例是不够的,需要几十倍上百倍的压缩比例。

模型压缩达到几十倍上百倍的压缩比例,这可能吗?

知识蒸馏(Knowledge Distillation)可以做到,它对压缩比例没有任何限制。严格来说,它并不是对大模型进行压缩,而是把大模型作为老师模型,去训练一个相对较小的学生模型。显然,院士也可以直接教一个小学生,这个方法可以带出任意大小的小模型。同样显然,小学生与院士肯定还是存在不小差距的,我们只是希望他经过训练能够比别的小学生更加优秀。

img

知识蒸馏是2015年辛顿(又是这位)在《Distilling the Knowledge in a Neural Network》中提出。还是一样的风格,一个非常朴素的想法,可以提升几乎所有机器学习算法的性能。

当OpenAI发布GPT-4,在大语言模型领域正当独领风骚之时,知识蒸馏还被其他跟随者用来“偷学”GPT-4的武艺。前面介绍过,监督微调是一个非常有效的训练方法,但获得大量高质量问答样本数据集非常昂贵。有了GPT-4之后,只要有足够的问题,就可以轻松让GPT-4生成高质量的答案,以此来训练自己的模型。虽然OpenAI在使用条款上明确禁止这样的“偷学”行为,但防不住跟随者前赴后继地去套GPT-4的答案,关起门来进行训练。

知识蒸馏用来进行模型压缩同样非常成功。今年初DeepSeek-R1模型的发布,轰动了整个业界。一方面是因为它是唯一能够媲美引领业界的GPT-o1模型,是具备「深度思考」能力的推理模型。而另一方面,不同于OpenAI的封闭策略,它完全开源,并且完全不限制偷学。DeepSeek官方还率先做起了偷学,基于80亿参数的LLaMA 3.2 8B模型,从6710亿参数的DeepSeek-R1进行知识蒸馏。结果表明,偷学之后的LLaMA 3.2 8B模型,在数学和代码方面的表现甚至超过了GPT-4o。

提问:

  • 知识蒸馏方法,依赖于种子问题集合,或者说是提示语集合。这个问题集合怎么来?有哪些较为著名的成功实践案例?

  • 知识蒸馏的训练环节具体怎么进行?硬目标和软目标有什么差别?

  • 知识蒸馏不仅是压缩模型的一种方式,而且在某些情况下还能使小模型的性能超过原始大模型。为什么会有这种现象?

  • 大模型哪些能力是小模型通过知识蒸馏很难学习到的?

四、大模型应用技术

最早感受到大模型落地应用带来变革的,应该就是程序员群体了。老程序员们也许还记得,当年从裸用 Vim 升级到能自动补全变量名的 Eclipse,那种幸福感。但与今天的 GitHub Copilot、Cursor 等基于大模型的智能编程助手相比,当年的进步简直是小巫见大巫。现在的编程助手不仅自动化水平提升了一个量级,还拓展了很多人的能力边界,让许多原本难以完成的任务变得可能。类似的变化正在快速扩散到更多领域。医学诊断、教育学习、商业决策、法律分析、内容创作等方向都在积极探索大模型能带来的新可能。

不过,大模型应用的研发并不是”向大模型提问“那么简单。尽管大模型具备强大的通用能力,但要让它在特定业务场景中发挥最大价值,仍需深入理解和掌握一系列应用技术。在持续实践中,围绕大模型的应用方法也正在快速演进,并逐步形成系统化的方法论。

4.1 提示语工程

“大模型时代要学会提出好问题”这句话,在社交平台上非常流行。因此提示语工程(Prompt Engineering)也被不少人误解为“会提问”,提示语工程师就是“会问问题的人”。这个理解虽然不无道理,但远远低估了提示语工程的复杂性。

提示语工程是一项真正的“工程”,提示语工程师依然是一名“工程师”,只是与计算机交流的语言,从传统的编程语言变成了自然语言。也正因如此,它更容易让人产生一种“我天生就会用”的错觉。但事实恰恰相反:虽然提示语是用自然语言书写的,但在大模型应用场景下,它的使用方式反而更接近于“编程”而不是“说话”,提示语工程仍然需要编程思维。

就像编程语言的语法技巧、设计模式、调试方法一样,提示语工程也正在逐渐积累相关的提示语工程技术。这里我们简单了解一下最基本的几项提示语技术。

零样本学习(Zero-shot Learning)是提示语工程最基础的能力。我们不给模型任何示例,直接用一句任务描述去触发模型完成任务,比如“请将以下文本翻译为中文”。大模型的零样本学习能力,使得我们可以直接用大模型解决各种长尾任务。

少样本学习(Few-shot Learning)相比零样本学习,在提示语中附加几个任务示例,帮助模型理解任务边界和模式。这相当于我们在调用函数前先写几个输入输出的样例,告诉模型“我想让你模仿这样的行为”。大量实验和实践表明,这种方法往往能显著提升效果,尤其在小众或复杂任务中更为明显。

思维链提示(Chain-of-Thought Prompting)指导模型在回答问题之前,先进行“一步步分析”,展示思考过程,再输出答案。对于相对复杂的问题,这种提示方式不但使得模型的思考过程更加透明,还能显著增强模型的逻辑性和正确率。

提示模板(Prompt Template)将提示语中可变的部分参数化,使其可复用、可批量生成。比如一个简单的问答任务模板:“请根据以下背景回答问题。背景:{context}。问题:{question}”。

而把大模型嵌入到一个具备记忆、决策、行动能力的系统中,就成了智能体(Agent)。智能体通常结合提示语工程,先对任务进行规划,然后按照规划一步一步执行,中间根据环境反馈不断更新下一步。这相当于是用提示语编写的“行为脚本”。

在更复杂的任务中,一个模型可能无法胜任所有职责,这时候就需要多智能体(Multi-Agent)。每个智能体都有自己的角色和提示语,是一个独立的“模块”,彼此通过消息传递协调合作。多智能体不仅考验提示语的设计能力,更需要“系统架构”的思维。

img

提问:

  • “浪费神灯三个愿望”的故事是讲什么的?提示语工程与它有什么相似之处?

  • 为什么大模型提示语研发需要调试、迭代、版本管理等工程实践,而人与人的沟通只要意思表达到了就行?

  • 如果要设计一个提示语来让大模型自动写诗,如何避免产生重复或无意义的文本?

  • 思维链提示为什么能提升效果?为什么说它是相当于不断延长Transformer层的深度?

  • 大模型推理规模定律是什么?提示语工程在其中发挥什么作用?

4.2 检索增强生成

提示语工程是在模型内部“激发”潜在能力,而有时候我们还希望模型能够“接入外部知识”。就像我们自己不会设置新买的路由器时,通常会先查看安装说明书,或者上网搜索攻略。

大模型本身虽然很强,但并非“无所不知”,尤其在两个方面存在明显短板:一是知识更新不及时,例如它可能不了解最新的新闻、实时天气、刚发布的产品,或是最新的科研成果;二是缺乏对特定领域的私有知识,比如公司内部的政策文档、医生手头的病例资料等。在这些场景下,仅依赖大模型自身的“记忆”,很难保证输出的准确性和可靠性。

img

检索增强生成(Retrieval-Augmented Generation,RAG)将信息检索与大模型生成结合起来,赋予模型“现查、现学、现用”的能力,可以显著拓展大模型的知识广度和应用边界。检索增强生成的实现方式,可以分为两个阶段:第一阶段是信息检索(Information Retrieval, IR),从外部数据源中查找相关资料;第二阶段是语言生成,将检索结果作为上下文,与用户问题一并输入模型,让大模型参考外部信息,回答用户问题。

那么,信息检索的来源主要有哪些?常见有三类:搜索引擎、向量数据库、知识图谱。

在大模型刚刚兴起时,“大模型+搜索引擎”的模式率先爆发。例如微软将 Bing 与 GPT 结合,推出了叫New Bing的新一代智能搜索体验。大模型出色的理解和生成能力,配合搜索引擎对实时和长尾信息的覆盖,使其成为极具潜力的信息助手。不过,传统搜索引擎的检索方式仍以关键词匹配为主,限制了其在语义理解更复杂的任务中的表现。例如,如果你搜索“公司年度营收下滑的主要原因”,搜索引擎可能返回大量包含“营收”或“公司报告”的网页,但不一定真正涉及“原因分析”的内容。

相比之下,向量数据库(Vector Database)是一种更加“内容驱动”的检索方式。它的核心是嵌入(Embedding)技术:用嵌入模型,将文本转换为高维向量,以捕捉其语义特征。随后,通过余弦相似度(Cosine Similarity)等度量方法,衡量文本间的语义距离,找出与查询最相关的内容。这一过程被称为近似最近邻搜索(Approximate Nearest Neighbor Search, ANN),本质上是在语义空间中寻找“最像的”片段。例如,当你搜索“如何应对宝宝发烧”,即使数据库中没有完全匹配的句子,系统仍可返回如“婴儿体温异常处理指南”或“儿童退烧药选择建议”等语义相近的内容。向量数据库在构建企业知识库问答、私有文档助手、智能客服等场景中扮演着关键角色。

提问:为什么用余弦相似度来度量语义距离?余弦相似度不受向量大小的影响,那么向量大小代表什么含义,为什么度量语义距离时忽略它?

此外,知识图谱(Knowledge Graph, KG)也是一种重要的信息来源,它通过“实体 + 关系”的形式组织知识,构建出一张结构化、可推理的知识网络。例如在医疗问答中,知识图谱可以提供如下路径:“高热 → 可能症状 → 感染 → 常见病因 → 呼吸道病毒”,帮助模型建立因果和逻辑关系,提升推理深度。知识图谱特别适用于需要结构化逻辑推理的场景,如医学诊断、法律合规、企业组织结构等。结合大模型后,图谱提供清晰的结构化语义支撑,大模型则负责自然语言的表达与整合,两者形成互补。

通过引入搜索引擎、向量数据库和知识图谱,检索增强生成让大模型从“凭记忆作答”迈向“基于事实作答”,不仅减少了幻觉现象,还赋予模型“现学现用”的能力,使其能在更广泛、更专业的应用场景中真正落地。

提问:

  • 大模型为什么会产生幻觉?为什么检索增强生成是减少幻觉的有效方式?

  • 如何为SQL生成器设计一个检索增强生成?

4.3 迁移学习

img

大模型是一个“全能型”工具,不仅有出色的基础能力,在各个专业领域也都具备相当不错的能力起点。但在产品化落地特定领域具体应用场景时,我们仍然希望它成为该场景最顶级的“专才” – 比如代码助手、医疗诊断、教育辅导、法律分析等等。因此,在这些专业场景的应用研发中,往往会基于通用模型进行迁移学习(Transfer Learning),让大模型进一步学习特定领域的新任务。大模型的迁移学习通常都是通过模型微调(Fine-tuning)实现,技术难度不亚于训练一个模型本身,玩到这一步的都是高端玩家了。

img

模型微调最直接的方法就是全参数微调,就是前面介绍过的监督微调(SFT)。它采用和最烧钱的预训练一样的训练方式,只是训练数据换成了特定领域的具体任务了。这个方法效果最好,但代价也最高,需要大量的计算资源和标注数据。而且一旦训练不当,还容易出现过拟合和灾难性遗忘(Catastrophic Forgetting) – 新知识学进来了,旧知识却忘掉了。

提问:为什么模型微调时容易发生灾难性遗忘?预训练的时候没有这个问题吗?

既然是微调,不是从头重学一遍,有没有更轻量的训练方法呢?参数高效微调(Parameter-Efficient Fine-Tuning,PEFT)就是这样一个理念,通过调整模型中的一小部分参数或者增加一些可学习的小模块,让模型学习和适应新的任务分布。这种方式不仅显著降低了训练成本,还能在数据较少的情况下有效缓解过拟合和灾难性遗忘问题。

最朴素的参数高效微调就是冻结模型大部分层的参数,只训练一小部分层的参数,但这样的方法效果与全参数微调相比有明显的差距。要真正达到“参数高效微调”,需要更巧妙的设计。

提问:在最朴素的参数高效微调中,冻结大部分参数,训练一部分参数。如何判断哪些参数应该冻结,哪些参数应该训练?

img

适配器微调(Adapter Fine-tuning)在Transformer的每一层中插入一个小的适配器模块,模型的原有参数保持不变,只训练这些小模块。上图左侧是一个Transformer层,由多头注意力和前馈神经网络(双层)组成,可以看到有两个适配器(Adapter)模块被插入到其中。适配器模块的结构如上图右侧,通常也是由两层前馈神经网络组成,但与Transformer层的前馈神经网络不同,它是先降维然后再升回原来的维度,即中间层的参数量远小于输入和输出的维度,因此它的参数量也是远小于Transformer层本身的参数量。

实验表明,适配器微调通过训练2%-4%量级的参数,就能达到接近全参数微调的效果。不过它的缺点是对模型架构有侵入性,需要修改模型内部结构,而且因为插入了需要串行执行的新模块,推理时会引入额外的延迟,对在线服务场景有一定影响。

提示微调(Prompt Tuning)可以被看作是“自动化提示语工程”。我们都知道提示语工程的重要性,同样的任务在提示语中描述方式不同,所能达到的效果可以有很大差别。不过提示语工程只能通过不断尝试不同变种的方式来探索最佳提示语,缺乏更科学、更自动化的“学习”方式,导致是否能探索到最佳提示语要靠运气,有很大的偶然性。其实,机器学习的世界没有什么是不能“学习”的,提示语同样也可以通过学习而获得。

img

图源:https://www.leewayhertz.com/parameter-efficient-fine-tuning/

上图是提示微调的示意图。最左侧的输入序列,通过分词和嵌入层,从自然语言转换成计算机友好的数学语言(词嵌入向量),输入到Transformer第一层。在这里,我们可以加上一段可训练的向量作为“软提示语”,冻结模型所有其他参数,用特定任务数据训练这部分向量。是的,学习到的提示语并不是人类友好的自然语言,而是计算机友好的嵌入向量,毕竟提示语的指令描述最终是为了让大模型发挥最佳效果。

提示微调对模型架构的侵入性非常小,只需要插入到输入端嵌入层。它也非常的轻量,只需要训练少量几个嵌入向量,需要训练的参数量相比模型大小几乎可以忽略不计。不过它的效果却非常依赖模型大小:在较大的大模型(参数量10B以上),效果可以接近全参数微调,但在相对较小的模型上效果差距就比较大了。有点像聪明的孩子只要轻轻点拨就懂,但“小学生”还是要一步一步教。

提问:提示微调学到的“软提示语”到底是什么呢?如果对软提示语进行文字化,会是什么内容?

提示微调是给Transformer第一层的输入加上一段可学习的“软提示语”前缀,那为什么停留在第一层呢?Transformer每一层都是同构的,第一层输入能加“软提示语”,也可以每一层都加类似的“软提示语”,这就是前缀微调(Prefix Tuning)。

img

前缀微调可学习的参数量比提示微调多,但比适配器微调少,大约在模型参数量的0.1%左右。对模型架构的侵入性也是介于两者中间,比适配器微调小,不改变Transformer结构,但改变每一个内部注意力层的输入,依然有一定的侵入性。

而如今在众多参数高效微调方法中,低秩适应(Low-Rank Adaptation, LoRA)以轻量、高效、通用、性能等全方面的综合优势,在实际应用中被广泛采用,成为了事实标准。低秩适应完美结合了线性代数的理论基础和架构设计的工程实现,基于两个巧妙而优美的设计。

img

第一个设计是“增量适应”。什么意思呢?假如我们进行全参数微调,权重矩阵从原先的W通过微调后更新为W’,那么W’-W=ΔW是权重的增量,微调学习的实际上是这个增量部分。那么换个视角,我们可以把全参数微调设计成W’=W+ΔW,只训练ΔW,也是等价的。这一设计可以让我们冻结原模型的参数W,使得原模型保持不变,灵活拔插ΔW。

img

第二个设计是“低秩分解”。这是基于一个重要的现象,就是大模型通常是过参数化的(over-parameterized),训练后所得的参数矩阵通常有很大的冗余,按照线性代数的术语就是低秩。可以同理猜想,模型微调所学习的ΔW应该也是低秩矩阵,即矩阵的秩(假设为r)远小于维度(假设为d)。一个低秩矩阵就可以用两个小矩阵的乘积来替代了,即ΔW=A⋅B。ΔW的参数量是d²,而A和B的参数量分别是d✖️r和r✖️d,加起来就是2dr,只要r<<d则A和B的参数量就远小于ΔW。

提问:为什么大模型通常是过参数化的?这有什么必要性?

这两个设计结合起来就是“低秩分解”,即原先的权重矩阵W替换为W+A⋅B进行微调,训练A和B两个矩阵,冻结W。其中r是一个重要的超参数,它可以取[1, d]的任何一个值,r的值越小则需要调的参数数量越少,r的值越大则模型的调整空间越大,极端情况r等于d时就和全参数微调等价了。实践表明,通常只需要一个远小于d的r就能够达到全参数微调一样的效果了,很多时候甚至r=1都能有非常好的效果。

提问:

  • 低秩适应中,A和B两个矩阵的初始化,为什么A是用标准正态分布随机数初始化,B是用全零初始化?

  • Transformer有5个参数矩阵(注意力的查询、键、值三个矩阵和前馈神经网络的扩展、压缩两个矩阵),低秩适应方法通常挑选哪些参数矩阵进行微调?这个选择有哪些考虑因素?

  • 既然大模型是过参数化的,为什么预训练不适合采用低秩分解,而微调时低秩适应又是最好的方法?

  • 提示微调号称在超过10B参数量级的大模型上效果能打平全参数微调,再加提示微调对模型架构的侵入性最小,所需要训练的参数数量也最少,为什么没能在大模型微调中成为主流方法,反而低秩适应应用更广泛?

五、结语

大模型技术仍在高速发展,任何技术综述在发布的那一刻起,已经开始过时。就在笔者沿着全景热力图自学的这段时间里,技术前沿不断有新的突破涌现。

OpenAI发布了首个推理模型o1。它可以在回答前先进行“深度思考”,显著提升复杂任务的准确率。模型能力比拼,正从“训练阶段的规模定律”,扩展到“推理阶段的规模定律”。

不久之后,DeepSeek发布了开源模型R1,在多个能力评测中与o1打成平手。更令人震撼的是,它通过一系列极致的工程优化(部分模块甚至使用GPU汇编编写),将训练成本压缩至o1的1/10。消息一出,英伟达股价当日暴跌17%,一夜之间市值蒸发近6000亿美元,创下全球股市历史中最大单日跌幅。

就在前几天,OpenAI正式开放了GPT-4o的图像生成功能。朋友圈迅速被“吉卜力风照片”刷屏,但它的意义远不止生成美图本身。GPT-4o是一个原生多模态模型,用统一的模型架构实现多模态能力。这标志着大模型从理解文本走向理解世界,图像、音频、视频等感知数据正成为新的学习燃料。多模态不仅是通向通用智能的关键路径,也将重塑我们与AI的交互方式。

浪潮汹涌,这是冲浪者最喜欢的时代。这篇大模型技术全景只是一个起点,重要的是尽早上路,持续学习。欢迎你一起来冲浪,也欢迎你分享你的“提问”。

六、如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

https://img-blog.csdnimg.cn/img_convert/05840567e2912bcdcdda7b15cba33d93.jpeg

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

https://img-blog.csdnimg.cn/img_convert/05840567e2912bcdcdda7b15cba33d93.jpeg

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐