量化交易中文教材

第 17 章 径向基网络

本章对应原书第 17 章(Radial Basis Networks)。径向基函数(RBF)网络是多层感知机之外的另一种通用函数逼近器。它的第一层是一组"局部"的高斯山包,第二层是线性组合。一旦固定了山包的位置和宽度,训练第二层就是一个(带正则化的)线性最小二乘问题,即岭回归。这使 RBF 网络成为连接神经网络与经典统计方法(核回归、逐步回归、岭回归)的桥梁,也是量化中做非线性因子建模、曲面平滑最容易落地的神经网络结构。本章是本册重点章之一。

学习目标

读完本章,你应当能够:

  1. 写出 RBF 网络的结构 \(a^1_i=\exp\!\big(-(\|\mathbf{p}-{}_i\mathbf{w}^1\|\,b^1_i)^2\big)\),\(\mathbf{a}^2=\mathbf{W}^2\mathbf{a}^1+\mathbf{b}^2\),说清中心、偏置(宽度)、第二层权值各自如何改变网络响应。
  2. 比较 RBF 的"局部"表示与多层感知机的"全局/分布式"表示,说出各自在神经元数量、训练速度、维数灾难、在线学习方面的优劣。
  3. 固定第一层后,用正则化线性最小二乘 \((\mathbf{U}^T\mathbf{U}+\rho\mathbf{I})\mathbf{x}=\mathbf{U}^T\mathbf{t}\) 求第二层,并能手算或编程复现原书例题。
  4. 推导并实现正交最小二乘(OLS)前向选择算法,理解误差下降比 \(o_i=h_i^2\mathbf{m}_i^T\mathbf{m}_i/\mathbf{t}^T\mathbf{t}\) 的含义及前向选择的局限。
  5. 用聚类确定中心与宽度,并能写出用梯度法微调全部参数时第一层的导数。
  6. 在截面收益预测中搭建"k-means 中心 + 岭回归"的 RBF 模型,用时间切分的验证集同时选择宽度和正则化参数。

读前导读

这一章在解决什么问题。 一句话:RBF 网络就是"先把原始特征变成一组相似度特征,再做岭回归"。第一层在输入空间里放若干个"参照点"(中心),对每个样本算它离每个参照点有多近,近则接近 1、远则接近 0;第二层拿这些相似度做线性回归。你在 CFA 二级见过多元回归 \(y=X\beta+\varepsilon\) 和它的正规方程 \(X^TX\hat\beta=X^Ty\),本章 17.7 节的核心公式 \((\mathbf{U}^T\mathbf{U}+\rho\mathbf{I})\mathbf{x}=\mathbf{U}^T\mathbf{t}\) 就是它,只是自变量矩阵 \(\mathbf{U}\) 不再是原始因子,而是"离各中心的相似度",并多了一个惩罚项 \(\rho\)(岭回归)。所以本章是神经网络里最接近你已有知识的一章:一旦第一层固定,剩下的全是回归。

本章的难点不在第二层,而在第一层:中心放哪、山包多宽。宽度太窄就是过拟合(每个数据点一个尖刺),太宽就退化成近似线性。17.8 节的正交最小二乘(OLS,注意这里是 Orthogonal Least Squares,不是普通最小二乘 Ordinary Least Squares)是一种逐个挑选中心的方法,它和量化里"逐步回归选因子""把新因子对已有因子做残差化"是同一个思路。

需要先想起来的数学。

  • 向量范数与距离:\(\|\mathbf{p}-\mathbf{w}\|=\sqrt{\sum_j(p_j-w_j)^2}\),就是两点间的直线距离。例:\([1,2]\) 与 \([4,6]\) 的距离为 \(\sqrt{9+16}=5\)。见 第 00 册第 06 章 线性代数速成。
  • 矩阵形式的最小二乘:\(\|\mathbf{t}-\mathbf{U}\mathbf{x}\|^2\) 对 \(\mathbf{x}\) 求梯度(所有偏导数排成的向量)得 \(-2\mathbf{U}^T(\mathbf{t}-\mathbf{U}\mathbf{x})\),令其为零得正规方程。两条常用规则:\(\nabla_{\mathbf{x}}(\mathbf{d}^T\mathbf{x})=\mathbf{d}\),\(\nabla_{\mathbf{x}}(\mathbf{x}^T\mathbf{A}\mathbf{x})=2\mathbf{A}\mathbf{x}\)(\(\mathbf{A}\) 对称时)。见 第 00 册第 05 章 多元微积分与优化。
  • 正定与半正定:对称矩阵 \(\mathbf{A}\) 若对任意非零 \(\mathbf{y}\) 都有 \(\mathbf{y}^T\mathbf{A}\mathbf{y}>0\),叫正定;\(\ge0\) 叫半正定。直观上,正定的 Hessian 意味着函数是"碗口朝上的碗",有唯一最低点。协方差矩阵就是半正定的(组合方差不会为负)。见第 06 章。
  • 正交与投影:两个向量内积为 0 就是正交。把 \(\mathbf{u}\) 中与 \(\mathbf{m}\) 同方向的部分去掉,剩下 \(\mathbf{u}-\frac{\mathbf{m}^T\mathbf{u}}{\mathbf{m}^T\mathbf{m}}\mathbf{m}\),它与 \(\mathbf{m}\) 正交。这一步等价于"把 \(\mathbf{u}\) 对 \(\mathbf{m}\) 做无截距回归后取残差"。
  • 链式法则:17.10 节求 \(n=b\sqrt{\sum_j(p_j-w_j)^2}\) 对 \(w_j\) 的导数要用它。见 第 00 册第 02 章 导数与泰勒展开。

怎么读这一章。 必读:17.2(结构)、17.3(四个参数的作用)、17.7(化为岭回归)、17.11.2(截面因子模型)。17.8 OLS 建议读,它是逐步回归的高效实现,能直接用于因子筛选;第一次读可以先看 17.8.2 的结论"\(o_i\) 是增量 \(R^2\)",跳过算法细节。17.4 模式分类和 17.10 梯度微调第一次可以略读。建议顺序:17.2 → 17.3 → 17.5 → 17.7 → 17.11.2 → 17.8 → 其余。


17.1 背景:从精确插值到稳健逼近

RBF 的原始工作是 1980 年代 Powell 等人研究的精确插值:插值函数必须精确穿过每一个训练点。神经网络面对的通常是有限且含噪的测量,精确插值会严重过拟合(第 13a 章)。Broomhead 与 Lowe(1988)首先把径向基函数用在神经网络里,目标改为得到一个平滑、泛化良好的逼近,而不强求穿过每个点。本章采用后一种观点。

原书介绍三类训练方法:

  1. 与第 11、12 章相同的梯度法,导数由反向传播的一个小变形给出;
  2. 两阶段法:先单独确定第一层的中心和宽度,再用线性最小二乘一步算出第二层;
  3. 增量法:一次加入一个神经元(正交最小二乘)。

实践中第 2、3 类最常用,梯度法通常只用于微调。


17.2 网络结构

RBF 网络有两层,与两层感知机有两处主要区别:

  • 第一层不计算权值与输入的内积,而是计算输入与权值矩阵每一行之间的距离(类似第 15 章 LVQ 的第一层);
  • 偏置不是加上去,而是乘上去。

第一层净输入与输出:

\[ n^1_i=\|\mathbf{p}-{}_i\mathbf{w}^1\|\;b^1_i,\qquad a^1_i=\mathrm{radbas}(n^1_i)=e^{-(n^1_i)^2} \tag{17.1–17.2} \]

