{* YBB Header v4.0 — Alpine.js + 自定义 CSS *}

泛函分析深度实战:从赋范空间、巴拿赫与希尔伯特空间到压缩映射、正交投影、再生核希尔伯特空间与神经正切核的完整工程链路

泛函分析是"无限维的线性代数"——它把线性代数从有限维向量空间搬到了函数空间上,用范数度量大小、用内积度量角度、用算子代替矩阵。现代机器学习的许多底层结构——核方法、高斯过程、神经正切核(NTK)、注意力机制中的投影、正则化的几何含义——本质上都是泛函分析的工程落地。本文从第一性原理出发,配 6 段可运行 Python 代码,把抽象的空间与算子变成可计算、可验证的对象。

一、第一性原理:从赋范空间到希尔伯特空间

赋范空间(Normed Space) 是一个向量空间配上一个范数 ||·||,满足三条公理:正定性(||x|| ≥ 0 且为零当且仅当 x=0)、齐次性(||αx|| = |α|·||x||)、三角不等式(||x+y|| ≤ ||x|| + ||y||)。范数给了我们"距离"的概念:d(x,y)=||x−y||。

巴拿赫空间(Banach Space) = 完备的赋范空间,即所有柯西列都收敛到空间内的点。完备性至关重要:很多存在性证明(如不动点定理)都依赖它。

内积空间 / 希尔伯特空间(Hilbert Space) 进一步引入内积 ⟨·,·⟩,并由它诱导范数 ||x|| = √⟨x,x⟩。希尔伯特空间额外要求内积诱导的范数下完备。希尔伯特空间拥有"角度"和"正交"——这是巴拿赫空间(只靠范数)一般没有的奢侈品。

两个判据能区分二者:

  • 柯西-施瓦茨不等式 |⟨x,y⟩| ≤ ||x||·||y|| 只在有内积时成立;
  • 平行四边形恒等式 ||x+y||² + ||x−y||² = 2(||x||² + ||y||²) 在希尔伯特空间中恒成立,反过来也成立:一个赋范空间只要满足该恒等式,就一定能由范数反推出内积(极化恒等式)。因此平行四边形恒等式是"该空间是否为希尔伯特空间"的判定准则。

下面在离散网格上把函数当成向量,直接验证这些性质。


import numpy as np

# 在网格上把函数视为向量,用黎曼和定义 L2 内积与范数
x = np.linspace(0, 1, 2001)
f = x**2                      # f(x) = x^2
g = np.sin(np.pi * x)         # g(x) = sin(πx)
dx = x[1] - x[0]

def L2_inner(a, b): return np.sum(a * b) * dx
def L2_norm(a):    return np.sqrt(L2_inner(a, a))
def sup_norm(a):   return np.max(np.abs(a))

# 1) ||x^2||_2 = sqrt(∫_0^1 x^4 dx) = sqrt(1/5) ≈ 0.4472
print(round(L2_norm(f), 4))                      # 0.4475(离散近似)

# 2) 柯西-施瓦茨:|⟨f,g⟩|² ≤ ||f||²·||g||²
cs = L2_inner(f, g)**2 <= L2_norm(f)**2 * L2_norm(g)**2 + 1e-9
print(bool(cs))                                  # True

# 3) 平行四边形恒等式:L2(希尔伯特)成立,sup 范数(一般巴拿赫)不成立
pl_l2  = L2_norm(f + g)**2 + L2_norm(f - g)**2
pl_l2r = 2 * (L2_norm(f)**2 + L2_norm(g)**2)
print(abs(pl_l2 - pl_l2r))                       # 0.0  -> L2 是希尔伯特

h = np.where(x < 0.5, 1.0, 0.0)
k = np.where(x >= 0.5, 1.0, 0.0)
pl_sup  = sup_norm(h + k)**2 + sup_norm(h - k)**2
pl_supr = 2 * (sup_norm(h)**2 + sup_norm(k)**2)
print(pl_sup, pl_supr)                           # 2.0 vs 4.0 -> sup 范数不是希尔伯特

运行结果:L2 范数下 ||x²||₂ ≈ 0.4475(理论 √(1/5)=0.4472),柯西-施瓦茨成立,L2 的平行四边形恒等式左右差为 0.0;而 sup 范数下平行四边形左右为 2.0 与 4.0 不相等——量化地证明了"带 sup 范数的连续函数空间是巴拿赫空间,却不是希尔伯特空间"。

二、有界线性算子与算子范数:无限维的"矩阵"

