偏差-方差分解与泛化
Hook:周一的因子复盘
上海某私募的因子研究员周一收到了风控的复盘邮件。他原本用 6 个 Barra 风格因子在沪深300 成份股上做截面回归预测次日超额收益,样本内 R 2 = 0.18 R^2 = 0.18 R 2 = 0.18 ,模型经理觉得「不够性感」。一周后他把因子从 6 个铺到 36 个——叠加了 28 个行业哑变量、过去 30 日动量分位、几个高频微观结构特征——样本内 R 2 R^2 R 2 一跃到 0.62 0.62 0.62 ,PPT 终于过了投委会。隔了一个月把策略推到 SSE 真实成交回测:样本外 R 2 = − 0.04 R^2 = -0.04 R 2 = − 0.04 ,相对中证基准跑输 1.3%。0.62 → − 0.04 0.62 \to -0.04 0.62 → − 0.04 之间的 0.66 0.66 0.66 个 R 2 R^2 R 2 去哪儿了? 上一节我们承认了泛化误差(generalization error)的存在,这一节把它拆成三块,告诉你那 30 个新因子真正买到的是什么。
一、把期望平方误差拆成三块
设数据满足 Y = f ( X ) + ε Y = f(X) + \varepsilon Y = f ( X ) + ε ,其中 ε \varepsilon ε 是零均值、方差为 σ 2 \sigma^2 σ 2 的噪声(noise),与训练集 D = { ( x i , y i ) } i = 1 n D = \{(x_i, y_i)\}_{i=1}^n D = {( x i , y i ) } i = 1 n 独立——工作假设通常是 ε ∼ N ( 0 , σ 2 ) \varepsilon \sim \mathcal{N}(0, \sigma^2) ε ∼ N ( 0 , σ 2 ) ,即标准正态分布(Gaussian distribution)。把训练集 D D D 喂给学习器(learner)得到预测函数 h ^ ( ⋅ ; D ) \hat{h}(\cdot; D) h ^ ( ⋅ ; D ) 。在任一固定测试点 x x x 上,对噪声 ε \varepsilon ε 与训练集 D D D 同时取期望 的均方误差等于:
E [ ( Y − h ^ ( x ) ) 2 ] = σ 2 + ( E D [ h ^ ( x ; D ) ] − f ( x ) ) 2 + V a r D [ h ^ ( x ; D ) ] \mathbb{E}\big[(Y - \hat{h}(x))^2\big] = \sigma^2 + \big(\mathbb{E}_D[\hat{h}(x; D)] - f(x)\big)^2 + \mathrm{Var}_D[\hat{h}(x; D)] E [ ( Y − h ^ ( x ) ) 2 ] = σ 2 + ( E D [ h ^ ( x ; D )] − f ( x ) ) 2 + Var D [ h ^ ( x ; D )]
右端三项各有名字:不可约噪声方差 (irreducible noise variance)σ 2 \sigma^2 σ 2 是数据本身的下限,再聪明的学习器也消不掉;偏差平方 (squared bias)刻画「平均预测器 h ˉ ( x ) = E D [ h ^ ( x ; D ) ] \bar h(x) = \mathbb{E}_D[\hat h(x; D)] h ˉ ( x ) = E D [ h ^ ( x ; D )] 」距离真实信号 f ( x ) f(x) f ( x ) 多远,是欠拟合(underfit)的标志;方差 (variance)刻画「训练集每换一份,h ^ ( x ) \hat h(x) h ^ ( x ) 抖几下」,是过拟合(overfit)的标志。
二、四步推导
加减平均预测 :记 h ˉ ( x ) = E D [ h ^ ( x ; D ) ] \bar h(x) = \mathbb{E}_D[\hat h(x; D)] h ˉ ( x ) = E D [ h ^ ( x ; D )] ,把残差三段拆分:Y − h ^ ( x ) = ( Y − f ( x ) ) ⏟ = ε + ( f ( x ) − h ˉ ( x ) ) ⏟ 偏差 + ( h ˉ ( x ) − h ^ ( x ) ) ⏟ 抖动 Y - \hat h(x) = \underbrace{(Y - f(x))}_{=\varepsilon} + \underbrace{(f(x) - \bar h(x))}_{\text{偏差}} + \underbrace{(\bar h(x) - \hat h(x))}_{\text{抖动}} Y − h ^ ( x ) = = ε ( Y − f ( x )) + 偏差 ( f ( x ) − h ˉ ( x )) + 抖动 ( h ˉ ( x ) − h ^ ( x )) 。
展开平方 :三段相加再平方,得到三个平方项与三个交叉项,对 ε \varepsilon ε 与 D D D 同时取期望。
交叉项逐一归零 :噪声 ε \varepsilon ε 与训练集 D D D 独立且零均值,因此 E [ ε ( f ( x ) − h ˉ ( x ) ) ] = 0 \mathbb{E}[\varepsilon(f(x) - \bar h(x))] = 0 E [ ε ( f ( x ) − h ˉ ( x ))] = 0 与 E [ ε ( h ˉ ( x ) − h ^ ( x ) ) ] = 0 \mathbb{E}[\varepsilon(\bar h(x) - \hat h(x))] = 0 E [ ε ( h ˉ ( x ) − h ^ ( x ))] = 0 ;余下的交叉项 E D [ ( f ( x ) − h ˉ ( x ) ) ( h ˉ ( x ) − h ^ ( x ) ) ] \mathbb{E}_D[(f(x) - \bar h(x))(\bar h(x) - \hat h(x))] E D [( f ( x ) − h ˉ ( x )) ( h ˉ ( x ) − h ^ ( x ))] 中 ( f ( x ) − h ˉ ( x ) ) (f(x) - \bar h(x)) ( f ( x ) − h ˉ ( x )) 不依赖 D D D ,可提出期望外,内剩 E D [ h ˉ ( x ) − h ^ ( x ) ] = 0 \mathbb{E}_D[\bar h(x) - \hat h(x)] = 0 E D [ h ˉ ( x ) − h ^ ( x )] = 0 。
回代 :E [ ε 2 ] = σ 2 \mathbb{E}[\varepsilon^2] = \sigma^2 E [ ε 2 ] = σ 2 、( f ( x ) − h ˉ ( x ) ) 2 (f(x) - \bar h(x))^2 ( f ( x ) − h ˉ ( x ) ) 2 不随机即偏差平方、E D [ ( h ˉ ( x ) − h ^ ( x ) ) 2 ] = V a r D [ h ^ ( x ; D ) ] \mathbb{E}_D[(\bar h(x) - \hat h(x))^2] = \mathrm{Var}_D[\hat h(x; D)] E D [( h ˉ ( x ) − h ^ ( x ) ) 2 ] = Var D [ h ^ ( x ; D )] 。三块合并即得上一节的等式。
把视角扩到多元线性模型:用普通最小二乘(ordinary least squares)拟合时,V a r D [ h ^ ( x ; D ) ] \mathrm{Var}_D[\hat h(x; D)] Var D [ h ^ ( x ; D )] 由设计矩阵 X X X 通过 σ 2 ( X T X ) − 1 \sigma^2 (X^T X)^{-1} σ 2 ( X T X ) − 1 决定;一旦因子之间高度共线,X T X X^T X X T X 的协方差矩阵(covariance matrix)结构恶化,条件数(condition number)飙升,方差项就被放大——这就是「加 30 个高度相关的行业哑变量」对样本外做的事。
三、模型容量与训练/测试曲线
固定样本量 n = 240 n = 240 n = 240 (一年沪深300 月频面板),同一组真实数据上用多项式特征拟合次日截面收益,典型结果如下表:
多项式阶 d d d 样本内 R 2 R^2 R 2 样本外 R 2 R^2 R 2 区域 1 0.04 0.03 欠拟合(高偏差) 3 0.16 0.14 良好拟合 6 0.28 0.11 偏过拟合 12 0.55 -0.02 过拟合(高方差)
训练误差几乎单调下降,测试误差先降后升——两条曲线之间的距离即方差项的实际体现 。开篇那位研究员把容量从 6 推到 36,正是把自己从中段推到了最后一行:样本内分数翻三倍,但泛化已经塌掉。
下面的滑块演示总误差关于容量 d d d 的 U 形:左侧偏差主导、右侧方差主导,最低点是「良好拟合」窗口。
Formula Explorer
b / d + v * d + s^2
四、学习曲线:样本量 n n n 的作用
把容量固定、变化样本量 n n n 。粗略地,方差项以 V a r D [ h ^ ( x ; D ) ] ∝ 1 / n \mathrm{Var}_D[\hat h(x; D)] \propto 1/n Var D [ h ^ ( x ; D )] ∝ 1/ n 衰减,而偏差项不随 n n n 改变 ——它只随假设空间 H \mathcal{H} H 的能力变化。典型学习曲线(learning curve)的样子:训练误差从极低位缓慢上升,测试误差从高位下降,两条像剪刀一样合拢,合拢的水平即 偏差2 + σ 2 ^2 + \sigma^2 2 + σ 2 。诊断:两条曲线已经合拢但仍远高于业务可接受水平 ,是高偏差信号——加因子、换更灵活的 H \mathcal{H} H ;两条曲线间距很大 ,是高方差信号——加样本、做正则化、降容量。
题外话:现代神经网络(modern neural networks)能观察到「双下降」(double descent)现象,过参数化模型在容量极大时反而再次降低测试误差。本课不展开,留到模块 2.6.3 神经网络。
五、No-Free-Lunch 与归纳偏置
非形式版本的没有免费午餐定理 (no-free-lunch theorem)说:在所有可能的数据分布上平均,任何学习算法的期望泛化误差都相同。直白点说:没有「普适最优」的模型 。一个学习器之所以在你的因子数据上有用,是因为它的假设空间 H \mathcal{H} H 恰好编码了与该数据相容的归纳偏置 (inductive bias)。下一课选定 H \mathcal{H} H 为线性函数族,基于「沪深300 截面信号大体近似线性可加」的经验先验;再下一课用正则化进一步收紧 H \mathcal{H} H 的有效容量;模型选择则把这个收紧旋钮交给交叉验证去拧。
六、练习
Exercise
给定 6 个观测 ( x i , y i ) = ( 1 , 1.1 ) , ( 2 , 1.9 ) , ( 3 , 3.0 ) , ( 4 , 4.2 ) , ( 5 , 4.8 ) , ( 6 , 6.1 ) (x_i, y_i) = (1, 1.1), (2, 1.9), (3, 3.0), (4, 4.2), (5, 4.8), (6, 6.1) ( x i , y i ) = ( 1 , 1.1 ) , ( 2 , 1.9 ) , ( 3 , 3.0 ) , ( 4 , 4.2 ) , ( 5 , 4.8 ) , ( 6 , 6.1 ) ,真实信号 f ( x ) = x f(x) = x f ( x ) = x ,噪声方差 σ 2 = 0.04 \sigma^2 = 0.04 σ 2 = 0.04 。
(i) 计算常数预测器 h ^ 0 ( x ) = y ˉ \hat h_0(x) = \bar y h ^ 0 ( x ) = y ˉ 与一元线性预测器 h ^ 1 ( x ) = β ^ 0 + β ^ 1 x \hat h_1(x) = \hat\beta_0 + \hat\beta_1 x h ^ 1 ( x ) = β ^ 0 + β ^ 1 x (用普通最小二乘拟合)在 x = 4 x = 4 x = 4 处的偏差2 ^2 2 、方差与总均方误差。把数据反复重抽 200 次后(数值已替你算好):常数预测器 h ˉ 0 ( 4 ) = 3.5 \bar h_0(4) = 3.5 h ˉ 0 ( 4 ) = 3.5 、V a r D [ h ^ 0 ( 4 ) ] ≈ 0.012 \mathrm{Var}_D[\hat h_0(4)] \approx 0.012 Var D [ h ^ 0 ( 4 )] ≈ 0.012 ;线性预测器 h ˉ 1 ( 4 ) ≈ 4.0 \bar h_1(4) \approx 4.0 h ˉ 1 ( 4 ) ≈ 4.0 、V a r D [ h ^ 1 ( 4 ) ] ≈ 0.020 \mathrm{Var}_D[\hat h_1(4)] \approx 0.020 Var D [ h ^ 1 ( 4 )] ≈ 0.020 。
(ii) 在 σ 2 = 0.04 \sigma^2 = 0.04 σ 2 = 0.04 当前噪声水平下哪一个更优? 若噪声方差升到 σ 2 = 1.0 \sigma^2 = 1.0 σ 2 = 1.0 ,结论会如何变?
提示 偏差
2 = ( h ˉ ( x ) − f ( x ) ) 2 ^2 = (\bar h(x) - f(x))^2 2 = ( h ˉ ( x ) − f ( x ) ) 2 ,在
x = 4 x = 4 x = 4 处真实信号
f ( 4 ) = 4 f(4) = 4 f ( 4 ) = 4 。先把两个学习器各自的
h ˉ ( 4 ) \bar h(4) h ˉ ( 4 ) 代入这条定义,你会立刻看出常数预测器哪一项主导了它的 MSE。
提示 线性预测器总 MSE
≈ 0 + 0.020 + 0.04 = 0.060 \approx 0 + 0.020 + 0.04 = 0.060 ≈ 0 + 0.020 + 0.04 = 0.060 ;常数预测器
≈ 0.25 + 0.012 + 0.04 = 0.302 \approx 0.25 + 0.012 + 0.04 = 0.302 ≈ 0.25 + 0.012 + 0.04 = 0.302 ,线性更优。若
σ 2 = 1.0 \sigma^2 = 1.0 σ 2 = 1.0 ,两边各加
0.96 0.96 0.96 ,差异被噪声本身淹没,简单模型的相对吸引力随之上升——噪声越大,偏差占总误差的比例越小。
七、通往下一节
到这里你已经手握偏差-方差分解这把尺子,能解释「加因子之后样本外塌掉」的现象,也能在容量与样本量两个旋钮之间做权衡。下一节我们让最简单的非平凡 H \mathcal{H} H ——线性回归 ——上场:偏差与方差都能写成 X T X X^T X X T X 的特征值与 σ 2 \sigma^2 σ 2 的闭式函数,因此线性回归是检验上述分解最干净的场地,也是后续岭回归、Lasso 与交叉验证的入口。