第二层是普通线性层:

\[ \mathbf{a}^2=\mathbf{W}^2\mathbf{a}^1+\mathbf{b}^2 \tag{17.3} \]

权值矩阵 \(\mathbf{W}^1\) 的每一行 \({}_i\mathbf{w}^1\) 叫做中心(center),是净输入为零、输出最大(等于 1)的点。偏置对基函数做缩放:偏置越大,山包越窄。许多文献用标准差 \(\sigma\) 或"扩展常数"(spread)描述宽度,二者只是记号不同。比较 \(e^{-(d\,b)^2}\) 与 \(e^{-d^2/(2\sigma^2)}\) 可得

\[ b=\frac{1}{\sigma\sqrt2} \]

推导拆解:要让两种写法处处相等,只需指数里的部分相等:\((d\,b)^2=d^2/(2\sigma^2)\)。两边约去 \(d^2\) 得 \(b^2=1/(2\sigma^2)\),开方取正根得 \(b=1/(\sigma\sqrt2)\)。数值感觉:\(b=1\) 对应 \(\sigma\approx0.71\);在离中心 \(d=1/b\) 处输出为 \(e^{-1}\approx0.37\),在 \(d=2/b\) 处只剩 \(e^{-4}\approx0.018\)。所以 \(1/b\) 可以粗略看成山包的"半径"。注意这里的 \(\sigma\) 只是借用正态密度的形状来描述宽度,RBF 的输出峰值是 1,不是概率密度。

高斯函数的关键性质是局部(local):远离中心时输出趋于 0。对比之下,sigmoid 是全局(global)的:净输入趋于无穷时输出保持接近 1。


17.3 函数逼近:四个参数各管什么

原书用一个 1-2-1 网络演示,默认参数:\(w^1_{1,1}=-1\)、\(w^1_{2,1}=1\)、\(b^1_1=b^1_2=2\)、\(w^2_{1,1}=w^2_{1,2}=1\)、\(b^2=0\)。在 \(-2\le p\le2\) 上,网络响应是两个山包,分别位于 \(-1\) 和 \(1\)。逐个改变参数:

参数 作用 对比多层感知机
第一层偏置 \(b^1_i\) 控制山包宽度,越大越窄 sigmoid 中权值控制台阶斜率
第一层权值 \({}_i\mathbf{w}^1\) 决定山包位置(中心) sigmoid 中偏置控制台阶位置
第二层权值 \(w^2_{1,i}\) 缩放山包高度 作用相同:加权求和
第二层偏置 \(b^2\) 整体上下平移 作用相同

神经元足够多时,RBF 网络能以任意精度逼近任何连续函数(Park & Sandberg 1993)。但它的逼近方式与 MLP 不同:每个基函数只在输入空间的一小块区域活跃。由此得到两条设计原则:

  1. 中心必须充分覆盖整个输入范围;
  2. 偏置要使相邻基函数显著重叠,否则基函数之间会出现"空洞"。

17.4 模式分类:边界是圆

XOR 问题:类 1 为 \(\mathbf{p}_2=[-1;1]\)、\(\mathbf{p}_3=[1;-1]\),类 2 为 \(\mathbf{p}_1=[-1;-1]\)、\(\mathbf{p}_4=[1;1]\)。线性不可分。原书给出一个简单设计:让网络在 \(\mathbf{p}_2\)、\(\mathbf{p}_3\) 附近输出为正,其他地方为负。

  • 中心取 \(\mathbf{p}_2\)、\(\mathbf{p}_3\):\(\mathbf{W}^1=\begin{bmatrix}-1&1\\1&-1\end{bmatrix}\)。
  • 偏置:希望两个分明的峰,不要重叠太多。中心到原点距离 \(\sqrt2\),取偏置 1,原点处 \(a=e^{-(1\cdot\sqrt2)^2}=e^{-2}=0.1353\)。故 \(\mathbf{b}^1=[1;1]\)。
  • 第一层输出在 0–1 之间。要让远处输出为负,取 \(b^2=-1\);再取 \(\mathbf{W}^2=[2\ \ 2]\) 把峰值拉回 1。

决策边界是响应曲面与 \(a^2=0\) 平面的交线,近似为围绕 \(\mathbf{p}_2\)、\(\mathbf{p}_3\) 的两个圆。分类正确,但它不总把输入归到最近的原型,不如第 11 章 MLP 的解。

直观对比:单层感知机的边界是直线,MLP 把直线拼成任意区域;RBF 的基本边界是圆(高维时是球面),把圆拼成任意区域。XOR 用直线更省。神经元多且中心靠近时,两者的边界都不再是纯直线或纯圆,但这个对比有助于直觉。

原书例题 P17.2 是另一个设计练习:类 I 由两个大小不同的子区域组成,中心分别放在 \([1;1]\) 和 \([2.5;2.5]\);第一个区域半径约 1、第二个约 1/2,取 \(\mathbf{b}^1=[1;2]\),使两个基函数都在各自边界上降到 \(e^{-1}=0.3679\);第二层仍取 \(\mathbf{W}^2=[2\ \ 2]\)、\(b^2=-1\)。宽度与区域半径成反比,这是选偏置的直接方法。


17.5 全局与局部

多层感知机(全局) RBF 网络(局部)
表示方式 分布式:任一输入处许多 sigmoid 都显著活跃,靠第二层相加抵消 任一输入处只有少数基函数活跃
所需神经元 通常较少,每个神经元影响大片输入空间 中心要铺满输入范围,受维数灾难影响:网格法 1 维 10 个,2 维就要 \(10^2=100\) 个
过拟合 参数较少 神经元多、参数多,更易过拟合
训练速度 非线性优化,较慢 两阶段法很快(第二层是线性最小二乘)
在线自适应 某段时间数据只落在某区域时,全局表示会为了这里变准而牺牲别处 输入落在某神经元活跃区之外时它的权值几乎不变,局部学习不破坏其他区域

最后一点对非平稳环境很重要:如果一段时间内只出现某类行情,局部模型只调整与这类行情相关的部分。

金融直觉:维数灾难可以这样感受。假设你想让每个特征都分成 10 档,并在每个格子里至少放一个中心。1 个因子要 10 个中心;5 个因子(如市值、估值、动量、质量、波动)就是 \(10^5=10\) 万个格子,而一个市场全部股票十年的月度样本也就几十万个,大多数格子里一个样本都没有。局部模型在空格子里"什么也不知道",只能输出常数。全局模型(线性回归、MLP)则用一条斜率覆盖整个空间,样本少的地方也能外推,尽管外推未必对。这就是正文说 RBF 适合低维曲面(波动率曲面、收益率曲线)而不适合几十个因子的原因。


17.6 训练概述

用梯度法同时训练全部参数是可以的,但由于基函数的局部性以及第一层权值、偏置的作用方式,RBF 的误差曲面上不理想的局部极小比 MLP 多得多。所以梯度法一般只用于其他方法初训后的微调。

最常用的是两阶段法。各变种的区别在于第一层怎么定:

  1. 网格:中心在输入范围内等距排列,取统一偏置使基函数有一定重叠。简单但浪费:函数复杂处需要更多基函数;实际输入常不占满整个范围;维数一高就不可行。
  2. 随机选取:从训练输入中随机选一部分作中心。中心落在数据所在区域,但不是最优。
  3. 聚类:用第 15 章的竞争层或 SOFM(或 k-means)对训练输入聚类,以簇中心为中心,并用簇的大小定偏置。
  4. 正交最小二乘(OLS):从大量候选中心(通常是全部训练输入)出发,每次加入使误差平方和下降最多的那个,直到满足停止准则。

