Transformer 详解:从注意力机制到代码实战

前言 Transformer 是目前深度学习中最重要的一类架构。从 GPT、BERT 这类大语言模型,到 ViT 这类视觉模型,近几年绝大多数突破背后都有它的身影。可以说,理解 Transformer 是读懂当代 AI 的必修课。 本文假设你已经读过本站的《正向传播与反向传播:神经网络到底如何学习》,理解"网络是一串函数复合、训练时误差沿链式法则反向流动"这两条主线。我们会沿用同样的思路拆解 Transformer:信息如何向前流动,梯度如何向后流动。 本文会从"为什么需要 Attention"讲起,逐步推导公式,最后用一个从零手写的迷你 Transformer(PyTorch)把代码落地。涉及 softmax 的数学细节——梯度、数值稳定性、为什么注意力要除以 $\sqrt{d_k}$——会链接到本站 ai-math 专栏的配套文章,避免在这里打断主线。 为什么要 Transformer RNN 的局限 在 Transformer 之前,处理序列(文本、语音等)的主流架构是 RNN(循环神经网络)。RNN 像一条传送带,按顺序逐个处理 token,把之前看到的信息压缩在一个隐藏状态里。这个设计有三个天然的瓶颈: 无法并行:第 $t$ 步的计算依赖第 $t-1$ 步的隐藏状态,只能从左到右依次计算,GPU 的大规模并行能力完全用不上。 长距离依赖困难:信息每传一步都要经过一次变换,距离越远衰减越明显。处理长文本时,开头的词往往"传不到"结尾。 信息瓶颈:所有历史都被压缩进一个固定大小的隐藏向量,容量有限。 Transformer 的思路 Transformer 的做法截然不同:一次看完整条序列。它不再按顺序传递状态,而是让序列中的任意两个位置直接交互。 先解释一个词:token(词元,我实在不喜欢它的官方中译) 是文本被切分后的基本单位,可以是一个词、一个字符或一个子词片段。比如"我吃了一个红苹果"可以切成 6 个 token:我 / 吃 / 了 / 一个 / 红 / 苹果。 flowchart LR subgraph RNN["RNN:信息一站一站传"] direction LR r1["第 1 个"] --> r2["第 2 个"] r2 --> r3["第 3 个"] r3 --> r4["第 4 个"] end subgraph ATTN["Transformer:任意两个直接对话"] direction LR a1["第 1 个"] --- a2["第 2 个"] a1 --- a3["第 3 个"] a1 --- a4["第 4 个"] a2 --- a3 a2 --- a4 a3 --- a4 end 上图为两种架构的token之间的交互示意: 从图论的角度来说,RNN 是一个 有向路径图,包含 $n$ 个节点(代表隐状态 $h_t$)和 $n-1$ 条有向边($h_{t-1} \to h_t$);而 Transformer 是一个 完全图,包含 $n$ 个节点和 $\frac{n(n-1)}{2}$ 条无向边(每两个 token 之间都有一条边)。 ...

📅 August 3, 2026 · ⏱️ 48 min · 📝 约 7268 字 · 👁️ 次阅读

正向传播与反向传播:神经网络到底如何学习

前言 如果只看 PyTorch 代码,训练神经网络似乎很简单:写一个 forward,算出 loss,调用 loss.backward(),再让优化器更新参数。但这几行代码背后,其实压缩了深度学习最核心的一条数学主线: 正向传播负责把输入变成预测,反向传播负责把误差变成每个参数应该调整的方向。 理解这条主线之后,再看 CNN、ResNet、Transformer 或 LoRA,很多公式就不再像突然冒出来的符号。它们本质上都在回答同一个问题:信息如何向前流动,梯度又如何向后流动。 从一个神经元开始 一个最简单的神经元可以写成: $$ z = w^\top x + b $$其中 $x$ 是输入向量,$w$ 是权重向量,$b$ 是偏置。线性部分 $z$ 再经过一个非线性激活函数: $$ a = \sigma(z) $$如果没有激活函数,很多层线性变换叠在一起仍然只是一个线性变换,网络无法表示复杂的非线性关系。激活函数的作用,就是让每一层都能在“线性组合”之外引入弯曲和分段变化。 一层网络在做什么 把一个神经元扩展成一层全连接网络,可以写成矩阵形式: $$ \begin{aligned} z^{(l)} &= W^{(l)} a^{(l-1)} + b^{(l)} \\\\ a^{(l)} &= \sigma\left(z^{(l)}\right) \end{aligned} $$这里的上标 $(l)$ 表示第 $l$ 层。$a^{(l-1)}$ 是上一层输出,$W^{(l)}$ 和 $b^{(l)}$ 是这一层参数,$a^{(l)}$ 是这一层输出。 从这个角度看,神经网络并不是一个神秘黑盒,而是一串函数复合: $$ x \xrightarrow{f_1} a^{(1)} \xrightarrow{f_2} a^{(2)} \xrightarrow{f_3} \cdots \xrightarrow{f_L} \hat{y} $$正向传播就是沿着这条链从左到右计算。 ...

