【LLM】从零开始学大语言模型 | SSM篇 | 3 | S4 Model 简洁

S4 Model 简洁:一个 SSM Block 内部到底在做什么 上一篇文章介绍了 SSM 的数学基础和典型 Block 结构。本文将聚焦于 S4(Structured State Space Sequence Model)这个 SSM 家族中第一个真正取得工程成功的模型,逐个拆解 S4 Block 中每个组件的任务、输入、输出和设计目的。 本文的讲解方式类似讲解 Transformer Block:先讲整体架构,再逐个组件说明"它是什么、它做什么、它为什么存在",不涉及数学优化和工程优化的细节。 一、S4 的整体定位 S4 于 2021 年提出,是第一个在长序列建模任务上全面超越 Transformer 的 SSM 模型。它在 Long Range Arena(LRA)基准上取得了全面领先的成绩——按原始 LRA 六项任务的算术平均来看,S4 约为 81.84%,而当时的 Transformer 变体约为 45%。 数据注记:有的总结材料里会把 S4 在 LRA 上的平均准确率写成约 86.1%。这个数字和上文按六项明细算出的 81.84% 并不完全吻合,可能来源于不同的报告版本、是否包含特定任务变体、加权平均还是算术平均等差异。读者如果在写作或复习时引用这一数据,建议优先以逐任务明细为准,并注意区分“某一版本汇总的平均值”和“从明细算出的算术平均”。 S4 的核心贡献不在于改变了 SSM 的基本方程,而在于解决了两个实际问题: 如何初始化矩阵 $\mathbf{A}$: 通过 HiPPO 理论推导出理论上最优的 $\mathbf{A}$ 矩阵,使 SSM 从一开始就具备长程记忆能力。 如何高效计算: 通过 DPLR(对角加低秩)结构和 Z 变换,将卷积核计算的复杂度从 $O(LN^2)$ 压缩到 $O((L+N)\log(L+N))$。 但这些优化细节将在后续的优化篇中讲解。本文先专注于 S4 Block 的架构本身。 ...

September 6, 2026 · 4 min · 743 words · c.w.

【LLM】从零开始学大语言模型 | SSM篇 | 2 | SSM入门

SSM 入门:从连续微分方程到离散递推 上一篇文章我们从宏观角度介绍了 SSM 的定位和优势。本文将进入 SSM 的数学基础:连续时间的线性状态空间方程如何定义、如何离散化为计算机可执行的递推公式、离散化后如何获得"循环"和"卷积"两种等价视角,以及一个完整的 SSM Block 由哪些组件构成。 本文的目标是让读者建立起对 SSM 的初步知识体系,不涉及后续的数学优化和工程优化。 一、连续时间的 SSM 方程 1. 两个核心方程 在连续时间 $t$ 下,一个线性状态空间模型由两个方程定义。 状态方程: $$h’(t) = \mathbf{A}h(t) + \mathbf{B}x(t)$$ 其中 $h’(t)$ 是 $h(t)$ 对时间 $t$ 的导数,即 $\frac{dh(t)}{dt}$。这个方程描述的是:在当前时刻,内部记忆 $h(t)$ 的变化率由两部分决定——自身当前状态 $\mathbf{A}h(t)$ 和新输入 $\mathbf{B}x(t)$。 观测方程: $$y(t) = \mathbf{C}h(t) + \mathbf{D}x(t)$$ 这个方程描述的是:如何从当前的内部记忆 $h(t)$ 中提取出我们关心的输出 $y(t)$。 2. 各变量的含义 $x(t) \in \mathbb{R}^d$:当前时刻的输入信号。在 NLP 中,这是某个 token 的 Embedding 向量。 $h(t) \in \mathbb{R}^N$:当前时刻的隐藏状态,即模型对历史信息的"记忆快照"。 $y(t) \in \mathbb{R}^d$:当前时刻的输出信号,将传递给下一层或用于最终预测。 $\mathbf{A} \in \mathbb{R}^{N \times N}$:状态转移矩阵。它控制记忆如何随时间自然演化。如果 $\mathbf{A}$ 的特征值为负,记忆会随时间衰减(遗忘旧信息);如果为正,记忆会指数增长(数值爆炸)。 $\mathbf{B} \in \mathbb{R}^{N \times d}$:输入投影矩阵。它控制新输入以多大的强度和方式写入状态。可以理解为一个"写入阀门"。 $\mathbf{C} \in \mathbb{R}^{d \times N}$:输出投影矩阵。它控制如何从状态中提取输出。可以理解为一个"读取探针"。 $\mathbf{D} \in \mathbb{R}^{d \times d}$:直接穿透矩阵,代表输入绕过记忆直接到达输出的路径。在实际的深度学习 SSM 中,$\mathbf{D}$ 通常被设为 0 或极小常数,因为它不经过记忆,对序列建模没有实质贡献。 三个核心参数的分工可以概括为:$\mathbf{B}$ 负责写入,$\mathbf{A}$ 负责维持和遗忘,$\mathbf{C}$ 负责读出。 ...

