最近,强化学习领域的奠基人之一 Richard Sutton 的一段观点又引发了圈内热议:大模型目前更像是被困在“局部最优”里,AI 真正要往前走,必须拥有持续学习的能力。这个判断击中了当前大模型发展的一个核心痛点——我们从海量静态数据里训练出来的模型,遇到新任务、新环境时,要么推倒重来,要么微调后忘了旧知识。很多团队把大量精力花在“更大的数据、更大的模型、更长的上下文”上,却忽略了模型在真实世界中持续进化的能力。
如果读到这里你也有同感,那这篇文章会比较适合你。我会围绕 Sutton 的判断,拆解“局部最优”和“持续学习”到底是什么意思,当前大模型训练范式为什么容易陷入局部最优,并提供一个可运行的 PyTorch 小实验,直观展示灾难性遗忘以及经验回放如何缓解它。最后再聊一聊强化学习如何帮助 AI 跳出局部最优,以及在工程落地时需要考虑的问题。
1. 背景:Sutton 的判断与大模型的“局部最优”困境
1.1 谁是 Richard Sutton,为什么他的观点值得关注
Richard Sutton 是强化学习领域的核心人物,长期在阿尔伯塔大学从事强化学习研究,也是《Reinforcement Learning: An Introduction》一书的作者之一。这本书几乎是所有强化学习研究者的入门经典。他提出的“痛苦教训”(The Bitter Lesson)在 AI 社区广为流传:那些依靠人类先验知识设计的精巧方法,短期可能领先,但长期来看,通用搜索、学习和规模化计算的力量最终会胜出。
当这样一位研究者说“大模型被困在局部最优”时,我们不能只把它当成普通观点。他的意思是:当前大模型通过大规模预训练确实逼近了一个不错的解,但解的空间里可能还有更好的区域,而现有训练方式很难到达那里。更关键的是,模型一旦部署到真实环境,如果无法继续从新数据、新反馈中学习,它就只能在旧分布里“打转”。
1.2 大模型被困在“局部最优”怎么理解
在机器学习里,局部最优是指一个模型在训练时收敛到了某个参数组合,这个组合使损失函数在一个局部区域内达到较低值,但并不是全局最低。对深度学习来说,损失面非常复杂,真正的全局最优几乎不可知,所以大家默认“找到足够好的局部最优”就行。
不过 Sutton 说的“局部最优”更偏向系统层面。大模型通过海量文本和图像训练后,已经掌握了很多知识,但这些知识是静态的。模型不会主动质疑自己的知识,也不会因为环境反馈而自动调整。它就像一个选手,已经练熟了一套固定打法,但遇到规则变化的比赛,就会显得僵硬。这种“僵硬”可以理解成大模型在当前数据分布下陷入了局部最优。
1.3 AI 必须学会持续学习的核心逻辑
持续学习(Continual Learning)也叫终身学习(Lifelong Learning),目标是让模型能够不断吸收新任务、新知识,同时不遗忘旧知识。人类就是这样学习的:今天学会开车,明天学做饭,并不会因为学做饭而忘了怎么开车。
大模型如果拥有持续学习能力,就能在部署后根据用户反馈、环境变化、新业务需求持续进化。比如一个客服机器人,上线后不断遇到新问题,它应该能记住新问题的处理方式,同时保持原有服务能力。这比每次都重新预训练或微调要高效得多,也更接近 Sutton 所说的智能。
2. 理解持续学习:从灾难性遗忘说起
2.1 持续学习的目标
持续学习的核心目标不是“多学一个任务”,而是在学习新任务后,旧任务的性能仍能保持甚至提升。形式化一点说,面对一系列任务 T1, T2, ..., Tn,模型在学完当前任务后,对所有已经出现过的任务都能保持良好表现。
这个目标听起来很简单,但实现起来非常难,因为神经网络在反向传播更新参数时,为了拟合新任务,会覆盖掉对旧任务有用的参数。这正是持续学习领域最著名的现象——灾难性遗忘(Catastrophic Forgetting)。
2.2 灾难性遗忘现象
我先用一个生活中的例子类比:你记住了一个朋友的电话号码,之后又记了一个新朋友的号码,结果发现旧号码怎么也想不起来了。神经网络比人更极端,它可能彻底“删除”旧知识,而不是暂时想不起来。
在实验中,灾难性遗忘表现为:模型依次学习任务 A、B、C 后,再测试任务 A 的准确率,往往会从 90% 以上跌到接近随机猜测。而且模型越深、任务差异越大,遗忘越严重。这也是很多大模型微调时的痛点:用业务数据微调后,通用能力下降,甚至出现“灾难性遗忘”导致的胡说八道。
2.3 稳定性-可塑性困境
持续学习面临一个内在矛盾:模型需要足够“可塑”,才能快速学习新任务;同时又要足够“稳定”,才能保留旧知识。这被称为稳定性-可塑性困境。
如果模型过于稳定,新任务学不进去,容易过拟合旧任务;如果过于可塑,新任务学得快,旧任务忘得也快。优秀的持续学习算法,本质上是在稳定性和可塑性之间做动态权衡。Sutton 强调 AI 必须学会持续学习,正是希望研究者正视这个根本矛盾,而不是靠堆数据量回避问题。
3. 当前大模型训练范式的局限
3.1 预训练+微调范式的优势与瓶颈
现在的大模型大多走“预训练 + 微调”路线。预训练阶段用海量无标注数据学习语言规律和世界知识,微调阶段用少量标注数据或人类反馈适配具体任务。这套范式非常成功,但它有一个隐含假设:预训练数据已经覆盖了模型未来会遇到的大部分情况。
现实是,真实世界的分布是动态变化的。新的热点出现、新的产品上线、用户的口语表达在变,这些信息往往不在预训练数据里。要让模型跟上变化,最常用的办法是重新预训练或持续微调,但成本高、周期长,而且很容易在微调过程中破坏原有能力。
3.2 静态数据集与封闭世界假设
预训练使用的是一个静态快照。模型只能从这个固定数据集里学习,无法主动获取新样本。即使数据量再大,它也是一个封闭世界。
封闭世界意味着模型不知道“自己不知道什么”。当用户问到训练数据之外的问题时,模型只能凭借记忆“编造”答案,而不是去查证或更新。相比之下,持续学习系统应该像人类一样,能从交互反馈中识别认知缺口,然后去补充新知识。
3.3 参数冻结带来的知识天花板
很多大模型发布后参数就不再更新,即使进行微调,也只会调整部分层或保留某些模块。这相当于给模型盖了一个“知识天花板”。当新知识出现在天花板之外时,模型只能硬套旧知识,结果就是答非所问。
当然,参数冻结有实际考虑:完整更新大模型需要巨大算力,且存在遗忘风险。但 Sutton 所批评的正是这种“训练完就固定”的思维。真正的智能体应该持续与环境交互,让参数成为“流动”的知识容器,而不是“封存”的历史档案。
4. 主流持续学习思路速览
4.1 正则化方法:保护重要参数
正则化方法的代表是 EWC(弹性权重固化)。它在损失函数中加入一个约束项,惩罚那些对旧任务重要的参数发生明显变化。训练新任务时,重要参数尽量不动,次要参数自由更新。
这类方法不需要保存旧数据,内存开销小,但难点在于如何准确衡量“重要性”。如果重要性估算不准,要么保护过度导致新任务学不进去,要么保护不足依然遗忘。
4.2 回放方法:重放旧经验
回放方法会保存一小部分旧任务的样本,训练新任务时把它们混入当前数据一起训练。我们后面实战中会用到这种思路。
回放方法直观有效,被很多持续学习系统采用。它牺牲了一点存储和计算,换来了稳定性和可塑性的平衡。对大模型来说,直接回放原始文本可能涉及数据隐私和存储成本,因此也可以用生成模型合成旧样本,或者用向量检索的方式从历史库里抽取典型样本。
4.3 参数扩展:动态架构
动态架构方法为每个新任务分配新的参数模块,例如新增一些层或专家网络。模型整体容量可以持续扩大,理论上不会遗忘旧任务。
这种方法的关键是设计好“任务识别器”和“模块选择器”,否则推理时不知道应该激活哪些模块。另外,参数无限增长也会带来部署复杂度,所以通常会配合低秩近似、稀疏化等手段压缩。
4.4 强化学习与持续学习的结合点
强化学习天然是持续学习的:智能体在环境中不断试错,根据奖励信号更新策略,整个过程没有明确的“训练测试”划分。Sutton 认为,真正的智能必须通过与环境持续交互来获得经验和知识。大模型可以作为强化学习的策略网络或价值函数,也可以作为世界模型,让智能体在想象中预演并学习。
这种思路给了我们一个重要启示:持续学习不只是算法问题,更是系统设计问题。我们需要构建闭环学习回路,让模型在真实反馈中持续优化。
5. 实战:用 PyTorch 演示灾难性遗忘与缓解
5.1 实验目标与任务设计
为了让你直观感受持续学习,我用 PyTorch 构造了一个最小实验。模型是一个两层 MLP,输入是二维平面上的点,输出是二分类结果。我会准备三个不同的分类任务:
- 任务 0:按点到原点距离分类,半径大于 1 为正类,否则为负类。
- 任务 1:按 x 是否大于 y 分类,即对角线划分。
- 任务 2:按 XOR 异或规则分类。
三个任务共享同样的输入分布x ∈ [-2, 2],但分类边界差异明显。模型先学任务 0,再学任务 1,然后再学任务 2。我们记录每次训练结束后,模型在三个任务测试集上的准确率,观察任务 0 的准确率是否下降。然后引入经验回放,再次跑一遍,对比遗忘是否减轻。
5.2 安装依赖与环境准备
需要 Python 环境,并安装以下依赖:
pip install torch numpy scikit-learn版本方面,PyTorch 使用 1.13 及以上或者 2.x 都可以,scikit-learn 用于划分数据集。运行环境可以是本地 Jupyter Notebook,也可以直接写一个.py脚本。下面代码建议保存为continual_learning_demo.py。
5.3 完整代码:数据生成与模型定义
先把数据生成和模型定义写好。注意设置随机种子,方便复现。
import torch import torch.nn as nn import numpy as np from sklearn.model_selection import train_test_split from torch.utils.data import DataLoader, TensorDataset def make_synthetic_task(seed, task_id, n=1000): """生成一个二分类任务,task_id 取 0、1、2""" rng = np.random.default_rng(seed) X = rng.uniform(-2, 2, size=(n, 2)) if task_id == 0: # 按到原点距离分类 y = (np.linalg.norm(X, axis=1) > 1.0).astype(int) elif task_id == 1: # 按 x > y 分类 y = (X[:, 0] > X[:, 1]).astype(int) else: # XOR 异或分类 y = ((X[:, 0] > 0) ^ (X[:, 1] > 0)).astype(int) return X, y def create_task(seed, task_id, test_size=0.2): X, y = make_synthetic_task(seed, task_id) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=test_size, random_state=seed ) return X_train, X_test, y_train, y_test class MLP(nn.Module): """一个简单的两层全连接分类器""" def __init__(self, input_dim=2, hidden_dim=32, output_dim=2): super().__init__() self.net = nn.Sequential( nn.Linear(input_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, output_dim) ) def forward(self, x): return self.net(x)5.4 顺序训练:观察灾难性遗忘
下面定义训练和评估函数,然后按顺序学习三个任务。
def train_model(model, X_train, y_train, epochs=15, lr=0.01, batch_size=64): model.train() optimizer = torch.optim.Adam(model.parameters(), lr=lr) loss_fn = nn.CrossEntropyLoss() dataset = TensorDataset(torch.FloatTensor(X_train), torch.LongTensor(y_train)) loader = DataLoader(dataset, batch_size=batch_size, shuffle=True) for epoch in range(epochs): for xb, yb in loader: optimizer.zero_grad() out = model(xb) loss = loss_fn(out, yb) loss.backward() optimizer.step() def evaluate(model, X_test, y_test): model.eval() with torch.no_grad(): output = model(torch.FloatTensor(X_test)) pred = output.argmax(dim=1).numpy() return float((pred == y_test).mean()) torch.manual_seed(0) np.random.seed(0) tasks = [ create_task(seed=100, task_id=0), create_task(seed=200, task_id=1), create_task(seed=300, task_id=2), ] model = MLP() records = [] for i, (X_train, X_test, y_train, y_test) in enumerate(tasks): train_model(model, X_train, y_train) # 评估所有任务的测试集 accs = [] for _, X_t, _, y_t in tasks: accs.append(evaluate(model, X_t, y_t)) records.append(accs) print(f"训练完任务{i + 1} -> 三个任务准确率: {[round(a, 3) for a in accs]}")运行后看到的效果类似:
训练完任务1 -> 三个任务准确率: [0.965, 0.501, 0.498] 训练完任务2 -> 三个任务准确率: [0.498, 0.988, 0.507] 训练完任务3 -> 三个任务准确率: [0.501, 0.501, 0.972]请注意:由于随机种子和训练轮数不同,你的结果可能有波动,但趋势一致——学完任务 2 后,任务 1 的准确率明显下降到接近随机,学完任务 3 后,任务 1 和任务 2 的准确率都大幅下降。这就是灾难性遗忘。
为什么会出现这种现象?因为 MLP 的所有参数是共享的,新任务的梯度更新会覆盖对旧任务有价值的特征。比如学习任务 2 的 XOR 边界时,模型可能调整了隐藏层的激活模式,而任务 0 依赖的“圆形边界”特征就被破坏了。
5.5 经验回放:缓解遗忘
现在我们在训练当前任务时,混入一部分之前任务的数据,看看效果。为了公平,每个旧任务只保留 100 个训练样本。
torch.manual_seed(0) np.random.seed(0) model = MLP() replay_memory = [] records_replay = [] for i, (X_train_cur, X_test_cur, y_train_cur, y_test_cur) in enumerate(tasks): # 从当前原始训练集中抽 100 个样本存入回放池 idx = np.random.choice(len(X_train_cur), size=min(100, len(X_train_cur)), replace=False) replay_memory.append((X_train_cur[idx], y_train_cur[idx])) # 构造本次训练数据:当前任务全量 + 之前旧任务回放样本 X_train_combined = X_train_cur.copy() y_train_combined = y_train_cur.copy() for old_X, old_y in replay_memory[:-1]: X_train_combined = np.concatenate([X_train_combined, old_X]) y_train_combined = np.concatenate([y_train_combined, old_y]) train_model(model, X_train_combined, y_train_combined) accs = [] for _, X_t, _, y_t in tasks: accs.append(evaluate(model, X_t, y_t)) records_replay.append(accs) print(f"训练完任务{i + 1} -> 三个任务准确率: {[round(a, 3) for a in accs]}")无回放版本中任务 0 的准确率最终可能掉到 0.5 左右,而加入经验回放后,任务 0 的准确率通常能维持在 0.85 以上。虽然任务 0 仍然会有一定下降,但遗忘明显被缓解。这说明“让模型在学新知识时反复看到旧样本”是有效的。
5.6 结果对比说明
经验回放并不是万能的。它需要存储旧数据,而很多真实场景中旧数据可能涉及隐私、不能长期保留。另外,如果旧任务和新任务差异过大,简单的样本回放依然会遗忘。这时候可以试试生成式回放、EWC 正则化或动态架构。
不过这个小实验已经足以说明一个道理:大模型如果只是不断吸收新数据而不保护旧知识,最终会陷入“学一个忘一个”的循环。只有把持续学习机制设计进去,才能让模型在真实环境中稳定进化。
6. 强化学习如何帮助 AI 跳出局部最优
6.1 在线交互与闭环学习
强化学习的最大特点是智能体在环境中在线交互,每个行动都会得到奖励或惩罚,然后策略被更新。这意味着学习过程本身就是持续的,不需要先“收集完所有数据再训练”。
对应用型 AI 来说,这种闭环学习非常有价值。比如推荐系统,用户点击就是奖励信号,模型可以根据实时反馈不断调整推荐策略。如果只靠离线训练,模型永远无法捕捉用户当下的兴趣变化。
6.2 奖励信号作为持续目标
监督学习和强化学习的一个关键区别是:监督学习的目标是拟合给定标签,强化学习的目标是最大化长期累积奖励。奖励信号本身就是动态的、环境驱动的,因此模型不会满足于一个静态解。
Sutton 强调持续学习,其实是强调智能体要有一个“不断优化的目标函数”。大模型如果只学“如何回答问题”,而不学“如何从结果中判断回答好不好”,就少了最核心的进化动力。RLHF(基于人类反馈的强化学习)已经是大模型训练的重要一环,但它大多停留在对齐阶段,还没有真正放开参数让模型在真实环境里持续更新。
6.3 探索机制避免过早收敛
局部最优的另一个原因是模型缺少探索。监督学习只在给定数据上做拟合,几乎没有随机探索;而强化学习有 epsilon-greedy、噪声探索等方法,能让智能体不断尝试新动作,跳出当前的局部最优区域。
如果大模型需要持续学习,它必须学会“在不确定的时候问清楚、查资料、尝试新策略”,而不是每次都直接生成一个似乎合理但可能过时的答案。这种探索能力可能来自强化学习,也可能来自外部知识检索。
6.4 大模型 + RL 的工程方向
大模型和强化学习结合,有几个实际方向:
- 将大模型作为 Agent 的策略网络,通过 RL 训练它使用工具、调用 API、完成任务。
- 将大模型作为世界模型,让智能体在内部模拟环境中预演,提高样本效率。
- 将大模型作为奖励模型,评价生成内容的好坏,再反馈给策略模型更新。
- 将大模型部署到生产环境后,收集用户反馈作为奖励信号,用在线 RL 持续微调。
这些方向都在探索,但离成熟的工业化还有距离。关键难点在于:如何保证在线更新的稳定性,如何避免奖励信号被攻击,以及如何控制持续更新过程中的成本。
7. 构建可持续学习系统的工程建议
7.1 数据流与经验池设计
如果要在真实项目中落地持续学习,第一件事是把数据管道设计好。模型不能只吃一次性快照,而需要一个不断追加新样本的数据流,通常称为经验池。
经验池设计要考虑三个问题:
- 采样策略:是随机采样,还是更重视最近样本、困难样本?
- 存储上限:经验池不可能无限增长,需要设计淘汰策略,比如 FIFO、按重要性保留。
- 隐私合规:涉及用户数据的样本需要脱敏、加密,并遵守相关法律法规。
对大模型而言,可以分层设计:原始语料层、高质量指令层、用户反馈层。不同层的数据通过不同管道进入训练流程。
7.2 模型评估与遗忘监控
持续学习系统最怕“温水煮青蛙”——旧任务性能悄悄下降,没人发现。因此必须建立实时评估与遗忘监控机制。
可行做法:
- 为每个历史任务准备一个固定测试集,定期跑一遍。
- 记录所有任务准确率的移动平均,设置阈值告警。
- 对新任务效果和旧任务效果做对比报告,防止“偏科”。
在评估时,也要注意测试集本身会过时。如果环境变化太快,旧测试集可能不再代表真实分布,这时需要定期筛选和更新测试集。
7.3 版本管理与回滚
持续学习不代表每次模型都要立即上线。更安全的做法是:
- 保留模型版本快照。
- 新模型先在影子环境中验证,对比旧模型的历史表现。
- 通过 A/B 测试逐步放量。
- 一旦发现负面反馈上升,快速回滚到旧版本。
模型版本和训练数据版本需要联动管理,否则无法追踪“某个指标变化是因为数据变化,还是因为模型更新”。
7.4 安全边界与合规要求
持续学习让模型可以不断更新参数,这带来了安全风险。攻击者可能故意制造大量恶意反馈,把模型“教坏”。因此要限制模型更新的数据来源,增加异常检测。涉及个人信息、敏感行业的场景,必须明确合法授权,并在沙箱环境中验证后再上线。
另外,持续更新的大模型一旦产生有害内容,责任边界也更难划分。工程团队要在模型更新链路中加入安全闸门,比如内容审核、输出过滤、人工抽检,最大限度降低风险。
8. 常见问题与误区
8.1 持续学习和增量训练是同一回事吗?
经常有人把持续学习和增量训练混为一谈。增量训练主要指后续数据继续训练同一个模型,但不强调旧任务保持。持续学习的核心挑战在于“不遗忘”,它不等于简单的model.fit(更多数据)。
如果新数据分布和旧数据差异很大,增量训练会加速遗忘。而持续学习会通过回放、正则化、动态结构等手段主动保护旧知识。所以工程上不能只做“定期加数据训练”,还要设计记忆和评估机制。
8.2 大模型微调为什么容易遗忘?
大模型在预训练时学到的是通用知识,微调时用业务数据继续训练。如果学习率设置过高、微调数据特征偏移较大,模型可能会过度拟合业务数据,放弃一部分通用能力。另一个原因是微调通常只更新全部或大部分参数,没有区分哪些参数负责通用知识。
缓解手段有:冻结底层参数、使用 LoRA 等低秩方法减少更新参数、加入少量通用预训练数据做混合训练、使用持续学习算法保护重要权重。
8.3 强化学习是否适合所有场景?
不是。强化学习需要环境交互和奖励信号,如果无法及时获得有效反馈,或者环境状态极度复杂、成本极高,RL 不一定比监督学习更合适。
比如文本生成任务,质量很难用单一奖励函数衡量,直接做 RL 可能让模型变得域内表现好但泛化差。所以实际中常用 RLHF 结合人类偏好,而不是完全用环境奖励。持续学习的方向是对的,但技术选型必须匹配场景。
8.4 如何衡量模型是否具备持续学习能力?
评估持续学习能力通常看两个指标:
- 平均准确率(Average Accuracy):所有任务最终测试准确率的平均。
- 遗忘程度(Forgetting):历史任务准确率从刚学完到学习后续任务后的下降幅度。
好的持续学习系统应该保持较高的平均准确率,同时遗忘率尽量低。此外还要关注“可塑性”,也就是新任务的学习能力。如果一个模型为了不遗忘旧任务导致新任务怎么都学不会,那也不是合格的持续学习系统。
9. 总结与学习路线
9.1 本文核心收获
我们从 Richard Sutton 的判断出发,梳理了大模型为什么会被困在局部最优,以及持续学习要解决的问题。你看到了灾难性遗忘的直观演示,也看到了经验回放这种简单有效的缓解方案。这里面的核心思想是:真正有用的 AI 不是“训练一次,用一辈子”,而是能持续从新数据、新交互中学习,并记住旧知识。
9.2 推荐学习顺序
如果你对持续学习感兴趣,建议按这个顺序走下去:
- 先掌握神经网络基础和 PyTorch 使用。
- 然后复现一个简单的持续学习实验,像本文一样观察遗忘。
- 精读 EWC、LwF(Learning without Forgetting)、Replay Buffer 等经典方法的原理。
- 再深入了解强化学习基础,理解智能体如何与环境交互。
- 最后尝试把持续学习和强化学习结合,设计一个小型 Agent,在 Gymnasium 环境中做实验。
9.3 落到实际项目的建议
在实际项目中,我不建议一上来就改造大模型训练框架。可以先把数据管道和评估体系搭好,记录模型在历史任务上的表现曲线。然后选择一个业务场景,比如客服助手或智能推荐,先加一个回放机制,看遗忘是否缓解。如果效果稳定,再逐步引入动态架构或在线 RL。
持续学习不是某一个算法的胜利,而是系统设计理念的转变。大模型时代的增量是算力和参数,但真正的智能增量,来自于模型在真实世界中的持续进化。