← 返回量化与 AI 投研概念库

正则化与泛化:给模型装一副刹车,让它别把噪音当规律

最后更新 2026-08-18
R2 · 注意风险

你训练完一个模型,看训练集上的成绩:预测和实际的吻合度高得让人心里发毛。然后你把那段特意留出来、训练时一眼都没看过的数据喂进去——吻合度掉了一大半,有时候干脆掉到零附近。

这时候第一反应通常是「模型不够强」,于是加层数、加因子、加轮数。结果训练集上的成绩又高了一截,留出来那段的成绩又低了一截。你会发现一件很反直觉的事:你越用力,两边的差距越大。

这个差距有个名字,叫泛化差距。而专门用来压这个差距的一整套手段,在机器学习里叫正则化。它做的事情说白了只有一句:故意不让模型学得那么好。

先说人话:一个只会背答案的学生

想象两个准备考试的学生。

第一个学生把往年真题从头到尾理解了一遍,抓的是出题的路数。第二个学生更狠——他把三千道真题连题目带答案一字不差全背下来了。你拿真题考他们,第二个学生一定考得更高,能到满分。

然后正式考试,卷子是新出的。第一个学生正常发挥,第二个学生傻眼。

问题不在第二个学生不努力,恰恰在于他太努力了,努力的方向是把这批题本身记住,而不是把题背后的规律弄懂。真题里有规律,也有大量跟规律无关的偶然:某道题恰好选了 C,某道题的数字恰好是 7。他把这些偶然也一并背了下来,而这部分记忆在新卷子上不但没用,还会主动误导他。

在数据里,「规律」和「偶然」是混在一起的,模型没有能力自动区分。 你给它的容量越大、让它拟合得越细,它就越会连偶然一起吃进去。这就是过拟合。而泛化,指的就是在它从没见过的数据上还能不能站得住——这才是你真正要的东西,训练集上那个漂亮数字只是副产品。

那怎么办?不能靠嘴上跟模型说「别背答案」。正则化的办法很物理:给它装一副刹车。

刹车是怎么装上去的

正则化的核心机制,用一句话就能讲完:给「复杂」这件事标个价,逼模型自己权衡。

训练一个模型,本质是让它去最小化一个叫损失函数的东西——就是「预测得有多差」的总分,分数越低越好。模型会朝着让这个分数下降的方向不断调整自己。

正则化做的事,是在这个分数后面加一项:

最终要最小化的 = 预测误差 + 惩罚 × 模型的复杂程度

加了这一项之后,模型的处境变了。它想再降低一点预测误差,就得让自己变复杂一点;可一变复杂,后面那项惩罚就涨上来了。于是它只会在「这条规律带来的误差下降,大到值得付这笔复杂度罚款」的时候,才肯把这条规律学进去。

这就是刹车的全部秘密——不是禁止它学,是让它学每一样东西都要付费。 那些真规律带来的收益大,付得起;那些纯属偶然的细节收益微乎其微,付不起,就被挤掉了。

前面那个惩罚系数(多大力气罚),就是刹车的松紧。系数越大,刹车越重,模型越保守、越钝;系数为零,刹车松开,模型放飞自我去背答案。

几种常见的踩法,各自的直觉

刹车不止一副。真实系统里通常同时装好几副,因为它们卡住的是不同的坏习惯。

罚系数大小:L1 和 L2

这是最经典的两副。模型内部对每个输入因子都有一个权重系数,表示「这个因子我给它多大话语权」。

  • L2:按系数的平方罚。效果是把所有系数都往小里压,谁也别太嚣张,但基本不会压到正好为零。直觉上像是「所有意见都听,但谁的嗓门都别太大」。
  • L1:按系数的绝对值罚。它有个 L2 没有的性质——会把一批系数直接压成。系数为零,等于这个因子被彻底踢出模型。所以 L1 顺手干了件事:自动挑因子。直觉上像是「与其让一百个人小声说话,不如让九十个人闭嘴,留十个人说清楚」。

qlib 那份 LightGBM 的示例配置里,这两项都开着,而且值给得相当猛——L1 和 L2 的系数分别是两百多和五百多的量级(这是该示例配置里的调参结果,可配置、也会随版本变化)。这个数量级放在很多别的行业的模型里是不可想象的。为什么金融要罚这么重,后面专门说。

限制模型能长多大

树模型(一类靠不断「如果 A 就往左、否则往右」切分数据的模型)还有一副更直接的刹车:限制树能长多深、最多允许多少个叶子节点。