September 6, 2026 · 4 min · 752 words · c.w.

【LLM】从零开始学大语言模型 | SSM篇 | 1 | SSM介绍

状态空间模型(SSM):从 RNN 与 Transformer 的困境出发 在序列建模的发展历程中,RNN 和 Transformer 是两座绕不过去的丰碑。RNN 以递推的方式逐步处理序列,结构简洁但受困于串行计算和长程依赖问题;Transformer 用自注意力机制彻底解决了长程依赖和并行化训练的难题,却引入了序列长度平方级的计算和显存开销。 这两种架构各有不可忽视的缺陷。有没有一种可能,让序列模型同时拥有 RNN 推理时的高效和 Transformer 训练时的并行? 这就是 SSM(State Space Model,状态空间模型)试图回答的问题。本文将从 RNN 和 Transformer 的痛点出发,解释 SSM 是什么、它为什么能做到"鱼与熊掌兼得",以及它从 2020 年到 2024 年的演进路线。 一、RNN 与 Transformer 的痛点 1. RNN 的核心问题 RNN(包括 LSTM、GRU)的核心是隐藏状态的递推更新:$h_t = f(h_{t-1}, x_t)$。这种递推结构带来了两个根本性问题。 第一,训练无法并行。 由于 $h_t$ 强依赖于 $h_{t-1}$,序列中不同时间步的计算必须严格串行进行。在 GPU 这种为大规模矩阵并行运算设计的硬件上,RNN 的训练效率极低。假设序列长度为 $L$,RNN 的训练需要 $L$ 个串行时间步,无法像矩阵乘法那样在 GPU 上一次算完。 第二,长程依赖衰减。 即使有 LSTM 的门控机制缓解梯度消失问题,当序列长度达到数千甚至数万时,信息从第一个 token 传递到最后一个 token 仍然需要经过漫长的递推链路,每一次传递都会有信息损耗。就像传话游戏,传的人越多,最后听到的内容和最初说的偏差越大。 2. Transformer 的核心问题 Transformer 用自注意力机制解决了 RNN 的两个痛点:通过计算所有 token 之间的两两相关性,实现了全局信息的直接交互和完全并行的训练。但这个解决方案引入了新的代价。 ...

September 6, 2026 · 3 min · 477 words · c.w.

【SSM】状态空间模型 | 1 | SSM入门