📅 August 1, 2026 · ⏱️ 11 min · 📝 约 1687 字 · 👁️ 次阅读

为什么 ResNet 能训练 152 层——残差连接的直觉与数学

前言 直接从 Deep Learning 概览跳到 ResNet 会有一点跳跃,因为 ResNet 不只是一个 CNN 结构,它还依赖正向传播、反向传播和梯度流这些训练机制。如果你还不熟悉“网络是函数复合”“损失如何反传到参数”这些概念,可以先看正向传播与反向传播:神经网络到底如何学习。 ResNet(Residual Network,残差网络)是经典视觉网络中绕不开的模型,因为它解决的不是“怎么设计一个更复杂的卷积层”,而是一个更基础的问题:网络变深以后,为什么反而更难训练? 直觉上,深层网络至少不应该比浅层网络差。假设一个 20 层网络已经能学到不错的函数,那么 56 层网络完全可以让后面 36 层近似恒等映射,理论上应该复现 20 层网络的效果。但在 ResNet 论文之前,实验中经常观察到相反现象:网络加深后,训练误差也会上升。这不是单纯的过拟合,因为过拟合通常表现为训练误差低、测试误差高;这里的问题是训练集本身都拟合不好。 这个现象通常被称为退化问题(Degradation Problem)。ResNet 的核心贡献,就是用一种非常简单的结构改写了深层网络的优化目标。 先看普通网络在学什么 设某一组卷积层想学习的目标函数是: $$ H(x) $$这里的 $x$ 是输入特征图,$H(x)$ 是这几层网络最终应该输出的特征。普通卷积网络会直接让堆叠的层去拟合 $H(x)$。 ResNet 的想法是:不要直接学 $H(x)$,而是学习它和输入 $x$ 之间的差值: $$ F(x) = H(x) - x $$于是目标输出可以改写成: $$ H(x) = F(x) + x $$这个 $F(x)$ 就叫残差映射(Residual Mapping),而旁边那条把 $x$ 直接加回输出的路径,就是跳跃连接(Skip Connection) 或 Shortcut Connection。 flowchart LR x["输入 x"] --> block["普通卷积层堆叠"] block --> h["直接学习 H(x)"] 普通网络的压力在于:每一组层都必须直接学出目标映射 $H(x)$。而 ResNet 把这个任务拆成两部分:主分支只学习“相对输入还需要改什么”,shortcut 分支直接把输入送到输出端。 ...

📅 July 31, 2026 · ⏱️ 16 min · 📝 约 2546 字 · 👁️ 次阅读

什么是机器学习和深度学习——从规则到数据的范式转移

