从零实现大模型:前向计算与特征空间变换详解

从张量形态变化角度拆解大语言模型的前向计算原理
南京大学《大语言模型基础》第二讲以"模型即函数"为起点,通过张量shape变化这一核心分析工具,将大模型的前向计算拆解为可理解的矩阵运算与特征空间投影。课程涵盖三维/四维张量结构、线性层的数学本质、残差连接、PyTorch的init/forward工程规范等内容,强调从实现出发理解模型运行机制。
引言:把大模型拆解成一次次张量运算
南京大学计算机学院的《大语言模型基础之从零到一实现之路》系列课程,正在以一种极为浓缩、贴近工程实现的视角,带学生从最底层理解大语言模型的运行机制。在第二讲(L2)中,主讲老师聚焦一个核心问题:模型是如何完成前向计算的? 副标题「特征空间的变换」则揭示了这一过程的数学本质。
这堂课的定位很清晰——不是照本宣科的深度学习理论课,而是以快节奏把最基础但最关键的概念补齐,帮助没有相关背景的学生建立对模型运行的直观认知。课程的一大特色是:始终围绕张量(Tensor)的形态变化来理解模型,而不是停留在抽象的架构名词上。

模型即函数:前向与反向传播的由来
从最本质的层面看,任何深度学习模型都可以理解为一个函数 f(x)。你输入一个 x,经过内部计算,输出一个 y。这个过程在早期并没有「前向」这样的专门叫法,就是一次普通的函数执行、一次推理过程。
那么「前向」(forward)一词从何而来?关键在于模型内部有一个需要学习的参数 W。经典的学习算法叫反向传播(Back Propagation),即从输出 y 沿着计算路径反推回输入 x 的方向去更新参数。既然有了「反向」的说法,那么从 x 到 y 的计算自然就被称为「前向计算」。
在 PyTorch 中,这一概念被固化为工程规范:每一个继承了 nn.Module 的模型模块,都必须实现一个 forward 方法。当你把 x 输入模型对象时,框架会自动触发 forward 完成计算。而反向传播则由 PyTorch 的自动微分机制帮你完成——在应用层面,开发者只需关注前向实现即可。
模型的骨架:init 与 forward 方法
一个标准的 PyTorch 模型类通常包含两个核心函数:
__init__(初始化):负责「静态」部分,即像搭积木一样定义模型有哪些层、参数如何初始化。forward(前向):负责「动态」部分,描述当输入 x 到来时,数据如何在各层之间流动、如何完成计算。
无论是 HuggingFace 的 Transformer 源码,还是任何复杂的大模型实现,这个「init + forward」的结构都是一致的,只是代码规模更大、模块嵌套更深而已。
模型输入解析:三维与四维张量结构
模型的输入 x 本质上就是一个张量(Tensor)。以自然语言模型为例,输入通常是一个三维张量,其三个维度分别是:
- B(Batch):请求或样本的数量。比如 10 个用户同时发来 prompt,B 就是 10。
- S(Sequence):每条 prompt 的序列长度,即 token 的数量。
- D(Dimension):每个 token 对应的特征向量维度,如 4096(4K)、8192 或 128 维。
这里有一个关键洞察:前两个维度只是「数量」的表示,真正承载语义信息的是最后一维的向量。 每个 token 都被表示为一个由若干浮点数组成的高维向量,这些数值是模型在训练过程中学习出来的,人类难以直接解读,但模型能据此理解语义。
至于四维张量,则通常出现在多头注意力机制(Multi-Head Attention) 中——将 4K 的维度平均切成若干份(如 8 份),就可以按四维张量的方式排列和处理。