为什么需要 SSM?——状态空间模型第一课:从 RNN 与 Transformer 的痛点,到状态空间模型的数学骨架 如果你已经了解了 RNN 和 Transformer 的基本原理,那么这篇文章要回答的核心问题只有一个:在 RNN 和 Transformer 已经统治序列建模的今天,我们为什么还需要一种新的架构——状态空间模型(State Space Model, SSM)? 我们会先看清两位"前辈"各自的结构性缺陷,然后一步步揭开 SSM 的数学面纱,把它的骨架、直觉、与 RNN 的对应关系彻底讲清楚。 一、课程导论:为什么需要 SSM? 1. RNN 的痛点:传话游戏的困境 RNN(包括 LSTM/GRU)的核心是隐藏状态的逐步递推:$h_t = f(h_{t-1}, x_t)$。这个看似简单的结构有两个难以克服的缺陷。 计算上的痛:串行诅咒。 因为 $h_t$ 强依赖于 $h_{t-1}$,你无法并行计算序列中不同时间步的状态——必须先算出 $t-1$ 时刻,才能算 $t$ 时刻。GPU 是为大规模并行矩阵乘法而生的硬件,RNN 的这种串行依赖让硬件的并行能力无处施展,训练效率极低。 记忆上的痛:长程依赖。 就像玩"传话游戏",信息每传递一次就会有损耗。即使有 LSTM 的门控机制,当序列长度达到几千甚至上万时,梯度消失或爆炸问题依然会让模型"忘记"开头的信息。 2. Transformer 的痛点:全班互相对答案的代价 Transformer 用自注意力机制(Self-Attention)彻底解决了长程依赖和并行计算问题,代价是计算所有 token 之间的两两相关性 $QK^\top$。注意力机制的计算复杂度和显存占用是序列长度 $L$ 的平方级 $O(L^2)$。 直觉上感受一下这个平方增长的威力:序列长度为 10 时,需要计算 100 次关联;长度变成 1000 时,计算量直接暴增到 1,000,000 次。当上下文窗口扩展到 128K 甚至 1M 时,显存会溢出(OOM),算力成本极其高昂。 ...

September 3, 2026 · 4 min · 751 words · c.w.

【LLM】从零开始学大语言模型 | 9 | Vision Transformer

跨界与融合:从视觉 Transformer (ViT) 到多模态大模型的底层逻辑 在前面的文章中,我们已经看到 Transformer 在自然语言处理中一路高歌猛进。但 Transformer 真正令人震撼的地方,不只是它能处理文字,而是它的架构具备极强的通用性——同样的 Self-Attention 机制,稍加改造,就能处理图像、音频、甚至跨模态的信息。 本文将沿着三个核心问题展开:第一,ViT 是如何让 Transformer “看”懂图片的?第二,CLIP 是如何让模型同时理解图片和文字的?第三,现代多模态大模型(如 GPT-4V、Qwen-VL)是如何将视觉与语言能力融为一体的? 我们将从 ViT 的核心机制出发,逐步深入到 CLIP 的对比学习原理,再到现代多模态大模型的底层工程逻辑,带你透视大模型跨界与融合的完整脉络。 一、 图像如何变成“序列”?视觉 Transformer (ViT) 的核心机制 在 2020 年之前,计算机视觉是卷积神经网络(CNN)的绝对天下。CNN 通过卷积核在图像上滑动,提取局部特征。然而,Google 的研究人员提出了一个大胆的想法:放弃卷积,将图像转化为序列,直接喂给标准的 Transformer Encoder。这就是 ViT(Vision Transformer)的诞生。 1. 图像切块与线性映射的数学等价性 Transformer 无法直接处理二维的像素矩阵,因此 ViT 的第一步是将图像“序列化”。假设输入一张 $224 \times 224$ 像素的图片,ViT 会将其像切披萨一样,切割成 $16 \times 16$ 像素的小块(Patch)。总共会得到 $(224/16) \times (224/16) = 196$ 个 Patch。 接下来是展平(Flatten)与线性映射(Patch Embedding)。每个 $16 \times 16$ 的 RGB Patch 包含 $16 \times 16 \times 3 = 768$ 个像素值。在计算机内存中,这些像素按行优先(Row-major)的顺序连续存储。展平机制就是直接将这 768 个数字“拉直”,变成一个长度为 768 的一维向量 $x_{patch}$。随后,通过一个可学习的权重矩阵 $W$(形状为 $[768, 768]$),进行矩阵乘法 $x_{embedded} = x_{patch} \times W$,将其映射到 Transformer 能处理的特征空间。 ...

