最近强化学习领域的奠基人之一 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, n1000): 生成一个二分类任务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, axis1) 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_size0.2): X, y make_synthetic_task(seed, task_id) X_train, X_test, y_train, y_test train_test_split( X, y, test_sizetest_size, random_stateseed ) return X_train, X_test, y_train, y_test class MLP(nn.Module): 一个简单的两层全连接分类器 def __init__(self, input_dim2, hidden_dim32, output_dim2): 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, epochs15, lr0.01, batch_size64): model.train() optimizer torch.optim.Adam(model.parameters(), lrlr) loss_fn nn.CrossEntropyLoss() dataset TensorDataset(torch.FloatTensor(X_train), torch.LongTensor(y_train)) loader DataLoader(dataset, batch_sizebatch_size, shuffleTrue) 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(dim1).numpy() return float((pred y_test).mean()) torch.manual_seed(0) np.random.seed(0) tasks [ create_task(seed100, task_id0), create_task(seed200, task_id1), create_task(seed300, task_id2), ] 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), sizemin(100, len(X_train_cur)), replaceFalse) 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、LwFLearning without Forgetting、Replay Buffer 等经典方法的原理。再深入了解强化学习基础理解智能体如何与环境交互。最后尝试把持续学习和强化学习结合设计一个小型 Agent在 Gymnasium 环境中做实验。9.3 落到实际项目的建议在实际项目中我不建议一上来就改造大模型训练框架。可以先把数据管道和评估体系搭好记录模型在历史任务上的表现曲线。然后选择一个业务场景比如客服助手或智能推荐先加一个回放机制看遗忘是否缓解。如果效果稳定再逐步引入动态架构或在线 RL。持续学习不是某一个算法的胜利而是系统设计理念的转变。大模型时代的增量是算力和参数但真正的智能增量来自于模型在真实世界中的持续进化。