线性代数基础(一):向量与空间

前言 这是"线性代数基础"专栏的第一篇。这个专栏的目的很明确:补齐看懂本站进阶数学文章所需的基础。读完本文(以及后续两篇),你应该能顺畅读懂《矩阵微积分如何服务反向传播》和《Softmax 与缩放点积的数学》。 我们从一个最朴素的问题开始:什么是向量? 它为什么值得花一整篇来讨论? 向量:从几何到坐标 向量有两种看待方式,二者等价,互为补充: 几何视角:向量是空间中带方向和长度的箭头。它表示"从一点移动到另一点"。 代数视角:向量是 $\mathbb{R}^n$ 中的一个有序数组,如 $v = (v_1, v_2, \dots, v_n)$。其中 $n$ 是维度。 在深度学习中,我们几乎总是用数组(张量)表示向量:一个词嵌入是几百维的向量,一张图片展开后是几万维的向量。几何直觉在低维(2D/3D)依然成立,只是"看不见",但公式可以推广到任意维度。 向量的基本运算 对向量 $u, v$ 和标量 $c$: 加法:$(u + v)_i = u_i + v_i$。几何上就是"首尾相接"(平行四边形法则)。 数乘:$(cv)_i = c v_i$。几何上是把箭头拉伸($|c| > 1$)或压缩($|c| < 1$),$c < 0$ 时反向。 这两个运算非常重要,因为"对加法和数乘封闭"正是下一篇文章里"向量空间"定义的核心。 点积与范数 点积(内积) 两个 $n$ 维向量 $a$、$b$ 的点积定义为对应分量乘积之和: $$ a \cdot b = \sum_{i=1}^{n} a_i b_i $$它的几何形式揭示了本质: $$ a \cdot b = \|a\| \|b\| \cos\theta $$其中 $\theta$ 是两个向量之间的夹角,$\|a\|$ 是 $a$ 的模长(范数)。也就是说,点积同时度量了两个向量的长度和方向一致性:夹角越小,点积越大。 ...

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

线性代数基础(二):矩阵与线性变换

前言 上一篇讲了向量。这一篇把向量"组织"起来——矩阵。矩阵是连接向量与线性变换的桥梁,也是神经网络里几乎所有计算(全连接层、注意力中的 $QK^\top$、反向传播的梯度回传)的载体。 读完本文,你会理解三件事:矩阵乘法到底在算什么、为什么神经网络一层是 $z = Wx + b$、以及 Jacobian 为什么能写成矩阵。 矩阵:数与表 矩阵是排成矩形的数表。一个 $m \times n$ 矩阵有 $m$ 行、$n$ 列: $$ A = \begin{bmatrix} a_{11} & a_{12} & \dots & a_{1n} \\ a_{21} & a_{22} & \dots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \dots & a_{mn} \end{bmatrix} $$几个常用特例: 单位阵 $I$:对角线上全为 1,其余为 0。作用类似乘法里的"1"($IA = AI = A$)。 对角阵:非对角线全为 0。相当于对每个分量独立缩放。 零矩阵:全为 0。 转置 $A^\top$:把行列互换,$(A^\top)_{ij} = A_{ji}$。 对称矩阵:$A = A^\top$。它很重要,在特征值篇会看到它有多好用。 矩阵乘法 两个矩阵 $A$($m \times k$)和 $B$($k \times n$)可以相乘,结果 $C = AB$ 是 $m \times n$ 矩阵,其中: ...

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

线性代数基础(三):特征值与分解

前言 前两篇讲了向量和矩阵。这一篇回答一个更深刻的问题:矩阵这个变换,有没有"主轴"? 沿着某个方向,变换可能只是单纯地拉伸(方向不变、长度变);沿着另一个方向,可能完全不动。抓住这些"不改变方向"的方向,矩阵的行为就一目了然了。 这就是特征值与特征向量的思想。它在深度学习里极其重要——梯度消失/爆炸、LoRA、PCA、甚至注意力里的缩放,背后都有它的影子。 特征值与特征向量 定义 对 $n \times n$ 矩阵 $A$,如果存在非零向量 $v$ 和标量 $\lambda$ 使得: $$ Av = \lambda v $$则 $\lambda$ 称为 $A$ 的特征值,$v$ 是它对应的特征向量。 几何意义:$v$ 是变换 $A$ 的"主轴"方向——被 $A$ 作用后方向不变,只是长度缩放 $\lambda$ 倍。$\lambda > 1$ 拉伸,$0 < \lambda < 1$ 压缩,$\lambda < 0$ 反向。 如何求特征值 把定义移项:$(A - \lambda I)v = 0$。非零解存在的条件是矩阵不可逆,即: $$ \det(A - \lambda I) = 0 $$这就是特征多项式,是 $\lambda$ 的一个 $n$ 次多项式,有 $n$ 个根(计重数)。 例:求 $A = \begin{bmatrix} 2 & 1 \\ 1 & 2 \end{bmatrix}$ 的特征值与特征向量。 ...

📅 August 4, 2026 · ⏱️ 12 min · 📝 约 1907 字 · 👁️ 次阅读

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 字 · 👁️ 次阅读
Comments