第一层定好后,第二层用线性最小二乘一步算出。


17.7 线性最小二乘求第二层

17.7.1 偏置的经验公式

随机选取中心时,原书引用 Lowe(1989)的取法,所有偏置相同:

\[ b^1_i=\frac{\sqrt{S^1}}{d_{\max}} \tag{17.9} \]

\(d_{\max}\) 为相邻中心之间的最大距离。它保证基函数适度重叠。

17.7.2 化为线性回归

第一层固定后,对每个训练输入 \(\mathbf{p}_q\) 算出 \(\mathbf{a}^1_q\),第二层的训练集就变成 \(\{\mathbf{a}^1_q,\mathbf{t}_q\}\),这正是第 10 章的线性网络问题。以单输出为例,把第二层权值和偏置合为 \(\mathbf{x}=\begin{bmatrix}{}_1\mathbf{w}^2\\b^2\end{bmatrix}\),输入补一个常数 1:\(\mathbf{z}_q=\begin{bmatrix}\mathbf{a}^1_q\\1\end{bmatrix}\),则 \(a_q=\mathbf{x}^T\mathbf{z}_q\)。定义

\[ \mathbf{t}=\begin{bmatrix}t_1\\\vdots\\t_Q\end{bmatrix},\qquad \mathbf{U}=\begin{bmatrix}\mathbf{z}_1^T\\\vdots\\\mathbf{z}_Q^T\end{bmatrix},\qquad \mathbf{e}=\mathbf{t}-\mathbf{U}\mathbf{x} \tag{17.21–17.22} \]

\(\mathbf{U}\) 的每一行是一个样本经过第一层后的输出,每一列对应一个基函数(最后一列全为 1)。加上第 13a、13b 章的权值衰减正则化(\(\rho=\alpha/\beta\)):

\[ F(\mathbf{x})=(\mathbf{t}-\mathbf{U}\mathbf{x})^T(\mathbf{t}-\mathbf{U}\mathbf{x})+\rho\,\mathbf{x}^T\mathbf{x}=\mathbf{t}^T\mathbf{t}-2\mathbf{t}^T\mathbf{U}\mathbf{x}+\mathbf{x}^T(\mathbf{U}^T\mathbf{U}+\rho\mathbf{I})\mathbf{x} \tag{17.25} \]

这是二次函数,与第 8 章一般式 \(c+\mathbf{d}^T\mathbf{x}+\frac12\mathbf{x}^T\mathbf{A}\mathbf{x}\) 对照,\(\mathbf{d}=-2\mathbf{U}^T\mathbf{t}\),\(\mathbf{A}=2(\mathbf{U}^T\mathbf{U}+\rho\mathbf{I})\)。Hessian \(\mathbf{A}\) 至少半正定(\(\mathbf{y}^T\mathbf{U}^T\mathbf{U}\mathbf{y}=\|\mathbf{U}\mathbf{y}\|^2\ge0\)),\(\rho>0\) 时正定。所以:全部特征值为正时有唯一全局极小;有零特征值时是弱极小(\(F\) 有下界,极小一定存在)。令梯度为零得正规方程:

\[ \boxed{(\mathbf{U}^T\mathbf{U}+\rho\mathbf{I})\,\mathbf{x}^*=\mathbf{U}^T\mathbf{t}} \tag{17.29–17.31} \]

这正是岭回归(ridge regression)的解,\(\rho=0\) 时退化为普通最小二乘。正则化在这里有两个作用:抑制过拟合,以及在基函数高度重叠导致 \(\mathbf{U}^T\mathbf{U}\) 接近奇异时保证数值稳定。

推导拆解:从 (17.25) 到 (17.31) 共三步。

  1. 展开平方项:\((\mathbf{t}-\mathbf{U}\mathbf{x})^T(\mathbf{t}-\mathbf{U}\mathbf{x})=\mathbf{t}^T\mathbf{t}-\mathbf{t}^T\mathbf{U}\mathbf{x}-\mathbf{x}^T\mathbf{U}^T\mathbf{t}+\mathbf{x}^T\mathbf{U}^T\mathbf{U}\mathbf{x}\)。中间两项都是标量且互为转置,所以相等,合并成 \(-2\mathbf{t}^T\mathbf{U}\mathbf{x}\);再把 \(\rho\mathbf{x}^T\mathbf{x}=\mathbf{x}^T(\rho\mathbf{I})\mathbf{x}\) 并入最后一项,就得到 (17.25) 右边。
  2. 对 \(\mathbf{x}\) 求梯度:常数 \(\mathbf{t}^T\mathbf{t}\) 的梯度为 0;线性项 \(-2(\mathbf{U}^T\mathbf{t})^T\mathbf{x}\) 的梯度为 \(-2\mathbf{U}^T\mathbf{t}\);二次项的梯度为 \(2(\mathbf{U}^T\mathbf{U}+\rho\mathbf{I})\mathbf{x}\)(用了 \(\nabla(\mathbf{x}^T\mathbf{A}\mathbf{x})=2\mathbf{A}\mathbf{x}\),\(\mathbf{A}\) 对称)。
  3. 令梯度为零:\(-2\mathbf{U}^T\mathbf{t}+2(\mathbf{U}^T\mathbf{U}+\rho\mathbf{I})\mathbf{x}=\mathbf{0}\),约去 2 即得正规方程。

为什么 \(\rho>0\) 能"治"奇异:\(\mathbf{U}^T\mathbf{U}\) 的特征值都 \(\ge0\),两个基函数几乎重合时会有特征值接近 0,求逆时放大误差。加上 \(\rho\mathbf{I}\) 后每个特征值都抬高 \(\rho\),最小也有 \(\rho\),矩阵一定可逆。这和你在多重共线性下看到回归系数忽正忽负、标准误巨大是同一个问题,岭回归用一点偏差换取大幅降低的方差。

17.7.3 例:三个基函数逼近正弦

逼近 \(g(p)=1+\sin(\frac{\pi}{4}p)\),\(-2\le p\le2\)。六个训练点 \(p=\{-2,-1.2,-0.4,0.4,1.2,2\}\),目标 \(t=\{0,0.19,0.69,1.3,1.8,2\}\)。中心等距取 \(-2,0,2\),偏置取中心间距的倒数 0.5。第一层输出构成

\[ \mathbf{U}^T=\begin{bmatrix}1&0.852&0.527&0.237&0.077&0.018\\0.368&0.698&0.961&0.961&0.698&0.368\\0.018&0.077&0.237&0.527&0.852&1\\1&1&1&1&1&1\end{bmatrix} \]

\(\rho=0\) 时解得 \(\mathbf{x}=[-1.03;\ 0;\ 1.03;\ 1]\),即 \(\mathbf{W}^2=[-1.03\ \ 0\ \ 1.03]\)、\(b^2=1\)。逼近曲线就是三个缩放后的高斯山包加常数 1。中间基函数的权值为 0,因为目标关于 \((0,1)\) 中心对称。

对中心和宽度敏感:若用六个基函数(中心就在六个数据点上)且偏置取 8,基函数宽度只有原来的 1/16,彼此几乎不重叠。网络精确穿过每个数据点,但在数据点之间几乎掉回常数,逼近很差。这是 RBF 版的过拟合:宽度太窄,局部性太强。


17.8 正交最小二乘(OLS)

17.8.1 子集选择

