
这次我们换个角度把大模型最底层的原理一次讲清楚。很多读者在用 GPT 类产品时都会有类似的困惑接口调用很容易但模型内部到底发生了什么为什么给它一句话它就能接着往下写回答这个问题有一条非常清晰的路线词向量 → RNN 的瓶颈 → 注意力机制 → Transformer → 大模型。这篇就把这条路线拆开讲配合动画里的可视化直觉把每个概念还原成“它解决什么问题、怎么运作、为什么现在大模型都长这样”。这篇文章适合正在学 Transformer、准备算法面试、或者想从应用层往底层走一步的开发者。不需要深厚的数学基础只要了解 Python 和基本神经网络概念就能跟上。你会看到 word2vec、GloVe、Self-Attention、QKV、位置编码、GPT 和 BERT 的分化以及从 Transformer 到大模型的缩放规律。这些概念单独看都很抽象但放进一条演进线里每一步都是为了解决上一步的缺陷逻辑非常顺。1. 先建立一张知识地图与其一开始就扎进 self-attention 公式不如先把整条技术演进路线摆在面前。下面这张表基本就是本文的内容骨架。阶段解决什么问题核心思想典型代表词向量计算机无法直接理解文字把词映射为稠密向量相似语义距离近Word2Vec、GloVeRNN / LSTM处理变长序列输入按时间步依次读取输入并传递隐状态LSTM、GRU注意力机制RNN 长距离遗忘严重让模型动态回看源数据的所有位置并加权聚合Bahdanau AttentionTransformerRNN 串行计算慢难并行用自注意力替换循环结构全局建模 并行计算Transformer 原论文预训练语言模型标注数据太少通用特征难学先在海量文本上自监督预训练再微调下游任务BERT、GPT大模型小模型能力有上限扩大参数量、数据量、算力按幂律提升效果GPT-3、GPT-4、Llama 系列这条路线不是随便排的。每一步几乎都是对前一步“硬伤”的补丁词向量解决了表示问题RNN 解决了变长序列的框架问题注意力解决了长距离依赖问题Transformer 解决了并行和扩展问题预训练解决了数据标注问题规模扩大则把能力上限整个抬了一层。2. 词向量让计算机从“查字典”变成“理解语义”2.1 为什么不能直接用 One-Hot自然语言处理的第一步是把文字变成数字。最朴素的想法是 one-hot 编码每个词分配一个唯一的索引位置该位置为 1其余为 0。比如词表里有“猫”“狗”“苹果”三个词“猫”就是[1, 0, 0]“狗”就是[0, 1, 0]。但 one-hot 有两个致命问题。第一维度爆炸。真实语料的词表动辄几十万每个词都有一个几十万维的向量存储和计算都不可接受。第二没有语义信息。[1, 0, 0]和[0, 1, 0]的夹角是 90 度这意味着“猫”和“狗”在向量空间里完全不相关模型根本不知道它们是动物。one-hot 只是“查字典”本质上是一个编号系统不携带任何“概念理解”。2.2 分布式表示用稠密向量承载语义解决方案是分布式表示。核心思想是一个词的语义不是由它自己单独决定而是由它经常共现的上下文决定。比如“猫”和“狗”都经常出现在“宠物”“喂食”“可爱”这些词附近所以它们的向量应该比较接近。这个方向最早的代表是神经网络语言模型真正把它推成通用工具的是 Word2Vec。Word2Vec 包含两种结构CBOW用上下文词预测中心词。输入“猫 在 __ 上”模型要预测“垫子”。Skip-gram用中心词预测上下文词。输入“猫”模型要预测“垫子、在、上”。训练完成后模型隐层的权重就成了词向量。这个向量是稠密的通常几百维而且天然携带语义关系。最经典的例子是king - man woman ≈ queen说明向量空间里不仅词义相近的点靠近连语义关系的方向都保持一致。下面用 gensim 演示一下加载词向量并计算相似度的基本流程import gensim.downloader as api # 下载一个轻量预训练词向量模型用于演示 model api.load(glove-wiki-gigaword-50) # 查看向量维度 print(向量维度:, model.vector_size) # 计算两个词的相似度 similarity model.similarity(cat, dog) print(cat 与 dog 的相似度:, round(similarity, 4)) # 找出和 king 最接近的词 result model.most_similar(king, topn5) print(与 king 最相似的词:, result)这个例子展示的流程就是很多“AI 大模型入门”实验里常常出现的第一个程序加载词向量 → 计算相似度 → 观察语义聚类。如果跑通了这一段就说明你对“词向量”这个抽象概念已经有直观体验了。2.3 GloVe从“局部窗口”到“全局共现”Word2Vec 的思路是基于滑动窗口只看一个词周围很小范围内的共现。GloVe 的思路不太一样它统计整个语料库中任意两个词共同出现的次数构建一个共现矩阵再对这个矩阵做矩阵分解得到词向量。GloVe 的优势在于它同时利用了全局统计信息和局部上下文信息。用一句话概括Word2Vec 是从“局部采样”里学向量GloVe 是从“全局计数”里学向量。实际应用中两者的效果差距不算大但理解它们共同的前提很重要一个词的语义藏在它和其他词的关系里。2.4 词向量的天花板词向量解决了“文本怎么变成数字”的问题但两个缺陷非常明显第一静态向量。bank在“河岸”和“银行”两个语境里的含义完全不同但词向量只给一个固定表示。这本质上是模型不懂上下文一个字有多义时它无能为力。第二无法建模长距离依赖。词向量只表示“一个词”不表示“一句话”。当你需要判断“The animal didnt cross the street because it was too tired”里的it指代什么时词向量没有这个能力。这个缺陷直接催生了后续的序列模型和注意力机制。3. RNN 与它的困境为什么大模型不选它当底座3.1 RNN 的基本思路循环神经网络的核心是“按顺序读句子”。每读一个词更新一次隐状态这个隐状态相当于模型对前面所有输入的一个压缩记忆。处理完最后一个词后就得到整个句子的表示。在机器翻译那个年代结构是编码器把源语言句子读成最后一个隐状态解码器从这个状态开始逐词生成目标语言。这个过程很像一个人先把整句话听完记住大意再用另一种语言复述出来。3.2 长距离遗忘问题RNN 的问题在于隐状态是一个固定长度的向量。句子越来越长早期的信息会被后面的信息不断覆盖。这就好像听一场讲座中间的细节太多等到最后总结时开头讲了什么已经模糊了。理论上 LSTM 可以用门控机制有选择地保留信息缓解梯度消失问题但它本质上仍然是一条串行链路信息要经过所有时间步才能到达终点长距离依赖依然是瓶颈。3.3 另一个硬伤无法并行RNN 处理第 5 个词时必须等前 4 个词都处理完。这导致训练速度极慢。在大规模语料上训练这种串行计算方式非常吃亏。Transformer 之所以能取代 RNN并行能力是极关键的一个原因。4. 注意力机制不再死记硬背而是动态查资料4.1 注意力从机器翻译中来2014 年Bahdanau 等人在机器翻译任务中提出了注意力机制。核心改动非常直观解码器生成每个词时不再只依赖编码器最后输出的那个向量而是回头去看源语言所有位置的隐状态给每个位置算一个权重再按权重加权求和。这个操作很像人在做翻译时查原文翻译到某一处会回头看原文里哪个词和当前翻译最相关相关的地方给更多关注。这样一来源语言每个词的语义细节都被保留下来不会被压缩进一个固定向量里丢掉。4.2 用代码理解注意力基本运算注意力机制的三个步骤计算相关性分数、softmax 归一化成权重、加权求和得到上下文向量。下面用 NumPy 实现一个最简版import numpy as np # 假设有 4 个词每个词是 8 维向量 # query 表示当前需要关注的位置 query np.random.randn(8) # keys 表示源语言所有位置 keys np.random.randn(4, 8) # values 表示源语言所有位置携带的内容 values np.random.randn(4, 8) # 第一步点积计算相关性 scores keys query # 得到 4 个分数 # 第二步softmax 归一化 weights np.exp(scores) / np.sum(np.exp(scores)) # 第三步加权求和 context weights values print(注意力权重:, weights) print(上下文向量维度:, context.shape)这段代码虽然简单但已经包含 attention 的全部要素query决定“我在找什么”keys决定“每个位置能提供什么”values决定“实际要拿什么内容”。三者的关系会在下一章的 QKV 中正式展开。5. Self-AttentionTransformer 的核心引擎5.1 从 RNN 到 Self-Attention 的跳跃注意力机制最初是用在编码器和解码器之间的用于“翻译时回看源语言”。Transformer 的论文做了一个更激进的改动让句子里的每个词都去和句子里的所有词计算注意力。这就是 Self-Attention自注意力。用大白话说一句话里每个词的意思不是它自己单独决定的而是由它和句子里的其他词共同决定的。比如“苹果”后面跟着“手机”那它大概率指品牌后面跟着“削皮”那就指水果。Self-Attention 让模型在生成每个词的表示时主动吸收整个句子的上下文信息。5.2 Q、K、V 分别是什么在 Transformer 中每个输入词会生成三个向量Query、Key、Value。Query表示“我在找什么”。当前词想从其他词那里获得什么信息。Key表示“我能提供什么”。每个词对当前 Query 的匹配程度。Value表示“我实际提供的内容”。被选中后真正贡献给输出的信息。计算流程是当前词的 Query 和所有词的 Key 做点积得到注意力分数分数经过 softmax 归一化后作为权重权重和所有词的 Value 做加权求和得到当前词的新表示。用“猫追老鼠”这个句子举例。处理“追”这个词时它的 Query 会想谁在追追谁于是和“猫”的 Key 匹配度很高和“老鼠”的 Key 也很高而和“追”自己的匹配度反而可能更低。最终“追”的新表示里大量信息来自“猫”和“老鼠”这就把语法关系编码进来了。当然真实模型里这种关系不是手工设计的而是靠训练数据学出来的。5.3 公式拆解Self-Attention 的公式是$$Attention(Q, K, V) softmax(\frac{QK^T}{\sqrt{d_k}})V$$拆成三步来理解QK^T是 Query 矩阵和 Key 矩阵的点积得到词与词之间的相关性矩阵。矩阵里第 i 行第 j 列表示第 i 个词对第 j 个词的关注度。除以√d_k是缩放因子。d_k是 Key 向量的维度。点积结果随维度增大而增大如果不缩放softmax 会进入梯度极小区域模型训练不稳定。softmax 把每一行的分数变成概率分布保证权重之和为 1。最后和 Value 矩阵相乘相当于按权重聚合所有词的信息。下面用一个极简的 NumPy 实现完整 self-attentionimport numpy as np def softmax(x): x x - np.max(x, axis-1, keepdimsTrue) return np.exp(x) / np.sum(np.exp(x), axis-1, keepdimsTrue) def self_attention(X, W_q, W_k, W_v): # X: (seq_len, d_model) Q X W_q # (seq_len, d_k) K X W_k # (seq_len, d_k) V X W_v # (seq_len, d_v) scores Q K.T / np.sqrt(K.shape[-1]) weights softmax(scores) return weights V, weights # 模拟 4 个词每个词 16 维 X np.random.randn(4, 16) W_q np.random.randn(16, 8) W_k np.random.randn(16, 8) W_v np.random.randn(16, 16) output, attn_weights self_attention(X, W_q, W_k, W_v) print(注意力权重矩阵形状:, attn_weights.shape) print(输出形状:, output.shape)跑通这段代码后你会直观看到注意力权重矩阵是一个4×4的矩阵每一行代表一个词看向其他词时的关注度分布。这就是大模型内部在每一层做的事情。6. 多头注意力与位置编码让 Transformer 真正可用6.1 为什么要“多头”如果只做一次 self-attention模型只能学习一种“词与词之间的关系”。但真实语言里的关系是多样的有语法关系、指代关系、局部语义搭配、长距离逻辑关联。单次注意力很难同时捕捉这些不同维度的关系。多头注意力Multi-Head Attention的思路是用多组 W_q、W_k、W_v 并行计算多次 self-attention每次从一个不同的子空间视角建模。比如一个头专门关注相邻词的搭配另一个头关注指代关系还有一个头关注句子全局主题。最后把所有头的结果拼接起来经过一个线性变换融合作为这一层的输出。从工程角度讲多头注意力还带来了一个好处每个头的维度降低单头的计算量可控总计算量和单头完整维度基本持平却获得更丰富的表达能力。这也是为什么“多头”成了标准配置。6.2 位置编码弥补并行带来的“顺序缺失”Self-Attention 有一个天生的短板它把句子当成一个无序集合。如果把“猫追老鼠”和“老鼠追猫”里的词分别替换位置计算的注意力分布会完全一样因为 self-attention 对词序是置换不变的。但语义恰恰依赖顺序。Transformer 的解决方案是位置编码。在输入词向量上叠加一个“位置向量”让模型知道每个词在句子中的位置。原始论文使用的是正弦余弦函数$$PE_{(pos, 2i)} \sin(pos / 10000^{2i/d_{model}})$$$$PE_{(pos, 2i1)} \cos(pos / 10000^{2i/d_{model}})$$这个公式的意义是不同位置得到不同的编码模式并且相邻位置之间有一定规律模型有能力推断相对位置。后来的大模型对位置编码做了很多改进更常用可训练的位置向量或旋转位置编码 RoPE但核心思想没有变化给词向量补充位置信息。下面用 NumPy 模拟一个简单的正弦位置编码import numpy as np def positional_encoding(seq_len, d_model): pe np.zeros((seq_len, d_model)) position np.arange(seq_len)[:, np.newaxis] # (seq_len, 1) div_term np.exp(np.arange(0, d_model, 2) * -(np.log(10000.0) / d_model)) pe[:, 0::2] np.sin(position * div_term) pe[:, 1::2] np.cos(position * div_term) return pe pe positional_encoding(20, 32) print(位置编码矩阵形状:, pe.shape)位置编码加上词向量后Transformer 才真正具备了“理解词序”的能力。这也是为什么它能在并行处理所有词的同时不丢失句子顺序信息。7. Transformer 整体架构从原版到 GPT、BERT 的分化7.1 编码器-解码器结构原始 Transformer 是标准的编码器-解码器架构。编码器由多层叠加组成每层包含两个子层多头自注意力层和前馈神经网络层。每个子层外面都有残差连接和层归一化。残差连接解决深层网络的梯度衰减问题层归一化稳定训练过程。解码器结构类似但多了一个掩码多头自注意力层。掩码的作用是生成第 t 个词时只能看前 t-1 个词不能看到未来。这是生成任务的基本约束你不能一边预测下一个词一边偷看标准答案。解码器还会通过交叉注意力层去关注编码器输出的信息完成翻译或生成任务。一个标准 Transformer 层可以简化为输入 - 多头自注意力 - 残差连接 层归一化 - 前馈神经网络 - 残差连接 层归一化 - 输出7.2 GPT 和 BERTTransformer 的两条分支BERT 和 GPT 分别继承了 Transformer 的不同部分。BERT 使用编码器做双向理解。它能同时看到一句话前后所有的词适合分类、阅读理解、命名实体识别这类理解型任务。预训练任务包括掩码语言模型随机盖住一些词让模型猜被盖住的词是什么。GPT 使用解码器做自回归生成。它严格按从左到右的顺序预测下一个词。预训练任务只有一个根据前文预测下一个词。这种方法看起来更简单但当数据量和参数量足够大后生成范式展现出了极强的通用性。为什么最终是 GPT 路线成为大模型的主流可以这样理解理解任务本质上也可以转化为生成任务。你说“这句话是正面还是负面”我不直接输出分类标签而是生成“正面”这个词。你说“这篇文章总结一下”我生成一段总结文字。生成范式天然覆盖了理解、翻译、问答、写作等各种任务一个模型结构就能统一所有 NLP 任务。7.3 为什么 Transformer 能取代 RNN把 Transformer 的优势汇总一下就很清楚了对比维度RNN / LSTMTransformer长距离依赖弱信息逐时间步传递强任意两词直接计算注意力并行训练无法并行串行计算可并行训练速度大幅提升全局建模依赖隐状态压缩每个词显式关注所有词规模扩展扩展能力有限参数量、数据量扩展稳定多任务统一结构分化多一个架构统一理解和生成Transformer 解决的核心问题可以概括成一句话计算效率更高语义建模更强还能靠规模继续变强。这三个优势正好是大模型时代的命门。8. 从 Transformer 到大模型预训练、缩放定律与涌现能力8.1 预训练 微调一个模型吃遍所有任务有了 Transformer 后一个新的训练范式出现先在海量无标注文本上做自监督预训练再在少量标注数据上做微调。自监督的意思是数据不需要人工标注下一个词是什么这个任务在任意文本上都能自动生成训练样本。预训练让模型学会语言的基本规律语法结构、常识知识、逻辑关系、甚至一部分推理能力。微调则是让模型适配具体场景客服问答、法律文书分析、代码生成。到了 GPT-3 之后连微调都开始变得可选因为模型足够大之后你只要把任务描述写进提示词它就能照着做。这就是 zero-shot 和 few-shot 能力的来源。8.2 缩放定律变大确实有回报OpenAI 在 2020 年发布的 Scaling Laws 论文给出一个关键结论模型性能与参数量、数据量、计算量之间呈幂律关系。简单说当三个因素同步提升时模型的损失按可预测的曲线下降并没有出现明显的收益递减。这意味着什么意味着大模型公司可以采用一个非常朴素的策略把模型做得更大、喂更多数据、堆更多算力效果就会变好。GPT 系列在很短时间内从 1.17 亿参数跳到 1750 亿参数核心驱动力就是这个规律。参数量变大后训练策略也会调整比如引入混合专家模型 MoE、多头潜在注意力 MLA 等架构优化让每一份参数都更高效。8.3 涌现能力小模型做不到大模型突然会了当模型超过某个规模阈值后一些能力会“突然出现”比如少样本学习、代码生成、多步推理。研究人员观察到一个现象小模型里完全看不到的能力在参数规模提升后以跳跃式的方式涌现。例如用 10 亿参数模型做不了简单数学推理但换成几千亿参数模型后同样的提示词就能给出正确答案。这个现象还没有完全被解释清楚但有两个共同因素被认为很重要一是足够大的参数量提供了记忆和表征容量二是海量数据提供了足够的模式覆盖。GPT 之所以能成为通用的生产力工具靠的不只是某个巧妙的算法而是规模效应带来的能力质变。8.4 GPT 生成一句话内部发生了什么把前文所有概念串起来GPT 生成一句话的流程是这样的输入提示词切成 token每个 token 查词表得到初始向量加上位置编码。向量经过几十层 Transformer 解码器。每一层里多头自注意力让词和词之间交换信息前馈网络对每个词的表示做非线性变换残差连接保住原始信息。最后一层输出的每个位置向量经过一个线性映射到词表大小再经过 softmax 得到每个词的生成概率。从概率分布中采样一个词拼到已有序列后面重复这个过程就完成了逐词生成。整个过程里没有人在手工写规则所有能力都来自训练中学到的权重。这正好呼应了开头那句话大模型的原理本质上就是“词向量 自注意力 大规模预训练”三者叠加的结果。9. 学习路径建议下一步去哪里这篇讲的是概念脉络接下来如果要深入落实建议按下面的路线推进。9.1 动手路线阶段目标推荐实践第一阶段掌握词向量用 gensim 加载预训练词向量做相似度和类比实验第二阶段理解注意力用 NumPy 手写 self-attention手动算 QKV 和 softmax第三阶段熟悉 Transformer 代码复现一个极小的 Transformer用 toy task 训练第四阶段接触真实大模型通过 Hugging Face 加载小规模模型观察输出和注意力权重第五阶段进阶架构与训练学习 RLHF、LoRA、量化推理、分布式训练9.2 关键代码资源Hugging Face Transformers 库最常用的模型加载、推理、微调工具官方文档有大量案例。PyTorch 官方教程中的 Transformer 示例适合把之前 NumPy 手写的部分替换成 PyTorch 版本。minGPT或nanoGPT这类极简 GPT 实现几千行代码就能跑一个小型 GPT 训练非常适合理解大模型的训练闭环。9.3 一个保底实验如果只看不练很容易遗忘建议把下面这个实验作为“保底任务”用 PyTorch 实现一个单层 self-attention输入一个 3~5 个词的句子打印出注意力权重矩阵再画出热力图。这个过程跑完你对 QKV 的理解就会从“看过公式”变成“亲手算过”。另外提示一下如果是自己学习需要下载开源模型建议只从 Hugging Face、ModelScope 等正规模型托管平台获取并且留意模型开源许可证。对第三方博客里的“魔改模型”“去限制版”等资源要保持警惕这些文件安全性无法保证不适合直接下载到本地。10. 总结这次我们把大模型的原理拆成了五步词向量让文字变成可计算的稠密向量RNN 提供了序列建模框架但有长距离遗忘和不可并行的瓶颈注意力机制让模型能动态选择信息Transformer 用自注意力同时解决了全局建模和并行计算问题预训练加规模扩张最终造就了大模型。如果你只想记住一个点建议记住这个自注意力是整个大模型的核心它让每个词都能动态关注句子里所有其他词而大模型的生成能力就是“根据前文预测下一个词”这套机制反复执行后的涌现结果。接下来可以做的事很明确先跑一遍上面的 NumPy 代码再去看一张 GPT 架构图最后用 Hugging Face 加载一个小模型测试生成效果。这条路走完你对大模型的认识就比单纯调 API 的开发者深一层了。建议收藏备用动手时直接对着这篇文章过一遍。