有限维里线性映射就是矩阵;无限维里它叫线性算子 T: X → Y。有界指存在常数 C 使 ||Tx|| ≤ C||x||——在赋范空间里,"有界"与"连续"等价。算子本身的"大小"由算子范数定义:

||T|| = sup_{||x||=1} ||Tx||

它把矩阵谱范数推广到了无限维:对矩阵而言 ||A||₂ 正好等于最大奇异值。一个关键反例是微分算子 D = d/dx——它在连续/可微函数空间上是无界的:对 f_k(x)=sin(kx),||f_k'|| / ||f_k|| = k → ∞,频率越高放大越狠。这就是为什么微分算子的"定义域"必须小心对待。


import numpy as np

# 算子范数 = 最大奇异值;并验证次乘性 ||AB|| ≤ ||A||·||B||
rng = np.random.default_rng(0)
A = rng.standard_normal((4, 4))
B = rng.standard_normal((4, 4))
n2   = np.linalg.norm(A, 2)
svmax = np.linalg.svd(A, compute_uv=False).max()
print(round(n2, 6), round(svmax, 6))             # 3.034873 3.034873(相等)
print(np.linalg.norm(A @ B, 2) <= np.linalg.norm(A, 2) * np.linalg.norm(B, 2) + 1e-10)  # True

# 微分算子无界:对 sin(kx),放大比 = k,随 k 发散
ratios = []
for kk in [1, 5, 10, 20, 50]:
    xs = np.linspace(0, 2*np.pi, 20001); ddx = xs[1] - xs[0]
    fk, dfk = np.sin(kk * xs), kk * np.cos(kk * xs)
    ratios.append(np.max(np.abs(dfk)) / np.max(np.abs(fk)))
print([round(r, 3) for r in ratios])             # [1.0, 5.0, 10.0, 20.0, 50.0] -> 无界

矩阵谱范数严格等于最大奇异值(3.034873);次乘性成立;微分算子的放大比随 k 线性增长到 50 仍无收敛趋势,确认其为无界算子——这提醒我们:在无穷维里"算子是否良好"不能想当然。

三、巴拿赫不动点定理:压缩映射的确定性收敛

压缩映射指存在 L < 1 使 ||T(x) − T(y)|| ≤ L·||x − y||。巴拿赫不动点定理断言:在完备度量空间里,压缩映射有唯一不动点 x = T(x),且从任意初值迭代 x_{n+1}=T(x_n) 都几何收敛,误差 ||x_n − x*|| ≤ Lⁿ/(1−L)·||x_1−x_0||。这是迭代法(方程求解、EM、强化学习的值迭代、PDE 的 Picard 迭代)的理论基石。


import numpy as np

# (a) x = cos(x):收缩常数 L = |sin(x)| ≤ sin(1) ≈ 0.8415 < 1,必收敛
val = 0.5
for _ in range(50):
    val = np.cos(val)
print(round(val, 10))                            # 0.7390851327(Dottie 数)

# (b) Picard 迭代求解 y' = y, y(0)=1  ->  积分方程 y = 1 + ∫_0^x y(t)dt  ->  e^x
xs = np.linspace(0, 1, 2001); h = xs[1] - xs[0]
y = np.ones_like(xs)
for _ in range(8):
    Y = np.concatenate([[0.0], np.cumsum(y[:-1]) * h])   # 左黎曼和求 ∫_0^x y
    y = 1.0 + Y
print(np.max(np.abs(y - np.exp(xs))))           # 6.82e-04,已逼近 e^x

x=cos(x) 收敛到 0.7390851327;Picard 迭代 8 步后解与 eˣ 的最大误差仅 6.82e-04——同一个定理既解标量方程,又解微分方程,是"无限维不动点"的典型工程用法。

四、希尔伯特空间几何:正交投影与 Gram-Schmidt

希尔伯特空间有正交性,于是有了最佳逼近定理:向量在子空间上的正交投影是距离最近的那个点。这正是最小二乘的本质——回归就是用线性函数的子空间去"正交投影"目标。用 Gram-Schmidt 还能在子空间上造出正交基:对函数空间做 Gram-Schmidt,得到的是一组正交多项式(勒让德多项式的离散版本)。


import numpy as np

xg = np.linspace(-1, 1, 2001); ddx = xg[1] - xg[0]
def inner(a, b): return np.sum(a * b) * ddx
def norm(a):    return np.sqrt(inner(a, a))

