这份梳理,也许可以作为你的一份字面学习的参考资料。本文是基于与大模型进行互动学习的时候,进行的梳理。说白了,就是反反复复的用自己的问题与语言来提问,促进自己对大模型机制的理解,直到自认为可以摸到其边界。内容不一定正确,本着先基于一个思考框架,然后再不断的修订与优化步骤。
大语言模型(Large Language Model, LLM)的研发取得了飞跃式进展。从GPT-3到GPT-5,再到各类开源模型的涌现,"模型越大,效果越好"似乎成为默认规律。然而,在实际开发一个属于自己的大模型时,需要面临工程实现与理论指导的双重挑战。本报告旨在系统梳理大模型开发全过程中的关键概念和实践步骤,涵盖数据准备与清洗、模型架构设计、预训练原理、性能上限(Scaling Law)、模型推理机制以及模型微调和增强等内容。
我们将先以一个表格概览从零开始开发训练大模型的完整路径,然后深入解析各个环节的核心技术点和难点 (尤其是数据清洗、去重与模型性能上限等关键问题)。本文中不仅包含详细的原理阐释,还引用了业内权威资料和实例以佐证观点,使内容更具可信度和参考价值。希望通过这份深入探索,帮助你建立对大模型开发的全景式理解,并为实际动手实践提供指导。
请注意,在以下内容中:
接下来,让我们从宏观上把握大模型开发的整体流程。
首先,我们用一个表格概述自行开发并训练一个大模型的主要步骤,以及每个阶段涉及的数据、技术栈、工程难点和最佳实践。此表格可作为全过程的路线图:
| 步骤 | 阶段/任务 | 语料与数据准备 | 技术栈 & 当前技术边界 | 工程难点 | 解决方案/最佳实践 |
|---|---|---|---|---|---|
| 需求定义与规划 | |||||
| 数据收集 | |||||
| 数据清洗与预处理 | 核心壁垒 | Streaming流式读写 | |||
| 分词与词表构建 | 复用成熟分词器 | ||||
| 模型架构设计 | |||||
| 预训练(语料建模) | |||||
| 评估基准测试 | |||||
| 指令微调(SFT) | |||||
| 人类反馈对齐(RLHF) | |||||
| 部署与推理优化 |
表格中的每一步都对应后续章节的详细讨论。例如,步骤3"数据清洗与预处理"被标为核心壁垒,我们将在下一节深入说明为何高质量的数据和去重对模型效果至关重要,以及MinHash+LSH这套工业级方案是如何使得"只改几个字也逃不过去重算法"的。同时,针对工程难点如10TB语料的内存处理,我们也给出了解决方案(流式读取、分桶等)并会详细解释其原理。
接下来,我们按顺序进入每个阶段的解析与学习,从数据开始。正所谓"垃圾进,垃圾出 ",数据质量将直接决定大模型的上限。
数据就是大模型的养料。没有充足且干净的语料,再庞大的模型也无从学到有效能力。事实上,在大模型训练中,数据处理常被视为最繁琐却也最关键的工作之一。本节将探讨数据收集、清洗与去重的技术细节,回答以下问题:
让我们从数据清洗的重要性谈起。
一句话:脏数据会毒害模型。未清洗的数据可能包含大量的拼写错误、乱码、广告、甚至自相矛盾的信息。如果用这些数据训练,模型不仅会"浪费脑容量"去记忆无意义模式,还可能学习到错误知识或不良语言风格。
具体来说,不清洗的数据会带来以下危害:
所以业界有句老话 “garbage in, garbage out”-输入垃圾数据,输出也会是垃圾。如同烹饪,大模型需要挑选新鲜的食材,去除腐坏部分,才能烹调出美味。
为确保数据质量,通常需要建立一条数据清洗流水线,包括:分句、降噪、规范化、敏感信息过滤和去重等步骤。许多顶尖开源项目(如BigScience、BigCode)都会投入大量人力物力来清理数据,在BigScience项目中甚至专门有人负责大规模数据去重。
其中,"去重"尤为关键,且技术挑战很大,我们单独展开讨论。
重复数据指完全相同的文本,而近重复数据指那些只有少许差异、主体内容相同的文本(比如一篇文章改了标题或少数字句)。两者都会对模型训练产生不良影响,需要剔除。
简单场景:精准重复--一模一样的两段文本。
解决:用常规哈希(如SHA-256或MD5)即可解决。SHA-256是一种加密哈希函数,能把任意文本映射为一个固定长度(256位)的哈希值。如果两段文本完全相同,它们的SHA-256哈希也相同。因此,我们可以:对每条文本计算SHA-256哈希,将哈希相同的归为一类,只保留一份。这方法高效简洁,许多数据集都用它做初步去重。
问题来了:SHA-256这类普通哈希对"哪怕极微小的改动"都非常敏感。举个例子:
用SHA-256计算两者的哈希,会得到完全不同的值。也就是说,哪怕只改了一个字符,普通哈希函数的输出都会天差地别。这是一种雪崩效应,在加密和校验场景是优点(可防碰撞、保证完整性),但在近重复检测场景却成了缺点--它无法识别内容近似的两段文本。
现实中的重复往往不是精确拷贝,而是**"改头换面"**:
靠SHA-256,我们无法将这些近似文本对应起来。这就需要MinHash + LSH这套组合拳。
MinHash是一种用于快速近似估计两个集 合相似度的算法。最初应用在网页去重上,如今已是工业界标准方案之一。MinHash的巧妙之处在于:即使文档改了几个字,只要大部分内容相同,它算出的签名仍会很相似。
要理解MinHash,先介绍Jaccard相似度。Jaccard相似度衡量两个集 合的相似程度,定义为:
对于文本,我们可以把每篇文章看成一个集 合,元素是其中出现的词(或n-gram等)。举例:
则 X和Y 的 Jaccard相似度 = |交集| / |并集| = 3 / 6 = 0.5(50%)。Jaccard=1表示完全相同,=0表示毫无共同之处。
直接算Jaccard需要遍历集 合,对于海量文档Pair比较非常慢(全比较是O复杂度,不现实)。MinHash巧妙地为每个集 合生成一个短小的"签名",使得签名相等的概率 = 两集 合的Jaccard相似度。这听起来不可思议,但原理超出本文范围,这里直观理解:
比如,为提高准确度,我们给每篇文章生成128个哈希值作为签名(相当于128维向量)。两篇文章如果有90%的内容相同,理论上这128维中大概有90%会相同。因此,用汉明距离(比较签名向量有多少位不同)就能估计相似度。而计算签名比逐词比对要快太多了--每篇文章只需128次哈希,比较两文档只需比较128个数,效率极高。
MinHash的特点:对内容的微小改动不敏感。删除或替换几个词,只会略微影响签名。它满足一种"局部平滑"性质:原内容变化小,签名变化也小。这正是我们需要的!
MinHash得到每篇文章的签名后,我们接下来用LSH(Locality Sensitive Hashing,局部敏感哈希)来高效检索相似对。
LSH可以理解为一种特殊的哈希算法,它设计哈希函数使得相似的输入以较高概率产生相同哈希值。换言之,相似的文章会被映射到同一个桶里。这样我们不用两两全文比较,只需要对同桶内的文章比较即可,大大降低计算量。
具体做法:将MinHash签名(比如128维)划分成若干组,每组拼成一个短哈希,如8组×16维。每组签名通过一个简单hash函数映射到桶ID。只有在至少一组签名哈希值相同的文档,才有可能是相似文档,需要进一步比对。这样,LSH先粗筛可能相似的候选对,再精细计算相似度,避免了对所有文档两两比较的爆炸组合。
形象类比:
想象有上亿个人要按相貌分组找相似长相的人。暴力做法是每两个人都面对面比一次(O太慢)。MinHash+LSH就像先按肤色、身高等粗指标分组(LSH分桶),把有可能长相近的先聚一起,再在组内仔细比对五官(计算Jaccard/签名相似度)。显然效率高很多,而且大部分不相似的人压根不会被分到一组里,不用做无用比对。
工业应用中,谷歌、亚马逊、Uber等都使用MinHash-LSH来查找近似重复的数据。因为当需要比较数十亿条记录时,没有这套方法几乎无法完成任务。
前文提到,通过MinHash我们能为每篇文章生成一个签名。然而在工业级别,例如你有10TB文本(约等于50亿条短文本),直接计算和存储所有签名也是天量的。让我们算一笔账(这也是对工程师的考验):
全部签名占内存:50亿 × 512 bytes ≈ 2.5万亿字节,约 2.5 TB 内存。
显然,普通服务器只有几十GB到几百GB内存,不可能容纳2.5TB的数据。一不小心,程序就OOM(内存溢出)。
为此,工程师需要使出浑身解数进行内存优化,包括:
通过以上方法,才能在可用内存有限的情况下完成对海量数据的MinHash去重。这也是为何大模型团队往往需要数据工程和分布式计算专家加盟:算法+工程两手缺一不可。
为了说明MinHash+LSH在实际近重复检测中的效果,我们举一个具体例子:
假设我们的语料库里有两句话:
肉眼看,它们含义几乎一样,句2只是比句1多了定语"技术",而且用了繁体字。如果用普通哈希比较,比如SHA-256,肯定完全不同--因为字符串不一模一样。
现在用MinHash处理,每句生成128位签名向量,结果或许是:
比较发现,两签名有大约90%以上位置相同,仅少数几位不同。这表明模型认为句子1和2的Jaccard相似度可能在90%左右。于是LSH把它们分进同一个桶(至少在某组哈希上匹配)。
接下来再做严谨些,可以对同桶内这些候选对再计算精确的Jaccard相似度或者编辑距离等。如果确实高于某阈值(比如90%),就认定它们是重复内容。最终,我们可以只保留其中一句,把另一句剔除或标记为重复。
通过MinHash+LSH,我们就成功发现了原本难以察觉的重复,哪怕文字上有一些差异。正因如此,MinHash+LSH成为处理亿级文档近重复的"杀手锏"。例如,在HuggingFace的BigCode项目中,他们报告对大型数据集采用MinHash+LSH去重,训练效率和模型性能显著提升。
在数据阶段,我们常提到要提升语料的"知识密度"和"事实准确性"。知识密度可以理解为有用信息的浓度:一篇废话连篇的文章知识密度很低,而一篇百科全书条目密度很高。准确性则是不含谬误、事实正确。
模型在预训练时,相当于在"记忆"语料中的知识和模式。一个模型"记住"了多少信息,部分取决于:
怎样判断模型知识储备的强弱? 这需要通过评测:
要提高模型的知识密度与准确性,从数据上就要严格把关:
需要强调的是,知识记忆量并非无上限增长。受限于参数量,一个固定大小的模型哪怕给它无限数据,它也记不全天下知识。这里就涉及Scaling Law和模型上限,我们稍后详细讨论。这也是为什么OpenAI、DeepMind等提出按照一定规则平衡参数和数据量,否则要么"大脑不够用",要么"给小学生灌大学教材"徒劳无功。
总结本节,在完成数据收集和清洗后,我们理想上会得到一个"大而全,干净且高信息量"的训练语料库。这就是大模型的"养料"。接下来,模型架构的设计和训练过程将决定如何把这些养料转化为模型内部的"知识网络"。
在进入模型架构前,先快速回答一个常见疑问:"训练数据和模型参数是如何关联的?数据真的被存在参数里了吗?"
实际上,正如我们将在下一节介绍的,训练过程就是让模型逐步调整参数去"记住"数据模式的过程。没有谁会直接把整段文本硬塞进参数里,而是通过无数次梯度迭代,让参数潜移默化地刻画出数据分布。下面,我们深入模型内部,看看这个神奇的过程。
在踏入预训练的大门之前,我们需要先了解模型架构的各个组成部分是什么,以及它们各自负责什么任务。大语言模型的主流架构是Transformer,它由嵌入层、若干层Transformer Block(内含自注意力和前馈网络),以及输出层组成。本节我们将逐层剖析,同时结合直观类比帮助理解:
理解这些部件的角色后,我们再讲解训练过程(前向预测 -> 计算损失 -> 反向传播 -> 参数更新)是如何让模型从随机输出进化到智能回答,以及参数量和数据量如何影响模型性能上限。
还记得我们在数据部分谈到的词表(Vocabulary)吗?在正式训练模型前,已经先构建了一个固定的词表,例如包含5万个Token。这些Token可能是英文单词、中文字或常见词组、符号等等。
嵌入层的作用就是:把每个Token映射成一个高维向量,以便供后续Transformer层处理。可以把嵌入层想象成一张巨大的二维表格(数学上称"嵌入矩阵"):
于是,这张表的尺寸是 V × d,每个单元格存一个浮点数参数。举例:
嵌入层参数量 = 行数 V × 列数 d。例如:V=50000, d=4096,则嵌入层参数约 50000×4096 ≈ 2.05亿。这也是模型参数的一部分,占整个模型的一定比例(大模型总参数动辄数十亿,但嵌入层几亿也不容忽视)。
当模型训练完毕后,每个Token对应的嵌入向量都会调整到特定的方向,反映该Token在模型高维空间中的"位置"和语义关系。这些向量最终固定下来,成为模型对词语的底层表示。也就是说,训练完成后,嵌入层的参数不再改变(除非再训练或微调模型),它像一本定稿的词典:词典里每个词的定义一旦编纂完成并出版,就固定下来了。
理解嵌入向量的直观意义:
案例:看看优秀和糟糕的分词、嵌入对比:
总之,嵌入层是模型理解语言的第一站。它决定了模型看待输入文本的"基本粒度"和初始特征表示。设计或选取一个好的Tokenizer和嵌入初始化,可以让模型事半功倍地学习。
需要说明的是,在Transformer模型中,输出层通常与嵌入层形状相同:也是一个大小为 V×d 的矩阵,只不过作用相反--将最终隐藏状态投影回词汇概率分布。某些模型会将输出层权重与嵌入层权重共享(以减少参数),但许多如GPT系列并不共享,而是各自有一套参数(这也解释了表格中我们计算Llama2-7B参数时嵌入层和输出层各约1.3亿,共2.6亿参数占总数一小部分)。
了解嵌入后,我们进入Transformer的主体部分,也就是层叠的Transformer Block。每一层都包含注意力和前馈,它们职责明确、配合紧密。下一节,我们将详细揭开Transformer Block内部的奥秘。
Transformer之所以强大,关键在于多头自注意力机制(Multi-Head Self-Attention)和前馈网络(Feed-Forward Network, FFN)的交替堆叠。这两者就像人的感官和大脑,分别负责:
我们分别讲解:
目的:让模型能在处理当前词时,参考同一句子(甚至段落)中的其他词,从而理解上下文。它赋予模型非凡的"短期记忆":可以在一个上下文窗口内记住相当长的序列,并找到其中有用的信息关联。
自注意力如何运作?通常,我们用Q、K、V三个概念来描述注意力计算:
具体过程(以一句话的一个词为例):
模型处理句子:"牛顿发现了万有引力"。当它读到"万有__"时,希望预测下一个词。
这个过程展示了注意力的两个功能:
Q, K, V 从何而来? 它们由当前层输入的向量经过线性变换得到。例如每层都有三个矩阵 ,把输入 分别投影: 。这些 矩阵都是可训练参数(所以注意力层也有参数量)。在 Transformer 实现中,为了增加表示力,还有一个 将注意力输出再线性变换。总的来说,一层注意力有4个矩阵参数: ,每个尺寸约为 。这4个矩阵的参数量占 Transformer 相当一部分(约1/3)。
多头注意力:实际上每层不是一个Q/K/V,而是有多组头,每头关注不同子空间的关联。比如一头关注语法主谓关系,一头关注语义主题,一头关注定语修饰…… 多头可以并行计算,然后拼接结果。这进一步提升模型找关系的能力。
简而言之,注意力赋予模型灵活的信息路由能力。每个词可以动态从其他词那里获取自己需要的信息。可以说,Attention让模型有了"理解上下文"的眼睛。而其强大的并行计算特性,使得模型上下文窗口内(例如4096个Token)的信息都可被高效整合。这就是模型短期记忆力的来源:上下文长度就是它一次能记忆处理的信息量上限(GPT-4有32K甚至100K的上下文,可见它短期记忆非常惊人)。
每一层Transformer除了Attention外,紧接着就是一个独立的前馈神经网络(FFN)层。Attention解决了"我该看哪里"的问题,有点像学生上课东张西望看黑板和同学笔记。而FFN则是学生低头"消化吸收"的过程:将刚才收集的信息进行处理、推理,并存进长期记忆里。
FFN层结构:通常是两层线性层加一个非线性激活,中间有扩展。例如Llama系列使用了SwiGLU激活,具体实现上有3个矩阵:
为什么要"扩展-激活-压缩"?因为高维空间更利于线性分离和组合。当模型需要记忆复杂模式或执行多步逻辑推理时,在原始d维空间可能装不下或分不开这些模式。扩展到d<sub>ff</sub>,相当于临时打开一个超大白板,让模型可以在上面写下丰富的中间推导步骤和知识关联,然后再把结论压缩回来。SwiGLU的作用是通过非线性和门控,让网络有能力筛选出有用特征,忽略噪声。可以将Gate看作大脑在思考时的注意力:只让某些路径的信号通过,从而形成明确的结论。
FFN的角色:越来越多研究发现,Transformer里超过一半的参数都在FFN(比如Llama-7B中FFN参数占2/3以上),而这些FFN层承担着存储知识和执行内在推理的重任。有论文直接指出:"Transformer的前馈层就是键值记忆网络",存储了大量"模式->结果"的映射。通俗讲:
举个例子容易理解:
模型读到"法国的首都是"……
在某层FFN里,可能有一组神经元正好对应模式"X的首都是"。当输入匹配"法国的首都是"时,这些神经元被Gate放行(Key匹配),然后Down层权重会产生一个向量倾向输出 "巴黎"的分布(Value作用)。如果又读到 "日本的首都是",另一组神经元对应这个模式,输出 "东京"的倾向。由此可见,FFN层学会了存储这种映射:{国家:首都}。Geva等人的论文验证了这一点:Transformer的FFN可以隐式存储成千上万的此类事实对。
因此FFN可以看做模型的长期记忆单元。注意力只能在当前上下文找答案,如果答案没在上下文里,就得靠FFN储存的知识。例如问"光年是什么单位",上下文没写解释词典只有"光年"这个词,模型就要从参数里调出:"光年->距离单位"的知识,这就是FFN完成的。
Attention vs FFN再总结:
一个形象比喻:把一层Transformer想象成学生听课。
注意力和FFN就这样交替N次(N层),每一层都让词语的向量表示变得更"聪明"一截:既融入了上下文,又附加了更深层的蕴含知识。当最后一层完成后,我们得到每个位置一个最终向量表示。对于语言模型,下一个词预测主要基于最后一个词位置的向量(当然也会看别的位置通过Attention影响)。最后,这个向量传入输出层。
输出层的本质是一个全连接层,将隐藏向量转换为词表大小的向量(称为logits),再通过Softmax得到概率分布,选取概率最大的词作为输出预测。如果不使用共享嵌入,那么输出层就是一个 d×V 的矩阵(与Embedding层结构相仿只是转置),含有d×V个参数。以Llama2-7B为例,其输出层参数 ≈ 4096×32000 ≈ 1.3亿,和嵌入层参数量差不多。
可以这样理解输出过程:
举个例子,模型在句子"…万有"后预测下一个词:
训练的目标就是让正确的词的logit相对其它词越大越好。下一节我们会具体讨论训练如何优化这一点(损失函数最小化过程)。
在Inference推理时,输出层每生成一个词,就将这个词反馈给模型作为下一个时间步的输入,如此自回归地产生整段话。这涉及解码策略(如贪婪、采样、温度等)控制输出的多样性和长度,我们稍后在"模型推理与输出控制"部分会详细说明。
小结:现在我们贯通了从输入文本到输出词的完整一圈:
这个架构配合海量数据训练,造就了如今强大的大语言模型。接下来我们要解答的关键问题是:模型是如何通过训练,从随机权重变成一个能理解语言、记忆知识、推理问题的智能体的? 训练过程的本质是什么,模型参数又是如何"吸收"数据知识的?
当我们刚初始化一个大模型,它实际上啥也不会,参数都是随机的。这时如果输入一句话,让它续写,它会输出一堆莫名其妙的字符,因为它的权重还没有学到任何语言规律。训练的目标,就是将模型从这种"咿呀学语"的状态调 教成"出口成章"的状态。
训练的核心算法是梯度下降(Gradient Descent),通过反向传播(Backpropagation)调整模型参数,使它逐步逼近正确行为。这部分比较概念化,我们通过一个形象的比喻来解释:
可以把一个7B参数的模型想象成一间巨大的录音棚,里面有70亿个调音旋钮。这些旋钮一开始都是随机扭曲的位置。
我们的任务就是调节这70亿个旋钮(参数),让模型的输出逐渐符合我们期望的正确答案。这个过程就是无数次的前向计算 -> 计算损失 -> 反向传播 -> 参数更新循环。下面分四步解读:
将上述过程在海量训练样本上重复无数次(通常要经历数百亿甚至万亿次单词预测),模型的参数会逐渐收敛到一个状态:它对于常见的上下文几乎总是输出正确合理的下文。Loss从最初的高高在上一路降低,直至在验证集上达到一个较低值。
Loss与模型聪明度:训练时我们看Loss曲线就能判断模型进步。当Loss降到接近理论下限,模型对训练语言的规律已经掌握得差不多了。比如Loss越接近零,表示模型在训练语料上的预测几乎不犯错了。虽然Loss很低并不意味万能(也可能记忆过度),但在验证集上的低Loss往往对应模型在各种任务上的高性能。可以说,Loss是模型智慧的度量之一:它反映模型预测下一个词的准确程度--这需要理解上下文和常识才能做到很好。
通过上面的解释,明白了一次训练迭代如何调整参数纠正模型输出。但一个句子的上下文很有限,调一次只能针对某几个词的关系来调整少量参数。如果只让模型看少量语料就停止,它往往对这些见过的句子记得很牢(训练Loss很低),但换个问法就不行--因为它没有学到"举一反三"。
这涉及过拟合和泛化的问题。让我们回到调音台的比喻:
前面说到Chinchilla定律,经验上训练Token数量约为模型参数数量的20倍是较优的平衡。举例,针对一个70亿参数模型,需要大概1.4万亿token的数据来充分训练。如果数据远少于这个规模,模型容易"装不满"--大量参数闲置没学到东西,就像1000页的书只写了10页内容,剩下都是空白。相反,如果数据过多而参数不足,模型学不下那么多细节,Loss也无法降到更低,性价比下降(当然仍可能变聪明一些,但效率低)。
因此,在给定参数预算下,准备尽可能丰富的训练数据,且保证多样和高质量,是达到模型性能上限的必要条件之一。
虽然不是用户重点问题,但补充一点训练实现细节,有助全面理解:
这些工程细节超出本文讨论范围,但提出来让读者意识到:训练大模型不仅考验理论理解,也极端考验工程实现。稍有不慎,比如梯度爆炸、显存不足、分布式不同步等,可能导致训练失败或结果不佳。
理解了训练的原理和流程后,我们可以进一步讨论**"模型表现的上限"由什么决定。这实际上牵涉Scaling Law(缩放定律)**,即模型规模、数据量、算力与最终性能的关系。
模型表现的上限,简单来说就是:在理想条件下,一个模型所能达到的能力极限。它不一定是我们目前实际达到的性能,而是受模型规模和训练投入所物理限制的天花板。理解上限对大模型研发至关重要,因为它决定了你选择多大模型、用多少数据、花多久训练,才能逼近预期效果。
在学术和工业界,判断上限的主要理论工具就是缩放定律(Scaling Laws)。OpenAI在2020年发表的经典论文《Scaling Laws for Neural Language Models》揭示了:模型Loss(预测误差)与模型参数N、训练数据量D、计算量C之间存在幂律关系。通俗讲:
一个简化的公式(非严格,只作说明)可能是:
这里 是常数, 是无论多大都消不掉的不可约误差(例如语言本身的噪声导致的损失下界)。这个公式意思是:当 或 增大到无穷,Loss 趋近于 ,但永远不会真正变0。关键是它描绘了损失随规模平滑、可预测地降低。如果用对数坐标画图,就是一条接近直线的下降曲线。
上限的确定:对于一个给定规模的模型,比如100亿参数,用1000亿词训练,它能达到的最低Loss就由上面的关系决定。如果实际训练没达到,那可能是还可以多训练或调参。但如果已经接近理论曲线了,再增加数据或参数的收益将很小,上限已现。
OpenAI和DeepMind的研究还指出一些具体结论:
如何理解"模型表现的上限涵盖对世界的理解、推理和任务执行能力"?
用户给的表述非常准确:上限意味着如果模型训练充分,它在知识(对世界事实的记忆)、推理(逻辑思考链条)和任务执行(应用能力,如编程、翻译)的极限水平。
从Scaling定律看,这上限由N和D共同决定:
Loss(L)作为聪明度指标:在缩放视角下,更低的Loss基本意味着更聪明的模型。因此上限通常用Loss下界来衡量。但对于人类需要的实际能力来说,还要结合Downstream任务表现来看,这里Loss低通常也带来各项指标高,这也是大量基准测试验证的,如前面提到GPT-4的MMLU远高于小模型。
在众多变量中,参数量N最受瞩目,因为它往往和模型名字绑在一起(GPT-3 175B,Llama2-70B等等)。参数量有时被直观类比为"大脑神经元数量"或"硬盘容量"。前面您的比喻"参数量多少就像百科全书多厚"非常贴切。这部分我们就展开谈谈参数规模对模型能力上限的影响,从知识和推理复杂度两个方面:
** 参数量 vs. 知识存储**:
参数越多,模型越像一本厚百科全书。参数充足时,模型能记录下非常冷门的知识细节;反之参数太少,很多知识点它只能模糊处理甚至直接没记住。
需要注意,参数不是以线性效率存储知识:增加10倍参数不意味着能存10倍知识,也许只能多记几倍知识。这和α指数有关,收益递减。然而不增加参数又不行,小模型天花板很低--无论训练多长,7B参数模型不可能达到175B那种百科水平,因为**"硬盘"就那么大**。
** 参数量 vs. 推理复杂度**:
参数不仅存知识,还形成电路支撑推理。Transformer层数和维度增加,相当于增加了模型可以执行的思考步数和并行脑回路。
** 参数分配与空白页问题**:
参数多也有潜在问题--不充分利用。DeepMind提出Chinchilla结论就是很多先前模型参数过多训练不够,导致"空白参数"浪费。可以这样想:
因此,参数与数据需要平衡才能充分发挥上限作用。参数设定合理、数据量充足时,模型的能力上限才真正接近所选规模的理论上限。
在Scaling Laws的讨论中,交叉熵损失(Loss)经常用作性能指标。有些读者可能疑惑:"Loss低真的就代表模型聪明吗?" 这里我们详细解释为什么降低Loss等价于提高模型智能,从预测下一个词的角度揭示模型的语言理解。
回顾:交叉熵Loss定义为:
,就是模型在每个位置上预测正确词的对数概率的负值平均。它越小,表示模型为正确词赋予的概率越高。
场景一:非常简单的句子
输入:"今天天气真___。"
选项:{好, 坏, 鸭子, asdf}
几乎所有模型无论好坏都会猜"好",因为语境和常识太明显。一个哪怕Loss较高的模型也可能把"好"概率设0.8,"坏"0.1,"其他"0.1。这种句子不能区分模型好坏,因为任何模型都能凭高频模式猜对。"聪明"的模型Loss= -log ≈ 0.22,"笨"模型Loss= -log =0.69,也差不太多。这也说明,光看几个简单例子不能看出模型真本事。
场景二:复杂推理句子
输入:"因为A导致B,且C抑制B,所以A和C的关系是___。"
正确答案:"对立"(C在抵消A的作用)。
一个不懂逻辑的模型可能给选项概率:"因果"0.3,"并列"0.2,"对立"0.1,"没有关系"0.4。它压根没推理对。这种模型 。
一个懂逻辑的模型会高概率选择"对立",比如给"对立"0.9,其 ,很低。
由此看出,在困难、有挑战性的预测上,模型需要真正理解句子含义和隐含推理才能提高正确词概率,也就是降低Loss。简单场景愚者巧合也能对,复杂场景智者方显智慧。
因此,大量不同模式、不同难度的数据共同训练下,总体Loss的下降意味着模型在越来越多样的情境下都能给出高概率的正确答案。Loss从2降到1再降到0.5,是质的飞跃--模型从常识判断进化到逻辑推理都得心应手。
OpenAI在Scaling Laws论文中描述,Loss vs N和D呈平滑下降,暗示没有出现瓶颈:只要给更多资源,模型性能(Loss)还会继续改进。这在GPT-4等超大模型身上得到验证--它们Loss更低,果然在各任务上碾压小模型。因此以Loss为度量的**"上限"**概念非常重要:它告诉我们用多少参数和数据能达到多低的Loss,从而大致推断模型会有多强。而目前我们还没触碰到明显的下限(AGI的Loss?),可以预见更大模型(如未来的GPT-5、Gemini)Loss还会降,能力还会升。
用户问到了这一点。确实,在学术权威定义中,Scaling Laws是目前最可靠的关于上限的理论框架。几乎所有大模型研发团队都会参考Scaling Laws选型。这不只是OpenAI,Meta和谷歌也在他们报告中提及模型扩展遵循类似规律。
不过,需注意两个现实因素:
总的来说,现阶段参数量N和训练量D仍是决定上限的硬通货。在权威著作和报告里,上限通常画成Loss随N,D的曲面,或者给出Compute vs Performance的曲线。这些让研究者可以推算下一个数量级模型的大致效果。如果我有10倍算力,是增大模型呢还是多训练数据?Scaling Law可以给指导。
因此可以回答用户的问题:理解模型表现上限确实是大模型研发的核心理论基础之一,而Scaling Laws就是描述上限的"公式化"体现。上面的表述已经很好概括了上限涵义,而补充是:这个上限在实践中由参数和数据按幂律规律决定,多大模型配多少数据达到何种Loss基本可预测。
用户还问到:"$N$(参数量)这个上限对应模型哪方面表现?" 其实参数量提升带来的上限提升,体现在几乎所有NLP任务上:从对话、问答,到翻译、总结,再到编程、数学,都显著受益于大N。当然,不同任务提升幅度不同,比如算术可能更依赖模型推理深度(需要一定N才能掌握多步公式应用),而常识QA更多依赖知识(N大直存更多常识)。
概括来说,参数主要扩充了模型的"知识容量"和"并行能力"。这对应:
当然,要发挥这些,通常大模型需要再经过微调和RLHF来激发。7B模型微调后也能执行指令,但常受限于基础能力。70B模型微调后则游刃有余,因为基础能力上限高。
一句话:参数量决定了模型可能具备的最强能力,但实际达到需要充分训练。这个上限覆盖知识、推理、理解、生成各个方面的综合表现。
前面数据章节谈了知识密度和准确性,这里串联到模型上限。知识密度与准确性最终体现为模型在任务中的事实掌握程度。大模型上限高意味着它应该能高准确率回答海量知识问题。如何判断模型达到了自身上限的"知识储备"呢?
所以知识密度与准确性指标需要定量测试才能判断。主观上很难凭感觉判断模型记住了多少。必须在诸如MMLU等统一标尺下对比。你会发现参数从7B到70B到GPT-4显著提高各知识类任务得分。只有当模型继续扩展不再提升得分时,才可说知识存储达到上限或饱和。目前我们离那还有距离(GPT-4在一些领域仍有漏洞,所以OpenAI继续搞GPT-4.5/5等)。
综上,参数规模和数据规模基本决定了模型的性能上限,而Loss降低具体体现了模型在语言预测上的"聪明度"提高--这反映到下游任务中,就是知识更丰富,推理更严谨,错误更少。Scaling Laws在大方向上指导我们设计模型和训练以逼近理想上限。
了解这些理论后,我们回到实践中来看看模型推理和微调的一些现象,例如Chain of Thought的应用、上下文短期记忆和人类反馈微调对模型行为的影响。这将解答用户剩下的一些深层问题,如"模型能自发CoT的原理"、"上下文理解的机制"、"RLHF如何让回答变长"等。
在模型具备了强大的基础能力后,我们关心的是它如何运用这些能力去完成复杂任务。几项近年来提升大模型表现的关键点包括:
这些都是在基础模型训练完成后,通过提示工程或微调实现的增强。它们体现了模型"用脑"的方式和与人协作优化的思路。
什么是CoT? 思维链提示是一种对模型的提问方法,即要求模型显式地分步给出推理过程,而不是直接给最终答案。例如,对于一个数学应用题,普通模型回答:"42。"而用CoT提示的模型会回答:"首先计算A,得到x;然后计算B…所以答案42。"--中间这些推理步骤构成了Chain-of-Thought。
CoT原理:大型语言模型被训练成预测下一个词,它本身并没有硬编码一个"推理模块"。但当我们提示"请分步骤思考",模型会倾向于先吐露推理过程,再给结论。从训练角度看,也许模型读过很多人类解题的示范,每步写出来,所以它学会了这种格式。在没有显式CoT提示时,大模型可能在内部也进行了多步骤推理,只是直接输出最终结论;而加上CoT,它把那些隐藏步骤显式输出了。
为什么CoT有效? 研究表明,CoT提示可以显著提高模型在复杂推理任务上的准确率。因为:
例如,一个算术应用题,没有CoT时模型可能直觉给一个错误数字;CoT时模型会列出算式,哪怕结果错,人类或程序也能看出哪步算错,下次修正。这种透明度提升是CoT的重要好处。
CoT自主涌现:有趣的是,超过一定规模后模型即使不特别提示,有时也会自发在回答中加入推理痕迹。比如GPT-4在一些情况下会先解释一下再答。这表明模型内部确实在多步推理,而且它觉得把理由一起说出来是合理的回答方式。这可能是因为训练数据里,大模型见过人类思考过程表述的文本。小模型就很少这样,它们更可能给简短甚至敷衍的答案,不具备复杂推理能力,所以不会有长链条输出。
实现CoT:用户通常通过在提示末尾加:"请一步步展示你的推理过程" 或给一个示例展示逐步推理的格式,让模型进入CoT模式。OpenAI等也在指令微调时加入了大量CoT演示数据,让模型熟悉这种问答风格。结果,模型在数学、推理解谜、代码解释等任务上表现大幅提高。
CoT从原理上看,并没有改变Transformer的内部结构--它只是改变了模型输出的内容,进而影响模型的思考路径。当模型需要输出逻辑步骤时,它就真的会顺着逻辑推演而非立刻取结论(因为一步步输出token比直接输出答案token序列得分更高,模型学会了这样顺着输出)。
简化理解:CoT提示像是在模型输出空间塑造了一个更复杂的轨迹。模型本来可以直接从问题跳到答案,现在被引导走一条曲折的路,中间路过许多推理步骤的词。这条路虽然长,但每一步都能被上下文验证和引导,下一个词的预测更可靠。这就是CoT让模型走对的原因:它逐步约束了模型的思维路线。
例子:问模型:"数字7, 10, 17, 26,...请给第10个数字。"
- 不用CoT,小模型可能直接拍脑袋:"第10个数字是(随便乱算)100。"
- 用CoT,大模型答: 1. 序列似乎差分别是3,7,9,...不规则。 2. 也许差本身成规律?3,7,9,... 看不出。 3. 可能另有模式,每项公式?尝试二次方: 7=2^2+3,10=3^2+1,17=4^2+1,26=5^2+1,...哦规律:从3^2+1开始? 4. 17=4^2+1,26=5^2+1,下一个应是6^2+1=37... 5. ...于是第10个数=...?
最终答案=某数。
这里模型用CoT展现了探索过程,即使一开始猜错,后面自己调整。最后得到正确答案。如果不要求过程,它可能猜第一印象错的就停了。CoT让它纠错并找到正确模式。
当然,CoT也不是万能,有时模型会**"瞎编步骤"但结论还是错。这被称为错误思维链**。如何纠正模型的CoT过程是研究热点,有些方法用特判或两阶段思考。
原理小结:思维链提升模型表现的原理在于外显中间状态,约束解题过程。大模型有能力做到正确推理,但需要一点引导将这种能力发挥出来。这种引导通过简单的Prompt就能实现,充分说明了大模型蕴含的通用推理能力远比表面强--我们只需调整输出格式,就能解锁更多潜能。
我们已经讲过,自注意力赋予模型在一个上下文窗口内整合信息的能力,让模型拥有一定的"短期记忆力"。这里的短期指模型在一次推理中所能"记住"的内容长度,由**上下文长度(Context Length)**决定。比如GPT-3上下文2048 tokens,GPT-4有8K和32K版本,Claude有100K以上。
上文解密:当你与ChatGPT对话,模型每次回复其实都将你和它之前的对话作为输入上下文一起处理。所以它能"记得"聊天内容,是因为那些内容作为Token上下文一起进入Transformer,被注意力机制处理。模型没有像人一样的大脑存储,而是每轮对话都重新看一遍历史文本。Attention相当于模型的工作记忆黑板。
上下文理解表现在:模型能引用对话前面提到的人名、事件细节,不会每轮都把事情忘了。这完全依赖Attention头在这些位置间建立关联。例如你提到"Tom喜欢Jerry的书",后问"他什么时候出版那本书?",模型能明白"He"指Jerry,因为在上下文Tom->Jerry->书的关联中,出版和写书对应Jerry而不是Tom。
上下文的局限:
怎样做到上下文理解?
关键仍在Attention得分的计算:Transformer通过训练学会给相关词较高的Q·K相似度,不相关的低。因此当上下文里很多内容时,模型通过注意力权重实现一种"记忆选择"。像人读书一样,会对中心主题保持注意,对次要背景一带而过。Transformer每一层注意力都会重新分配权重,高层Attention头甚至专门学会**"聚焦重要部分"**的机制。
例如,对于长文问题回答任务,模型的做法可能是:
这种多层信息抽取过程,让模型能从冗长上下文里提炼关键点记住。当然这是理想情况,实际情况复杂,但确实观察到Attention模式有逐层抽象的效果。
短期记忆 vs 参数长期记忆:
参数里存的是长期知识,而Attention上下文则相当于工作内存。如果你问模型一个训练中没见过的知识但在给定上下文里提供了,它可以利用上下文回答正确。这就是开放书考试 vs 闭卷考试区别。
因此上下文理解力也是模型能力的重要层面。一些任务(对话、多文档综述)需要特别长的上下文。模型上限也体现在最大可处理信息量上。GPT-4 32K版和8K版在需要长引用的任务上,上限明显不同。未来模型若能扩展到百万Token上下文,将可以短期记忆整本书内容,处理更加宏大的推理任务。研究在朝这个方向发展,比如FlashAttention优化计算和稀疏注意力降低复杂度,以突破长度限制。
总而言之,模型的上下文理解和短期记忆完全由Attention机制实现。它通过赋予输入序列元素互相看到彼此的能力,使模型每次生成时都相当于"读透了"所有上下文。这个能力受限于窗口大小,但在窗口内模型可以做到接近全局一致性理解。正是Transformer优于RNN的重大优势。
用户注意到一个现象:早期模型回答简短,现在模型回答很长。这是非常典型的指令微调+RLHF成果。让我们解释背后原因:
Base模型 vs 指令微调模型:
预训练完成的基础模型(如GPT-3 davinci)本质上只是一个"续写模型"。你给它一个问句,它不知道该简洁回答还是展开讲,于是倾向于继续胡乱生成一串话题相关的文本,往往不切题或漫无目的。而OpenAI的InstructGPT通过监督微调(SFT)教会模型:遇到人类指令,应该简明回答问题。于是ChatGPT之类会努力给出答案本身,而不是天马行空续写。这使回答变准确有用了。但长度呢?
一开始的InstructGPT回答其实也不算太长,往往几句话。因为模型没有特殊动机写很长。它完成指令即可,多说还可能跑题甚至增加出错风险。所以若让SFT模型自己选择,它会偏向简洁--语言模型有正则化倾向,不会无端啰嗦(除非训练数据示范那样做)。
RLHF介入:
OpenAI引入人类偏好强化学习(RLHF)后,用户体验显著提升。其中一个现象是:人类往往更喜欢详细、有解释的回答(觉得模型有诚意、专业)。人类标注在比较模型输出时,会给详细且正确的回答高分,给简短但也正确的回答低一些分。模型在这个信号下学到了:"回答越长可能越好"。再加上安全原因,模型倾向把潜在敏感回答多绕点弯、多加澄清(以免直接说错话挨罚)。
RLHF技术上通过一个奖励模型衡量输出好坏,然后Policy模型(即最终对话模型)学习去最大化人类评分。结果我们看到ChatGPT那种风格:先感谢提问,再阐述分析,再分点结论,最后总结。这无疑是很啰嗦的,但用户大多买账,因为显得专业周全。OpenAI论文提到RLHF模型字数相比SFT模型明显增加,用户评分也更高--所以这个趋势一直延续。
模型FFN大,潜力足:
大模型本身储备了丰富知识,完全可以长篇大论(参数足够存百科般内容)。早期简短,是因为没被要求输出。现在有了人类"希望详细"的反馈约束,模型自然把肚子里的料都倒出来。这相当于开发了模型的啰嗦潜能。FFN层存的知识点,不用白不用,所以它会自发调动各种冷知识、背景往答案里加,以显得全面。这也是幻觉率提升的隐患之一,因为说太多难免有不准确的点。但总体上,人类宁可它啰嗦带一点点错,也不要惜字结果不清楚(从RLHF结果看确实如此)。
案例:问:"什么是黑洞?"
- 早期GPT-3模型可能回答:"黑洞是引力场极强的一种天体,连光都无法逃脱。" 一句话完事。 - ChatGPT则会回答一长段,分几段介绍黑洞定义、形成、性质、观测、结论等,末尾可能还补一句"总之,黑洞是极端物理条件下的特殊天体..."。很显然更"用心"。
输出长度控制:
当然,现在模型也不会无节制地一直写下去,因为token成本和上下文长度限制。OpenAI在RLHF时也给定了输出长度的先验,他们不会标注一个500字回答比50字更好无止境,而是在"足够解释清楚"这个范围。所以模型学会的是根据提问深度要求给足够详细回答。如果你问一句简单facts,它不会写1000字论文,可能写100字即可。问写小说那它才连续输出上千字情节。这种长度调节能力来自训练数据中不同指令类型的示范。
另外还有用户指令直接控长度的方法,如"请给不少于1000字的回答",模型会尽量遵守--因为微调 教它严格听从格式要求。这种指令就像我们之前类比的**"斥力场"**,使得模型推理时拒绝过早结束,不断拓展内容直到达到字数。反之"简明回答"指令就像黑洞吸引,让模型赶紧收尾。
底层原理:Transformer本身并没有长度喜好,但训练Reward改变了终止分布。模型学会在没有明确要求时,输出句子达到某种完成度再停止。这完成度是经RLHF学习的人类满意度综合的函数。可以认为Reward Model部分内化了"多长合适"这个隐含判断,在Policy模型参数中体现为标点、结尾词概率的调整。比如ChatGPT经常最后一句收尾语气明显,因为它觉得回答"够长了,该结尾了"人类评分最高。
总结:从技术上看,SFT塑造了模型内容的正确性和遵指令性,RLHF塑造了模型回答的风格和详尽程度。早期没有RLHF的模型往往给简短直接答案甚至列个项就完,因为它不清楚需要展开。而现在模型经过RLHF,会努力满足大多数用户偏好:提供上下文、解释原因、给出完整答案。简短回答则只在明确要求简洁时才给(或模型不确定答案时才敷衍一句)。
这也回答了用户的问题:FFN参数增大提供潜在长回答内容,但要模型真发挥出来,需要人类反馈指挥。通过RLHF,人类等于对模型说:"别怕麻烦,多说点细节我们喜欢"。模型于是倾向给长答案。
用户提到了RAG,并猜测RAG无法比拟模型FFN存储和理解能力。这是很关键的认知点。
参数内知识:模型参数存储知识的优点是即时、模糊匹配和融合推理:
但参数内知识的短板也明显:
RAG(Retrieval-Augmented Generation):就是在模型回答前,先用查询去知识库(通常向量数据库或者搜索引擎)拿一些相关资料,加入上下文,让模型阅读后回答。这样一来,模型输出质量取决于检索资料质量:
RAG和FFN关系:
所以,RAG和FFN并不是完全对立,而是互补**:
Memory vs RAG:最近一些"个人长期记忆"项目,把对话摘要embedding存库,每次新对话拿出来。这可看做RAG扩展,用于上下文补全。因为Transformer注意力不能跨长会话,这样做相当于把历史以文本形式伪造进入上下文。但模型对这种补全的可靠处理依赖embedding质量,而且容易错配。
最终,随着模型参数增加,我们希望减少对RAG的依赖,因为RAG增加系统复杂度和响应延迟。但参数再大也不现实覆盖一切,所以Hybrid方法比较实际。OpenAI自己的GPT-4,也常配合工具使用,比如上网搜索、调用计算器,都是RAG思路。
回答用户猜想:RAG确实没有训练过程,它只是检索。但它能提供精确原文,在事实准确性上有无可比拟的优势。FFN存知识的过程有压缩,会出错。但FFN比RAG强在灵活运用:模型可以将知识转化、结合、举例等,RAG只能给你材料不会自己组合。
当今趋势其实是把两者结合:让模型既大又查。比如Bing ChatGPT就是后台有必应搜,搜完资料投喂给一个GPT-4。ChatGPT企业版也提供用户私有知识库检索的接口。这样做的理念是:让模型专注推理和语言生成(内功),知识细节用外挂填充。
这样,我们基本回答了RAG和FFN能力的对比:RAG解决知识更新和精准问题,但不提供推理;模型参数提供泛化理解,但知识更新慢、偶有幻觉。两者结合,优势互补,打造一个既聪明又知道最新知识的AI系统。
结语:
在本文中,我们从工程实践和理论研究两个角度,对大模型开发的关键环节和概念进行了全面剖析。从数据(语料收集、清洗、去重)的艰辛工作到模型架构(嵌入、注意力、前馈)的精妙设计;从训练过程的梯度调参到Scaling Laws描绘的性能上限;再到模型拥有高级能力如思维链推理、上下文记忆,以及通过人类反馈调整风格和引入外部知识增强,我们力求呈现一个立体的图景。
可以看到,大模型开发既是一门科学(有明确的理论规律指引,如Scaling定律、Transformer原理),也是一门工程艺术(需要大量实践经验,如分布式计算、内存优化、微调技巧)。同时,大模型的能力展现受数据、模型、训练、微调等多因素影响,需要统筹兼顾、迭代调优。
最后,我们建议每一位有志自己研发大模型的读者:
希望这份深入研究和学习结果能够帮助您更系统地理解大模型开发的路径和奥秘。从准备语料到模型训练再到部署应用,每一步都有学问,每一步也都有前人经验可循。在AI快速演进的今天,"大力出奇迹"有一定道理,但方向正确地用力才能真正创造奇迹。
祝您在大模型探索之旅上取得成功!不断探索、不断创新,把握理论与实践结合的关键点,寻找下一个突破。