August 26, 2026 · 4 min · 733 words · c.w.

【LLM】从零开始学大语言模型 | 8 | Decoder-only架构和GPT

Decoder-only 架构与 GPT 家族:从单向预测到大语言模型时代 在学习 BERT 时,我们看到 Transformer 的 Encoder 可以通过双向注意力充分理解上下文,从而完成分类、标注、匹配等任务。但如果把视线转向今天最主流的大语言模型,会发现另一条路线取得了压倒性成功:只保留 Decoder 的 Decoder-only 架构。这一路线的代表就是 GPT 家族。 从表面上看,Decoder-only 似乎比完整的 Encoder-Decoder 更“残缺”:它没有 Encoder,也没有 Cross-Attention,只能从左到右地看前文。但正是这种看似简单的结构,配合大规模数据、大规模算力和“预测下一个 Token”的训练目标,最终催生出了具备强大生成、推理和上下文学习能力的大语言模型。 本文将系统梳理 Decoder-only 架构的设计动机、GPT 的训练方式、从 GPT-1 到 GPT-3 的范式变化,以及现代大模型中常见的工程与结构改进,包括稀疏注意力、MoE、SwiGLU、RMSNorm、GQA/MQA 等。对于学习过程中常见的疑问,例如“GPT 是不是只是更大的工程堆叠”“预测下一个 Token 的损失函数如何定义”“为什么 GPT 可以不做微调”“In-context Learning 是否有理论依据”“MoE 的专家是不是预先训练好的”等,也会自然地融入正文解释中。 一、为什么 GPT 选择 Decoder-only 1. Encoder 与 Decoder 的分工 完整 Transformer 包含两部分: Encoder:擅长理解输入序列。它的 Self-Attention 通常允许每个位置同时看到左右上下文,因此可以构建双向语义表示。 Decoder:擅长生成输出序列。它通过 Causal Mask 限制每个位置只能看到自己之前的位置,从而保证生成过程符合从左到右的顺序。 因此,Encoder 更像是一个“阅读理解器”,Decoder 更像是一个“逐字写作器”。 BERT 选择了 Encoder 路线,通过完形填空任务学习双向语义表示。GPT 则选择了 Decoder 路线,通过不断预测下一个词元来学习语言生成能力。 ...

August 25, 2026 · 7 min · 1426 words · c.w.

【LLM】从零开始学大语言模型 | 6 | Encoder-Decoder和掩码

Encoder-Decoder 架构与 Mask 机制:从翻译模型到自回归生成 在理解了 Attention、Multi-Head Attention、FFN 以及 Transformer Block 之后,我们已经拥有了一个可以反复堆叠的基础模块。下一步要回答的问题是:这些模块如何组成一个完整的模型?在 2017 年的论文《Attention Is All You Need》中,Transformer 被设计成一个 Encoder-Decoder 架构,最初主要用于机器翻译这样的序列到序列任务。也就是说,输入是一段序列,输出也是一段序列,而且输入和输出长度可以不同。 这篇文章将从整体架构、Decoder 的特殊结构、Mask 机制、训练时的 Loss 与反向传播,以及多层 Decoder 中 Cross-Attention 的 KV 来源几个方面,把 Encoder-Decoder Transformer 的工作方式完整梳理一遍。 一、从单个 Transformer Block 到 Encoder-Decoder 架构 1. Encoder 与 Decoder 的分工 可以把 Encoder-Decoder 结构理解成一个翻译官的工作台。 左侧是 Encoder,也就是编码器。它的任务是深度阅读源语言。例如输入一句中文:“我 / 爱 / AI”,Encoder 会通过多层网络逐步理解这些词之间的关系:谁是主语,谁是谓语,哪个词修饰哪个词,整句话的整体语义是什么。经过若干层 Encoder Block 之后,模型得到的不是一串孤立的词向量,而是一组包含上下文信息的特征向量。可以把它看作 Encoder 对源语言句子进行抽象压缩后得到的“语义表示”。 右侧是 Decoder,也就是解码器。它的任务是逐字生成目标语言。例如它要生成英文:“I / love / AI”。Decoder 不能像 Encoder 那样一次性随意看完整句目标语言的全部内容,因为在真正生成文本时,模型只能依赖已经生成的内容。Decoder 需要一边参考 Encoder 对源语言的理解,一边根据当前已经生成的词预测下一个词。 ...