OLS 的思路是:有一批候选中心(全部训练输入、网格点等),一次选一个,逐个神经元地构建网络,直到性能满意。这是统计学中的子集选择(subset selection)问题:从 \(n\) 个候选回归量里选一个小子集来最有效地预测目标。穷举需要检查 \(2^n-1\) 个子集(\(n=10\) 时 1023 个,\(n=20\) 时超过一百万),不现实。次优方法有:

  • 前向选择(forward selection):从空模型开始,每次加入使平方误差下降最多的变量;
  • 后向剔除(backward elimination):从全模型开始,每次去掉使误差增加最少的变量;
  • 两者结合:每步可增可删(逐步回归)。

OLS(Chen, Cowan & Grant 1991)是前向选择的一种高效实现:通过正交化,能快速算出每个候选带来的误差下降。

17.8.2 正交化与误差分解

把问题写成线性回归 \(\mathbf{t}=\mathbf{U}\mathbf{x}+\mathbf{e}\),\(\mathbf{U}=[\mathbf{u}_1\ \cdots\ \mathbf{u}_n]\) 叫回归矩阵,各列叫回归向量。各列通常相关,难以单独衡量每列的贡献,所以先正交分解:

\[ \mathbf{U}=\mathbf{M}\mathbf{R} \tag{17.46} \]

\(\mathbf{R}\) 为对角线为 1 的上三角阵,\(\mathbf{M}\) 的列两两正交,\(\mathbf{M}^T\mathbf{M}=\mathbf{V}=\mathrm{diag}(\mathbf{m}_1^T\mathbf{m}_1,\dots,\mathbf{m}_n^T\mathbf{m}_n)\)。用 Gram–Schmidt:

\[ \mathbf{m}_1=\mathbf{u}_1,\qquad \mathbf{m}_k=\mathbf{u}_k-\sum_{i=1}^{k-1}r_{ik}\,\mathbf{m}_i,\qquad r_{ik}=\frac{\mathbf{m}_i^T\mathbf{u}_k}{\mathbf{m}_i^T\mathbf{m}_i} \tag{17.53–17.55} \]

令 \(\mathbf{h}=\mathbf{R}\mathbf{x}\),则 \(\mathbf{t}=\mathbf{M}\mathbf{h}+\mathbf{e}\)。由于 \(\mathbf{M}\) 的列正交,最小二乘解逐分量独立:

\[ h_i=\frac{\mathbf{m}_i^T\mathbf{t}}{\mathbf{m}_i^T\mathbf{m}_i} \tag{17.52} \]

在最优 \(\mathbf{h}\) 下交叉项为零,于是

\[ \mathbf{t}^T\mathbf{t}=\sum_{i=1}^{n}h_i^2\,\mathbf{m}_i^T\mathbf{m}_i+\mathbf{e}^T\mathbf{e} \]

第一项是回归量解释的平方和,第二项是残差。第 \(i\) 个正交回归量的贡献是 \(h_i^2\mathbf{m}_i^T\mathbf{m}_i\),归一化后得误差下降比:

\[ o_i=\frac{h_i^2\,\mathbf{m}_i^T\mathbf{m}_i}{\mathbf{t}^T\mathbf{t}}\in[0,1] \tag{17.61} \]

它就是"加入这个基函数能让 \(\mathbf{t}^T\mathbf{t}\) 中被解释的比例增加多少",相当于(未中心化的)增量 \(R^2\)。

推导拆解:为什么正交化之后贡献能"逐项相加"。

  1. \(\mathbf{U}=\mathbf{M}\mathbf{R}\) 且 \(\mathbf{R}\) 可逆,所以 \(\mathbf{U}\mathbf{x}\) 能表示的向量与 \(\mathbf{M}\mathbf{h}\) 能表示的完全相同(\(\mathbf{h}=\mathbf{R}\mathbf{x}\) 只是换了坐标),最小二乘问题可以改在 \(\mathbf{M}\) 上做。
  2. \(\mathbf{M}\) 的列两两正交,\(\mathbf{M}^T\mathbf{M}\) 是对角阵,正规方程 \(\mathbf{M}^T\mathbf{M}\mathbf{h}=\mathbf{M}^T\mathbf{t}\) 拆成 \(n\) 个独立的一元方程 \((\mathbf{m}_i^T\mathbf{m}_i)h_i=\mathbf{m}_i^T\mathbf{t}\),即 (17.52)。每个 \(h_i\) 就是"\(\mathbf{t}\) 对 \(\mathbf{m}_i\) 单独做无截距回归"的斜率。
  3. 把 \(\mathbf{t}=\mathbf{M}\mathbf{h}+\mathbf{e}\) 两边取平方和:\(\mathbf{t}^T\mathbf{t}=\mathbf{h}^T\mathbf{M}^T\mathbf{M}\mathbf{h}+2\mathbf{h}^T\mathbf{M}^T\mathbf{e}+\mathbf{e}^T\mathbf{e}\)。最优解处残差与每个回归量正交(\(\mathbf{M}^T\mathbf{e}=\mathbf{0}\),这就是正规方程本身),交叉项消失;\(\mathbf{M}^T\mathbf{M}\) 是对角阵,第一项展开为 \(\sum_ih_i^2\mathbf{m}_i^T\mathbf{m}_i\)。

金融直觉:Gram–Schmidt 就是量化里常做的"因子残差化"。比如已经有市场和规模因子,再加入动量时,先把动量对前两个因子回归,只保留残差作为"纯动量"。残差化后的因子彼此不相关,各自贡献的 \(R^2\) 可以直接相加。代价也一样:残差化的结果依赖于加入顺序,这正是前向选择不保证最优的根源。

17.8.3 算法

开始时把全部候选放进 \(\mathbf{U}\),网络中还没有基函数。

  • 第 1 步:对每个候选 \(i\),\(\mathbf{m}_1^{(i)}=\mathbf{u}_i\),算 \(h_1^{(i)}\) 与 \(o_1^{(i)}\);选 \(o_1^{(i)}\) 最大者 \(i_1\)。
  • 第 \(k\) 步:对每个尚未入选的候选 \(i\),先对已选的 \(\mathbf{m}_1,\dots,\mathbf{m}_{k-1}\) 正交化:\(r^{(i)}_{jk}=\mathbf{m}_j^T\mathbf{u}_i/\mathbf{m}_j^T\mathbf{m}_j\),\(\mathbf{m}_k^{(i)}=\mathbf{u}_i-\sum_jr^{(i)}_{jk}\mathbf{m}_j\);再算 \(h_k^{(i)}\)、\(o_k^{(i)}\);选最大者。
  • 停止:\(1-\sum_{j=1}^{k}o_j<\delta\)。\(\delta\) 太小会过拟合;更好的办法是用验证集,在验证误差开始上升时停止(第 13a 章)。
  • 回代:由 \(\mathbf{h}\) 求原权值,\(x_n=h_n\),\(x_k=h_k-\sum_{j=k+1}^{n}r_{kj}x_j\)。因为 \(\mathbf{R}\) 是上三角阵,不需要求逆。注意每加入一个新基函数,前面的 \(x_k\) 都会变,只有最后一个 \(x_n=h_n\) 可以直接读出。

17.8.4 例:OLS 逼近余弦(原书 P17.1)

逼近 \(g(p)=\cos(\pi p)\),五个点 \(p=\{-1,-0.5,0,0.5,1\}\),\(t=\{-1,0,1,0,-1\}\),候选中心为全部训练输入,偏置全取 1,再加一列全 1 作为第二层偏置的候选。第 1 步:

\[ h_1^{(i)}=\{-0.371,-0.045,0.106,-0.045,-0.371,-0.200\},\qquad o_1^{(i)}=\{0.0804,0.0016,0.0094,0.0016,0.0804,0.0667\} \]