这就像给一份判断规则限定篇幅:你只有一页纸,写不下三千条例外,只能写最要紧的那几条。容量上限本身就是一种正则化——模型想背也没地方背。

dropout:训练时随机蒙住一部分

神经网络里有一副刹车叫 dropout(直译「随机丢弃」):每一轮训练时,随机把一部分神经元临时关掉,让它们不参与这一轮的计算。

直觉是这样的:一支球队如果所有进攻都靠一个明星前锋,前锋被盯死,全队瘫痪。你如果在训练时随机让几个主力轮空,整支队伍就被迫练出多条得分路线。模型也一样——当它没法确定某个输入这一轮在不在,它就不敢把宝全押在单一线索上,只好把判断依据分散开。分散开的判断,换到新数据上更耐用。

有意思的是,同一批示例配置里,那份 GRU 的 dropout 写的是 0,也就是这一副刹车默认没踩(示例值,可配置)。它转而重仓押在下面这一副上。

早停:让一个不参与训练的裁判喊停

这副刹车不改模型结构,只管什么时候停手

做法是把数据切三份:训练集用来学,验证集(一段训练时不学、只用来打分的数据)用来当裁判,测试集留到最后。训练过程中,训练集上的成绩会一路往上走——它本来就在背这批题。但验证集上的成绩会先涨后跌:涨的那一段是在学规律,开始跌的那一刻,就是它转去背偶然了。

qlib 里那个循环写得很朴素,逻辑一看就懂:每跑完一轮,在验证集上打个分。分数创新高,就把当前这一版模型参数完整复制一份存起来,并把计数器清零;分数没创新高,计数器加一。计数器累到设定的耐心值,就跳出循环。

if val_score > best_score:
    best_score = val_score
    stop_steps = 0
    best_epoch = step
    best_param = copy.deepcopy(self.gru_model.state_dict())
else:
    stop_steps += 1
    if stop_steps >= self.early_stop:
        break

跳出之后还有关键一步:load_state_dict(best_param) —— 把模型倒回验证集成绩最好的那一版。也就是说,最后交付的不是训练到最后那一版,是中途表现最好的那一版。后面那些轮次不但白练,还练坏了,所以直接作废。

freqtrade 那边也有对应的参数,文档里写得很直白:它数的是「验证损失连续多少轮没有改善」,并且明确说这个功能必须有验证集才能用(默认是关闭的,可配置)。这条约束不是实现细节——没有一个不参与训练的裁判,早停就没有判断依据。

减少输入本身

还有一路刹车动的是入口:把因子先做降维(用少数几个综合维度代替原来上百列),或者把那些取值从头到尾没变过的列直接删掉——一列常数不携带任何信息,留着只会给模型多一个乱抓的把手。freqtrade 的特征处理流水线里这两件事都有对应开关。

最反直觉的一副:主动往数据里掺噪音

freqtrade 的文档里有个参数,作用是给训练数据加高斯噪音——随机生成一批小扰动,加到所有数据点上,文档写明目的就是防止过拟合(默认关闭,可配置)。

第一次看到会觉得离谱:数据本来就不干净,你还往里加脏东西?

但顺着刹车的逻辑想就通了。你把数据轻微抖一抖,那些真正结实的规律抖不散,照样在;那些只在原始数值上刚好成立的巧合,一抖就没了。加噪音等于逼模型只学「抖一抖还在」的东西。 这跟前面几副刹车是同一个思路的不同实现:让模型学不到那些经不起折腾的细节。

📌 说明

别把梯度裁剪跟正则化混为一谈。qlib 的训练循环里也有一行限制梯度幅度的代码,但那是为了防止训练过程数值失控、直接跑飞,属于训练稳定性手段,目标不是压泛化差距。两者长得像,管的事不是一回事。

为什么金融要踩得比别人重得多

这是本篇最想让你记住的一层。

同一套正则化技术,在图像识别、语音、翻译这些领域也在用,但强度完全不是一个量级。原因只有一个词:信噪比

一张猫的照片里,有多少像素在说「这是猫」?非常多,而且很确定——只要不是刻意伪造,图里的信息几乎全是信号,噪音很少。所以模型可以学得很细,学细了确实有回报。

金融数据反过来。价格的每天变动里,真正来自「可被提前识别的规律」的那部分极小,绝大部分是各种一次性的、不重复的、你永远不会知道原因的扰动。这类数据的特点是:你几乎总能在里面找到一堆看起来很像规律的东西,而它们绝大多数只是巧合。

