第 17 章 径向基网络
本章对应原书第 17 章(Radial Basis Networks)。径向基函数(RBF)网络是多层感知机之外的另一种通用函数逼近器。它的第一层是一组"局部"的高斯山包,第二层是线性组合。一旦固定了山包的位置和宽度,训练第二层就是一个(带正则化的)线性最小二乘问题,即岭回归。这使 RBF 网络成为连接神经网络与经典统计方法(核回归、逐步回归、岭回归)的桥梁,也是量化中做非线性因子建模、曲面平滑最容易落地的神经网络结构。本章是本册重点章之一。
学习目标
读完本章,你应当能够:
- 写出 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\),说清中心、偏置(宽度)、第二层权值各自如何改变网络响应。
- 比较 RBF 的"局部"表示与多层感知机的"全局/分布式"表示,说出各自在神经元数量、训练速度、维数灾难、在线学习方面的优劣。
- 固定第一层后,用正则化线性最小二乘 \((\mathbf{U}^T\mathbf{U}+\rho\mathbf{I})\mathbf{x}=\mathbf{U}^T\mathbf{t}\) 求第二层,并能手算或编程复现原书例题。
- 推导并实现正交最小二乘(OLS)前向选择算法,理解误差下降比 \(o_i=h_i^2\mathbf{m}_i^T\mathbf{m}_i/\mathbf{t}^T\mathbf{t}\) 的含义及前向选择的局限。
- 用聚类确定中心与宽度,并能写出用梯度法微调全部参数时第一层的导数。
- 在截面收益预测中搭建"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)首先把径向基函数用在神经网络里,目标改为得到一个平滑、泛化良好的逼近,而不强求穿过每个点。本章采用后一种观点。
原书介绍三类训练方法:
- 与第 11、12 章相同的梯度法,导数由反向传播的一个小变形给出;
- 两阶段法:先单独确定第一层的中心和宽度,再用线性最小二乘一步算出第二层;
- 增量法:一次加入一个神经元(正交最小二乘)。
实践中第 2、3 类最常用,梯度法通常只用于微调。
17.2 网络结构
RBF 网络有两层,与两层感知机有两处主要区别:
- 第一层不计算权值与输入的内积,而是计算输入与权值矩阵每一行之间的距离(类似第 15 章 LVQ 的第一层);
- 偏置不是加上去,而是乘上去。
第一层净输入与输出:
第二层是普通线性层:
权值矩阵 \(\mathbf{W}^1\) 的每一行 \({}_i\mathbf{w}^1\) 叫做中心(center),是净输入为零、输出最大(等于 1)的点。偏置对基函数做缩放:偏置越大,山包越窄。许多文献用标准差 \(\sigma\) 或"扩展常数"(spread)描述宽度,二者只是记号不同。比较 \(e^{-(d\,b)^2}\) 与 \(e^{-d^2/(2\sigma^2)}\) 可得
推导拆解:要让两种写法处处相等,只需指数里的部分相等:\((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 不同:每个基函数只在输入空间的一小块区域活跃。由此得到两条设计原则:
- 中心必须充分覆盖整个输入范围;
- 偏置要使相邻基函数显著重叠,否则基函数之间会出现"空洞"。
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 多得多。所以梯度法一般只用于其他方法初训后的微调。
最常用的是两阶段法。各变种的区别在于第一层怎么定:
- 网格:中心在输入范围内等距排列,取统一偏置使基函数有一定重叠。简单但浪费:函数复杂处需要更多基函数;实际输入常不占满整个范围;维数一高就不可行。
- 随机选取:从训练输入中随机选一部分作中心。中心落在数据所在区域,但不是最优。
- 聚类:用第 15 章的竞争层或 SOFM(或 k-means)对训练输入聚类,以簇中心为中心,并用簇的大小定偏置。
- 正交最小二乘(OLS):从大量候选中心(通常是全部训练输入)出发,每次加入使误差平方和下降最多的那个,直到满足停止准则。
第一层定好后,第二层用线性最小二乘一步算出。
17.7 线性最小二乘求第二层
17.7.1 偏置的经验公式
随机选取中心时,原书引用 Lowe(1989)的取法,所有偏置相同:
\(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{U}\) 的每一行是一个样本经过第一层后的输出,每一列对应一个基函数(最后一列全为 1)。加上第 13a、13b 章的权值衰减正则化(\(\rho=\alpha/\beta\)):
这是二次函数,与第 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\) 有下界,极小一定存在)。令梯度为零得正规方程:
这正是岭回归(ridge regression)的解,\(\rho=0\) 时退化为普通最小二乘。正则化在这里有两个作用:抑制过拟合,以及在基函数高度重叠导致 \(\mathbf{U}^T\mathbf{U}\) 接近奇异时保证数值稳定。
推导拆解:从 (17.25) 到 (17.31) 共三步。
- 展开平方项:\((\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) 右边。
- 对 \(\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}\) 对称)。
- 令梯度为零:\(-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。第一层输出构成
\(\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{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{h}=\mathbf{R}\mathbf{x}\),则 \(\mathbf{t}=\mathbf{M}\mathbf{h}+\mathbf{e}\)。由于 \(\mathbf{M}\) 的列正交,最小二乘解逐分量独立:
在最优 \(\mathbf{h}\) 下交叉项为零,于是
第一项是回归量解释的平方和,第二项是残差。第 \(i\) 个正交回归量的贡献是 \(h_i^2\mathbf{m}_i^T\mathbf{m}_i\),归一化后得误差下降比:
它就是"加入这个基函数能让 \(\mathbf{t}^T\mathbf{t}\) 中被解释的比例增加多少",相当于(未中心化的)增量 \(R^2\)。
推导拆解:为什么正交化之后贡献能"逐项相加"。
- \(\mathbf{U}=\mathbf{M}\mathbf{R}\) 且 \(\mathbf{R}\) 可逆,所以 \(\mathbf{U}\mathbf{x}\) 能表示的向量与 \(\mathbf{M}\mathbf{h}\) 能表示的完全相同(\(\mathbf{h}=\mathbf{R}\mathbf{x}\) 只是换了坐标),最小二乘问题可以改在 \(\mathbf{M}\) 上做。
- \(\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\) 单独做无截距回归"的斜率。
- 把 \(\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 步:
第 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 规则(只更新离输入最近的那一行):
也可以用 SOFM 或批量 k-means。这样基函数位于输入最常出现的区域。
偏置按簇的大小定:对每个中心,找出离它最近的 \(n_c\) 个训练输入,计算均方根距离
簇宽则基函数宽,各中心有各自的宽度,比统一偏置更有效地利用基函数。之后用线性最小二乘求第二层。
白话解释:(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 章相同,只有第一层净输入对权值和偏置的导数不同:
于是第一层梯度为
推导拆解:(17.82) 用链式法则。记 \(D=\|\mathbf{p}-{}_i\mathbf{w}^1\|=\sqrt{S}\),\(S=\sum_j(p_j-w^1_{i,j})^2\)。
- 外层:\(\partial n^1_i/\partial D=b^1_i\)。
- 中层:\(\partial D/\partial S=\frac{1}{2\sqrt S}=\frac{1}{2D}\)。
- 内层:\(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\) 求导。
- 三者相乘:\(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}\) |
练习
基础
-
证明 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\)。
-
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 收缩,等高线的中心向原点移动。
-
若把第一层的高斯函数换成线性传递函数,网络还是通用逼近器吗?(原书 E17.6) 答案要点:不等价于单层线性网络,因为距离 \(\|\mathbf{p}-{}_i\mathbf{w}^1\|\) 本身是输入的非线性函数。一维时输出是以各中心为折点的分段线性函数(若干"V"形之和),中心足够多时能以任意精度逼近区间上的连续函数;多维时它相当于以 \(\varphi(r)=r\) 为基函数的 RBF(文献中的"线性径向基"),逼近能力仍然很强,但失去了局部性:远离中心时输出线性增长而不是趋于 0。
-
在 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,说明偏置太小导致基函数重叠过多。
-
用 17.11.1 节的代码,把 17.7.3 节的例子改为六个中心(就在六个数据点上)、偏置 8,计算在 \(p=0\) 处的网络输出,与真值 1 比较。 提示:偏置 8 时离 \(p=0\) 最近的中心在 \(\pm0.4\),\(e^{-(0.4\cdot8)^2}\approx3.6\times10^{-5}\),输出几乎只剩第二层偏置。
进阶
-
说明如何把第 10 章的 LMS 算法用于在线训练第二层(原书 E17.5),并解释在非平稳市场中,为什么局部基函数比 MLP 更不容易"忘掉"其他区域。
-
编程实现 OLS,对 \(g(p)=1+\sin(\pi p/8)\) 在 \([-4,4]\) 上取 10 个随机点,只保留前 4 个入选中心,与 4 个等距中心 + 式 (17.9) 偏置的结果比较。(原书 E17.10、E17.12)
-
用 4×4 与 2×2 的 SOFM(或 k-means)聚类得到中心,按式 (17.79)(17.80) 设偏置,再用最小二乘逼近 \(t=\sin(2\pi p_1)\cos(2\pi p_2)\)。比较两种中心数下的训练误差和验证误差。(原书 E17.15)
-
在 17.11.2 节的代码中,把验证准则从 MSE 换成验证段的平均 Rank IC,选出的 \((n_c,\rho)\) 会变吗?再加入第三个纯噪声特征,观察 RBF 与线性模型的测试表现如何变化,并用维数灾难解释。
-
把
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 节为编者补充的量化应用,不在原书中。