# 对单项式基 {1, x, x^2, x^3} 做 Gram-Schmidt -> 正交多项式
basis = [np.ones_like(xg), xg, xg**2, xg**3]
Q = []
for b in basis:
    v = b.copy()
    for q in Q:
        v = v - inner(v, q) * q
    Q.append(v / norm(v))

G = np.array([[inner(Q[i], Q[j]) for j in range(4)] for i in range(4)])
print(np.max(np.abs(G - np.diag(np.diag(G)))), [round(G[i, i], 4) for i in range(4)])
# 2.27e-16 , [1.0, 1.0, 1.0, 1.0]  -> 完美正交

# 正交投影 = 最小二乘:|x| 在 span{1, x} 上的投影 与 线性回归 完全一致
f = np.abs(xg)
proj = inner(f, Q[0]) * Q[0] + inner(f, Q[1]) * Q[1]
slope, intercept = np.polyfit(xg, f, 1)
linreg = intercept + slope * xg
print(np.max(np.abs(proj - linreg)))              # 4.44e-16

正交性误差 2.27e-16(机器精度),对角线全为 1.0;而"函数空间正交投影"与"线性回归"的预测曲线相差仅 4.44e-16——从泛函分析视角看,线性回归就是在希尔伯特空间里做正交投影,二者是同一个几何事实。

五、里斯表示定理与再生核希尔伯特空间(RKHS)

里斯表示定理说:希尔伯特空间上任一连续线性泛函,都可唯一表示为与某个向量的内积 φ(f) = ⟨f, v⟩。这给了"求值"一个优雅形式。特别地,若"在某点的取值" f ↦ f(x₀) 是连续线性泛函(即点求值有界),就存在唯一的"代表核" k_{x₀} 使 f(x₀) = ⟨f, k_{x₀}⟩——这样的空间叫再生核希尔伯特空间(RKHS),核函数 k(x,y)=⟨k_x,k_y⟩ 满足再生性 f(x)=⟨f,k_x⟩。

表示定理(Representer Theorem) 是核机器学习的命根子:带正则项的经验风险最小化,其解必落在训练样本核的张成空间里,即 f(x) = Σᵢ αᵢ k(xᵢ, x)。于是 SVM、核岭回归、高斯过程都被收编进同一个框架。


import numpy as np

rng = np.random.default_rng(1)
n = 40; X = rng.uniform(-3, 3, n); y = np.sin(X) + 0.1 * rng.standard_normal(n)

def gk(X, Y, s=1.0):
    X, Y = X.reshape(-1, 1), Y.reshape(-1, 1)
    return np.exp(-((X - Y.T)**2) / (2 * s**2))      # 高斯核

K = gk(X, X, 1.0); lam = 0.1
alpha = np.linalg.solve(K + lam * np.eye(n), y)        # 解 = Σ αᵢ k(xᵢ,·)(表示定理)
Xg = np.linspace(-3, 3, 300); ypred = gk(Xg, X, 1.0) @ alpha

# 对照:线性岭回归
Xl = np.column_stack([np.ones(n), X])
w  = np.linalg.solve(Xl.T @ Xl + lam * np.eye(2), Xl.T @ y)
linpred = np.column_stack([np.ones(len(Xg)), Xg]) @ w

print(np.sqrt(np.mean((ypred - np.sin(Xg))**2)),       # 核岭 RMSE
      np.sqrt(np.mean((linpred - np.sin(Xg))**2)))      # 线性 RMSE
print(np.linalg.eigvalsh(K + lam * np.eye(n)).min())   # 0.1(PSD)

核岭回归 RMSE 0.0334,线性岭回归 0.4208——核把非线性结构卷进 RKHS 后拟合碾压线性;同时 K+λI 最小特征值 0.1 > 0,核矩阵正定,再生性成立。解显式写成 Σ αᵢ k(xᵢ,·) 正是表示定理的落地。

六、神经正切核(NTK):泛函分析直击深度学习

把神经网络参数记为 θ,输出 f_θ(x)。在无限宽极限下,梯度下降在函数空间里演化,网络的"核"

Θ(x, x') = ⟨∇_θ f_θ(x), ∇_θ f_θ(x')⟩ = J Jᵀ

——即参数梯度(雅可比)的内积——在训练过程中几乎不变。此时网络训练等价于以 NTK 为核的核回归:这是"无限宽网络 = 线性模型(在 NTK 定义的函数空间里)"的精确表述,也是深度学习可训练性的经典解释。


import numpy as np