第 1、5 个中心各能解释 8.04%,取下标小的第 1 个。若此时停止,\(w^2_{1,1}=h_1=-0.371\)。继续选下去,在 5 个中心中的入选顺序为 1、2、5、3、4,误差下降依次为 0.0804、0.3526、0.5074、0.0448、0.0147。后入选的基函数带来的下降反而更大,因为好的逼近需要基函数的组合,单独看某个基函数并不显眼。这说明贪心的前向选择不保证选到最优组合。

关于偏置列:原书给出的入选顺序是 1、2、5、3、4、6,偏置列最后入选且下降为 0。编者用下面的代码复核时发现,若在第 4 步把偏置列也作为候选,它能带来 0.059 的下降,大于中心 3 的 0.0448,严格按算法应在第 4 步入选。两种顺序最终都解释了 100% 的平方和(5 个点、6 个候选,必然精确拟合),差别只在中间步骤。读者在自己实现时应明确偏置列是否参与竞争。


17.9 聚类法定中心与宽度

Moody 与 Darken(1989)用竞争网络对训练输入聚类,以簇中心作为 RBF 中心。对训练输入反复使用 Kohonen 规则(只更新离输入最近的那一行):

\[ {}_{i}\mathbf{w}^1(q)={}_{i}\mathbf{w}^1(q-1)+\alpha\big(\mathbf{p}(q)-{}_{i}\mathbf{w}^1(q-1)\big) \tag{17.78} \]

也可以用 SOFM 或批量 k-means。这样基函数位于输入最常出现的区域。

偏置按簇的大小定:对每个中心,找出离它最近的 \(n_c\) 个训练输入,计算均方根距离

\[ \mathrm{dist}_i=\Big(\frac{1}{n_c}\sum_{j=1}^{n_c}\|\mathbf{p}^i_j-{}_i\mathbf{w}^1\|^2\Big)^{1/2},\qquad b^1_i=\frac{1}{\sqrt2\,\mathrm{dist}_i} \tag{17.79–17.80} \]

簇宽则基函数宽,各中心有各自的宽度,比统一偏置更有效地利用基函数。之后用线性最小二乘求第二层。

白话解释:(17.80) 的 \(\sqrt2\) 来自 \(b=1/(\sigma\sqrt2)\):把簇内点到中心的均方根距离 \(\mathrm{dist}_i\) 当作 \(\sigma\),山包在离中心一个"典型距离"处的输出约为 \(e^{-1/2}\approx0.61\),簇内大部分点都能被这个基函数明显"照到"。\(n_c\) 是你手里的旋钮:取得越大,算均方根时纳入的点越远,\(\mathrm{dist}_i\) 越大,山包越宽。17.11.2 节就是靠扫描 \(n_c\) 来选宽度的。

缺点是聚类只看输入分布,不看目标。若函数恰好在输入稀少的区域更复杂,那里的中心就不够。不过通常我们本来就希望模型在数据多(也就是最常使用)的区域最准确。


17.10 非线性优化:梯度法微调

也可以像 MLP 一样同时调整全部参数。推导与第 11 章相同,只有第一层净输入对权值和偏置的导数不同:

\[ n^1_i=b^1_i\sqrt{\textstyle\sum_j(p_j-w^1_{i,j})^2},\qquad \frac{\partial n^1_i}{\partial w^1_{i,j}}=b^1_i\,\frac{w^1_{i,j}-p_j}{\|\mathbf{p}-{}_i\mathbf{w}^1\|},\qquad \frac{\partial n^1_i}{\partial b^1_i}=\|\mathbf{p}-{}_i\mathbf{w}^1\| \tag{17.81–17.83} \]

于是第一层梯度为

\[ \frac{\partial\hat F}{\partial w^1_{i,j}}=s^1_i\,b^1_i\,\frac{w^1_{i,j}-p_j}{\|\mathbf{p}-{}_i\mathbf{w}^1\|},\qquad \frac{\partial\hat F}{\partial b^1_i}=s^1_i\,\|\mathbf{p}-{}_i\mathbf{w}^1\| \tag{17.84–17.85} \]

推导拆解:(17.82) 用链式法则。记 \(D=\|\mathbf{p}-{}_i\mathbf{w}^1\|=\sqrt{S}\),\(S=\sum_j(p_j-w^1_{i,j})^2\)。

  1. 外层:\(\partial n^1_i/\partial D=b^1_i\)。
  2. 中层:\(\partial D/\partial S=\frac{1}{2\sqrt S}=\frac{1}{2D}\)。
  3. 内层:\(S\) 中只有第 \(j\) 项含 \(w^1_{i,j}\),\(\partial S/\partial w^1_{i,j}=2(p_j-w^1_{i,j})\cdot(-1)=2(w^1_{i,j}-p_j)\),这里的 \(-1\) 是对 \(-w\) 求导。
  4. 三者相乘:\(b^1_i\cdot\frac{1}{2D}\cdot2(w^1_{i,j}-p_j)=b^1_i\frac{w^1_{i,j}-p_j}{D}\)。

偏置导数更简单:\(n^1_i=b^1_iD\) 对 \(b^1_i\) 是线性的,导数就是 \(D\)。(17.84)(17.85) 再乘上敏感度 \(s^1_i=\partial\hat F/\partial n^1_i\),仍是链式法则。注意 \(D=0\)(输入恰好落在中心上)时导数无定义,实现时需加一个很小的数防止除零。

它们替换第 11 章反向传播总结中 \(m=1\) 的权值、偏置更新公式;敏感度的反传照旧,其中 radbas 的导数为 \(\dot f(n)=-2n\,e^{-n^2}\)。

例(原书 P17.3):1-1-1 网络,\(w^1=0\),\(b^1=1\),\(w^2=-2\),\(b^2=1\);训练对 \(p=-1\)、\(t=1\),学习率 \(\alpha=1\)。

  • 前向:\(n^1=|-1-0|\cdot1=1\),\(a^1=e^{-1}=0.3679\);\(a^2=-2(0.3679)+1=0.2642\);\(e=0.7358\)。
  • 敏感度:\(s^2=-2\,e=-1.4716\);\(s^1=\dot f(n^1)\,w^2\,s^2=(-2e^{-1})(-2)(-1.4716)=-2.1655\)。
  • 更新:\(w^2=-2-(-1.4716)(0.3679)=-1.4586\);\(b^2=1+1.4716=2.4716\);\(w^1=0-(-2.1655)\cdot1\cdot\frac{0-(-1)}{1}=2.1655\);\(b^1=1-(-2.1655)\cdot1=3.1655\)。

直观解释:\(w^2<0\) 而输出偏低,需要减小 \(a^1\),所以中心远离 \(p\)(从 0 移到 2.17),同时偏置增大让基函数变窄。

其他方法(原书 17.11 节列举):多输出 OLS、带正则化的 OLS、遗传算法选偏置和正则化参数、用 EM 算法优化中心、用回归树选中心,以及"聚类初始化 + 非线性优化微调"的各种组合。


17.11 量化实战

17.11.1 复现原书例题

下面的代码复现 17.7.3 节的线性最小二乘、17.8.4 节的 OLS 和 17.10 节的一步梯度下降。ols_select 可以直接用于下一小节以外的特征筛选。

import numpy as np
np.set_printoptions(precision=4, suppress=True)

def rbf_layer(P, C, b):
    """第一层:a_i = exp(-(||p - c_i|| * b_i)^2)。P: Q×R, C: S×R, b: S"""
    dist = np.linalg.norm(P[:, None, :] - C[None, :, :], axis=2)
    return np.exp(-(dist * b) ** 2)

