← 返回模块
Q2.6.3.1beta 可读 · 未来免费校验通过内容版本 2026-05-26

前馈神经网络作为函数逼近器

2.6.3 · 神经网络 · 数学与统计能力

开篇场景 (Hook):Ridge 之外,还有什么

上海一家私募的初级量化研究员陈晨把过去 36 个月沪深300(CSI 300)成分股的 30 列因子拼成一张面板:价值、动量、低波、质量、规模、换手、分析师修正等等,每月做一次截面回归,标签是下月超额收益。她用岭回归(ridge regression)跑了一遍 5 折交叉验证,OOS 上的 R2R^2 只有 0.012——勉强能投产,但她的组长转过椅子问了一句:「价值和动量之间会不会有交互项?βvaluexmom\beta_{\text{value}} \cdot x_{\text{mom}} 这种东西岭回归看不见,你不补一层非线性?」

她当场卡壳。岭回归与任何线性模型的假设空间 Hlinear={xwx+b}\mathcal{H}_{\text{linear}} = \{x \mapsto w^\top x + b\} 不带交互项;要让模型看见「动量在低估值股票里更猛、在高估值股票里反转」,得把 H\mathcal{H} 扩到能装下任意光滑函数。本课的答案就是​​前馈神经网络​​(feedforward neural network),又叫​​多层感知机​​(multi-layer perceptron, MLP)。代价是优化问题不再凸;回报是 H\mathcal{H} 一举吞下你能想到的任何连续因子组合方式。

一、MLP 的逐层定义

把一个 LL 层 MLP 看成「仿射变换 + 逐元素非线性 + 仿射变换 + ……」的复合。记输入 a(0)=xRd0a^{(0)} = x \in \mathbb{R}^{d_0},第 ll 层(l=1,,Ll = 1, \dots, L)做两件事:先算​​净输入​​(pre-activation)z(l)Rdlz^{(l)} \in \mathbb{R}^{d_l},再过​​激活函数​​(activation function)σl\sigma_l 得到​​激活值​​(post-activation)a(l)a^{(l)}

z(l)=W(l)a(l1)+b(l),a(l)=σl(z(l)),a(0)=x,hθ(x)=a(L)z^{(l)} = W^{(l)} a^{(l-1)} + b^{(l)}, \quad a^{(l)} = \sigma_l(z^{(l)}), \quad a^{(0)} = x, \quad h_\theta(x) = a^{(L)}

每层的可学参数是矩阵 W(l)Rdl×dl1W^{(l)} \in \mathbb{R}^{d_l \times d_{l-1}} 与偏置 b(l)Rdlb^{(l)} \in \mathbb{R}^{d_l};把所有层的参数串起来记为 θ=(W(1),b(1),,W(L),b(L))Rp\theta = (W^{(1)}, b^{(1)}, \dots, W^{(L)}, b^{(L)}) \in \mathbb{R}^p,参数总数 p=ldl(dl1+1)p = \sum_l d_l (d_{l-1} + 1)。整张 MLP 就是一个由 θ\theta 索引的预测器 hθ:Rd0RdLh_\theta : \mathbb{R}^{d_0} \to \mathbb{R}^{d_L},假设空间 Hθ={hθ:θRp}\mathcal{H}_\theta = \{h_\theta : \theta \in \mathbb{R}^p\}

注意两个独立的容量旋钮:​​宽度​​(width,每层单元数 dld_l)与​​深度​​(depth,层数 LL)。把它们混为一谈是初学者最常犯的错——第六节专门讲为什么深更省。

二、四种规范激活函数

历史上四种激活函数撑起了 MLP 的绝大部分实用场景:

σ(z)=11+ez,tanh(z)=ezezez+ez,ReLU(z)=max(0,z),softmax(z)k=ezkjezj\sigma(z) = \tfrac{1}{1 + e^{-z}}, \quad \tanh(z) = \tfrac{e^z - e^{-z}}{e^z + e^{-z}}, \quad \mathrm{ReLU}(z) = \max(0, z), \quad \mathrm{softmax}(z)_k = \tfrac{e^{z_k}}{\sum_j e^{z_j}}

它们的导数依次是 σ(z)(1σ(z))\sigma(z)(1 - \sigma(z))1tanh2(z)1 - \tanh^2(z)1{z>0}\mathbb{1}\{z > 0\}、以及 softmaxk/zj=softmaxk(δkjsoftmaxj)\partial \mathrm{softmax}_k / \partial z_j = \mathrm{softmax}_k (\delta_{kj} - \mathrm{softmax}_j) 给出的 K×KK \times K 雅可比。

