
最近两年AI大模型几乎成了技术圈最热的关键词。无论是GPT系列、通义千问、Llama还是开源社区里层出不穷的各种大模型它们背后都有一个绕不开的核心结构——Transformer。很多人尝试去读原始论文结果被“自注意力”“多头机制”“位置编码”这些名词劝退最后只能停留在“大模型约等于黑盒”的认知上。我的判断是大模型并不神秘也不需要一次性啃下几十个公式。你只需要把下面这条链路看清楚——词向量负责把文字变成坐标Transformer负责让这些坐标在语境中互相修正最后模型通过预测下一个词完成输出。这篇文章就用“动画思维”来拆解这条链路。读完这篇文章你会理解词向量为什么是大模型的第一块基石注意力机制到底在做什么以及为什么“最后胜出的是Transformer”而不是更早的RNN或CNN。我不会扔给你一堆公式而是尽量用画面、类比和最小化的代码示例让你在脑海中形成一张能反复调用的架构图。这篇文章适合刚入门NLP、准备算法面试、或者想系统梳理大模型原理的开发者。1. 这篇文章真正要解决的问题如果你正在学习大模型大概率遇到过这三种困境。第一种困境是资料太散。今天看到一篇文章讲Word2Vec明天看到一篇讲BERT后天又刷到一篇讲GPT-4每个名词都眼熟但串不起来。你不知道这些概念之间是什么关系也不知道谁先谁后。第二种困境是公式劝退。打开Transformer论文满屏的矩阵乘法、Softmax、缩放点积注意力每个符号都认识合在一起就不知道在说什么。大部分人止步于此以为深度学习原理就是数学推导和自己无缘。第三种困境是学了就忘。即使硬着头皮读完了原理因为没有实际跑过一个小模型也没有见过注意力权重长什么样第二天就忘光了。这篇文章要解决的就是这三件事。我会把大模型的核心原理压缩成三个问题怎么让计算机理解“苹果”这个词。怎么让模型知道“我喜欢吃苹果”里的“苹果”是水果而不是手机品牌。怎么让模型根据前文生成通顺、合理的下一个词。这三个问题分别对应词向量、Transformer、预训练大模型。理解清楚这三层再去看任何一篇大模型相关的论文或者技术博客你都会觉得它们只是在同一个框架下做工程优化。2. 词向量让计算机“读懂”语义的第一步2.1 为什么一定要有词向量计算机不认识汉字也不认识英文单词它只认数字。所以我们需要把“猫”“狗”“汽车”这样的词转换成一组数字。最简单的转换方式是One-Hot编码。假设词表里有5万个词“苹果”就是第10086号词那么它对应一个5万维的向量第10086位是1其余位全是0。这种方式有两个致命问题。第一维度爆炸。5万维的向量极其稀疏大部分位置都是0计算和存储效率都很低。如果词表扩大到100万情况更糟。第二语义鸿沟。在One-Hot编码下“猫”和“狗”这两个向量没有任何一位是相同的它们在高维空间中是正交的。模型完全看不出这两个词意思接近。换句话说One-Hot没有表达出“相似性”这个极其重要的语义信息。词向量Word Embedding就是为了解决这个问题出现的。它的核心思路是把每个词映射到一个低维稠密向量中比如300维。在这个向量空间中语义相近的词向量距离也更近。最经典的效果是可以做向量运算king - man woman ≈ queen这意味着模型在训练过程中自动学会了把“国王”和“王后”之间的语义关系编码进向量空间的某个方向上。2.2 Word2Vec与Glove词向量的经典方案Word2Vec是2013年提出的一种训练词向量的经典方法。它有两种工作模式CBOW给定上下文预测中间词。Skip-gram给定中间词预测上下文。想象一下一个滑动窗口在语料库中不断移动。窗口里有“我 喜欢 [苹果] 因为 它 很 甜”模型会反复做这样的任务看到“我 喜欢 因为 它 很 甜”猜中间被遮住的词是“苹果”。训练完成之后模型的隐藏层权重就变成了词向量。Glove的方法则不一样。它先统计整个语料库中任意两个词共同出现的次数构建一个共现矩阵然后对这个矩阵做分解得到词向量。Word2Vec更关注局部窗口内的词共现关系Glove则引入了全局统计信息两者各有优势。2.3 从静态词向量到上下文词向量Word2Vec和Glove训练出来的词向量有一个共同限制静态。也就是说“苹果”不管出现在“苹果很好吃”还是“苹果手机很贵”向量都是同一个。这显然不合理。后来的ELMo、BERT等模型引入了一个重要概念上下文词向量。同一个词放在不同句子里模型会生成不同的向量。这才是真正让模型“理解”多义词的关键一步。这里用一个最简单的小例子让大家直观感受一下“词向量之间的距离”是什么意思。import numpy as np # 假设我们从某个已经训练好的模型里取出三维向量 vectors { 猫: np.array([0.9, 0.8, 0.2]), 狗: np.array([0.8, 0.9, 0.1]), 汽车: np.array([0.1, 0.2, 0.9]), } def cosine_similarity(v1, v2): return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2)) print(猫 vs 狗, cosine_similarity(vectors[猫], vectors[狗])) print(猫 vs 汽车, cosine_similarity(vectors[猫], vectors[汽车]))运行之后你会看到“猫”和“狗”的余弦相似度明显更高。这就是“语义相近、距离相近”的最直观展示。理解词向量之后我们已经拥有了大模型的第一块基石。接下来要回答的问题是当一句话里有多个词时怎么让词和词之间产生交互。3. 注意力机制让模型学会“该看哪里”在Transformer出现之前NLP领域主流模型是RNN和CNN。它们的局限性非常明显。RNN按顺序读入句子把历史信息通过隐藏状态向后传递。对于长句子信息传到后面就容易衰减模型会忘记前面说了什么。CNN则只能看局部窗口比如每次看3个词或者5个词窗口之外的上下文完全感知不到。注意力机制Attention Mechanism的出发点很简单在处理当前词的时候模型应该有机会看一看整句话里所有词然后决定哪些词更重要。你可以想象一个画面你在会议室里发言说“这个方案要和上季度的数据对比”。当你强调“对比”这个词时你的目光会下意识地看向“数据”。这就是注意力——它让模型在处理“对比”时把更大的权重放到“数据”上而不是平均地看待所有词。3.1 注意力计算的最小流程现代注意力机制通常使用Q、K、V三个向量。很多人第一次看到Q、K、V就头皮发麻其实它们可以理解成三种角色Query查询当前词想问的问题。比如“我和谁关系最大”Key键每个词给自己的标签。比如“我是数据我是上季度我是方案”。Value值每个词真正携带的内容。流程分四步当前词的Query与句子中每一个词的Key做点积得到一个分数。对所有分数做Softmax变成和为1的权重。每个词的Value乘以对应的权重。把所有加权后的Value加起来得到当前词的新表示。我们用一个非常简化的Python代码演示这个过程。import numpy as np def softmax(x): e_x np.exp(x - np.max(x)) return e_x / e_x.sum(axis-1, keepdimsTrue) # 假设一句话共有3个词每个词用一个4维向量表示 X np.array([ [1.0, 0.0, 0.5, 0.2], [0.5, 1.0, 0.3, 0.1], [0.2, 0.4, 1.0, 0.6] ]) # 为了理解方便这里让Q、K、V都等于X本身 Q, K, V X, X, X # 计算注意力得分 scores Q K.T # 对每一行做Softmax让权重之和为1 weights softmax(scores) # 新的表示 权重 V output weights V print(注意力权重矩阵) print(weights) print(加权后的输出) print(output)运行这段代码你会看到weights矩阵里每一行代表一个词对全句所有词的注意力分布。比如第0行是“第一个词”看“第一个词、第二个词、第三个词”的权重。在实际的Transformer中Q、K、V会通过三个可学习的权重矩阵从输入向量中变换出来而不是直接等于输入。这相当于给了模型更大的自由度让它能学习出更丰富的注意力模式。3.2 注意力机制的关键贡献注意力机制最重要的贡献是让模型拥有了“全局视野”。不管两个词在句中相隔多远注意力都可以直接建立联系。同时句子中的所有词可以同时计算注意力这种并行特性极大提高了训练速度。可以这么说注意力机制解决了两大核心痛点——长距离依赖和并行计算。这也是Transformer最终取代RNN的最根本原因。4. Transformer架构从“顺序处理”到“全书处理”Transformer的核心思想是抛弃RNN的顺序结构完全依靠注意力机制来建模序列。它把整句话当作一个整体一次性输入模型让所有词之间互相交换信息。4.1 自注意力“自注意力”这个词很多初学者会误解以为它和前面说的注意力是两码事。其实没有本质区别自注意力只不过是在同一个序列内部做注意力计算。前面第3节演示的流程就是自注意力。每个词不是看向其他句子里的词而是看向本句内所有词。一个句子里的词数量有多少注意力计算的范围就有多大。这种设计的优势非常明显任何一个词在处理过程中都能考虑到全句的信息。这对语义消歧特别重要。比如“苹果”在“我爱吃苹果”里自注意力会让它从“吃”这个动词上获得高权重从而确定这里的“苹果”是食物而在“苹果发布新手机”里它会从“发布”“手机”上获得上下文信号确定这里指的是公司。4.2 多头注意力多头注意力是Transformer的另一个关键设计。它把注意力计算拆成多个“头”每个头在独立的子空间里做注意力。为什么要这样做因为一个句子里的关系是多维度的。有可能第一个头重点关注“动词和宾语”的关系第二个头关注“指代关系”第三个头关注“形容词修饰谁”。如果只有一个注意力模型只能学到一种加权平均的方式表达能力有限。多个头并行就像多个专家从不同角度分析同一句话最后把分析结果拼接起来。4.3 位置编码完全基于注意力的模型有一个尴尬的问题它看不出词的顺序。在RNN里顺序是天然保证的因为模型从左到右依次读词。但在Transformer里整句话同时输入没有先后概念。如果不额外处理“我打你”和“你打我”在模型看来可能没有任何区别。为了解决这个问题Transformer引入了一个叫做位置编码Positional Encoding的机制。它给每个位置生成一个唯一的向量然后把这个向量加到对应位置的词向量上。这样模型既能知道这个词是什么又能知道它在句子中的位置。位置编码的生成方式是固定的正弦余弦函数也可以通过训练学习。以下是生成位置编码的代码示例import numpy as np def get_positional_encoding(seq_len, d_model): pe np.zeros((seq_len, d_model)) for pos in range(seq_len): for i in range(0, d_model, 2): pe[pos, i] np.sin(pos / (10000 ** (i / d_model))) if i 1 d_model: pe[pos, i 1] np.cos(pos / (10000 ** (i / d_model))) return pe # 生成一个长度为10、每个位置向量维度为8的位置编码 pe get_positional_encoding(10, 8) print(位置编码矩阵大小, pe.shape) print(第1个位置的编码, pe[0])这个矩阵加上词向量之后每个词的位置信息就自然地融入了输入表示。4.4 残差连接与LayerNormTransformer的层数通常很深比如BERT-base有12层GPT-3有96层。深层网络容易遇到梯度消失和训练不稳定的问题。Transformer引入了两个标准设计来解决残差连接把输入直接加到输出上保证梯度可以顺畅回传。LayerNorm在每一层内部做归一化稳定数据分布。这两个组件在结构图上往往只占很小篇幅但训练大模型时它们是让几十层、几千亿参数能稳定跑起来的重要保障。4.5 Encoder与Decoder原始Transformer论文是做机器翻译的所以分为两大部分Encoder负责读取完整的输入句子理解语义Decoder负责一个词一个词地生成目标语言。后来研究者发现这两个部分可以拆开单独使用于是有了两条不同的技术路线BERT只使用Encoder适合理解类任务比如文本分类、情感分析、命名实体识别。GPT只使用Decoder适合生成类任务比如对话、写文章、写代码。这也解释了为什么你经常看到“GPT是生成式的BERT是理解式的”这种说法。4.6 为什么最后胜出的是Transformer关于这个问题本文给出一个明确判断Transformer不是一种凭空出现的全新架构而是把注意力机制发挥到极致的产物。它同时满足了三个条件维度RNNCNNTransformer并行计算不友好必须按顺序处理友好极友好全句同时计算长距离依赖弱存在信息衰减弱只有局部视野强任意词可直接交互架构通用性只能处理序列主要处理图像文本、图像、音频均适用正因为这一点Transformer不仅统治了NLP还扩散到了计算机视觉领域ViT、Swin Transformer都是它的变体。从实际发展来看“为什么最后是Transformer”的答案在于它把并行、全局、通用这三个关键属性同时集合在了同一套架构里。5. 从Transformer到大模型GPT与BERT的分岔路5.1 预训练大模型的“基础教育”在传统NLP时代每做一个任务都要从头设计模型和特征。比如做情感分析要收集标注数据训练一个分类器做命名实体识别又要另外训练一套模型。工程量巨大而且任务之间的知识无法复用。Transformer之后NLP的玩法彻底变了。研究者先用海量无标注文本比如维基百科、新闻、书籍训练一个通用模型。这个阶段叫预训练Pre-training。模型在这个阶段学习的是语言的基本规律包括语法、常识、逻辑关系等。预训练完成之后这个模型已经具备了很强的语言能力。后续要做具体任务只需要用少量标注数据做微调Fine-tuning或者直接通过提示词Prompt来引导模型完成任务。5.2 BERT双向理解BERT的预训练任务很有意思叫“掩码语言模型”。它在训练时随机遮住句子中的一些词让模型根据上下文猜出被遮住的词。比如我喜欢吃[MASK]因为它很甜。模型需要根据“我喜欢吃”和“因为它很甜”两个方向的信息猜出[MASK]大概率是“苹果”。这种双向建模能力让BERT在理解类任务上表现极好。5.3 GPT自回归生成GPT选择的路线是另一条只使用Transformer的Decoder结构预训练目标是最简单的“预测下一个词”。给定“我喜欢吃”模型预测下一个词的概率分布最可能是“苹果”然后继续往后预测。这个机制看起来简单但它的潜力远比想象中要大。因为语言本身就是按顺序生成的GPT这种自回归方式非常适合做生成任务。更重要的是随着训练数据量和模型规模不断增大GPT的表现呈现出持续提升的趋势。5.4 缩放法则与涌现能力大模型的能力并不是线性增长的。研究者发现当模型参数量、训练数据量、计算量同步增加时模型能力会按照一定规律稳定提升这就是缩放法则Scaling Law。更奇妙的是模型规模大到某个临界点之后会出现一些原先小模型完全没有的能力比如上下文学习In-Context Learning和思维链Chain of Thought。这些能力不是被显式设计出来的而是模型在规模驱动下自然涌现的。这也是为什么近两年大家争相把模型越做越大因为有些能力只有达到一定规模才会出现。但从工程角度看这也带来了巨大的算力成本和部署压力。所以本地部署AI大模型、模型量化、蒸馏这些技术也成了大模型落地的重要方向。6. “动画速通”在脑海中把整个流程跑一遍前面几节讲了不少概念这一节我们把这些概念串成一条完整的动态流程。你可以想象屏幕上正在播放一部关于语言处理的动画短片。第一步输入句子变成词向量。每个词从“文字”变成高维空间中的一个点。“我”“喜欢”“吃”“苹果”各自带着自己的初始向量进入模型。第二步位置编码加入。每个词向量加上位置信息模型知道“苹果”出现在第四个位置而不是第一个。第三步进入第一层Transformer。自注意力开始运作。每一个词向全句其他所有词发出查询“你们和我有什么关系”得分高的词获得更高的权重。这个动画里你可以看到“苹果”和“吃”之间出现一条加粗的连线“苹果”和“我”之间也有一条细线。经过加权求和“苹果”的向量已经不再是孤立的词向量而是融合了“吃”和“我”等上下文信息的新向量。第四步进入下一层Transformer。新的向量再次做自注意力信息继续交换。每一层都在不断细化每个词的语义表示。深层的“苹果”向量已经包含了整句话的语境信息。第五步如果是GPT这样的生成式模型最后一层会把“苹果”位置的表征映射到整个词表上计算每个词作为下一个词的概率。模型选择概率最高的词作为输出然后这个输出又变成新的输入继续预测下一个词。整部“动画”的核心只有一句话词向量提供起点自注意力实现信息交换多层堆叠加深理解最后映射为概率输出。如果你希望看到真实的注意力可视化效果可以找一些开源的注意力可视化项目把BERT或者GPT的输出画成热力图。你会直观地看到句子里不同的词对之间的关系强度和本文描述的动画几乎一模一样。7. 学习大模型原理的常见误区与排查思路很多人在学习过程中会产生一些长期困惑这里挑出最常见的几个误区做一个对照说明。误区实际情况大模型是完全不可理解的黑盒底层是确定的矩阵运算和概率预测中间结果可以被观察和分析词向量已经是过时技术大模型第一层仍然是Embedding词向量思想贯穿始终注意力机制是Transformer发明的注意力最早用于机器翻译Transformer的贡献是把它作为主架构并扩展到极致Transformer只有GPT这一种用法BERT、ViT、Swin Transformer都是基于Transformer的变体大模型能力完全靠堆参数数据质量、模型结构、训练策略和算力都同等重要7.1 误区一词向量和上下文词向量分不清静态词向量指每一个词只有一个固定向量比如Word2Vec和Glove。上下文词向量指同一个词在不同句子里有不同向量比如BERT的输出。初学者经常把这两者混为一谈。理解两者区别对理解大模型的本质帮助很大。7.2 误区二以为注意力权重就是模型解释性注意力权重确实能告诉我们模型在“看哪里”但它不等于完整的模型解释。不同注意力头关注的关系各不相同而且注意力权重只是模型内部计算的一个环节。不要把注意力可视化和模型真正决策逻辑完全等同起来。7.3 误区三只记名词不串链路很多人记住了“自注意力”“多头”“位置编码”这些名词却说不清它们之间的关系。真正有效的学习方式是能在纸上默写出整条链路输入词 → 词向量 → 位置编码 → 多头注意力 → 前馈网络 → 多层堆叠 → 输出概率。你可以用这个标准自测一下。8. 动手实践与最佳学习路径原理看再多不实际操作就很难真正掌握。下面给出一条从易到难的实践路径。8.1 第一步用Hugging Face跑一个小模型安装transformers库之后用几行代码加载一个小模型体验大模型的输入输出过程。pip install transformers下面的代码会加载一个小型GPT模型并让它续写一段文字。from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer AutoTokenizer.from_pretrained(gpt2) model AutoModelForCausalLM.from_pretrained(gpt2) prompt The future of AI is inputs tokenizer(prompt, return_tensorspt) outputs model.generate(**inputs, max_new_tokens20) print(tokenizer.decode(outputs[0], skip_special_tokensTrue))注意第一次运行需要下载模型文件耗时取决于网络情况。运行成功的话你会在终端看到模型生成的一段英文续写。这个实验虽然简单但能让你直观地感受“预测下一个词”的过程。8.2 第二步读原论文只看关键图Transformer的原始论文《Attention Is All You Need》值得一读但不需要一字一句啃。建议先看架构图和自注意力公式然后对照本文第4节的内容把每个组件的名称和作用一一对应起来。8.3 第三步手推一遍自注意力的矩阵运算不要停留在代码和概念上。尝试在一张纸上写出一个2个词的输入矩阵手动完成Q、K、V的生成、点积、Softmax、加权求和。这个流程完整走一遍之后Transformer对你来说就不再神秘。8.4 第四步用“词向量注意力”框架去理解新事物当你刷到大模型相关的新闻时试着用本文的框架去分析这个方案改了词向量层吗改了注意力机制吗用了什么预训练策略这样的思维习惯比单纯收藏文章有用得多。8.5 工程落地的安全意识最后必须提醒一点在实际业务中使用大模型尤其是通过API调用或者在本地做推理时要注意数据合规。不要直接把用户隐私数据、公司核心代码、商业机密封送给外部模型。如果敏感数据确实需要处理优先考虑私有化部署或者数据脱敏方案。9. 总结与后续学习方向这篇文章的核心线索可以总结成三句话词向量把文字变成模型可以计算的坐标。Transformer通过自注意力机制让每个词在上下文中不断修正自己的语义表示。大模型通过大规模预训练把这条链路推到极致最终涌现出惊人的通用能力。读完这篇文章建议你完成三件事。第一把第8节的Hugging Face实验跑通感受一次真实的“预测下一个词”过程。第二在纸上画出Transformer的架构图标注每个组件的名称和作用。第三尝试用“词向量 注意力 预训练”的视角去拆解最近看到的一篇大模型技术文章。后续可以继续深入的方向包括GPT系列模型的结构细节、多模态大模型的实现思路、本地部署AI大模型的量化方法、以及基于Transformer的并行训练技术。这些内容都建立在这篇文章的基础上只要你把“词向量 → 注意力 → Transformer → 大模型”这条主线记清楚后面再学任何新技术都不容易迷路。