rng = np.random.default_rng(2)
n_in, m, n_data = 1, 100, 8
W1 = rng.standard_normal((m, n_in)) / np.sqrt(n_in)
b1 = np.zeros(m)
W2 = rng.standard_normal((1, m)) / np.sqrt(m)
xt = rng.standard_normal((n_data, n_in)); yt = np.sin(xt[:, 0])

def unflatten(v):
    return v[:m*n_in].reshape(m, n_in), v[m*n_in:2*m*n_in], v[2*m*n_in:].reshape(1, m)
def flatten(p): return np.concatenate([p[0].ravel(), p[1].ravel(), p[2].ravel()])
def fwd(v, x):
    W1r, b1r, W2r = unflatten(v); z = np.tanh(x @ W1r.T + b1r); return (z @ W2r.T)[:, 0]

def ntk_at(theta, x):
    n_p = len(theta); J = np.zeros((len(x), n_p)); eps = 1e-5
    for j in range(n_p):
        tp, tm = theta.copy(), theta.copy(); tp[j] += eps; tm[j] -= eps
        J[:, j] = (fwd(tp, x) - fwd(tm, x)) / (2 * eps)
    return J @ J.T

theta0 = flatten((W1, b1, W2))
ntk0 = ntk_at(theta0, xt)
print(np.linalg.eigvalsh(ntk0).min())                 # 9.43e-05(半正定)

# 训练 3 步后看 NTK 是否近似恒定
theta = theta0.copy()
for _ in range(3):
    out = fwd(theta, xt); res = out - yt
    n_p = len(theta); J = np.zeros((n_data, n_p)); eps = 1e-5
    for j in range(n_p):
        tp, tm = theta.copy(), theta.copy(); tp[j] += eps; tm[j] -= eps
        J[:, j] = (fwd(tp, xt) - fwd(tm, xt)) / (2 * eps)
    theta = theta - 0.05 * (J.T @ res)
ntk1 = ntk_at(theta, xt)
print(np.linalg.norm(ntk1 - ntk0) / np.linalg.norm(ntk0))   # 0.1125(宽度100时偏移~11%)

NTK 最小特征值 9.43e-05 ≥ 0,确认其为半正定核;宽度 100 的网络训练 3 步后 NTK 仅偏移约 11%,且随宽度增大严格趋于恒定——这正是"lazy training" regime 的量化证据:无限宽网络在函数空间里退化成核方法。

七、与 AI / 深度学习的映射表

泛函分析概念 在 AI / ML 中的对应
巴拿赫不动点 / 压缩映射 迭代推断、EM 算法、值迭代、不动点网络
算子范数 ` T ₂` 模型 Lipschitz 常数、对抗鲁棒性上界
正交投影 / 最佳逼近 最小二乘、线性回归、残差连接的正交分解
Gram-Schmidt / 正交基 白化、PCA、正交初始化、谱方法基函数
RKHS / 再生核 SVM、核岭回归、高斯过程先验
表示定理 核机器"解在样本张成空间"的理论保证
神经正切核 NTK 无限宽网络的训练动力学、grokking、线性化分析
谱定理 / 奇异值 PCA、SVD、低秩近似(数值分析已详述)

八、工程边界与陷阱

  1. 无界算子:微分、卷积(某些核)在常见范数下无界,定义域与稠密性必须显式处理,否则"算子范数"不存在。
  2. 范数即世界观:同一函数集配 L2 与 sup 范数会得到不同的完备化(不同的巴拿赫空间),"收敛"含义截然不同——选错范数,训练目标就变了。
  3. 核的选择决定 RKHS:高斯核、线性核、谱核对应不同的函数空间与光滑性先验,核宽 σ 直接控制偏差-方差。
  4. NTK 只是无限宽极限:有限宽网络会偏离 NTK 预测,特征学习(偏离线性)正是有限网络强于核方法的原因;NTK 解释不了 grokking 之后的相变。
  5. 非凸陷阱:有限宽网络损失地貌在参数空间非凸,泛函分析的凸几何工具(如 RKHS)只在"线性化/无限宽"近似下严格成立。

九、结论

泛函分析把"空间—范数—内积—算子—投影"这一套几何语言,从有限维向量扩展到了函数与模型本身。它既解释了为什么最小二乘是投影、为什么核方法解必取样本核展开、为什么无限宽网络退化为核回归,也划定了这些工具的边界:无界算子、范数依赖、有限宽偏离。掌握这条链路,等于拿到了连接数值分析、概率论、PDE 与现代深度学习的统一视角——而这正是后续继续深入算子学习、神经算子(如傅里叶神经算子)与可证明鲁棒性的地基。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部