第02章 系统的本质------从LTI系统到神经网络
2.1 经典回顾:系统是什么?
在奥本海姆的框架中,系统是一个变换规则:给定输入信号,产生输出信号。
x(t) → [ 系统 T{·} ] → y(t)
你学过的系统分类:
| 性质 | 定义 | 直觉 |
|---|---|---|
| 线性 | T{ax1+bx2}=aT{x1}+bT{x2}T\{ax_1+bx_2\} = aT\{x_1\}+bT\{x_2\}T{ax1+bx2}=aT{x1}+bT{x2} | 叠加原理成立 |
| 时不变 | T{x(t−τ)}=y(t−τ)T\{x(t-\tau)\} = y(t-\tau)T{x(t−τ)}=y(t−τ) | 系统行为不随时间改变 |
| 因果 | y(t)y(t)y(t) 只取决于 x(τ), τ≤tx(\tau),\; \tau\leq tx(τ),τ≤t | 不依赖未来输入 |
| 稳定(BIBO) | 有界输入 → 有界输出 | 不会爆炸 |
| 记忆less | y(t)y(t)y(t) 只取决于 x(t)x(t)x(t) | 无记忆 |
LTI系统 (线性时不变系统)是整个课程的核心------它完全由冲激响应 h(t) 决定:
y(t)=x(t)∗h(t)=∫x(τ)h(t−τ) dτ y(t) = x(t) * h(t) = \int x(\tau)h(t-\tau)\, d\tau y(t)=x(t)∗h(t)=∫x(τ)h(t−τ)dτ
2.2 直觉重塑:神经网络就是参数化的系统
把上面的框图换成AI的语言:
输入数据 → [ 神经网络 f_θ{·} ] → 预测输出
每一个神经网络层都是一个系统。 整个网络是系统的级联(串联)。
关键问题是:神经网络是LTI系统吗?
答案:不是。 这是理解深度学习本质的关键。
2.3 线性 → 线性层 vs 非线性激活
经典线性系统
LTI系统的线性意味着:叠加原理成立。两个输入的响应之和等于它们各自响应之和。
AI中的线性层
全连接层 y = Wx + b 是仿射变换(线性变换 + 平移):
python
import torch
linear = torch.nn.Linear(10, 5, bias=True)
# 验证线性(实际上是仿射性)
x1 = torch.randn(1, 10)
x2 = torch.randn(1, 10)
y1 = linear(x1)
y2 = linear(x2)
# 线性:T{ax₁+bx₂} = aT{x₁}+bT{x₂}
# 仿射:T{ax₁+bx₂} = aT{x₁}+bT{x₂} + b(1-a-b)... 不严格成立
# 去掉bias才是严格线性
# 严格线性验证(设bias=False)
linear_no_bias = torch.nn.Linear(10, 5, bias=False)
y_sum = linear_no_bias(x1 + x2)
y_parts = linear_no_bias(x1) + linear_no_bias(x2)
print(torch.allclose(y_sum, y_parts)) # True
为什么需要非线性?
如果神经网络只有线性层,那它就是一个大号的线性变换:
y = W₃(W₂(W₁x)) = (W₃W₂W₁)x = Wx
再多的线性层叠加还是线性的------这和信号处理中"级联LTI系统还是LTI系统"是同一件事。
非线性激活函数打破了这个限制:
python
# 没有激活函数:两层 = 一层
x = torch.randn(1, 10)
W1 = torch.randn(10, 20)
W2 = torch.randn(20, 10)
y_linear = x @ W1 @ W2 # 还是线性变换
# 有激活函数:两层 ≠ 一层
y_relu = torch.relu(x @ W1) @ W2 # 非线性变换,表达能力更强
关键洞察:
- 信号处理:LTI系统 = 线性 + 时不变
- ↓
- AI:线性层 = 线性(无时不变概念)
- ↓
- 非线性激活 = 打破线性性
- ↓
- 深度网络 = 线性层的级联 + 非线性 = 通用函数逼近器
2.4 时不变性 → 平移等变性(Equivariance)
经典定义
时不变系统:如果输入延迟 τ,输出也延迟 τ。
x(t) → y(t)
x(t-τ) → y(t-τ)
AI中的对应:平移等变性
卷积层(Convolutional Layer)是平移等变的:
python
import torch
# 创建一个简单的卷积层
conv = torch.nn.Conv2d(1, 1, kernel_size=3, padding=1, bias=False)
# 输入图像
x = torch.randn(1, 1, 8, 8)
# 平移后的图像(向右移2像素)
x_shifted = torch.roll(x, shifts=2, dims=3)
# 卷积的输出
y = conv(x)
y_shifted = conv(x_shifted)
# 验证:卷积输出也平移了2像素
y_shifted_manual = torch.roll(y, shifts=2, dims=3)
print(torch.allclose(y_shifted, y_shifted_manual, atol=1e-6)) # True
全连接层不具备平移等变性:
python
# 全连接层:平移输入后,输出不是简单的平移
fc = torch.nn.Linear(64, 32)
x_flat = x.view(1, -1)
x_shifted_flat = x_shifted.view(1, -1)
y_fc = fc(x_flat)
y_shifted_fc = fc(x_shifted_flat)
y_fc_shifted = torch.roll(y_fc, shifts=2, dims=1) # 不等于 y_shifted_fc
更一般的等变性
时不变性是"平移等变性"的一个特例(时间轴上的平移)。现代AI追求更广泛的等变性:
| 等变性类型 | 变换 | 对应的网络结构 |
|---|---|---|
| 平移等变 | 平移 | CNN |
| 旋转等变 | 旋转 | G-CNN, E(2)-CNN |
| 排列等变 | 元素置换 | 图神经网络、PointNet |
| 尺度等变 | 缩放 | 小波CNN |
2.5 因果性 → 自回归模型
经典定义
因果系统:输出 y(t) 只依赖于当前和过去的输入 x(τ), τ ≤ t。
AI中的对应
自回归模型(Autoregressive Model)是因果的:
p(x₁, x₂, ..., xₙ) = p(x₁) · p(x₂|x₁) · p(x₃|x₁,x₂) · ...
GPT就是自回归模型------预测第n个token时,只能看到前n-1个token。
python
# GPT的因果性:通过掩码实现
def causal_mask(seq_len):
"""创建因果掩码:每个位置只能看到自己和之前的位置"""
mask = torch.tril(torch.ones(seq_len, seq_len))
return mask
# 4个token的因果掩码
mask = causal_mask(4)
print(mask)
# tensor([[1, 0, 0, 0],
# [1, 1, 0, 0],
# [1, 1, 1, 0],
# [1, 1, 1, 1]])
# 注意力分数 × 掩码 = 因果注意力
attn_scores = torch.randn(4, 4)
causal_scores = attn_scores.masked_fill(mask == 0, float('-inf'))
causal_weights = torch.softmax(causal_scores, dim=-1)
# 第i个token只关注第0~i个token
关键洞察:
信号处理的因果性:y(t) 只看 x(τ), τ≤t
GPT的因果性: 预测token[n] 只看 token[0..n-1]
实现方式: 下三角掩码(信号处理中不需要,因为因果性是自然的)
2.6 稳定性(BIBO)→ 梯度稳定性
经典定义
BIBO稳定:有界输入产生有界输出。
∣x(t)∣≤Mx<∞ → ∣y(t)∣≤My<∞ |x(t)| \leq M_x < \infty \;\to\; |y(t)| \leq M_y < \infty ∣x(t)∣≤Mx<∞→∣y(t)∣≤My<∞
对于LTI系统:BIBO稳定 ⟺ \iff⟺ ∫∣h(t)∣ dt<∞\int |h(t)|\, dt < \infty∫∣h(t)∣dt<∞(冲激响应绝对可积)。
AI中的对应:梯度稳定性
训练神经网络时,梯度通过反向传播流过每一层。如果梯度在传播过程中指数级增长或缩小,训练就会失败:
信号处理:BIBO稳定 → 冲激响应绝对可积
AI: 训练稳定 → 梯度的"冲激响应"不爆炸/消失
python
# 梯度爆炸的演示
import torch
# 模拟一个深层网络的梯度传播
# 每一层的梯度乘以权重矩阵
# 如果权重矩阵的谱范数 > 1,梯度会指数增长
def simulate_gradient_flow(n_layers, spectral_radius):
"""模拟梯度在n层网络中的传播"""
grad = torch.tensor([1.0])
grads = [grad.item()]
for _ in range(n_layers):
# 模拟一层的梯度:乘以一个标量(简化版)
grad = grad * spectral_radius
grads.append(grad.item())
return grads
# 谱半径 < 1:梯度消失
grads_vanishing = simulate_gradient_flow(50, 0.9)
print(f"消失: 最终梯度 = {grads_vanishing[-1]:.2e}") # ~1e-2
# 谱半径 > 1:梯度爆炸
grads_exploding = simulate_gradient_flow(50, 1.1)
print(f"爆炸: 最终梯度 = {grads_exploding[-1]:.2e}") # ~117
# 谱半径 = 1:梯度稳定(理想情况)
grads_stable = simulate_gradient_flow(50, 1.0)
print(f"稳定: 最终梯度 = {grads_stable[-1]:.2e}") # 1.0
这就是为什么需要:
- BatchNorm / LayerNorm:控制每层输出的"能量"
- 残差连接:提供"直通路径"让梯度直接流过
- 合理的初始化(Xavier, He):让初始梯度的谱半径接近1
2.7 冲激响应 → 权重/核函数
经典定义
LTI系统完全由其冲激响应 h(t) 决定:
y(t)=(x∗h)(t)=∫x(τ)h(t−τ) dτ y(t) = (x * h)(t) = \int x(\tau)h(t-\tau)\, d\tau y(t)=(x∗h)(t)=∫x(τ)h(t−τ)dτ
AI中的对应
卷积核(Convolutional Kernel)就是离散的冲激响应:
python
# 卷积核 = 冲激响应
conv = torch.nn.Conv2d(1, 1, kernel_size=3, padding=1, bias=False)
# 查看"冲激响应"(卷积核的权重)
h = conv.weight.data # (1, 1, 3, 3)
print("冲激响应(卷积核):")
print(h.squeeze())
# 对输入做卷积 = 用冲激响应对输入做滤波
x = torch.randn(1, 1, 5, 5)
y = conv(x) # y = x * h
全连接层的"冲激响应"是什么?
全连接层 y = Wx 可以看作是一个"全局卷积"------核的大小等于输入的大小:
python
fc = torch.nn.Linear(10, 5, bias=False)
# 权重矩阵 W 的形状是 (5, 10)
# 对于输出的第i个神经元,"冲激响应"是 W[i, :]
# 它看的是整个输入------这是一个"全局卷积"
2.8 级联系统 → 深度网络
经典性质
LTI系统的级联还是LTI系统,且级联顺序可以交换(在一定条件下):
htotal(t)=h1(t)∗h2(t)=h2(t)∗h1(t) h_{\text{total}}(t) = h_1(t) * h_2(t) = h_2(t) * h_1(t) htotal(t)=h1(t)∗h2(t)=h2(t)∗h1(t)
AI中的对应
深度网络是层的级联,但因为有非线性激活,级联顺序不可交换:
LTI级联:顺序可交换
y = (x * h₁) * h₂ = (x * h₂) * h₁
深度网络:顺序不可交换
x = torch.randn(1, 10)
W1 = torch.nn.Linear(10, 10, bias=False)
W2 = torch.nn.Linear(10, 10, bias=False)
relu = torch.nn.ReLU()
顺序1: W2(relu(W1(x)))
y1 = W2(relu(W1(x)))
顺序2: W1(relu(W2(x)))
y2 = W1(relu(W2(x)))
print(torch.allclose(y1, y2)) # False --- 不可交换!
**关键洞察**:非线性激活函数使得深度网络的"层序"成为一个重要的设计选择。这和LTI系统完全不同------LTI系统的级联顺序无关紧要。
---
## 2.9 系统的互联 → 网络架构设计
### 经典互联方式
- 级联(串联):$y = T_2\{T_1\{x\}\}$ ------ 输出直接作为下一个系统的输入
- 并联:$y = T_1\{x\} + T_2\{x\}$ ------ 两个系统处理同一个输入,输出相加
- 反馈连接:$y = T_1\{x + T_2\{y\}\}$ ------ 输出反馈到输入
### AI中的对应
```python
# 级联 = Sequential
model_cascade = torch.nn.Sequential(
torch.nn.Linear(10, 20),
torch.nn.ReLU(),
torch.nn.Linear(20, 5)
)
# 并联 = 多分支(如Inception模块)
class ParallelBranches(torch.nn.Module):
def __init__(self):
super().__init__()
self.branch1 = torch.nn.Linear(10, 5)
self.branch2 = torch.nn.Linear(10, 5)
def forward(self, x):
return self.branch1(x) + self.branch2(x) # 并联求和
# 反馈连接 = RNN / 残差连接
class FeedbackSystem(torch.nn.Module):
def __init__(self):
super().__init__()
self.T1 = torch.nn.Linear(10, 10)
self.T2 = torch.nn.Linear(10, 10)
def forward(self, x, y_prev):
# y = T1(x + T2(y_prev))
return self.T1(x + self.T2(y_prev))
2.10 传递函数 → 网络的输入-输出映射
经典定义
LTI系统的传递函数 H(s) 是冲激响应的拉普拉斯变换:
Y(s)=H(s)⋅X(s) Y(s) = H(s) \cdot X(s) Y(s)=H(s)⋅X(s)
它描述了系统在频域中的行为。
AI中的"传递函数"
虽然深度学习没有直接使用传递函数的概念,但函数映射的思想是一样的:
- 信号处理:H(s)=Y(s)/X(s)H(s) = Y(s)/X(s)H(s)=Y(s)/X(s) → 系统的频域特性
- AI:fθ(x)=yf_\theta(x) = yfθ(x)=y → 网络的输入-输出映射
Neural ODE 的"传递函数"是可以显式写出的:
Neural ODE: dx/dt = f_θ(x, t)
在频域:sX(s) - x(0) = F_θ(X(s), s)
传递函数不是简单的 H(s),而是一个隐式定义
但思想相同:描述输入-输出关系
2.11 综合对比表
| 信号处理概念 | AI对应 | 关键差异 |
|---|---|---|
| 系统 T{⋅}T\{\cdot\}T{⋅} | 网络 fθ(⋅)f_\theta(\cdot)fθ(⋅) | AI系统是参数化的 |
| 线性 | 线性层 | AI需要非线性打破线性 |
| 时不变 | 平移等变(CNN) | AI有更广泛的等变性需求 |
| 因果性 | 自回归掩码 | AI中需要显式实现 |
| BIBO稳定 | 梯度稳定 | AI中通过Norm/残差保证 |
| 冲激响应 h(t)h(t)h(t) | 卷积核 / 权重矩阵 | AI中是可学习的 |
| 级联系统 | 深度网络 | AI中级联顺序重要 |
| 并联系统 | 多分支架构 | 同构 |
| 反馈系统 | RNN / 残差连接 | 同构 |
| 传递函数 H(s)H(s)H(s) | 网络映射 fθf_\thetafθ | AI中通常不显式使用 |
2.12 思考题
Q1: "为什么深度学习不用LTI系统?"
回答:因为LTI系统的级联还是LTI,无论堆多少层,表达能力不会增加------它只能做线性变换。非线性激活函数打破了线性性,使得深度网络成为通用函数逼近器。但有趣的是,CNN的卷积层本身就是LTI(平移等变的线性变换),非线性只在激活函数中引入。这使得CNN既有LTI系统的高效性和可分析性,又有非线性网络的表达能力。
Q2: "残差连接和反馈系统有什么关系?"
回答:残差连接 y = x + F(x) 可以看作是一个特殊的反馈结构------如果把 F(x) 看作"前馈路径",x 看作"直通路径",那残差连接就是一个并联系统(前馈 + 直通)。从反馈系统的角度看,它提供了一个"零延迟反馈路径",让信号可以不经过任何变换就到达输出,这对梯度传播极其重要。
Q3: "CNN为什么比全连接层更适合图像?"
回答 :三个原因,全部可以用信号处理的语言解释:(1) 局部性 :卷积核只看局部邻域,图像的统计特性是局部的(相邻像素相关);(2) 平移等变性 :同一个物体出现在图像的不同位置,卷积的响应相同------这是时不变性的空间版本;(3) 参数共享:同一个卷积核用于所有位置,参数量从 O(n²) 降到 O(k²),其中 k 是核大小。
本章总结
- LTI系统 :线性 + 时不变 + 因果 + 稳定
- ↓ 打破线性性,增加参数化
- 神经网络 :非线性 + 参数化 + 可训练
- ↓ 保留部分LTI性质
- CNN:卷积层(LTI) + 激活函数(非线性) = 平移等变 + 非线性
- RNN:循环连接(反馈) + 激活函数(非线性) = 因果 + 非线性
- Transformer:自注意力(全局) + FFN(局部) = 全局建模 + 非线性
下一章预告:卷积是信号处理的灵魂运算,也是CNN的核心。下一章我们深入卷积本身------从连续卷积到离散卷积,从互相关到深度可分离卷积,彻底搞清楚"卷积"这个概念在两个领域中的精确映射。