# ---- 例 1:线性最小二乘求第二层(原书式 17.32–17.42)----
p = np.array([-2, -1.2, -0.4, 0.4, 1.2, 2.0])[:, None]
t = 1 + np.sin(np.pi / 4 * p.ravel())
C = np.array([[-2.0], [0.0], [2.0]]); b = np.full(3, 0.5)
U = np.column_stack([rbf_layer(p, C, b), np.ones(len(p))])   # 最后一列对应第二层偏置
print("U^T =\n", U.T.round(3))
rho = 0.0
x = np.linalg.solve(U.T @ U + rho * np.eye(U.shape[1]), U.T @ t)   # 式 (17.31)
print("[W2, b2] =", x)

# ---- 例 2:正交最小二乘 OLS(原书 P17.1)----
def ols_select(U, t, n_select):
    """前向选择 + Gram-Schmidt;返回入选列顺序、各步误差下降 o 和系数 h"""
    Q, n = U.shape
    chosen, M, o_list, h_list = [], [], [], []
    tt = t @ t
    for k in range(n_select):
        best = None
        for i in range(n):
            if i in chosen:
                continue
            m = U[:, i].copy()
            for mj in M:                                   # 对已选的正交向量正交化
                m -= (mj @ U[:, i]) / (mj @ mj) * mj
            mm = m @ m
            h = (m @ t) / mm if mm > 1e-10 else 0.0        # 与已选列线性相关则无贡献
            o = h ** 2 * mm / tt                           # 式 (17.61)
            if best is None or o > best[0] + 1e-12:        # 并列时取下标小者
                best = (o, i, m, h)
        o, i, m, h = best
        chosen.append(i); M.append(m); o_list.append(o); h_list.append(h)
    return chosen, np.array(o_list), np.array(h_list)

p = np.array([-1, -0.5, 0, 0.5, 1.0])[:, None]
t = np.cos(np.pi * p.ravel())
U = np.column_stack([rbf_layer(p, p, np.ones(5)), np.ones(5)])   # 候选中心=全部训练输入
m1 = U; h1 = (m1.T @ t) / (m1 ** 2).sum(0); o1 = h1 ** 2 * (m1 ** 2).sum(0) / (t @ t)
print("第 1 步 h:", h1.round(3)); print("第 1 步 o:", o1.round(4))
order, o, h = ols_select(U[:, :5], t, 5)          # 只在 5 个中心里选
print("仅中心候选 入选顺序:", [i + 1 for i in order], " 误差下降:", o.round(4))
order, o, h = ols_select(U, t, 6)                 # 偏置列也作为候选
print("含偏置候选 入选顺序:", [i + 1 for i in order], " 误差下降:", o.round(4))

# ---- 例 3:一步最速下降(原书 P17.3)----
w1, b1, w2, b2, p_, t_, lr = 0.0, 1.0, -2.0, 1.0, -1.0, 1.0, 1.0
n1 = abs(p_ - w1) * b1; a1 = np.exp(-n1 ** 2); a2 = w2 * a1 + b2; e = t_ - a2
s2 = -2 * e
s1 = (-2 * n1 * np.exp(-n1 ** 2)) * w2 * s2           # radbas 导数 -2n e^{-n^2}
w2n, b2n = w2 - lr * s2 * a1, b2 - lr * s2
w1n = w1 - lr * s1 * b1 * (w1 - p_) / abs(p_ - w1)    # 式 (17.84)
b1n = b1 - lr * s1 * abs(p_ - w1)                     # 式 (17.85)
print(f"a2={a2:.4f}, s2={s2:.4f}, s1={s1:.4f}")
print(f"w2={w2n:.4f}, b2={b2n:.4f}, w1={w1n:.4f}, b1={b1n:.4f}")

输出:

U^T =
 [[1.    0.852 0.527 0.237 0.077 0.018]
 [0.368 0.698 0.961 0.961 0.698 0.368]
 [0.018 0.077 0.237 0.527 0.852 1.   ]
 [1.    1.    1.    1.    1.    1.   ]]
[W2, b2] = [-1.0303 -0.      1.0303  1.    ]
第 1 步 h: [-0.371 -0.045  0.106 -0.045 -0.371 -0.2  ]
第 1 步 o: [0.0804 0.0016 0.0094 0.0016 0.0804 0.0667]
仅中心候选 入选顺序: [1, 2, 5, 3, 4]  误差下降: [0.0804 0.3526 0.5074 0.0448 0.0147]
含偏置候选 入选顺序: [1, 2, 5, 6, 3, 4]  误差下降: [0.0804 0.3526 0.5074 0.059  0.0006 0.    ]
a2=0.2642, s2=-1.4715, s1=-2.1654
w2=-1.4587, b2=2.4715, w1=2.1654, b1=3.1654

例 3 与原书的末位差异(\(-1.4716\) 对 \(-1.4715\) 等)来自原书先把 \(a^1\) 四舍五入到 0.3679 再计算。

17.11.2 非线性截面因子模型

场景。 股票截面收益与特征之间常有非线性关系:估值因子的效应在极端处饱和;动量因子两端(涨得最多和跌得最多的股票)都可能表现不佳。线性模型 \(r=\beta_0+\beta_1x_1+\beta_2x_2\) 抓不住这些形状。固定中心的 RBF 网络就是"径向基特征 + 岭回归",可以直接用来估计 \(E[r\mid x_1,x_2]\)。

设计要点。

  • 每月截面上两个已标准化的特征,按月份切成训练(84 个月)、验证(24 个月)、测试(36 个月)三段。截面数据在月内相关、跨月有结构变化,必须按时间切分,不能随机打乱。
  • 第一层只用训练段的输入做 k-means(16 个中心),偏置按式 (17.79)(17.80) 定。\(n_c\) 控制宽度:\(n_c\) 越大,"最近 \(n_c\) 个点"的范围越大,偏置越小、基函数越宽。
  • 宽度和正则化参数 \(\rho\) 都在验证段上选;选定后用训练+验证段重估第二层,再在测试段评估一次。
  • 评价指标用量化中常用的逐月 Rank IC(预测值与实际收益的秩相关)和五分位多空收益;因为是模拟数据,还能算预测值与真实期望收益的相关,直接衡量"学到的形状对不对"。
import numpy as np
from scipy.stats import spearmanr
from sklearn.cluster import KMeans

rng = np.random.default_rng(3)

# 1) 模拟月度截面:两个已标准化的特征(估值 x1、动量 x2),真实期望收益非线性
T, N = 144, 400
X = rng.standard_normal((T, N, 2))
def true_mu(x):
    return 0.004 * np.tanh(1.5 * x[..., 0]) - 0.003 * (x[..., 1] ** 2 - 1) + 0.002 * x[..., 1]
R = true_mu(X) + 0.08 * rng.standard_normal((T, N))          # 噪声远大于信号
tr, va, te = slice(0, 84), slice(84, 108), slice(108, 144)   # 按时间切分
flat = lambda a, s: a[s].reshape(-1, *a.shape[2:])

# 2) RBF 第一层:k-means 定中心(式 17.78 的批量版),按式 (17.79)(17.80) 定偏置
def rbf_design(P, C, b):
    d = np.linalg.norm(P[:, None, :] - C[None], axis=2)
    return np.column_stack([np.exp(-(d * b) ** 2), np.ones(len(P))])