特征空间变换:线性层的数学本质
课程的核心概念「特征空间的变换」在这里得到了具象化的解释。深度学习模型被称为「表示学习」(Representation Learning),其核心目的就是让模型学会用一个高维向量来「表示」token 或样本。
老师用一个猫狗四分类的例子生动说明了这一过程:输入时,各种颜色的猫狗混杂在一起、无法区分;但经过深度模型的多层变换后,在最终的高维特征空间中,相同类别会聚集在一起,从而变得线性可分——只需用一条线就能把不同类别切分开。
这就是特征空间变换的意义:不管输入是什么样的空间表示,通过一次矩阵运算,它就会被投影到另一个更适合下游任务的空间中。
从线性回归到深度网络的演进
经典的线性变换公式是 y = xW + b。如果只做一次这样的变换直接得出结果,就是「浅层模型」。而深度学习的精髓在于堆叠:把上一层的输出作为下一层的输入,反复变换,并在中间插入非线性的激活函数。
回顾这段发展历史:早年这类模型只叫「神经网络」(Neural Network),因为层数叠高后会遇到梯度消散问题,训练难以收敛。直到 2010 年前后,一系列技术突破解决了深层网络的训练难题,「Deep」一词才被冠上,于是有了深度神经网络(DNN)。今天的大语言模型本质上就是一种堆叠了数十甚至上百层的深度神经网络。
从Shape视角理解矩阵运算
这堂课反复强调的方法论是:通过观察输入、输出和参数的 shape(形态)变化来理解模型的每一步运算。
以线性层为例,一个 BHD 维度的输入张量,乘以一个 D×E 的权重矩阵 W,得到 BHE 维度的输出。回顾线性代数的基本规则:M×N 的矩阵乘以 N×K 的矩阵得到 M×K,中间维度 N 被消掉。当输入是三维张量时,B 维可以理解为「批量维度」——有 B 个矩阵各自与同一个 W 做运算。
从 token 的视角看则更为直观:输入有 B×H 个 token,每个 token 从 D 维空间通过一次线性变换投影到 E 维空间。同一个 W 矩阵被所有 token 复用,这正是参数共享的体现。
广播机制与逐元素运算
PyTorch 中,@ 表示矩阵乘法,* 表示逐元素乘法(element-wise multiplication)。此外还有一个重要机制——广播(Broadcasting)。
当一个三维张量要加上一个一维的 bias 向量时,按照严格的数学定义本不成立,但 PyTorch 会按规则从右往左扫描维度,自动补全低维张量的形态,使其与高维张量对齐后再运算。需要注意的是:广播不是随意进行的,而是遵循严格规则,一旦 shape 无法对齐就会报错。

参数管理与模块化模型构建
与不断变化的输入 x 不同,W 和 b 是模型的静态参数。在 PyTorch 中,它们被 nn.Parameter 封装,从而获得一系列便利功能:
- 参数统计:自动汇总模型的参数量(如 7B、13B 模型的规模就是这么计算出来的)。
- 设备迁移:通过
model.to(device)一次性将所有参数从 CPU 内存搬到 GPU 显存。 - 保存与加载:通过 state_dict 管理参数的定位、替换与持久化存储。
搭积木:从线性层到完整的前馈网络
课程展示了如何用线性层搭建一个迷你的 FFN(前馈网络)模块:先通过 up 层将向量升维(如 4K→8K),经过激活函数(如 SwiGLU 门控激活),再通过 down 层降回原维度。
更进一步,课程还引入了残差连接(Residual Connection) 的概念——类似电路的并联结构,输入 x 一路做计算、一路原样复制,最后用加法合并。这种设计是深度模型能够训练更多层的关键技术之一。
值得注意的一个工程细节:在大语言模型中,线性层默认不带 bias,创建时通过设置 bias=False 关闭偏置项;而传统计算机视觉模型(如 ResNet)则通常保留 bias。
课程亮点与动手实践
这门课程还有一个突出特点是其强烈的实践导向。课程与华为达成合作,将引入华为的 Agent 框架(Open9n),并计划为选课学生发放国内大模型的 API token 额度用于完成大作业。
在作业设计上,A0 作业要求学生手动实现一个线性层,包括显式保存前向输入、手动计算反向传播——这需要运用偏导数和链式法则的数学知识。建议学习者提前回顾高等数学中的求偏导内容,为后续反向传播的学习做好准备。
总结
L2 这堂课以「模型即函数」为起点,用张量的 shape 变化作为贯穿始终的分析工具,把大语言模型的前向计算拆解为一次次可理解的矩阵运算与特征空间投影。核心要点可以归纳为:
- 理解模型的关键在于理解张量的形态变换;
- 线性层的本质是把 token 从一个维度空间投影到另一个空间;
- 深度来自堆叠与非线性激活的组合;
- PyTorch 的 init/forward 结构是所有模型的通用骨架。
这种「从实现出发、以 shape 为锚点」的教学思路,对于希望真正理解大模型运行原理而非停留在概念层面的学习者,极具参考价值。
相关推荐

GPT-6 Astra对决Fable 5.1:基准高分为何输给实战体验
GPT-6 Astra在KingBench 3基准测试拿下90%高分,却在大型项目实测中频频翻车。本文通过8项小型测试和4个大型项目的完整对比,揭示Astra与Fable 5.1在代码质量、设计审美、成本和日常体验上的真实差距。

Vercel AI SDK Azure集成包4.0.63发布:依赖同步与升级指南
Vercel AI SDK发布@ai-sdk/azure 4.0.63补丁更新,同步升级底层@ai-sdk/openai至4.0.60版本。本文解析更新内容、模块化架构逻辑及开发者升级建议。

Mistral融资30亿欧元:解读主权开放AI战略与欧洲技术独立野心
Mistral AI完成30亿欧元创纪录融资,推动主权开放权重AI战略。本文深度解读Mistral的开放权重模式、资金用途、与OpenAI等巨头的路线之争,以及欧洲AI技术独立的前景与挑战。