​现代实践​​:隐藏层(hidden layer)几乎全部用 ReLU。原因有二——一是 σ\sigmatanh\tanhz|z| 大时导数趋零,深层堆叠时梯度被指数级压扁,这就是​​梯度消失​​(vanishing gradient,下一课量化);二是 ReLU 一次只算一个比较,比 exp\exp 便宜近一个量级。​​输出层​​按任务选:回归用恒等,二分类用 σ\sigmaKK 类分类用 softmax\mathrm{softmax}tanh\tanh 仅在循环网络的门里还活着,纯前馈基本退场。

三、经验风险与非凸性

把 MLP 接回 2.6.1 的统计学习框架。回归任务用平方损失,分类任务用 softmax-交叉熵(前者已在 2.6.1-3、后者在 2.6.1-5 推过,此处只引)。​​经验风险​​(empirical risk)写成

R^(θ)=1ni=1nL(hθ(xi),yi)\widehat{R}(\theta) = \tfrac{1}{n} \sum_{i=1}^n L(h_\theta(x_i), y_i)

学习目标是 θ^=argminθR^(θ)\hat{\theta} = \arg\min_\theta \widehat{R}(\theta)——形式上仍是 ERM。​​关键变化​​:R^\widehat{R} 现在是 θ\theta 的​​非凸函数​​。这是与 OLS、岭回归、SVM、kernel ridge 那一整套凸世界的分水岭。

非凸的根源在 hθh_\theta 对参数的依赖:W(l)a(l1)W^{(l)} a^{(l-1)}W(l)W^{(l)}a(l1)a^{(l-1)} 同时是优化变量,而 a(l1)a^{(l-1)} 自己又是更前面 WW 的函数,相乘后整个组合在 θ\theta 里多项式式地交互。后果是 R^\widehat{R} 上可同时存在多个局部极小、鞍点、长条状平坦区域,没有闭式解。梯度下降为何在如此糟糕的地形上仍能工作,是下一课的内容。

四、通用近似定理与它的边界

既然 Hθ\mathcal{H}_\theta 看起来这么贪心,它的逼近能力到底有多强?答案是几乎无界。

​通用近似定理​​(universal approximation theorem,Cybenko 1989;Hornik 1991):设 KRdK \subset \mathbb{R}^d 紧,fC(K)f \in C(K)σ\sigma 为任意非多项式连续函数。则对任意 ε>0\varepsilon > 0,存在一个​​单隐藏层​​(depth-2)MLP hθh_\theta,使

supxKhθ(x)f(x)<ε.\sup_{x \in K} |h_\theta(x) - f(x)| < \varepsilon.

通俗讲:足够宽的单层 MLP 在紧集上的连续函数空间里​​稠密​​。这话听上去很猛,但请注意三件​​没说​​的事:

  1. ​没给宽度上界​​:要逼近的 ff 越复杂,所需隐藏单元数 d1d_1 可以指数式爆炸——定理只给存在性,不给构造性。
  2. ​没给优化保证​​:定理只说「存在某个 θ\theta」,没说 SGD 从随机初始化出发能不能找到它。事实上经常找不到。
  3. ​没给泛化保证​​:定理在 KK 上对真实函数 ff 逼近,但你手上的 R^\widehat{R} 是有限样本经验风险曲面,二者不是同一回事。

一句话:通用近似是「​​能​​拟合一切」的必要条件,远非「​​应该​​拟合一切」的充分条件。

五、一个手算的 MLP

d0=2d_0 = 2d1=3d_1 = 3(一个 ReLU 隐藏层)、d2=1d_2 = 1 输出。参数固定为

W(1)=(110111),b(1)=(001),W(2)=(1,  1,  2),b(2)=0.W^{(1)} = \begin{pmatrix} 1 & -1 \\ 0 & 1 \\ 1 & 1 \end{pmatrix}, \quad b^{(1)} = \begin{pmatrix} 0 \\ 0 \\ -1 \end{pmatrix}, \quad W^{(2)} = (1, \; 1, \; -2), \quad b^{(2)} = 0.

输入 x=(2,1)x = (2, 1)^\top。第一层净输入

z(1)=W(1)x+b(1)=(21,  0+1,  2+11)=(1,1,2).z^{(1)} = W^{(1)} x + b^{(1)} = (2 - 1, \; 0 + 1, \; 2 + 1 - 1)^\top = (1, 1, 2)^\top.