def fit_centers(P, S, n_c=200, seed=0):
    C = KMeans(S, n_init=4, random_state=seed).fit(P).cluster_centers_
    d = np.linalg.norm(P[:, None, :] - C[None], axis=2)
    dist = np.sqrt(np.sort(d ** 2, axis=0)[:n_c].mean(axis=0))   # 最近 n_c 个输入的均方根距离
    return C, 1 / (np.sqrt(2) * dist)

def ridge(U, t, rho):                                            # 式 (17.31)
    return np.linalg.solve(U.T @ U + rho * np.eye(U.shape[1]), U.T @ t)

Ptr, ttr = flat(X, tr), flat(R, tr)
Pva, tva = flat(X, va), flat(R, va)

# 3) 宽度(通过 n_c)与正则化 rho 一起在验证段上选,测试段不参与任何选择
results = {}
for n_c in [200, 1000, 4000, 8000]:
    C, b = fit_centers(Ptr, S=16, n_c=n_c)
    Utr, Uva = rbf_design(Ptr, C, b), rbf_design(Pva, C, b)
    for rho in [0, 10, 100, 1000]:
        x = ridge(Utr, ttr, rho)
        results[(n_c, rho)] = (np.mean((tva - Uva @ x) ** 2), C, b)
    print(f"n_c={n_c:5d}  平均偏置 b={b.mean():.2f}  验证 MSE(rho=0)×1e4="
          f"{results[(n_c, 0)][0]*1e4:.4f}")
(n_c, rho) = min(results, key=lambda k: results[k][0])
_, C, b = results[(n_c, rho)]
print(f"验证段选出: n_c={n_c}, rho={rho}")
x_rbf = ridge(rbf_design(np.vstack([Ptr, Pva]), C, b), np.concatenate([ttr, tva]), rho)
C_n, b_n = results[(200, 0)][1:]                                # 对照:过窄的基函数
x_narrow = ridge(rbf_design(Ptr, C_n, b_n), ttr, 0)

# 4) 线性基准:同样两特征的普通最小二乘
Z = lambda P: np.column_stack([np.ones(len(P)), P])
x_lin, *_ = np.linalg.lstsq(Z(np.vstack([Ptr, Pva])), np.concatenate([ttr, tva]), rcond=None)

# 5) 测试段评估:逐月 Rank IC、与真实期望收益的相关、五分位多空收益
def evaluate(pred_fn, name):
    ic, oracle, ls = [], [], []
    for t in range(108, 144):
        f = pred_fn(X[t])
        ic.append(spearmanr(f, R[t])[0])
        oracle.append(np.corrcoef(f, true_mu(X[t]))[0, 1])
        q = np.argsort(f); k = N // 5
        ls.append(R[t, q[-k:]].mean() - R[t, q[:k]].mean())
    ic, ls = np.array(ic), np.array(ls)
    print(f"{name:6s} RankIC 均值={ic.mean():.4f} (t={ic.mean()/ic.std(ddof=1)*np.sqrt(len(ic)):.2f}), "
          f"与真实 mu 相关={np.mean(oracle):.3f}, 多空月均={ls.mean()*100:.2f}%")

evaluate(lambda P: Z(P) @ x_lin, "线性")
evaluate(lambda P: rbf_design(P, C, b) @ x_rbf, "RBF")
evaluate(lambda P: rbf_design(P, C_n, b_n) @ x_narrow, "RBF窄")
evaluate(lambda P: true_mu(P), "真值")

输出:

n_c=  200  平均偏置 b=5.52  验证 MSE(rho=0)×1e4=63.3633
n_c= 1000  平均偏置 b=2.47  验证 MSE(rho=0)×1e4=63.1686
n_c= 4000  平均偏置 b=1.24  验证 MSE(rho=0)×1e4=63.0502
n_c= 8000  平均偏置 b=0.88  验证 MSE(rho=0)×1e4=63.0262
验证段选出: n_c=8000, rho=100
线性     RankIC 均值=0.0392 (t=5.74), 与真实 mu 相关=0.617, 多空月均=0.85%
RBF    RankIC 均值=0.0563 (t=8.43), 与真实 mu 相关=0.924, 多空月均=1.12%
RBF窄   RankIC 均值=0.0320 (t=4.40), 与真实 mu 相关=0.284, 多空月均=0.79%
真值     RankIC 均值=0.0569 (t=8.31), 与真实 mu 相关=1.000, 多空月均=1.34%

解读。

  • 选好宽度的 RBF 模型与真实期望收益的相关达到 0.92,Rank IC 几乎追平"知道真值"的上限(0.0563 对 0.0569);线性模型只学到动量的线性部分和估值的单调部分,相关 0.62。
  • 宽度是第一位的超参数。 偏置过大(\(n_c=200\),\(b\approx5.5\))时基函数太窄、彼此不重叠,正是 17.7.3 节"偏置取 8"的情形:模型在中心附近拟合噪声,中心之间掉回常数,表现比线性模型还差。
  • 验证 MSE 之间的差别只在小数点后第三位(63.36 对 63.03,单位 \(10^{-4}\))。金融截面的 \(R^2\) 通常不到 1%,选模型时损失函数的改善幅度极小,却对应显著的 IC 差别。所以验证集要足够长,必要时直接用验证段的 Rank IC 作为选择标准。
  • 模拟里噪声与信号之比约 20:1,与真实月度股票收益相当。即便模型完美,Rank IC 也只有约 0.057,这是这类问题的常态。

17.11.3 其他用法与注意事项

  • OLS = 正交化逐步回归 = 因子筛选。 把 ols_select 的候选列换成候选因子(或因子的非线性变换),它就逐个挑出增量解释力最大的因子,\(o_i\) 是正交化后的增量贡献。P17.1 的教训直接适用:贪心选择不保证最优组合;后入选的因子贡献可能更大;停止准则必须基于验证集,而不是样本内误差。
  • 曲面平滑与插值。 期权隐含波动率曲面、收益率曲线、交易成本曲面(成交量占比 × 波动率 → 冲击成本)都是低维、平滑的函数,适合 RBF + 岭回归。维数低时局部方法的维数灾难不成问题。
  • 维数灾难。 特征超过四五个时,局部基函数难以覆盖输入空间。此时要么先降维(主成分、因子打包),要么改用全局模型(线性、MLP、树模型)。
  • 局部性与非平稳。 局部表示适合在线更新:一段新行情只改变它附近的基函数权值。若用 LMS 在线更新第二层(原书 E17.5),这一点尤其有用。
  • 聚类定中心的盲区。 中心落在数据密集处,极端行情(尾部)样本少、中心稀疏,模型在尾部的分辨率最低,而尾部往往是风险最集中的地方。可以人为在尾部加中心,或对尾部单独建模。

本章小结

RBF 网络的第一层计算输入到各中心的距离,乘以偏置后送入高斯函数,形成一组局部山包;第二层把山包线性组合。中心决定山包位置,偏置决定宽度(\(b=1/(\sigma\sqrt2)\)),第二层权值决定高度。它与 MLP 一样是通用逼近器,但用局部表示:训练快、适合在线自适应,代价是中心要覆盖输入空间,受维数灾难影响,且对宽度很敏感。训练通常分两阶段:先用网格、随机选取、聚类或 OLS 定第一层,再解正则化正规方程 \((\mathbf{U}^T\mathbf{U}+\rho\mathbf{I})\mathbf{x}=\mathbf{U}^T\mathbf{t}\) 得到第二层,这就是岭回归。OLS 用 Gram–Schmidt 正交化后逐个加入误差下降比最大的基函数,是高效的前向选择,但不保证最优组合,停止要看验证集。梯度法因为局部极小多,只适合微调。在量化中,RBF + 岭回归可直接用于非线性因子模型和低维曲面平滑,OLS 可用于因子筛选;宽度和正则化参数必须用按时间切分的验证集选择。