这就决定了两件事:

第一,模型的胃口必须被死死管住。 一个容量足够大的模型面对金融数据,几乎必然会去拟合噪音,因为噪音的量远大于信号——那里「可学的东西」多得多。惩罚系数动辄给到几百的量级,不是调参调疯了,而是在明确表态:这份数据里能被信任的结构极少,你就老老实实学那么一点点。

第二,衡量成功的标准要跟着降。 这一行里预测能力的常用度量(比如 IC 这类相关性口径)在实践中普遍是很小的数,跟其它领域动不动九成几的准确率完全不能比。理解了信噪比这一层,你就不会再被一个「训练集上吻合度极高」的模型唬住——在这个领域里,那个数字高本身就是个坏消息,它说明刹车没踩住。

这也是为什么 过拟合 那篇里讲的「调参本身就在生产过拟合」和这篇是一体两面:调参是在放大搜索次数,正则化是在压缩模型能吃下的东西。前者制造问题,后者收拾问题,而在金融数据上,后者永远比你以为的更需要用力。

失效边界与常见误用

刹车踩死了车就不走了。 惩罚系数一路加大,模型会保守到什么都学不到——训练集和验证集上成绩一起烂。这叫欠拟合。正则化不是越强越好,它是一个要拿捏的量,而且这个量本身没有普适答案,换一段市场、换一批因子就得重新掂量。

别把正则化强度也拿去疯狂搜。 这里有个很容易踩的循环:为了压过拟合,你去调惩罚系数;调的方式是试几十个值,挑验证集上最好看的那个。恭喜,你刚刚在验证集上又做了一次搜索。验证集被反复用来做选择,它就不再是干净的裁判了。 想理解这个漏斗,样本内外 那篇讲的分割纪律是必须的前置。

正则化治不了别的病。 它压的是「模型吃进了噪音」这一类问题。如果你的数据本身在计算时用了当时拿不到的信息,那模型学到的是一条真实存在但你现实中用不上的规律——正则化对此毫无办法,反而会因为这条「规律」在历史上格外结实而重点保留它。这类问题得回到 前视偏差 那一层去解。

泛化好也不等于能用。 一个在没见过的数据上仍然稳定的模型,只说明它抓到的东西不是幻觉。它抓到的那点优势够不够覆盖手续费、滑点、冲击成本,是完全独立的另一道关;而且它今天泛化得好,也不保证半年后还成立,那属于 模型会过期 的范畴。

把「训练集成绩」当成汇报口径。 任何时候有人给你看一个模型的表现,第一个该问的问题不是数字多少,而是:这个数字是在哪一段数据上算的,那段数据在训练时被看过没有。这一问能挡掉这一行里相当大比例的噪音。

小结

  • 泛化 = 在没见过的数据上还站得住;训练集上的漂亮成绩不是目标,是副产品,而且经常是反指标。
  • 正则化的机制统一得出奇:给复杂度标价,让模型只有在收益够大时才肯多学一样东西——真规律付得起,纯巧合付不起。
  • 常见踩法各卡一处坏习惯:罚系数大小(L1 顺手把没用的因子踢成零,L2 只压不踢)、限制模型能长多大、dropout 逼它别押单一线索、早停让不参与训练的裁判喊停并倒回最好那一版、减少输入本身、以及最反直觉的主动加噪音。
  • 金融要踩重刹车的唯一原因是信噪比极低:可学的巧合远多于可学的规律,所以惩罚系数动辄给到别的行业不会用的量级,预测能力的度量也天然是个小数。
  • 边界:踩太死会欠拟合;拿验证集反复挑正则化强度等于污染裁判;它治不了前视偏差;泛化好也不等于扣完成本还剩东西。

一句话记住这篇:能在新题上做对,才叫会做题;在旧题上考满分,往往只说明你背得太熟了。

本文所引源码与文档均来自上述快照版本,是阅读代码得出的机制说明,不是运行结果;配置项的具体取值属于示例与默认值,可配置且可能随版本变化,请以你手上那个版本为准。回 量化与 AI 投研概念库 看其它概念各自在说什么;本站内容为投资教育,不构成任何投资建议,边界见 免责声明

内容有错、看不懂、或想看下一篇?告诉我们 →

本文为投资教育整理,不构成任何投资建议;不荐个股/基金、不预测点位、不承诺收益。关键数据与结论请结合权威来源自行验证,并见风险免责声明