前言 欢迎来到 Deep Learning 专栏。我们假设你修过一门传统机器学习课程(比如 HKU 的 COMP3314),或者对 ML 有基本了解;你也可能已经装过 PyTorch、跑通过几个示例项目,但对背后的数学原理还没有清晰的理解。这个专栏的目标是:从零开始,系统地拆解深度学习的核心概念和算法,让你不仅"能用",还能"懂"。 传统机器学习 想象一下我们小时候,父母是怎么教我们认识世界的。当你看到一只动物,父母可能会说:“这是一只猫——它有四条腿、毛茸茸的身体、喜欢吃鱼。” 我们会发现,想要区分一个东西是什么,我们会捕捉它的特征(四条腿、毛茸茸、喜欢吃鱼),并把这些特征和一个标签(猫)联系起来。这就是传统机器学习的核心思想:特征工程 + 模型训练。 在传统 ML 中,人类专家负责设计特征(例如图像的边缘直方图、纹理描述子),然后让算法(如 SVM、决策树)学习这些特征与标签之间的映射。这类方法在简单任务上效果不错,但当数据变得复杂——高分辨率图像、自然语言、原始音频——手工设计特征就成了瓶颈:你很难用几百个手工特征去描述一只猫的全部视觉变化。模型的性能天花板,本质上取决于特征的质量。 深度学习:为什么要"深" 为什么出现了深度学习? 在传统机器学习中,面对极其复杂且高维的数据时,依赖人工提取特征(比如手动设计边缘检测算子)遇到了难以逾越的瓶颈。深度学习的出现,正是为了解决“特征工程”的局限性。它通过引入多层次的组合原理,让模型自己从数据中学习表示。简单来说,较低的隐藏层学习简单的概念(如边缘、颜色),较高的隐藏层将这些简单概念组合成复杂的概念(如汽车、狗)。虽然早期的神经网络深受生物大脑机制启发,但现代深度学习已经不再将神经科学作为刚性指导,而是更多地依赖于应用数学(如线性代数、概率论、数值优化)来进行构建。 深度学习的历史 深度学习看似是近几年才爆发的全新领域,但实际上它已经经历了漫长的发展、多次改名与起伏。它的历史大致可以划分为三次浪潮: 第一次浪潮:控制论(Cybernetics,1940s–1960s) — 以生物学习理论为基础,出现了最早的线性模型(感知机 Perceptron、ADALINE)。当时人们希望通过逆向大脑的计算原理来建立智能。然而早期的线性模型存在严重局限——连简单的异或(XOR)函数都无法学习——直接导致了神经网络研究的第一次大衰退。 第二次浪潮:联结主义(Connectionism,1980s–1990s) — 核心思想是”大量简单的计算单元连接在一起时可以实现智能行为”。这一时期提出了对今天至关重要的分布式表示(Distributed Representation) 和 反向传播(Backpropagation) 算法,并引入了处理序列数据的 LSTM。但后来因投资者对 AI 的期望过高而不切实际,加之 SVM 等核方法的崛起,神经网络再次陷入低谷。 第三次浪潮:深度学习复兴(2006 年至今) — 以逐层贪婪预训练(Greedy Layer-wise Pretraining)为突破口,学术界终于找到了有效训练深层网络的方法。深度网络在测试样例上的泛化能力大幅提升,在图像识别、语音识别等复杂任务上全面超越了传统基于手工特征的 AI 系统。 为什么深度学习这几年才爆发 深度学习的核心算法(如反向传播)其实在 80 年代就已经存在,它的真正爆发和走向成熟主要归功于以下三个核心驱动力: 数据量爆炸:ImageNet(2009)、维基百科、YouTube 等大规模标注数据集的涌现。一个粗略的经验法则是:5000 个标注样本能达到可接受的性能,而 1000 万个样本能达到或超越人类水平。你在 COMP3314 课上学 SVM 或逻辑回归时,用的往往是数百行的小型结构化数据集;而 DL 时代面对的是百万级的复杂图像和文本,数据量本身催生了方法论的彻底变革。 算力与模型规模的指数级增长:GPU 从渲染管线变成并行计算引擎,CUDA 生态成熟。这使得神经网络的规模大约每 2.4 年就能翻一倍,如今庞大的参数量使网络能够处理前所未有的复杂任务。 算法演进与基建完善:ReLU 等现代激活函数的广泛使用解决了梯度消失问题、Batch Normalization 加速了训练、ResNet 让训练 100+ 层极深网络成为可能。同时,TensorFlow、PyTorch 等软件库极大降低了工程实现的门槛。 传统 ML vs 深度学习:一张对比表 维度 传统 ML(SVM、XGBoost) 深度学习 特征提取 人工设计,依赖领域知识 网络自动学习层次化表示 数据需求 几百到几千可训练 通常需要大量标注数据 计算资源 CPU 足够 GPU/TPU,训练成本高 可解释性 较高(特征权重可读) 较低,常被称为"黑盒" 代表任务 表格数据、小样本分类 图像、语音、NLP、生成 什么时候用传统 ML,什么时候用 DL 一个快速决策框架: ...

📅 June 15, 2026 · ⏱️ 12 min · 📝 约 1815 字 · 👁️ 次阅读

深度学习从拆箱开始——序言

为什么要写这个专栏 笔者在上学期学习了 COMP3314,一门传统机器学习课程。然而,传统机器学习在特征提取和模型设计上都需要大量的人工干预,难以适应复杂的现实世界数据。相比之下,深度学习通过多层神经网络自动学习数据的特征表示,在图像识别、自然语言处理等领域取得了许多重要突破。这个专栏旨在记录笔者从零开始学习深度学习的过程,分享理论推导和实战经验,希望能帮助同样对深度学习感兴趣的读者快速入门并逐步深入理解这一领域。 写作说明 这个专栏不会被写成一份固定课程表。深度学习本身发展很快,我自己的学习兴趣也会随着论文、项目和课程不断变化;如果一开始就把文章顺序钉死,反而容易限制后面真正想写的问题。 因此,这里更像是一组持续更新的学习笔记:有些文章会解释基础概念,例如什么是机器学习和深度学习;有些文章会拆解训练机制,例如正向传播与反向传播;也会有一些文章直接进入具体模型,例如为什么 ResNet 能训练 152 层。 如果某篇文章里的数学推导开始依赖更复杂的矩阵知识,我会把这部分拆到独立的 Math 专栏(线性代数 与 AI Math)里。比如 ResNet 中关于 Jacobian、向量-Jacobian 乘积和恒等矩阵的部分,就可以配合矩阵微积分如何服务反向传播一起看。这样,Deep Learning 专栏可以保持主线清晰,而数学细节也有足够空间展开。

📅 June 15, 2026 · ⏱️ 3 min · 📝 约 485 字 · 👁️ 次阅读
Comments