概念 公式 / 要点
第一层 \(a^1_i=\exp\!\big(-(|\mathbf{p}-{}_i\mathbf{w}^1|\,b^1_i)^2\big)\)
偏置与标准差 \(b=1/(\sigma\sqrt2)\),偏置大则窄
第二层 \(\mathbf{a}^2=\mathbf{W}^2\mathbf{a}^1+\mathbf{b}^2\)
统一偏置经验式 \(b^1_i=\sqrt{S^1}/d_{\max}\)
正规方程(岭回归) \((\mathbf{U}^T\mathbf{U}+\rho\mathbf{I})\mathbf{x}^*=\mathbf{U}^T\mathbf{t}\)
Hessian \(2(\mathbf{U}^T\mathbf{U}+\rho\mathbf{I})\),\(\rho\ge0\) 半正定,\(\rho>0\) 正定
OLS 正交化 \(\mathbf{m}_k=\mathbf{u}_k-\sum_i r_{ik}\mathbf{m}_i\),\(r_{ik}=\mathbf{m}_i^T\mathbf{u}_k/\mathbf{m}_i^T\mathbf{m}_i\)
误差下降比 \(h_i=\mathbf{m}_i^T\mathbf{t}/\mathbf{m}_i^T\mathbf{m}_i\),\(o_i=h_i^2\mathbf{m}_i^T\mathbf{m}_i/\mathbf{t}^T\mathbf{t}\)
回代 \(x_n=h_n\),\(x_k=h_k-\sum_{j>k}r_{kj}x_j\)
聚类定宽度 \(\mathrm{dist}_i=\big(\frac1{n_c}\sum_j|\mathbf{p}^i_j-{}_i\mathbf{w}^1|^2\big)^{1/2}\),\(b^1_i=1/(\sqrt2\,\mathrm{dist}_i)\)
梯度微调 \(\partial\hat F/\partial w^1_{i,j}=s^1_ib^1_i(w^1_{i,j}-p_j)/|\mathbf{p}-{}_i\mathbf{w}^1|\),\(\partial\hat F/\partial b^1_i=s^1_i|\mathbf{p}-{}_i\mathbf{w}^1|\)
radbas 导数 \(\dot f(n)=-2n\,e^{-n^2}\)

练习

基础

  1. 证明 Hessian \(2(\mathbf{U}^T\mathbf{U}+\rho\mathbf{I})\) 在 \(\rho\ge0\) 时半正定,在 \(\rho>0\) 时正定。(原书 E17.4) 提示:\(\mathbf{y}^T(\mathbf{U}^T\mathbf{U}+\rho\mathbf{I})\mathbf{y}=\|\mathbf{U}\mathbf{y}\|^2+\rho\|\mathbf{y}\|^2\)。

  2. 1-2-1 网络 \(\mathbf{W}^1=[-1;1]\),\(\mathbf{b}^1=[0.5;0.5]\),\(b^2=0\)(无第二层偏置)。给定三个训练对,写出 \(\mathbf{U}\) 并用最小二乘求 \(\mathbf{W}^2\);再取 \(\rho=4\) 重算,说明正则化让权值发生了什么变化。(原书 E17.3) 提示:\(\rho\) 增大把 \(\mathbf{x}\) 向 0 收缩,等高线的中心向原点移动。

  3. 若把第一层的高斯函数换成线性传递函数,网络还是通用逼近器吗?(原书 E17.6) 答案要点:不等价于单层线性网络,因为距离 \(\|\mathbf{p}-{}_i\mathbf{w}^1\|\) 本身是输入的非线性函数。一维时输出是以各中心为折点的分段线性函数(若干"V"形之和),中心足够多时能以任意精度逼近区间上的连续函数;多维时它相当于以 \(\varphi(r)=r\) 为基函数的 RBF(文献中的"线性径向基"),逼近能力仍然很强,但失去了局部性:远离中心时输出线性增长而不是趋于 0。

  4. 在 17.4 节 XOR 设计中,若把偏置从 1 改为 0.5,原点处第一层每个神经元的输出是多少?网络输出在原点处还为负吗? 答案要点:\(e^{-(0.5\sqrt2)^2}=e^{-0.5}=0.607\),输出 \(2(0.607+0.607)-1=1.43>0\),原点被错分为类 1,说明偏置太小导致基函数重叠过多。

  5. 用 17.11.1 节的代码,把 17.7.3 节的例子改为六个中心(就在六个数据点上)、偏置 8,计算在 \(p=0\) 处的网络输出,与真值 1 比较。 提示:偏置 8 时离 \(p=0\) 最近的中心在 \(\pm0.4\),\(e^{-(0.4\cdot8)^2}\approx3.6\times10^{-5}\),输出几乎只剩第二层偏置。

进阶

  1. 说明如何把第 10 章的 LMS 算法用于在线训练第二层(原书 E17.5),并解释在非平稳市场中,为什么局部基函数比 MLP 更不容易"忘掉"其他区域。

  2. 编程实现 OLS,对 \(g(p)=1+\sin(\pi p/8)\) 在 \([-4,4]\) 上取 10 个随机点,只保留前 4 个入选中心,与 4 个等距中心 + 式 (17.9) 偏置的结果比较。(原书 E17.10、E17.12)

  3. 用 4×4 与 2×2 的 SOFM(或 k-means)聚类得到中心,按式 (17.79)(17.80) 设偏置,再用最小二乘逼近 \(t=\sin(2\pi p_1)\cos(2\pi p_2)\)。比较两种中心数下的训练误差和验证误差。(原书 E17.15)

  4. 在 17.11.2 节的代码中,把验证准则从 MSE 换成验证段的平均 Rank IC,选出的 \((n_c,\rho)\) 会变吗?再加入第三个纯噪声特征,观察 RBF 与线性模型的测试表现如何变化,并用维数灾难解释。

  5. 把 ols_select 用于因子筛选:模拟 30 个候选因子,其中 5 个真正有效且彼此相关,其余为噪声。用训练段做前向选择,用验证段的误差决定在第几步停止,统计选中的有效因子个数。

原书推荐习题:E17.4(Hessian 正定性);E17.3、E17.10、E17.11(最小二乘、宽度与正则化对拟合和噪声的影响);P17.1 与 E17.12(OLS);P17.3、E17.13(梯度法与两种初始化比较);E17.15(聚类 + 最小二乘的完整流程);E17.6(非线性的必要性)。


原书对照

本章小节 原书内容 PDF 页码
17.1 Objectives、Theory and Examples p.664–665
17.2 Radial Basis Network p.665–667
17.3 Function Approximation p.667–669
17.4 Pattern Classification p.669–672
17.5 Global vs. Local p.672–673
17.6 Training RBF Networks p.673–674
17.7 Linear Least Squares p.674–681
17.8 Orthogonal Least Squares p.681–686
17.9 Clustering p.686–688
17.10 Nonlinear Optimization、Other Training Techniques p.688–689
小结 Summary of Results p.690–692
例题 Solved Problems P17.1–P17.3 p.693–697
延伸阅读 Epilogue、Further Reading(Bish91、BrLo88、ChCo91、Lowe89、Mill90、MoDa89、PaSa93、Powe87 等) p.698–700
习题 Exercises E17.1–E17.15 p.701–706

17.11 节为编者补充的量化应用,不在原书中。