August 21, 2026 · 6 min · 1093 words · c.w.

【LLM】从零开始学大语言模型 | 7 | Encoder-only架构和BERT

Encoder-only 架构与 BERT 家族:理解型大模型的构建方式 在 Transformer 的完整结构中,Encoder 与 Decoder 共同组成了一套既能理解文本、又能生成文本的模型框架。但在真实工业应用中,不同任务对模型能力的要求并不相同。有些任务需要模型不断生成新的词元,例如机器翻译、对话生成、文章续写;而另一些任务只需要模型读懂输入文本,然后给出判断、分类、标注或打分。 正是因为任务目标不同,Transformer 在后续发展中逐渐演化出了几类典型架构。其中第一类,就是专门面向文本理解任务的 Encoder-only 架构。这一方向最具代表性的模型,是 Google 在 2018 年提出的 BERT。 本文将系统梳理 Encoder-only 架构的设计动机、BERT 的核心训练任务、特殊 Token 的作用,以及“预训练 + 微调”这一改变 NLP 发展路径的技术范式。同时,我也会把一些常见疑问自然地融入解释中,例如:BERT 的伟大是否主要来自训练任务设计?微调时所谓“在顶层加一个分类器”到底是什么意思?Encoder-only 模型最后输出的矩阵又如何接到具体任务上? 一、从完整 Transformer 到 Encoder-only 1. Encoder 的特长:双向理解上下文 在原始 Transformer 中,Encoder 的职责是接收一段输入序列,并通过多层 Self-Attention 和前馈网络,为序列中的每个词元生成富含上下文信息的表示。 Encoder 的关键特点是:它的 Self-Attention 通常不限制词元之间的可见范围。对于输入序列中的任意一个词元,它既可以关注左侧上下文,也可以关注右侧上下文。也就是说,模型在表示一个词时,能够同时利用这个词前后的信息。 举例来说,对于句子: 我 今天 去 买 了 苹果 如果要理解“苹果”这个词的含义,模型不仅可以看到左侧的“我 今天 去 买 了”,也可以在条件允许时看到右侧可能出现的词。虽然这个例子右侧可能没有更多内容,但在更复杂的句子中,右侧上下文常常非常重要。例如: He deposited some money in the bank(他在银行存了钱) 与: ...

August 21, 2026 · 4 min · 846 words · c.w.

【LLM】从零开始学大语言模型 | 5 | Transformer

