开篇场景 (Hook):Ridge 之外,还有什么
上海一家私募的初级量化研究员陈晨把过去 36 个月沪深300(CSI 300)成分股的 30 列因子拼成一张面板:价值、动量、低波、质量、规模、换手、分析师修正等等,每月做一次截面回归,标签是下月超额收益。她用岭回归(ridge regression)跑了一遍 5 折交叉验证,OOS 上的 R2 只有 0.012——勉强能投产,但她的组长转过椅子问了一句:「价值和动量之间会不会有交互项?βvalue⋅xmom 这种东西岭回归看不见,你不补一层非线性?」
她当场卡壳。岭回归与任何线性模型的假设空间 Hlinear={x↦w⊤x+b} 不带交互项;要让模型看见「动量在低估值股票里更猛、在高估值股票里反转」,得把 H 扩到能装下任意光滑函数。本课的答案就是前馈神经网络(feedforward neural network),又叫多层感知机(multi-layer perceptron, MLP)。代价是优化问题不再凸;回报是 H 一举吞下你能想到的任何连续因子组合方式。
一、MLP 的逐层定义
把一个 L 层 MLP 看成「仿射变换 + 逐元素非线性 + 仿射变换 + ……」的复合。记输入 a(0)=x∈Rd0,第 l 层(l=1,…,L)做两件事:先算净输入(pre-activation)z(l)∈Rdl,再过激活函数(activation function)σl 得到激活值(post-activation)a(l)。
z(l)=W(l)a(l−1)+b(l),a(l)=σl(z(l)),a(0)=x,hθ(x)=a(L)
每层的可学参数是矩阵 W(l)∈Rdl×dl−1 与偏置 b(l)∈Rdl;把所有层的参数串起来记为 θ=(W(1),b(1),…,W(L),b(L))∈Rp,参数总数 p=∑ldl(dl−1+1)。整张 MLP 就是一个由 θ 索引的预测器 hθ:Rd0→RdL,假设空间 Hθ={hθ:θ∈Rp}。
注意两个独立的容量旋钮:宽度(width,每层单元数 dl)与深度(depth,层数 L)。把它们混为一谈是初学者最常犯的错——第六节专门讲为什么深更省。
二、四种规范激活函数
历史上四种激活函数撑起了 MLP 的绝大部分实用场景:
σ(z)=1+e−z1,tanh(z)=ez+e−zez−e−z,ReLU(z)=max(0,z),softmax(z)k=∑jezjezk
它们的导数依次是 σ(z)(1−σ(z))、1−tanh2(z)、1{z>0}、以及 ∂softmaxk/∂zj=softmaxk(δkj−softmaxj) 给出的 K×K 雅可比。
现代实践:隐藏层(hidden layer)几乎全部用 ReLU。原因有二——一是 σ 与 tanh 在 ∣z∣ 大时导数趋零,深层堆叠时梯度被指数级压扁,这就是梯度消失(vanishing gradient,下一课量化);二是 ReLU 一次只算一个比较,比 exp 便宜近一个量级。输出层按任务选:回归用恒等,二分类用 σ,K 类分类用 softmax。tanh 仅在循环网络的门里还活着,纯前馈基本退场。
三、经验风险与非凸性
把 MLP 接回 2.6.1 的统计学习框架。回归任务用平方损失,分类任务用 softmax-交叉熵(前者已在 2.6.1-3、后者在 2.6.1-5 推过,此处只引)。经验风险(empirical risk)写成
R(θ)=n1i=1∑nL(hθ(xi),yi)
学习目标是 θ^=argminθR(θ)——形式上仍是 ERM。关键变化:R 现在是 θ 的非凸函数。这是与 OLS、岭回归、SVM、kernel ridge 那一整套凸世界的分水岭。
非凸的根源在 hθ 对参数的依赖:W(l)a(l−1) 里 W(l) 与 a(l−1) 同时是优化变量,而 a(l−1) 自己又是更前面 W 的函数,相乘后整个组合在 θ 里多项式式地交互。后果是 R 上可同时存在多个局部极小、鞍点、长条状平坦区域,没有闭式解。梯度下降为何在如此糟糕的地形上仍能工作,是下一课的内容。
四、通用近似定理与它的边界
既然 Hθ 看起来这么贪心,它的逼近能力到底有多强?答案是几乎无界。
通用近似定理(universal approximation theorem,Cybenko 1989;Hornik 1991):设 K⊂Rd 紧,f∈C(K),σ 为任意非多项式连续函数。则对任意 ε>0,存在一个单隐藏层(depth-2)MLP hθ,使
x∈Ksup∣hθ(x)−f(x)∣<ε.
通俗讲:足够宽的单层 MLP 在紧集上的连续函数空间里稠密。这话听上去很猛,但请注意三件没说的事:
- 没给宽度上界:要逼近的 f 越复杂,所需隐藏单元数 d1 可以指数式爆炸——定理只给存在性,不给构造性。
- 没给优化保证:定理只说「存在某个 θ」,没说 SGD 从随机初始化出发能不能找到它。事实上经常找不到。
- 没给泛化保证:定理在 K 上对真实函数 f 逼近,但你手上的 R 是有限样本经验风险曲面,二者不是同一回事。
一句话:通用近似是「能拟合一切」的必要条件,远非「应该拟合一切」的充分条件。
五、一个手算的 MLP
设 d0=2、d1=3(一个 ReLU 隐藏层)、d2=1 输出。参数固定为
W(1)=101−111,b(1)=00−1,W(2)=(1,1,−2),b(2)=0.
输入 x=(2,1)⊤。第一层净输入
z(1)=W(1)x+b(1)=(2−1,0+1,2+1−1)⊤=(1,1,2)⊤.
ReLU 后 a(1)=(1,1,2)⊤(三个都 > 0,原样通过)。输出层 hθ(x)=1⋅1+1⋅1−2⋅2=−2。
换 x=(1,2):z(1)=(−1,2,2)⊤,a(1)=(0,2,2),输出 0+2−4=−2。再换 x=(0,0):z(1)=(0,0,−1),a(1)=(0,0,0),输出 0。第三个隐藏单元的 ReLU 在原点被关掉——这一开关行为正是 MLP 用「分段线性拼接」表达任意函数的源头。
整张网络的全部秘密只有一行:矩阵-向量乘 + 逐元素非线性 + 再来一次。
六、深度为什么比宽度便宜
通用近似定理只承诺单层够用,但 Telgarsky(2016)的锯齿构造(sawtooth construction)证明:要在 [0,1] 上逼近一个有 2k 个尖峰的锯齿函数到固定精度,单隐藏层 ReLU 网络至少需要 Ω(2k) 个单元;而一个深度 k+2 的 ReLU 网络只要 O(k) 个单元——后者比前者指数级省。Eldan-Shamir(2016)对径向函数给出了「深度 3 vs 深度 2」的类似分离结果。
直觉上,深层网络重复利用低层特征:第一层的分段线性段被第二层组合成凸函数之差,第三层再拼成更复杂形状——这就是层级特征(hierarchical features),也是深度学习胜过浅层模型的实证基础。代价是非凸优化更难,要靠下一课的反向传播。
Formula Explorer
max(0, w*x + b)
把单个 ReLU 单元 max(0,wx+b) 拖一拖:w 控制斜率,b 控制折点。若干这样的折线相加,就是 MLP 表达力的几何源头——也是把假设空间从岭回归推到带交互项因子模型(factor model)所需的最小拼图。MLP 用「仿射 + ReLU + 仿射」硬逼近条件期望 E[Y∣X]。
七、练习
Exercise
设两输入 x=(x1,x2)、一个 width-2 ReLU 隐藏层、单输出 MLP 的参数为
W(1)=(1001)、b(1)=(0,0)⊤、W(2)=(1,1)、b(2)=0。
- 这张网络计算的是什么函数?显式写出 hθ(x)。
- 当输入 x 来自 [−1,1]2 时,hθ 是否能在该方块上等于线性函数 x1+x2?如果不能,差在哪里?
- 把第二层权重改为 W(2)=(1,−1),重新写出 hθ(x)。它现在等于哪个常见的非线性函数?
提示
第一问只需把定义代进去:
z(1)=(x1,x2),
a(1)=(max(0,x1),max(0,x2)),输出加权求和。注意 ReLU 把负半轴砍掉。
提示
第三问把
W(2)=(1,−1) 代入:
hθ(x)=max(0,x1)−max(0,x2)。考虑
x1,x2 同号 / 异号四个象限,会发现这是某个分段线性函数的常见写法。
通往下一课
到这里你已经接受了三件事:MLP 是仿射 + ReLU 复合的可微假设空间;它一举吞下岭回归与 kernel 看不见的因子交互;经验风险 R(θ) 非凸、无闭式解。剩下的关键问题只剩两个——怎么算梯度 ∇θR,以及在非凸地形上怎么走。下一课用反向传播(backpropagation)解决第一个:链式法则在计算图上被组织成一遍前向、一遍反向的访问,所有偏导只需 O(网络规模) 次运算——这是 PyTorch 与现代深度学习栈的核心算法。