计算机视觉的数学基础与张量计算范式 / Mathematical Foundations and Tensor Computation Paradigms
第 1 章:计算机视觉的数学基础与张量计算范式
Mathematical Foundations and Tensor Computation Paradigms
视觉智能(Visual Intelligence)的本质问题可被还原为一句话:给定由光强函数 $I(x, y, t)$ 描述的二维或三维观测场,如何通过可计算的程序抽取具有语义判别力的层次化表征(hierarchical representation),并据此完成识别、定位、分割、推理等下游任务。Chapter 1 的核心任务并非给出这些任务的算法答案,而是为后续 14 章建立一套统一的数学分析框架。当读者在后续章节中遇到诸如感受野(receptive field)等价公式、损失函数曲率分析、或优化器收敛性证明时,本章所定义的张量记号、概率诠释与梯度几何将作为共同的语义底座。
本章从三个角度展开对视觉问题数学结构的解构:(1)作为一门交叉学科,计算机视觉如何从神经生理学、心理物理学与信号处理三个源头汇聚成今天的深度学习范式;(2)将图像、滤波器、特征图与批量样本统一抽象为不同阶的张量(tensor),并在此抽象下严格形式化卷积运算;(3)将视觉任务中的不确定性建模为概率分布,将训练目标诠释为某种信息论度量(KL 散度、互信息)的极值化,从而把优化问题几何化、可视化。
---
1.1 视觉认知的层次化本质:从 Hubel-Wiesel 到 Marr 再到深度学习
视觉并非单一过程,而是一个跨多个时空尺度的信息抽取流水线。David Hubel 与 Torsten Wiesel 在 1959–1968 年间通过对猫初级视皮层(V1)的微电极记录,确立了视觉系统由简单细胞(simple cell)到复杂细胞(complex cell)的层次化组织结构:简单细胞响应特定朝向与位置的边缘刺激,复杂细胞则对位置的微小平移保持不变性。这一发现为后续所有视觉计算模型提供了关键启示——视觉系统通过组合低级局部特征形成高级全局表征。
David Marr 于 1982 年在其里程碑著作 *Vision* 中进一步将视觉处理形式化为三个计算层次:
1. 早期视觉(Early Vision)/ 计算理论层:明确视觉系统的输入是什么(2D 图像强度数组)、输出是什么(亮度、轮廓、深度等局部几何属性的初步描述)、以及应满足何种约束(如平滑性约束)。这一层关注"为什么"(why)的问题。 2. 中层视觉(Mid-level Vision)/ 算法与表征层:指定从输入到输出的具体计算过程。例如,零交叉检测(zero-crossing detection)、边缘连接(edge linking)、立体匹配(stereo matching)的算法步骤。这一层关注"如何"(how)的问题。 3. 晚期视觉(Late Vision)/ 物理实现层:将算法映射到具体的神经硬件或硅基硬件,关注"由谁实现"(who implements)。
Marr 框架的关键洞见在于:算法与硬件是可分离的,相同的算法(如 SIFT 特征提取)可在不同硬件上实现,而相同的硬件(如卷积电路)可运行不同算法。这种分离思想使得后续研究者能够脱离具体实现讨论视觉计算的抽象结构。
1998 年 Yann LeCun 提出的 LeNet-5 与 2012 年 AlexNet 的突破,标志着视觉计算的范式跃迁:手工设计的特征提取器(如 SIFT、HOG)被层次化的可学习滤波器组所取代。Marr 框架的三个层次在深度学习时代被重新诠释:
- 计算理论层:仍对应于任务的概率建模(如分类任务的类条件分布 $p(y|x)$);
- 算法层:被端到端的反向传播(backpropagation)与随机梯度下降(SGD)所取代;
- 实现层:与 Marr 时代不同,现代实现层是高度并行的 GPU/TPU 矩阵-张量计算单元。
下图展示了 Marr 三个层次与深度学习视觉流水线之间的对应关系:
```mermaid flowchart TD A["Marr 计算理论层<br/>(Computational Theory)"] --> A1["任务定义: p(y|x)<br/>贝叶斯推断框架"] B["Marr 算法表征层<br/>(Algorithmic)"] --> B1["特征提取流水线<br/>SIFT, HOG, Canny"] C["Marr 硬件实现层<br/>(Implementation)"] --> C1["神经电路 / FPGA"]
A --> A2["损失函数设计<br/>Cross-Entropy, IoU Loss"] B --> B2["深度卷积网络<br/>反向传播 + SGD"] C --> C2["GPU/TPU 张量核"]
A2 -.对应.- A B2 -.对应.- B C2 -.对应.- C
D["统一视角: 层次化特征抽取"] --> A2 D --> B2 D --> C2 ```
> 图注:Marr 视觉计算三层次与深度学习视觉流水线之间的语义对应关系。两条横向箭头链分别表示经典视觉与深度学习视觉对三个层次的具体实现方式。
值得注意的是,Marr 框架并未被深度学习所推翻,而是被重新诠释:现代 CNN 的层级结构(conv1 → conv2 → conv3 → ... → fc)本质上是对 Marr 算法层与实现层的"硬件-算法协同演化"。每一层卷积可被视为一个微分算子(differential operator)的参数化实现,其参数通过数据驱动的方式被学习。这种"层次化微分算子"视角为后续章节理解感受野、有效感受野、特征金字塔等概念提供了统一语言。
---
1.2 张量计算基础:图像作为高阶对象与卷积的形式化
1.2.1 图像的多阶张量抽象
在严格的数学语境中,张量(tensor)是指在多重线性映射意义下保持分量变换规律的几何对象。在计算机视觉实践中,我们采用工程化但同样严格的定义:一个 $n$ 阶张量是一个具有 $n$ 个索引(mode)的多维数组,每一阶对应一个坐标轴。例如:
- 灰度图像 $I \in \mathbb{R}^{H \times W}$ 是一个 2 阶张量,其两个 mode 分别对应空间高度 $H$ 与宽度 $W$;
- RGB 彩色图像 $I \in \mathbb{R}^{3 \times H \times W}$ 是一个 3 阶张量,第一个 mode 是通道维度(channel mode);
- 一个批量(batch)的彩色图像 $X \in \mathbb{R}^{B \times 3 \times H \times W}$ 是一个 4 阶张量,第一个 mode 是批次维度。
更高阶的张量在视频、3D 体数据、特征图批量中自然出现。例如一段视频可表示为 $\mathcal{V} \in \mathbb{R}^{T \times 3 \times H \times W}$,其中 $T$ 是时间帧数。在 PyTorch、TensorFlow 等主流框架中,"tensor"这一术语保留了工程语义,但其运算规则完全继承自多线性代数的张量演算。
将图像视为张量而非简单矩阵的关键意义在于:后续所有线性算子(如卷积、池化、归一化、注意力)都可在张量空间中以统一记号书写。设输入张量 $\mathcal{X} \in \mathbb{R}^{B \times C_{\text{in}} \times H \times W}$,卷积核张量 $\mathcal{K} \in \mathbb{R}^{C_{\text{out}} \times C_{\text{in}} \times k_h \times k_w}$,则 2D 卷积运算可形式化为:
$$ \mathcal{Y}_{b, c_{\text{out}}, i, j} = \sum_{c=1}^{C_{\text{in}}} \sum_{u=1}^{k_h} \sum_{v=1}^{k_w} \mathcal{X}_{b, c, i+u-1, j+v-1} \cdot \mathcal{K}_{c_{\text{out}}, c, u, v} + b_{c_{\text{out}}} \tag{1.1} $$
其中 $b_{c_{\text{out}}}$ 是输出通道 $c_{\text{out}}$ 对应的偏置项。式 (1.1) 的关键观察是:输出特征图 $\mathcal{Y}$ 在空间位置 $(i, j)$ 处的值,是输入张量在以 $(i, j)$ 为左上角的 $k_h \times k_w$ 局部块与对应卷积核在所有输入通道上的内积。这一形式化将"局部连接 + 权值共享"两个核心卷积属性精确编码到数学表达中。
1.2.2 离散卷积与互相关的等价性
值得注意的是,深度学习文献中所谓的"convolution"实际上是互相关(cross-correlation),而非严格的数学卷积。数学上的 2D 离散卷积定义为:
$$ (\mathcal{X} * \mathcal{K})[i, j] = \sum_{u, v} \mathcal{X}[u, v] \cdot \mathcal{K}[i - u, j - v] \tag{1.2} $$
而互相关则是:
$$ (\mathcal{X} \star \mathcal{K})[i, j] = \sum_{u, v} \mathcal{X}[u + u', v + v'] \cdot \mathcal{K}[u', v'] \tag{1.3} $$
二者之差仅在于核的翻转(flipping)。在可学习框架下,由于卷积核 $\mathcal{K}$ 的参数是任意学习的,我们总可以吸收翻转操作到参数初始化中,因此二者产生等价的模型族。这一等价性是深度卷积网络能够高效训练的关键。
1.2.3 连续视角下的卷积与微分算子的对应
为深化理解,我们考虑卷积的连续形式。设输入图像为连续函数 $f: \mathbb{R}^2 \to \mathbb{R}$,卷积核为 $k: \mathbb{R}^2 \to \mathbb{R}$,则卷积定义为:
$$ (f * k)(x, y) = \iint_{\mathbb{R}^2} f(x - u, y - v) k(u, v) \, du \, dv \tag{1.4} $$
对卷积结果取空间梯度,得到:
$$ \nabla (f * k) = (\nabla f) * k = f * (\nabla k) \tag{1.5} $$
式 (1.5) 揭示了一个深刻事实:卷积与微分算子可交换。这一性质意味着:若 $k$ 本身是一个高斯函数 $G_\sigma(x, y) = \frac{1}{2\pi\sigma^2} \exp(-\frac{x^2 + y^2}{2\sigma^2})$,则 $f * G_\sigma$ 对应尺度为 $\sigma$ 的高斯平滑;而 $\nabla f * G_\sigma$ 则对应先平滑后求边缘。深度网络中堆叠的卷积层在某种意义上就是在学习一个复合微分算子。
1.2.4 张量分解与低秩近似
高阶张量不可避免地面临维度灾难问题。例如,一个 4D 特征图批量 $X \in \mathbb{R}^{64 \times 256 \times 56 \times 56}$ 包含约 2 亿个标量参数。张量分解(tensor decomposition)通过将高阶张量分解为低秩因子(low-rank factor)的乘积,在保持信息的同时降低自由度。最常用的分解形式包括:
- **CP 分解(CANDECOMP/PARAFAC)**:将张量分解为若干秩一张量(rank-one tensor)的加权和;
- **Tucker 分解**:将张量分解为一个核心张量(core tensor)与若干因子矩阵的模态积(mode product)。
在视觉应用中,Tucker 分解与 CP 分解常用于卷积核压缩。例如,一个标准卷积核 $W \in \mathbb{R}^{C_{\text{out}} \times C_{\text{in}} \times k_h \times k_w}$ 可被 Tucker-2 分解为两个小核:
$$ W \approx U \cdot V, \quad U \in \mathbb{R}^{C_{\text{out}} \times r}, V \in \mathbb{R}^{r \times C_{\text{in}} \times k_h \times k_w} \tag{1.6} $$
其中 $r \ll \min(C_{\text{out}}, C_{\text{in}})$。原始卷积运算 $Y = W * X$ 的参数复杂度从 $O(C_{\text{out}} \cdot C_{\text{in}} \cdot k_h \cdot k_w)$ 降至 $O(r \cdot C_{\text{in}} \cdot k_h \cdot k_w + r \cdot C_{\text{out}})$,在 $C_{\text{out}}, C_{\text{in}}$ 较大时获得显著加速。这一分解将在第 14 章轻量化网络设计中再次出现。
1.2.5 实践:张量操作与广播机制
在 NumPy 与 PyTorch 中,张量操作遵循广播(broadcasting)规则:当两个张量的阶数不同时,较小的张量会在最左侧补 1 维。例如,标量偏置 $b \in \mathbb{R}^{C_{\text{out}}}$ 与 4D 输出 $\mathcal{Y} \in \mathbb{R}^{B \times C_{\text{out}} \times H' \times W'}$ 相加时,$b$ 会被隐式广播为 $\mathbb{R}^{1 \times C_{\text{out}} \times 1 \times 1}$,再沿批次与空间维度扩展:
```python import torch import torch.nn.functional as F
输入: B=32, C_in=3, H=W=224
x = torch.randn(32, 3, 224, 224)
卷积核: 64 个 3x3 卷积核
weight = torch.randn(64, 3, 3, 3) bias = torch.randn(64)
2D 卷积 (此处互相关实现)
y = F.conv2d(x, weight, bias=bias, stride=1, padding=1)
输出: B=32, C_out=64, H'=W'=224
print(y.shape) # torch.Size([32, 64, 224, 224]) ```
理解广播规则对于后续实现自定义算子(如仿射变换、可变形卷积)至关重要——错误使用广播会导致内存爆炸或形状不匹配错误。
---
1.3 概率与信息论工具:视觉任务的不确定性建模
视觉任务的本质在于从含有噪声的观测中恢复语义结构。这种噪声既包括传感器层面的光子散粒噪声(photon shot noise),也包括语义层面的标注歧义(如一张图中既有"猫"也有"狗",应如何标注?)。概率论与信息论为处理这种不确定性提供了统一语言。
1.3.1 贝叶斯推理框架
设图像观测为 $x \in \mathcal{X}$(如像素空间),任务目标是推断语义标签 $y \in \mathcal{Y}$(如类别向量)。贝叶斯公式给出:
$$ p(y|x) = \frac{p(x|y) \cdot p(y)}{p(x)} \propto p(x|y) \cdot p(y) \tag{1.7} $$
其中:
- $p(y)$ 是先验分布(prior),编码关于 $y$ 的边缘统计(如自然图像中各类别的不平衡分布);
- $p(x|y)$ 是似然(likelihood),描述在给定标签 $y$ 下生成观测 $x$ 的概率;
- $p(y|x)$ 是后验分布(posterior),即在看到 $x$ 后对 $y$ 的最优估计;
- $p(x)$ 是证据(evidence),在推断 $y$ 时作为归一化常数。
深度学习中的判别式模型(discriminative model)直接对 $p(y|x)$ 参数化,其训练目标是最大化对数似然:
$$ \theta^* = \arg\max_\theta \sum_{(x_i, y_i) \in \mathcal{D}} \log p_\theta(y_i | x_i) \tag{1.8} $$
而生成式模型(generative model)则同时对 $p(x|y)$ 与 $p(y)$ 建模,可用于数据生成、异常检测等任务。VAE、扩散模型等均属此类,将在第 15 章展开。
1.3.2 最大似然估计与损失函数的概率诠释
给定数据集 $\mathcal{D} = \{(x_i, y_i)\}_{i=1}^{N}$,最大似然估计(MLE)的目标是找到参数 $\theta$ 使得观测数据的联合概率最大:
$$ \theta^*_{\text{MLE}} = \arg\max_\theta \prod_{i=1}^N p_\theta(x_i, y_i) \tag{1.9} $$
取对数后,等价于最小化负对数似然(Negative Log-Likelihood, NLL):
$$ \theta^*_{\text{MLE}} = \arg\min_\theta \sum_{i=1}^N -\log p_\theta(y_i | x_i) - \log p_\theta(x_i) \tag{1.10} $$
若模型仅对 $p(y|x)$ 建模(如分类网络),则 NLL 简化为:
$$ \mathcal{L}_{\text{NLL}}(\theta) = -\frac{1}{N} \sum_{i=1}^N \log p_\theta(y_i | x_i) \tag{1.11} $$
对于多分类任务,若采用 one-hot 标签 $\mathbf{y}_i \in \{0, 1\}^K$($K$ 为类别数),且模型输出为 softmax 归一化后的类概率 $\hat{\mathbf{p}}_i = \text{softmax}(\mathbf{z}_i)$,则:
$$ \log p_\theta(y_i | x_i) = \sum_{k=1}^K y_{i,k} \cdot \log \hat{p}_{i,k} \tag{1.12