从多头注意力到完整 Transformer Block:结构、原理与训练逻辑的系统讲解 本文假设你已经了解词向量、位置编码以及单头 Self-Attention 的基本思想。在这个基础上,我们继续向前推进:为什么单头注意力不够用?多头注意力到底在做什么?Attention 之后为什么还要接一个前馈网络?残差连接和层归一化为什么是深层 Transformer 能够训练的关键?最终的 Transformer Block 又如何组成一个完整的语言模型? 我们会尽量把这些问题放在同一条主线里讲清楚:以一个"预测下一个词"的语言模型为例,从输入词向量开始,一步一步说明数据如何被加工,参数如何被训练,以及每个组件为什么必须存在。 一、从任务出发:Transformer 在语言模型中做什么 1. 语言模型的核心任务 为了让讨论有明确的目标,我们采用现代大语言模型最常见的训练任务之一:预测下一个词。 给定一句话的前半部分,例如: 今天天气真好,我想去 模型的任务是预测下一个最可能出现的词,例如: 公园 这看起来只是"猜下一个词",但要做好这件事,模型需要理解词义、语法、指代关系、常识推理,甚至语气和语境。因此,Transformer 并不是简单地查表,而是要把原始词向量逐层加工成更适合预测的语义表示。 2. Transformer 的整体流水线 一个典型的 Decoder-only 语言模型,前向过程大致可以概括为: 词编号 → 词嵌入与位置编码 → 多个 Transformer Block → LM Head → 下一个词的概率分布 更具体地说: 输入文本首先被切成 token,并转换为整数编号。 每个 token 编号通过词嵌入矩阵变成一个稠密向量。 为了让模型知道 token 的位置,再加入位置编码。 得到的向量矩阵进入第一个Transformer Block。 经过多个 Block 的逐层加工后,得到更高层的语义表示。 最后的 LM Head 将某个位置的隐藏向量映射到词表大小的 logits。 通过 Softmax 得到下一个词的概率分布。 如果输入序列的形状是 [batch_size, seq_len, d_model],那么经过每一个 Transformer Block 后,形状通常保持不变,仍然是 [batch_size, seq_len, d_model]。也就是说,Block 的工作不是改变序列长度或向量维度,而是不断改变每个 token 向量内部的语义内容。 ...

August 21, 2026 · 6 min · 1135 words · c.w.

【LLM】从零开始学大语言模型 | 4 | Attention

从注意力机制到自注意力与位置编码:Transformer 核心机制详解 在这篇文章中,我们从一个非常自然的问题出发:为什么深度学习在处理序列信息时,会从 RNN 逐渐走向 Attention,再进一步走向 Transformer 中的 Self-Attention?我们会把注意力机制的直觉、数学公式、工程意义,以及它与 RNN 的本质区别讲清楚,并进一步讨论 Self-Attention 中非常关键的缩放因子、位置信息丢失和位置编码问题。 为了避免概念混乱,本文会特别澄清几个常见误解:Attention 不是简单地把 RNN 的隐藏状态替换成 Q、K、V;W_Q、W_K、W_V 也不是所谓“三层感知机”;早期 Attention 与现代大模型中常见的 Self-Attention 之间既有历史联系,也有本质差别。 一、从 RNN 的串行记忆到注意力机制的直觉 1. RNN 的串行记忆为什么容易遗忘 在 RNN 中,序列通常是一个词一个词地被处理。假设当前时刻的输入是 $x_t$,上一时刻的隐藏状态是 $h_{t-1}$,那么当前时刻的隐藏状态可以写成: $$ h_t = \tanh(W_{hh}h_{t-1} + W_{xh}x_t+b) $$ 这里最重要的角色是隐藏状态 $h_t$。它可以被理解为 RNN 的“记忆胶囊”:模型把之前看到的信息压缩进这个向量里,然后带着这个向量继续往下走。 这种方式在短序列上很自然,但问题也很明显。 首先,信息必须一站一站传递。第 1 个词的信息要先影响第 2 个词,再影响第 3 个词,一直传到第 100 个词。换句话说,如果第 100 个词想知道第 1 个词说了什么,它只能依赖前面经过 99 次传递后残留下来的状态。 其次,隐藏状态通常是固定维度的向量。无论句子有多长,所有历史信息都要被压缩进同一个有限空间里。这样一来,早期信息很容易被后来的信息覆盖、稀释或干扰。 这就是 RNN 长距离依赖困难的根源:不是模型“不想记住”,而是它的结构决定了信息必须通过一条很长、很窄、不断被压缩的通路传递。 2. 人类阅读中的选择性关注 我们来看一个很常见的英文句子: The animal didn’t cross the street because it was too tired. ...

August 21, 2026 · 7 min · 1313 words · c.w.