ReLU 后 a(1)=(1,1,2)a^{(1)} = (1, 1, 2)^\top(三个都 > 0,原样通过)。输出层 hθ(x)=11+1122=2h_\theta(x) = 1 \cdot 1 + 1 \cdot 1 - 2 \cdot 2 = -2

x=(1,2)x = (1, 2)z(1)=(1,2,2)z^{(1)} = (-1, 2, 2)^\topa(1)=(0,2,2)a^{(1)} = (0, 2, 2),输出 0+24=20 + 2 - 4 = -2。再换 x=(0,0)x = (0, 0)z(1)=(0,0,1)z^{(1)} = (0, 0, -1)a(1)=(0,0,0)a^{(1)} = (0, 0, 0),输出 00。第三个隐藏单元的 ReLU 在原点被关掉——这一开关行为正是 MLP 用「分段线性拼接」表达任意函数的源头。

整张网络的全部秘密只有一行:​​矩阵-向量乘 + 逐元素非线性 + 再来一次​​。

六、深度为什么比宽度便宜

通用近似定理只承诺单层够用,但 Telgarsky(2016)的锯齿构造(sawtooth construction)证明:要在 [0,1][0, 1] 上逼近一个有 2k2^k 个尖峰的锯齿函数到固定精度,​​单隐藏层​ ReLU 网络至少需要 Ω(2k)\Omega(2^k) 个单元;而一个深度 k+2k + 2 的 ReLU 网络只要 O(k)O(k) 个单元——后者比前者​​指数级省​​。Eldan-Shamir(2016)对径向函数给出了「深度 3 vs 深度 2」的类似分离结果。

直觉上,深层网络重复利用低层特征:第一层的分段线性段被第二层组合成凸函数之差,第三层再拼成更复杂形状——这就是​​层级特征​​(hierarchical features),也是深度学习胜过浅层模型的实证基础。代价是非凸优化更难,要靠下一课的反向传播。

Formula Explorer

max(0, w*x + b)

把单个 ReLU 单元 max(0,wx+b)\max(0, wx + b) 拖一拖:ww 控制斜率,bb 控制折点。若干这样的折线相加,就是 MLP 表达力的几何源头——也是把假设空间从岭回归推到带交互项​​因子模型​​(factor model)所需的最小拼图。MLP 用「仿射 + ReLU + 仿射」硬逼近​​条件期望​ E[YX]\mathbb{E}[Y \mid X]

七、练习

Exercise

设两输入 x=(x1,x2)x = (x_1, x_2)、一个 width-2 ReLU 隐藏层、单输出 MLP 的参数为 W(1)=(1001)W^{(1)} = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix}b(1)=(0,0)b^{(1)} = (0, 0)^\topW(2)=(1,1)W^{(2)} = (1, 1)b(2)=0b^{(2)} = 0

  1. 这张网络计算的是什么函数?显式写出 hθ(x)h_\theta(x)
  2. 当输入 xx 来自 [1,1]2[-1, 1]^2 时,hθh_\theta 是否能在该方块上​​等于​​线性函数 x1+x2x_1 + x_2?如果不能,差在哪里?
  3. 把第二层权重改为 W(2)=(1,1)W^{(2)} = (1, -1),重新写出 hθ(x)h_\theta(x)。它现在等于哪个常见的非线性函数?
提示
第一问只需把定义代进去:z(1)=(x1,x2)z^{(1)} = (x_1, x_2)a(1)=(max(0,x1),max(0,x2))a^{(1)} = (\max(0, x_1), \max(0, x_2)),输出加权求和。注意 ReLU 把负半轴砍掉。
提示
第三问把 W(2)=(1,1)W^{(2)} = (1, -1) 代入:hθ(x)=max(0,x1)max(0,x2)h_\theta(x) = \max(0, x_1) - \max(0, x_2)。考虑 x1,x2x_1, x_2 同号 / 异号四个象限,会发现这是某个分段线性函数的常见写法。

通往下一课

到这里你已经接受了三件事:MLP 是仿射 + ReLU 复合的可微假设空间;它一举吞下岭回归与 kernel 看不见的因子交互;经验风险 R^(θ)\widehat{R}(\theta) 非凸、无闭式解。剩下的关键问题只剩两个——​​怎么算梯度 θR^\nabla_\theta \widehat{R}​​​,以及​​在非凸地形上怎么走​​。下一课用反向传播(backpropagation)解决第一个:链式法则在计算图上被组织成一遍前向、一遍反向的访问,所有偏导只需 O(网络规模)O(\text{网络规模}) 次运算——这是 PyTorch 与现代深度学习栈的核心算法。