破除黑箱:大语言模型究竟是如何工作的
这轮伴随着ChatGPT以及后续各种前沿模型所掀起的人工智能浪潮,已经轰轰烈烈地发展了快四年了。在今天,AI已经深入到我们工作与生活的方方面面,各种大语言模型的名字每天都在我们耳边回绕。然而,我身边依然有非常多非技术背景的朋友,甚至是一些每天都在使用AI的深度用户,依然搞不清楚大语言模型(Large Language Model: 基于海量文本数据进行预训练、拥有数十亿甚至数千亿参数的深度学习网络系统)到底是什么,以及它们在敲击键盘发送提示词之后,背后究竟是怎样一番运转逻辑。
为了彻底解答这个疑惑,今天我们不讲故弄玄虚的科幻概念,也不讲枯燥难懂的微积分公式,而是把一个现代大语言模型从你敲入文字、点击发送,到它在屏幕上一字一句输出回答的整个生命周期与计算流程,拆解为一个个具体的、可理解的工程环节。我们将重点探讨为什么模型需要这个部件、它在历史演进中解决了什么问题,以及今天的主流模型在这个部件上做了哪些最前沿的改进。听完这期,相信大家再去看任何一篇最新的大模型论文或者技术发布会,都能大致知道他们在吹捧的改进是在讲模型的哪一个部分。
分词器:文字进入数字王国的入场券
当你在对话框里敲下一句话并点下发送时,模型拿到的第一个东西是什么?首先,我们需要明确一个最基础的物理事实:计算机和神经网络本质上是数学机器,它们只能处理数字,根本无法直接读取和理解你所写的汉字或英文字符。因此,第一步必须是将人类的自然语言转换成计算机能处理的数字。
你看到的是“今天天气怎么样”这七个汉字,但模型看到的其实是一串整数。把文字转换成整数序列的这个步骤,就叫做分词(Tokenization: 将自然语言字符串切分为离散的语义单元并映射为整数ID的过程)。分词是通过一个叫做分词器的程序来进行的,它接收你输入的字符串,输出一串数字,其中每个数字都指向一个固定词表里的某个条目。现代大模型的词表通常非常庞大,从几万到几十万个条目不等。
说到这里,你可能会产生一个直观的疑问:为什么我们不直接用完整的单词或者整词做词表呢?比如把“apple”、“banana”或者“今天”分别作为词表里的独立单元。这其实是一个典型的效率与通用性权衡(Trade-off)的问题。如果我们选择用整词词表,因为人类语言的词汇量是无穷无尽的,还要加上各种派生词、时态变化以及不断产生的新词,这会导致词表体积变得无比巨大,不仅极大地消耗了存储和计算资源,而且一旦在实际运行中遇到训练时完全没见过的新词,模型就会彻底“抓瞎”,无法处理。
那么如果反过来,我们用最基础的单个字符(比如英文的26个字母,或者中文的单个字)作为最小的词表单位呢?这样词表确实可以压缩到非常小,但代价也是极其沉重且无法接受的:模型必须从零开始,耗费巨大的计算能力去学习最简单的拼写模式和构词规律,导致整体的计算序列变得极长,计算效率极其低下。
为了解决这个两难困境,现代大模型无一例外地采用了子词分词(Subword Tokenization: 介于字符与整词之间的折中方案,利用高频子词片段来组合表达任意词汇)。它的基本逻辑是:最常见的字符串片段会被直接当成单个token,而罕见词、复杂词和新词则由更小的片段拼贴出来。举例来说,“tokenization”这个词在分词时可能会被切分成“token”和“ization”两个部分;“running”可能会被切分成“run”和“ning”这两个token。
这种设计上的折中和取舍,会在一些非常微妙且意想不到的地方暴露出来,甚至让大模型显得有些“蠢”。其中最经典的一个例子,就是去问大模型:“strawberry(草莓)这个单词里有几个字母r?”。如果你去测试很多早期的模型,甚至是一些实力不俗的开源模型,它们会言之凿凿地给出一个错误答案。很多人第一次看到这个现象时会嗤之以鼻,认为大模型连小学生水平的数数都不会,一定是智商有问题。
其实,这真的不是模型不会数数,而是分词机制带来的物理屏蔽。因为模型根本不在字母层面操作,它看不到“s-t-r-a-w-b-e-r-r-y”这十个字母,它接收到的只是分词器处理后输出的token ID(比如可能是“straw”和“berry”两个数字)。对模型来说,它处理的是这两个子词单元,它根本不知道“berry”这个token内部是由哪些字母拼写而成的。所以在它没有逐字拆开的视野下,数错r的个数实在是再正常不过的一件事情。
在实际工业应用中,不同的模型家族会根据自身的需求选择不同的分词算法。例如GPT系列模型普遍使用的是字节对编码(Byte Pair Encoding, 简称BPE)的变体;而LLaMA系列则常用SentencePiece。分词器的选择直接影响了模型的计算量和语言表达效率:同样一句话,如果分词器能将其切分成更少数量的token,就意味着后续需要参与神经网络计算的步骤更少,推理速度更快、成本更低。同时,它也决定了模型对多语言的覆盖和支持能力。但无论具体算法如何变幻,它们的基本形态都是完全一致的:文本进去,一串整数出来。
嵌入矩阵:为无意义的代号注入灵魂
现在,你的提示词已经成功变成了一串整数ID。但是对于模型内部的矩阵乘法而言,像“1024”或者“2048”这样的token ID,本质上只是一个用来查表的行号,它本身不具备任何语义上的数学意义。如果直接把这些数字输入进网络,模型根本搞不懂“1024”和“1025”之间到底有什么关联。
为了赋予这些冰冷的行号真实的意义,我们需要引入模型中第一个极其庞大的权重部件——嵌入矩阵(Embedding Matrix: 一张存储了所有token多维特征向量的参数表)。每个模型都有这样一张巨大的查找表,词表里的每一个条目都在这张表里对应着唯一的一行,而每一行都是一个长长的实数向量。这个向量的长度被称为模型的“隐藏维度”或“嵌入维度”。在目前市面上最常见的70亿参数级(7B)的开源模型中,这个隐藏维度通常是4096;而在千亿参数的大模型中,这个向量的宽度会更加惊人,比如达到8192甚至更高。
分词器把整数序列交给模型后,模型要做的第一件事,就是去嵌入矩阵里“查表”,找出这些整数ID对应的那一行向量。从这一刻起,后续所有的神经网络层和注意力计算,都将彻底告别那串整数,转而完全用这组多维度的特征向量来做计算。这个查表得到的向量,就是这个token的嵌入(Embedding: 词元在多维连续向量空间中的数学表示,承载了其潜在的语义和语法特征)。
这个嵌入向量绝对不是随机生成的,它是模型在海量文本预训练过程中,历经千锤百炼、自发学出来的内部表示。它有一个极其美妙且令人惊叹的数学性质:语义相近或在语境中经常互相替代的token,最终在多维几何空间中,它们的嵌入向量会彼此非常靠近。比方说,在4096维的超空间里,“国王”的向量会距离“女王”非常近;“巴黎”的向量会靠近“法国”和“伦敦”。
这种复杂的语义和地理位置关系,没有任何程序员去进行手动编码或规则书写,它完全是模型为了完成“预测下一个词”这个任务,在梯度下降的训练过程中自发涌现出来的。更有趣的是,因为这些向量在几何空间中承载了真实的语义结构,你甚至可以对它们进行向量算术。最著名的经典公式就是: $$\text{Vector}(\text{"国王"}) - \text{Vector}(\text{"男人"}) + \text{Vector}(\text{"女人"}) \approx \text{Vector}(\text{"女王"})$$ 这绝非巧合,而是多维几何空间的语义对齐在数学上的真实映射。
但在解释完嵌入矩阵的强大之后,我们必须立刻指出一个致命的架构缺口:朴素的嵌入向量只编码了“这个词本身代表什么”,却对“这个词出现在哪里”一无所知。这意味着,在初始的嵌入表示中,“狗”这个汉字不论是出现在提示词的第一句,还是出现在最后一句,它查表查出来的初始嵌入向量都是完全相同的。这在语言处理中是一个巨大的问题,因为在自然语言中,词序决定了真正的意思。我们都知道,“狗咬人”和“人咬狗”所包含的汉字完全一样,但在逻辑上却是天差地别。如果不对位置进行编码,模型将无法区分这两者的本质不同。这个关键的结构缺口,必须由下一个核心部件来填补。
旋转位置编码:在旋转的几何中感知时序
由于朴素的自注意力机制在数学公式上是完全对称的,它本身不具备内建的词序概念。为了让模型感知到顺序,我们必须在向量中注入位置信号。
在2017年那篇奠定了整个大模型时代基石的原始Transformer论文《Attention Is All You Need》中,Google的研究人员给出的解决方案是使用绝对位置编码(Absolute Position Encoding: 将基于特定三角函数计算出的位置向量直接与词嵌入向量相加)。他们为序列中的每个绝对位置(如第1个位置、第5个位置、第100个位置)分配一套独有的正弦和余弦波数值模式,然后直接加到对应位置token的嵌入向量上。这样一来,狗在位置1和在位置5的向量就会因为加了不同的波形信号而产生差异,从而让模型区分它们的位置。
虽然绝对位置编码简单直观,但随着大模型的发展和上下文长度的急剧膨胀,这种简单的“加法”方案逐渐暴露出了两个难以调和的弊端:
- 容量限制:语义信息和位置信息被强行相加混合在同一个向量空间里,这就要求同一个维度必须同时承载这两种截然不同的信号,对向量的表达容量造成了挤占。
- 外推性极差:绝对位置编码对超出训练长度的序列几乎没有泛化能力。如果一个模型在预训练时最长只见过2048个token的文本,那么位置5000的绝对位置向量在训练中就从来没有被接触过,模型遇到这个位置时就会直接产生混乱。
为了解决这些痛点,现代大语言模型(如LLaMA、Mistral、Qwen等)普遍抛弃了正弦绝对位置编码,改用了一种名为旋转位置编码(Rotary Position Embedding, 简称RoPE)的方案。这是中国研究者苏剑林等人在2021年提出的一项杰出工作。
RoPE的核心直觉非常巧妙:它不再采用粗暴的“相加”操作,而是根据token在序列中的相对位置,对它的Query向量和Key向量施加一个旋转矩阵操作。我们可以将其想象成,位置1的向量旋转一个微小的角度,而位置100的向量则旋转一个很大的角度。
当后续进行自注意力比较(计算点积)时,两个token向量由于都经过了旋转,它们之间做点积运算的结果,在数学上会极其神奇地只取决于这两个向量旋转角度的差值。这个差值,在几何上恰好完美地表征了这两个token在文本序列中的相对距离。
RoPE在工业界能够全面胜出,主要归功于它带来的三个巨大优势:
- 天然编码相对位置:相比于生硬地告诉模型某个词在第几页第几行,让模型知道两个词之间相隔了几个词,显然更符合自然语言理解的本质。
- 极佳的长上下文外推性:由于旋转操作在数学上对距离衰减具有天然的包容性,研究人员可以通过简单的插值技术(如Linear Scaling、NTK-aware Scaling等),在不重新训练整个模型的情况下,轻松将模型的上下文窗口从4K扩展到32K甚至128K以上。
- 零参数开销:RoPE纯粹是一种数学上的旋转变换,不需要在训练中学习任何额外的位置参数,极为优雅和高效。
说到这里,顺便可以提到一个对日常撰写提示词(Prompt)非常有用的实操技巧。虽然我们有了像RoPE这样优秀的相对位置编码,但现代大模型在处理超长文本时,依然存在一个被学术界广泛证实并记录的现象——中间迷失(Lost in the Middle: 模型在处理长文本提示词时,对输入开头和结尾的信息提取能力远超其中部信息的现象)。
这是因为虽然位置编码提供了距离信息,但在漫长的网络层传播和注意力注意力权重分配中,位于中间部分的信息很容易被两侧的高激活信号淹没。因此,在日常编写复杂的提示词时,务必将最重要的指示和约束条件放在最开头,或者在结尾处进行重申和总结,避免将关键钥匙埋藏在漫长文本的肚子里,因为模型并不会均匀地关照你提示词的每一个角落。
注意力机制:QKV三剑客的信息大迁徙
在token的语义被嵌入矩阵表达、位置被RoPE编码之后,数据终于流向了整个Transformer架构中最为核心、最为耀眼的明珠——注意力机制(Attention Mechanism: 允许模型在计算当前词的表示时,动态关注并整合序列中其他相关词汇信息的机制)。
在Transformer的每一个隐藏层中,注意力机制其实只在做一件事:让序列中的每一个token,去查看它被允许看到的其他所有token,并基于语义的相关程度,决定哪些token的信息对预测接下来的内容是重要的。
为了在数学上实现这种动态的“关注”,注意力机制让每个输入向量同时扮演三个截然不同的角色,并通过三个不同的投影矩阵,将原始的token向量转换成三个全新的向量,这就是著名的Query(查询向量)、Key(键向量)和Value(值向量),简称Q、K、V。为了方便非技术朋友理解,我们可以用一个非常生动形象的“相亲/招聘”或者“搜索引擎”来做类比:
- Query (Q):代表“我正在寻找什么”。它是当前token主动发出的寻人启事,定义了它自己当前最渴望获取什么样的外部语义信息。
- Key (K):代表“我能提供什么”。它是序列中其他token身上的标签或广告牌,展示了自己能提供哪些特征和语义维度。
- Value (V):代表“我身上携带的真实货品”。一旦Query和某个Key匹配成功,这个Value就是那个被匹配上的token真正要打包传递过去的信息。
这三个投影矩阵(参数)是模型在预训练阶段从海量语料中自动学习出来的。在运行过程中,匹配过程是通过相似度打分来计算的:每个当前位置的Query向量,会和序列中所有可见token的Key向量做缩放点积(Scaled Dot-Product)运算。点积的本质是衡量两个多维向量在空间中的对齐程度。两个向量越对齐,乘积就越大,代表两者的语义关联度越高。
算出的原始分数会先除以一个缩放因子(通常是通道维度的平方根,为了防止数值过大导致梯度消失),接着通过一个Softmax函数(Softmax Function: 将一组实数映射为概率分布的函数,使所有候选的权重之和严格等于1)。Softmax会让高分者分到极大的权重占比,而低分者的权重则趋近于零。最后,这些算出来的权重会被用来对所有的Value向量进行加权求和,从而为当前token生成一个融合了周围上下文环境的新向量。
为了让这个过程更具象,我们来看一个具体的英文例句:
"The cat that I saw yesterday was sleeping."(我昨天看到的那只猫正在睡觉。)
当模型处理到“was”这个助动词的时候,为了能够做出正确的语法判断和后续生成,它必须要搞清楚到底是谁在“was sleeping”。此时,“was”对应的Query向量会去和句子里所有token的Key向量进行对齐度计算。
因为在语言训练中,模型深刻理解了“was”这类单数系动词需要寻找它的单数主语,而“cat”所产生的Key向量恰好与“was”的Query向量高度契合,两者的点积得分就会非常高。相反,“was”的Query去碰“yesterday”(昨天)的Key时,发现语境上根本不搭,点积得分就会很低。
经过Softmax的归一化,主语“cat”被分配到了绝对领先的高权重。在最后的Value向量加权混合中,“cat”的Value信息便主导了最终输出的向量表示。尽管“cat”和“was”在物理空间上隔了好几个词,但通过这一套QKV机制,它们在语义空间里被紧紧地系在了一起,实现了跨越距离的指代消解。
对于像GPT和LLaMA这类自回归(Autoregressive)的大模型,它们在生成文本时必须严格遵循“因果律”,即只能根据已经写出来的左边文字去预测右边,而绝对不能提前偷看右边还没生成的未来词。
为了在数学上约束这一点,注意力机制中引入了因果掩码(Causal Masking: 一种矩阵算子,用于在计算注意力时遮蔽当前token之后的未来Token信息)。它的实现方式非常简单粗暴但有效:在Softmax计算之前,将所有未来位置的匹配得分强制设定为负无穷大。这样一来,经过Softmax激活后,未来Token的权重就变成了绝对的零,从而杜绝了“向未来偷看”的作弊行为。
在关于注意力机制的前沿研究中,Anthropic在2022年发布的一篇关于模型可解释性(Interpretability)的论文中,揭示了一个非常迷人的发现——归纳头(Induction Heads: 一种特化的注意力头组合,能够识别并泛化'A...B... -> A... [预测B]'的模式)。这是大模型之所以能够展现出惊人的“上下文学习”(In-Context Learning: 无需更新权重,仅凭提示词中的示例就能学会新任务的能力)的核心数学机制之一。
归纳头通常在模型的较深层中涌现,它们学会了这样一种通用模式:如果在之前的上下文里见过“A后面跟着B”,那么当序列在后面再次出现“A”的时候,这个注意力头会立刻回看第一次出现“A”的地方,并把后面紧跟的“B”的Value信息提取过来,促使模型在下一步直接输出“B”。这就是大模型在面对你给它喂的Few-shot(少样本)示例时,能够迅速心领神会、照猫画虎地继续写下去的底层原理。
然而,注意力机制的强大也是有代价的。在标准的自注意力(Full Attention)计算中,由于序列中的每个token都要和包含自己在内的所有token两两进行匹配,其计算量和内存占用随着序列长度的增长呈二次方关系($O(N^2)$)。这意味着如果你的提示词长度翻倍,计算量会直接暴涨四倍。这也是长上下文推理成本高昂的物理死结,并直接推动了FlashAttention等硬件加速算法以及各种稀疏注意力方案的蓬勃发展。
多头注意力与分组查询注意力:多视角的代价与优化
在实际工程落地时,我们不会只让模型去算一次注意力。因为自然语言中的语义关系实在是太复杂了:既要保证主谓一致,又要理清代词的指代,同时还要兼顾局部短语结构和句间的长程逻辑。如果只用一组QKV(单头),模型很难同时兼顾如此多维度的联系。
因此,现代大模型全部采用的是多头注意力(Multi-Head Attention, 简称MHA: 并行运行多个独立QKV计算通道的机制)。通过并行运行多个注意力头,每个头可以独立去寻找和关注不同的语义维度。
这里必须纠正一个在很多通俗科普教程中经常被讲错的细节。很多人会误以为,多头注意力就是把一个比如4096维的原始token向量,死板地像切西瓜一样均匀切成32个128维的子向量,然后每个头分一块去计算。这完全是不符合实际情况的。
在真实的数学计算中,每个头都有自己独立且通过训练学习出来的投影矩阵。它是把完整的4096维向量,通过线性变换投影到一个属于该头专属的128维低维空间。这128个数字是整体4096维向量在特定角度下的“影子”,是一种经过学习的视角投影,而不是物理上的局部切片。
每个头独立在自己的空间里算完注意力并得到输出向量后,所有头的输出会被重新拼接(Concat)在一起,然后再经过一个最终的线性混合层,还原成4096维的完整向量宽度。
在模型训练完成后,研究人员去拆解这些头时,发现了非常有趣的自发特化现象:
- 有的头专门负责盯着句子的动词和它的宾语;
- 有的头专注于匹配“他/她/它”等代词到底指代前面哪个具体名词;
- 有的头只关注前后的相邻词(局部位置模式);
- 还有的头就是我们刚才提到的归纳头。
一个典型的70亿参数模型可能有32个层,每层有32个头,这意味着整个模型内部同时运转着上千个不同的“注意力观察哨”,它们各司其职,共同完成了对复杂语言世界的网状解构。
然而,多头注意力虽然能力强大,但在实际部署和推理时,却带来了一个极其沉重的内存包袱——KV缓存(KV Cache: 在自回归生成过程中,缓存历史Token的Key和Value向量以避免重复计算的机制)。为了保证生成新词时的速度,模型不能每生成一个字,就把前面写过的几千个字重新做一遍投影计算。它必须把历史token算好的Key和Value向量一直缓存在显存里。随着上下文越来越长、并发用户数越来越多,显存空间很快就会被这些堆积如山的KV Cache彻底榨干。
为了打破这个制约显存的瓶颈,近年来几乎所有的主流大模型都做出了一个关键的架构调整,从传统的多头注意力(MHA)转向了分组查询注意力(Grouped-Query Attention, 简称GQA)。
在GQA架构中,我们打破了“Query头、Key头、Value头数量严格1:1:1配对”的传统限制,而是让多组Query头去共享同一个Key和Value头。例如,在LLaMA-2 70B模型中,其设计比例是64个Query头只配对8个Key/Value头(8:1的比例)。
这种分组共享的设计带来的实际成效是震撼性的:它在几乎完全没有损伤模型语义理解精度的前提下,将KV缓存的显存占用直接斩去了近80%,极大地提升了显卡的并发吞吐量,降低了模型在实际商业化落地时的推理成本。
前馈网络与SwiGLU:静默运行的巨量事实记忆库
如果说注意力机制是token之间跨越空间的“信息迁徙与交谈”,那么在每一层中紧随其后的第二个部件——前馈网络(Feed-Forward Network, 简称FFN),就是每个token独自关闭大门进行的“深加工与脑暴”。
前馈网络在每个token向量上完全独立运行,不做任何跨token的信息混杂。它在结构上非常简单,通常按顺序只做三件事:
- 扩张:通过一个权重矩阵,把输入的4096维向量膨胀到更宽的维度(在经典的Transformer中是膨胀4倍到16384维,在现代使用SwiGLU的模型中会有微调)。
- 非线性激活:将膨胀后的数字通过一个非线性函数进行变换。
- 压缩:再通过一个权重矩阵,把膨胀后的向量压缩回原始的4096维。
我们必须重点拆解中间那个听起来有些古怪的“非线性激活”步骤。为什么神经网络里一定要有非线性函数?
因为在代数中,如果只进行纯线性的矩阵乘法,无论你把多少层叠在一起(比如把100个线性层串联),它们在数学上都可以被完美坍缩并等价为单单一个线性矩阵乘法。这意味着,没有非线性函数的堆叠,网络无论多深都只具有极为可怜的简单表达能力。
而非线性函数(如传统的ReLU,或者现代的SwiGLU)的作用,就是将一条直线的映射给“掰弯”。这种“掰弯”阻止了多层网络的数学坍缩,是深层神经网络能够完成极其复杂非线性拟合、展现出智能的数学根本原因。
在前馈网络的演进历程中,激活函数也经历了三代技术迭代:
- 原始Transformer使用的是最简单的 ReLU(负数归零,正数原样通过);
- 随后GPT和BERT家族升级为了更平滑的 GELU;
- 现代开源社区(LLaMA等)则几乎全员换装了性能更佳的 SwiGLU(Swish-Gated Linear Unit: 结合了门控机制与Swish激活函数的非线性映射结构)。
这里有一个可能会颠覆很多人常识的科学发现:在像LLaMA这样稠密的大模型中,实际上绝大部分的参数(权重数值)是存放在前馈网络(FFN)里的,而不是名声大噪的注意力机制中。
前馈网络就像是模型的“长期事实记忆库”。研究人员通过可解释性神经科学方法发现,前馈网络中特定神经元的激活状态与具体的现实概念或事实知识存在着强烈的耦合关系。例如,某个特定层FFN里的某个神经元,只要遇到和“埃菲尔铁塔”或者“编程语言的括号”相关的文本,就会发生强烈的电平激活。这意味着,大模型在预训练中所背诵下来的那些人类百科全书知识,有相当一部分被压缩并存储在了前馈网络的连接权重里。
基于这一物理性质,近年来学术界诞生了一项非常有前景的研究——模型编辑(Model Editing, 例如ROME算法: 通过直接修改前馈网络特定权重矩阵,实现对模型内部事实知识进行精准修正的技术)。
研究人员可以通过算法精确定位到负责存储某条知识的FFN权重位置,在不进行重新训练的情况下,做一次局部的权重修改,就能直接把模型脑子里的“埃菲尔铁塔在巴黎”更改为“埃菲尔铁塔在罗马”,并且修改后模型能完美自洽地用新事实进行后续的内容生成。虽然这目前还处于研究阶段,但它已经充分证明了前馈网络对于大模型知识存储的核心支柱作用。
混合专家模型(MoE):参数规模膨胀的减负密码
随着大模型性能竞争的白热化,业界达成了一个共识:模型的参数规模越大,往往意味着其蕴含的知识和推理能力越强。但如果继续使用“稠密(Dense)”的经典架构,即让每一个token计算时都去访问和激活模型的全部参数,那么推理所需的算力成本和延迟将会达到人类社会无法承受的极限。
为了打破这个物理屏障,现代顶级大模型普遍转向了混合专家模型(Mixture of Experts, 简称MoE: 将单一的前馈网络拆分为多个并行的“专家”,并由路由网络动态激活部分专家的架构)。
在MoE架构中,我们将原本那一整块巨大且笨重的前馈网络(FFN)拆分成数个并行的、规模较小的前馈网络,每一个小网络就称为一个“专家”(Expert)。同时,在它们前面设立一个非常轻量级的路由网络(Router: 根据当前Token特征,计算并决定将其派发给哪几个专家进行处理的决策模块)。
以著名的Mixtral 8x7B模型为例:它的每一层中都并排站立着8个专家,对于任意流经的单个token,路由网络通过计算只会挑选其中最契合的2个专家来进行激活和计算。
这种设计展现出了精妙的工程美学:Mixtral 8x7B虽然总共躺着高达467亿的物理参数,但在实际计算任何一个Token时,真正处于激活和工作状态的参数量只有大约129亿。
MoE的核心价值在于:它实现了“参数量”与“计算成本”的解耦。它允许我们在不显著增加推理算力开销和延迟的前提下,将模型的知识容量向上翻了数倍,这也是当前GPT-4等行业天花板大模型在后台广泛采用的基建架构。
残差连接与层归一化:极深网络的续命钢筋与安全阀
在介绍完注意力和前馈网络这两个核心的计算积木之后,我们必须把目光投向两个听起来不那么光鲜亮丽,但如果缺失了它们,整个深层大模型将瞬间分崩离析的基建部件——残差流与层归一化。
我们先来聊聊残差连接(Residual Connection: 将输入信号绕过子层直接与子层输出相加的旁路通道设计)。在层数极深(如几十层甚至上百层)的Transformer网络中,如果没有残差连接,会发生什么?
答案是:根本无法训练。因为在神经网络的“反向传播”训练过程中,误差信号需要从输出端一路往回传导到最前端的输入端以更新参数。但在穿过漫长且充满矩阵乘法的深层网络时,信号会遭遇毁灭性的梯度消失(误差信号在层层回传中指数级衰减至零)或梯度爆炸。
2015年,微软亚洲研究院的何恺明团队提出了残差网络(ResNet),完美地解决了这个世纪难题。残差连接的数学原理极其简单:每一层注意力或前馈网络的输出,不要直接去覆盖和替换原来的向量,而是和原本的输入向量进行逐元素相加: $$\text{Output} = \text{Input} + \text{SubLayer}(\text{Input})$$
这在网络内部架设了一条横跨所有层、直达底部的“加法高速公路”。因为在数学上,加法操作在求导时能让梯度信号无损地流过。借助这条高速公路,深达上百层的模型终于能够顺畅地将训练信号送回起点,使得极深网络的训练成为可能。
在现代可解释性研究中,这个由残差连接贯穿起来的连续向量空间被称为残差流(Residual Stream)。你可以把它想象成一条奔腾不息的信息干线,一路上,每个注意力头和前馈网络都扮演着“读写器”的角色:它们从残差流里读取当前向量的片断信息,做一番加工,然后将新的增量信息“写回”残差流,与原本的信息融为一体,共同奔向更深处。
然而,残差流的高速流转也伴随着失控的物理风险:由于一路上不断进行累加,数字的大小很容易在层层相加后彻底失控,导致数值爆炸或塌缩,导致训练崩盘。
为了约束这些脱缰的数字,我们需要在每个计算子块的前后安装“安全阀”——层归一化(Layer Normalization: 对单个样本在特征维度上进行均值和方差归一化,将数值强行拉回稳定区间的操作)。
在层归一化的演进中,有两个非常关键的工程改动奠定了今天大模型的稳定推理:
- 从Post-Norm到Pre-Norm:在原始Transformer中,归一化是放在每个子块之后的(Post-Norm),这被证明在深层模型中依然会导致训练极不稳定。现代模型无一例外地改为了在向量进入子块计算之前进行归一化(Pre-Norm),这是保障百层大模型能顺利训完的工程钥匙。
- RMSNorm的普及:为了追求极致的计算效率,现代大模型(如LLaMA)大多将传统的层归一化替换为了均方根归一化(RMSNorm: 一种只进行方差缩放、省去均值偏移计算的简化归一化算子)。因为实践证明,归一化的核心收益来自于方差缩放,砍掉均值偏移不仅不损效果,还能让计算变得更轻快。
可以说,残差流是强壮的骨骼,层归一化是血液的稳压器。有了这两个基石,大模型庞大的参数帝国才得以平稳运转。
生成循环与自回归解码:一字千金的创造之旅
当所有的隐藏层(通常有32到80层不等)全部完成了注意力和前馈网络的加工后,序列里最后一个token在最顶层输出的那个最终向量,就汇聚了前面所有上下文的精华语义。
大模型的任务是预测下一个词。为了做到这一点,这个最终的向量会被送入一个被称为Lm Head的投影层,映射回词表大小的空间。如果词表有10万个token,这里就会输出10万个实数。这些未归一化的原始得分被称为 Logits。
接着,这10万个Logits会再次通过Softmax函数,转化为总和为1的、指向这10万个候选词的概率分布。
在实际生成文本时,为了让回答不显得千篇一律、枯燥死板,模型并不会每次都生硬地去挑选概率最高的那个词,而是引入了几个控制生成多样性的关键解码参数:
- Temperature(温度):用于控制概率分布的平缓程度。温度设得极低(如接近0),概率分布会变得像针尖一样陡峭,模型会表现得极其严谨、确定性极强,适合回答客观事实;温度设得较高,分布会被“烫平”,各种低概率的奇思妙想词汇就会有机会脱颖而出,让输出极具创造性。
- Top-K 与 Top-P:用于在采样前截断概率列表,只保留排名前K个或者累计概率达到P%的候选词,防止模型抽风输出完全风马牛不相及的胡话。
一旦通过采样选定了一个新token(例如选定了“睡觉”这个词),这个token就会被立刻追加到你原本提示词的最末尾,成为输入序列的一部分。
然后,整个模型会重新启动,把这个加长了的序列送入输入端,重新跑一遍分词、嵌入、RoPE、注意力和前馈计算,去预测再下一个词。在这个循环中,KV缓存发挥了关键作用,避免了每次都要重新计算历史前缀的尴尬。这个循环会不断往复,直到模型在概率中抽到了特殊的“终止符”(EOS Token),或者达到了用户设定的最大长度上限。
你所看到的屏幕上如流水般涌现的精美回答,就是大模型后台这个庞大循环,以每秒几十个词的速度,一次一个Token硬生生给跑出来的。
在这里,我必须向所有读者强调一个极其重要、却经常被主流舆论所忽视的技术真相:预测下一个词(Next-Token Prediction),就是基础大语言模型(Base LLM)在预训练阶段所接受的唯一训练信号。
基础大模型在诞生之初,完全不知道什么是“对话”,不知道什么是“逻辑推理”,更不知道什么叫做“安全合规”。它只是在成吨的互联网垃圾文本和图书语料中,机械地去拟合“给定前文,预测后文最可能出现什么词”这一件事。
你今天所感受到的,ChatGPT或Claude那礼貌而充满逻辑的对话姿态、严格遵循指令的服从度,全都是在基础模型训练完成后,在后训练阶段(Post-Training: 包含监督微调SFT与基于人类反馈的强化学习RLHF等对齐工艺的阶段)被人工塑造出来的,是后天微调的产物,而非这个庞大数学骨架预训练时的本能。
为了提升这个单字生成循环的物理速度,现代工业界还广泛应用了一项名为投机解码(Speculative Decoding)的加速技术。
它的核心直觉是:既然大模型的计算如此昂贵,我们能不能先用一个参数量极小(比如只有1亿参数)的“草稿模型”快速地在前面盲猜5个Token,然后把这5个Token打包一次性喂给大模型进行并行验证?
因为大模型并行验证多个Token的计算速度,几乎和它自己生成一个Token的速度是一样快的。如果草稿模型猜中了(即大模型评估这几个词的概率也是可接受的),模型就会直接采纳并向前推进;如果中间猜错了,大模型就退回到出错的位置,由自己接管并重新计算。
这种“小弟探路,大哥把关”的策略,在数学概率上被证明与完全使用大模型生成是100%等价且无损的,但却能将整体的生成速度提升1.5到2.5倍,是目前各大云端推理厂商赖以生存的省钱秘诀。
技术收敛与未来的演进
走到这里,我们已经完整地陪同你的提示词,在这个由硅基晶体管和浮点数构建的庞大网络帝国里旅行了一圈,见证了它从冰冷的行号数字,被赋予语义与位置,经历网状的信息交换与深度的记忆提取,最终化为概率分布并吐出文字的全过程。
最后,我们可以回过头来看看那个大众经常感到困惑的问题:OpenAI的GPT、Anthropic的Claude、Google的Gemini、Meta的LLaMA,这些名震天下的大模型,它们到底差在哪?
坦率地说,因为激烈的商业竞争,各家顶级闭源模型的底层细节绝大部分都属于最高商业机密。但根据开源社区的实践和学术界的共识,我们可以笃定的是:它们在核心骨架层面上,全部收敛并坐落在同一个Transformer家族的设计空间里。它们都共享着我们今天所解构的这套物理积木。
当前前沿模型与开源社区之间真正差异,主要体现在以下三个维度:
- 权重的质量(The Weights):即在几万亿Token的高质量私有数据上,花费数千万美元电费,用超级显卡集群实打实训练出来的那些最终的参数矩阵数字。这是模型最核心的壁垒。
- 超参数与架构配置(Hyperparameters):例如具体堆叠了多少层、词表选择多大、选用稠密网络还是MoE、路由策略如何制定。
- 后训练对齐技术(Alignment):各家独特的RLHF偏好引导、安全红队测试的严苛程度,这直接决定了模型表现出来的是像一个博学儒雅的绅士,还是一个呆板保守的答题机器。
一个非常有意思的行业观察是:在2023年到2025年这一波技术竞逐中,整个机器学习业界在技术路线上展现出了惊人的收敛性。不论是前沿闭源模型还是最顶尖的开源项目,大家在底层部件的选型上几乎达成了一致:Pre-norm结构、RMSNorm归一化、RoPE位置编码、SwiGLU激活函数、GQA分组注意力,再加上大尺寸模型上的MoE架构。
这种技术大统一在机器学习的发展史上其实是相当反常且少见的。在过去,这个领域极其推崇“专兵专器”——做图像的用CNN,做语音的用RNN,彼此的技术栈老死不相往来。
而如今,Transformer不仅统治了自然语言,还作为核心骨架横跨了图像生成、多模态视频理解、音频合成等几乎所有人工智能子领域,把整个人工智能的科研力量紧紧地拧在了一起。
当然,这种收敛并不代表技术的终结。围绕着Transformer处理超长文本时的计算代价瓶颈,学术界也一直在试图寻找颠覆性的替代方案。例如以 Mamba 为代表的新一代状态空间模型(State Space Model, 简称SSM),就在数学上实现了计算复杂度随长度线性增长($O(N)$)的优异特性,在长文本处理上展现出了强大的潜力,各种Mamba与Transformer的混合架构也正处于火热的探索期。
但无论未来的新架构如何变迁,分词编码、特征向量嵌入、相对位置映射、多维度的信息交换、关门独立的事实处理、残差稳压以及逐步的概率生成,这些都是任何序列处理模型所必须以某种形式解决的物理本质问题。
大语言模型绝对不是科幻作品中描述的那种不可名状的超自然魔力,也不是一个不可知晓的绝对黑箱。它是由人类顶尖的科学家和工程师,用一个个具体的数学公式和精妙的工程积木,历经数十次迭代打磨,一片一片拼装出来的精密机器。
对技术保持一种“祛魅”的态度,看清它厉害的真实边界,不仅能帮助我们更清醒、更高效地去驾驭和使用这些AI工具,也能让我们在面对汹涌而来的技术未来时,少一分无谓的恐慌,多一分底气与从容。