1. 大模型发展史的学习路径与核心脉络
1.1 为什么值得从头梳理一遍大模型的发展史
很多人接触大模型是从ChatGPT爆火那会儿开始的,直接上手用,觉得这东西凭空冒出来。但真要把大模型用好、用明白,甚至想自己动手微调、部署、做应用,光会用是不够的。你得知道它是怎么一步步走到今天的,每个阶段解决了什么问题,又留下了什么坑。这份学习笔记就是我自己在补这段历史时整理出来的,从早期的统计语言模型一路捋到Transformer、BERT、GPT,再到如今百花齐放的大模型生态。
这份笔记适合几类人看:一是刚入门AI大模型、想建立完整知识框架的新手;二是已经在用大模型API做应用,但对其底层原理一知半解的开发者;三是准备做企业大模型私有化部署、需要理解技术选型逻辑的工程师。不管你是哪一类,把发展史捋清楚,后面学Transformer模型详解、BERT模型实操、大模型微调这些具体内容时,会顺畅很多。
我自己的体会是,发展史不是背年表,而是理解“为什么会有这个设计”。比如为什么BERT用编码器、GPT用解码器,为什么Transformer能取代RNN,这些问题在历史脉络里都有答案。下面我就按自己的学习顺序,把这条线拆开讲。
1.2 从统计方法到神经网络:大模型的前史
在大模型这个词出现之前,自然语言处理走过了很长一段路。最早是基于规则的方法,靠语言学家手写语法规则,覆盖范围有限,稍微换个领域就失效。后来转向统计语言模型,核心思路是用概率来预测下一个词,比如N-gram模型,通过统计语料中词序列出现的频率来估计概率。
N-gram的问题很明显:当N变大时,参数空间爆炸,数据稀疏严重,很多词序列在语料里根本没出现过,概率就估不准。而且它只看前面固定的N个词,长距离依赖完全抓不住。这时候神经网络语言模型登场了,用词向量(Word Embedding)把词映射到低维稠密空间,再用前馈网络或循环网络(RNN)来建模序列。
RNN的引入是个大进步,它能理论上记住任意长的历史信息。但实际训练时,RNN有梯度消失和梯度爆炸的问题,长序列上的依赖还是学不好。LSTM和GRU通过门控机制缓解了这个问题,在一段时间内成了序列建模的主流。不过它们都是串行计算的,没法并行,训练效率低,这为后来Transformer的出现埋下了伏笔。
我整理这段历史时最大的感受是:每个方法都是在解决前一个方法的痛点,但同时又引入新的限制。理解这些限制,才能理解为什么Transformer的设计是那个样子。
1.3 Transformer的横空出世与核心突破
2017年那篇《Attention Is All You Need》是分水岭。Transformer彻底抛弃了循环结构,完全基于自注意力机制(Self-Attention)来建模序列。这个设计的核心突破有两点:一是并行计算,所有位置可以同时处理,训练效率大幅提升;二是全局依赖,任意两个位置之间的关联都能直接建模,不受距离限制。
自注意力的计算过程可以这样理解:每个词生成Query、Key、Value三个向量,用Query和所有Key做点积得到注意力权重,再对Value加权求和。这个过程用矩阵运算一次性完成,非常适合GPU加速。多头注意力(Multi-Head Attention)则是在多个子空间里并行做这件事,让模型能同时关注不同类型的关系。
位置编码(Positional Encoding)是另一个关键设计。因为自注意力本身不包含顺序信息,必须额外注入位置信息。原始Transformer用的是正弦余弦函数,后来也出现了可学习的位置嵌入、相对位置编码等变体。这部分在Transformer模型详解里经常被忽略,但实际很重要,位置编码的设计直接影响模型对长序列的建模能力。
我第一次手写Transformer的时候,卡在注意力掩码(Mask)上很久。编码器里的自注意力是全可见的,但解码器里的自注意力必须用因果掩码遮住未来位置,否则训练时模型会“偷看”答案。这个细节在Transformer手写练习里是必踩的坑。
2. BERT与GPT:两条技术路线的分道扬镳
2.1 BERT:双向编码器与预训练微调范式
BERT在2018年出现,把NLP带入了预训练+微调的时代。它的核心是双向编码器,用Transformer的Encoder堆叠而成,通过掩码语言模型(MLM)和下一句预测(NSP)两个任务在大规模语料上预训练。MLM的做法是随机遮住15%的词,让模型根据上下文预测,这样就能同时利用左右两侧的信息。
BERT的意义在于,它证明了大规模无监督预训练能学到通用的语言表示,然后只需少量标注数据微调,就能在各类下游任务上取得好成绩。这在当时是范式级的转变,之前每个任务都要从头设计模型和特征。
BERT模型实操时要注意几个点:输入格式是[CLS] + 句子A + [SEP] + 句子B + [SEP],[CLS]位置的输出常用于分类任务;MLM的15%遮罩里,80%换成[MASK],10%换成随机词,10%保持不变,这是为了缓解预训练和微调阶段的不一致。这些细节在BERT模型实操教程里都会讲,但自己动手跑一遍印象更深。
BERT的局限也很明显:它不适合做生成任务,因为编码器是双向的,没法自回归地一个词一个词往外吐。这就引出了GPT这条路线。
2.2 GPT:自回归解码器与生成式预训练
GPT走的是另一条路,用Transformer的解码器堆叠,做自回归语言建模,也就是根据前面的词预测下一个词。GPT-1在2018年提出,GPT-2在2019年放大到15亿参数,GPT-3在2020年直接干到1750亿参数,展示了规模定律(Scaling Law)的威力:模型越大、数据越多、算力越足,性能就越好,而且会出现一些小模型没有的涌现能力。
GPT系列的成功让“大模型”这个词真正流行起来。它的训练目标简单直接,就是预测下一个token,但在这个简单目标下,模型学会了语法、知识、推理,甚至一些代码能力。GPT-3之后,**提示工程(Prompt Engineering)**成了新技能,因为模型不再需要微调,靠few-shot甚至zero-shot就能做很多任务。
GPT和BERT的对比是理解大模型发展史的关键。BERT是理解式的,适合分类、抽取、匹配;GPT是生成式的,适合对话、写作、代码。后来的大模型大多走GPT路线,因为生成能力的通用性更强。但BERT的编码器思想也没消失,在很多检索、嵌入模型里还在用。
2.3 两条路线的融合与演进
BERT和GPT之后,技术路线开始互相借鉴。比如T5把所有任务都统一成文本到文本的格式,用编码器-解码器结构;BART也是编码器-解码器,在去噪任务上预训练。这些模型试图兼顾理解和生成。
再往后,**指令微调(Instruction Tuning)和人类反馈强化学习(RLHF)**成了关键。GPT-3虽然强,但不太听指令,你问它问题它可能继续编故事。InstructGPT通过指令微调让模型学会按指令回答,再用RLHF让输出更符合人类偏好。这一步直接催生了ChatGPT,让大模型从实验室走向大众。
我自己的学习路径是先搞懂BERT的双向编码,再理解GPT的自回归解码,然后看T5怎么统一,最后看指令微调和RLHF怎么让模型变得好用。这个顺序比一上来就啃GPT-3论文要顺得多。
3. 大模型生态:从训练到部署的完整链路
3.1 大模型微调:让通用模型适配垂直场景
通用大模型虽然强,但在具体行业场景里往往不够精准。比如医疗、法律、金融这些领域,术语和专业逻辑差异大,直接问通用模型容易得到泛泛而谈的回答。这时候就需要大模型微调。
微调的方式有好几种。全量微调是更新所有参数,效果最好但成本极高,普通团队玩不起。**LoRA(Low-Rank Adaptation)**是在原模型旁边加低秩矩阵,只训练这些小矩阵,大幅降低显存和计算需求,效果接近全量微调,是目前最流行的方案。QLoRA进一步把原模型量化到4-bit,再叠加LoRA,让单张消费级显卡也能微调大模型。
微调的数据准备是关键。一般需要几千到几万条高质量的指令-回答对,格式要统一,质量要过关。数据里如果有噪声或错误,模型会学歪。我踩过的坑是数据量不够就急着调,结果模型过拟合,在训练集上表现好,一换问题就露馅。后来老老实实扩数据、做清洗,效果才稳。
微调时的超参数也要注意:学习率通常比预训练小一到两个数量级,epoch数不宜多,一般3到5轮就够,多了容易过拟合。LoRA的秩(rank)和alpha也要调,rank太小欠拟合,太大又失去低秩的意义。
3.2 大模型部署:私有化与本地运行的现实选择
很多企业出于数据安全考虑,要做企业大模型私有化部署,把模型放在自己的服务器上,数据不出内网。部署方式主要有几种:一是用Ollama这类工具快速拉起本地模型,适合个人和小团队试验;二是用vLLM、TensorRT-LLM这类高性能推理框架,适合生产环境;三是用云厂商的私有化方案,省心但成本高。
Ollama部署大模型很简单,一条命令就能拉模型跑起来,适合快速验证。但它对并发和吞吐的支持有限,生产环境还是得上vLLM。vLLM的核心是PagedAttention,把KV Cache分页管理,显存利用率高,吞吐能提升好几倍。部署时要根据显卡显存选模型规模,比如7B模型用一张24G显存的卡就够,70B模型就得多卡并行。
量化是部署时绕不开的话题。FP16精度高但占显存,INT8和INT4能大幅压缩,但会损失一些精度。实际选型要看场景:对精度要求高的用FP16或INT8,对成本敏感的用INT4。我实测下来,INT4量化的模型在多数对话场景里和FP16差别不大,但显存占用少了一半多。
3.3 API调用与生态工具链
不是所有场景都需要自己部署,很多时候直接调大模型API更划算。DeepSeek、GPT等都有API接口,按token计费,适合快速开发和中小规模应用。调用API时要注意几个点:一是速率限制,免费或低价套餐通常有QPS和并发限制,高并发场景要提前规划;二是上下文长度,不同模型支持的最大token数不同,超长输入要截断或分段;三是错误处理,网络抖动、超时、限流都要有重试机制。
生态工具链也很重要。LangChain、LlamaIndex这类框架能帮你快速搭建RAG(检索增强生成)应用,把私有知识库和大模型结合起来。向量数据库如Milvus、Chroma用于存储和检索嵌入向量。Codex接入DeepSeek这类组合也很常见,用大模型辅助写代码。
我自己做应用时的经验是:先用API快速验证想法,跑通了再考虑私有化部署。API阶段重点调提示词和流程,部署阶段重点调性能和成本。两边的工作重心不一样,别混在一起。
4. 实操中的常见问题与排查技巧
4.1 模型加载与显存问题排查
部署大模型时最常见的问题就是显存不够。报错通常是CUDA out of memory,这时候要一步步排查。先看模型本身占多少,7B模型FP16大概14G,加上KV Cache和中间激活,实际要20G左右。如果显存不够,可以尝试量化、减小batch size、缩短上下文长度,或者用CPU offload把部分层放到内存。
另一个常见问题是模型加载慢。大模型动辄几十G,从磁盘加载到显存要几分钟。可以用内存映射(mmap)加速,或者把模型放在SSD上。如果是多卡部署,还要注意卡间通信,NVLink比PCIe快很多。
我遇到过模型加载后推理结果乱码的情况,排查下来是tokenizer不匹配。模型和tokenizer必须配套,用错tokenizer会导致编码解码不一致,输出全是乱码。这个坑在新手部署时很常见,一定要检查模型目录里的tokenizer配置文件。
4.2 微调训练中的典型故障
微调时loss不下降是常见问题。可能原因有:学习率太大导致震荡,太小导致不收敛;数据格式不对,模型没学到有效信号;或者预训练模型和任务差异太大。排查时先看loss曲线,如果一直平着不动,先调学习率;如果震荡厉害,就减小学习率或加warmup。
过拟合也很常见,表现为训练loss持续下降但验证loss开始上升。这时候要早停、加正则、扩数据。LoRA微调时过拟合更快,因为可训练参数少,容易记住训练集。我的做法是留一部分数据做验证,每轮都看验证指标,一旦变差就停。
还有一个坑是数据泄露,训练集和验证集有重叠,导致验证指标虚高。做数据划分时一定要去重,确保验证集是模型没见过的。
4.3 推理性能与并发优化
推理性能优化主要看吞吐和延迟两个指标。吞吐是每秒能处理多少请求,延迟是单个请求要多久。两者往往矛盾,batch size大吞吐高但延迟也高。实际要按场景权衡:在线对话要低延迟,离线批处理要高吞吐。
KV Cache是推理优化的重点。自回归生成时,每个新token都要和之前所有token做注意力,如果每次都重算,计算量爆炸。KV Cache把之前算过的Key和Value存下来,新token只算自己的,大幅加速。但KV Cache占显存,长上下文时很吃资源。vLLM的PagedAttention就是专门优化这个的。
**连续批处理(Continuous Batching)**也是关键优化,把不同请求的动态合并,提高GPU利用率。传统批处理要等一个batch全完成才能开始下一个,连续批处理可以随时插入新请求,吞吐提升明显。
4.4 常见问题速查表
| 问题现象 | 可能原因 | 排查方向 | 解决建议 |
|---|---|---|---|
| CUDA out of memory | 显存不足 | 看模型大小、batch size、上下文长度 | 量化、减小batch、缩短上下文、CPU offload |
| 输出乱码 | tokenizer不匹配 | 检查tokenizer配置 | 用配套tokenizer,重新加载 |
| loss不下降 | 学习率不当或数据问题 | 看loss曲线、检查数据格式 | 调学习率、清洗数据、加warmup |
| 过拟合 | 数据少或训练久 | 对比训练和验证loss | 早停、加正则、扩数据 |
| 推理慢 | 未用KV Cache或批处理 | 看推理框架配置 | 启用KV Cache、连续批处理 |
| API限流 | 超过速率限制 | 看返回状态码 | 加退避重试、申请更高配额 |
这张表是我自己踩坑后整理的,基本覆盖了日常遇到的大部分问题。实际排查时按现象对原因,能省不少时间。
5. 学习大模型发展史的个人体会
5.1 建立时间线与技术树的联动记忆
学发展史最怕变成背年表。我的方法是把时间线和技术树绑在一起记。比如2017年Transformer,2018年BERT和GPT-1,2019年GPT-2,2020年GPT-3,2022年ChatGPT,2023年GPT-4和各类开源模型爆发。每个节点不仅记时间,还要记它解决了什么问题、用了什么结构、影响了哪些后续工作。
技术树则是按结构分:编码器路线(BERT、RoBERTa、ELECTRA)、解码器路线(GPT系列)、编码器-解码器路线(T5、BART)。每条路线下的模型有继承关系,理解一个就能推出一片。这样记比孤立地背模型名高效得多。
我还会画简单的结构图,不用mermaid,就手画或文字描述。比如自注意力的QKV计算,自己推一遍公式,比看十遍图都管用。Transformer手写练习也是这个道理,写一遍就知道哪里容易错。
5.2 从应用到原理的逆向学习法
如果你已经会用大模型API,想深入原理,我推荐逆向学习法:先找一个你常用的功能,比如对话,然后问自己“模型是怎么生成这句话的”。顺着这个问题往下挖:生成是自回归的,每个token怎么选,注意力怎么算,位置编码怎么加,训练目标是什么。一层层挖下去,自然就串起来了。
这种方法的好处是有具体场景牵引,不会学着学着就迷失在公式里。比如你调DeepSeek API时遇到上下文长度限制,就去查它的位置编码和注意力机制,理解为什么有长度限制,怎么扩展。带着问题学,效率高很多。
5.3 动手实践的最小可行路径
光看不动手,发展史永远是别人的。我建议的最小可行路径是:先用Ollama拉一个7B模型跑起来,感受一下本地推理;然后用LoRA微调一个小模型,走一遍数据准备、训练、验证的流程;最后用vLLM部署,测一下吞吐和延迟。这三步走完,对大模型的全链路就有体感了。
每一步都会遇到问题,但正是这些问题让你真正理解原理。比如微调时显存不够,你就会去研究量化和LoRA;部署时吞吐低,你就会去研究KV Cache和批处理。问题驱动学习,比按部就班看教程有效得多。
最后分享一个小技巧:把每次踩的坑记下来,形成自己的问题库。我现在的速查表就是这么攒出来的,比任何教程都贴合自己的实际环境。大模型这个领域变化快,但底层原理和常见坑是相对稳定的,把这些吃透,新模型出来也能快速上手。