1. 学习决策的两级解耦:从路径选择到处理深度调度
1.1 为什么“学什么”和“学多深”必须拆开看
很多做学习系统或者自适应引擎的朋友都遇到过同一个困境:模型在决定下一步动作时,既要选方向,又要定力度,结果两个目标互相拉扯,策略震荡得厉害。比如一个智能辅导系统,它既要判断学生当前该做“基础巩固”还是“拔高挑战”,又要决定这道题给多少提示、允许多少次重试。如果这两件事放在同一个决策层里做,就会出现一种典型病态:选了拔高路径,但处理深度给得太浅,学生挫败;选了基础路径,处理深度又给得太深,学生无聊。更麻烦的是,下一轮状态更新后,策略可能直接翻转到另一个极端,形成来回横跳。
我最初接触这类问题时,也试过用单一策略网络直接输出一个联合动作空间。动作空间大小是路径数乘以深度档位数,看起来可行,但实际跑起来样本效率极低,而且策略稳定性极差。后来把决策拆成两级——第一级只负责路径选择,第二级只负责处理深度调度——整个系统的行为立刻变得可解释、可调试,而且收敛速度提升了一个量级。这就是标题里说的“两级解耦”的核心价值:把耦合在一起的决策变量分开,让每一级只面对自己那部分不确定性。
这个思路适合谁参考?如果你在做自适应学习、智能推荐、对话策略、游戏AI,或者任何需要“先选方向再定力度”的决策系统,这套框架都能直接套用。它不依赖特定算法,用规则引擎、强化学习、甚至简单的上下文老虎机都能实现。下面我会从设计思路、核心细节、实操过程、常见问题四个层面,把踩过的坑和验证过的方案完整拆开讲。
1.2 核心概念对齐:LearningTarget、PathAction、ProcessingMode
在展开之前,先把几个关键词的定义对齐,不然后面讨论容易混淆。
LearningTarget是学习决策的目标对象。它可以是知识点掌握度、技能熟练度、行为倾向,甚至是一个抽象的能力向量。它的关键属性是:可观测、可更新、有明确的期望状态。比如“一元二次方程求根”这个知识点,目标就是掌握度达到0.85以上。
PathAction是路径选择动作。它回答的是“往哪个方向走”的问题。路径可以是知识图谱上的边、推荐列表里的类别、对话策略里的意图分支。路径空间通常是离散的、有限的,而且每条路径对应一个子目标或子领域。
ProcessingMode是处理深度调度。它回答的是“用多大力气处理”的问题。深度可以表现为:提示层级、重试次数、题目难度、解释详细程度、交互轮次上限。处理深度通常是序数型的,从浅到深有自然顺序。
一致性检查是在两级决策之间做校验的机制。因为路径和深度是分开选的,可能出现“路径选A但深度档位在A上不可用”的情况,或者“深度选深但路径本身不支持深处理”。一致性检查就是兜底逻辑。
策略稳定性是衡量两级解耦后系统行为是否可预测、是否频繁震荡的指标。解耦本身就是为了提升稳定性,但如果两级之间的协调没做好,反而可能引入新的震荡源。
把这五个概念串起来:系统根据LearningTarget的当前状态,先由路径选择器输出PathAction,再由深度调度器输出ProcessingMode,然后经过一致性检查修正,最后执行并更新状态。整个链路里,每一级只关注自己的决策空间,耦合度降到最低。
2. 两级解耦的架构设计与选型逻辑
2.1 为什么不是三级、四级,而是两级
有人会问:既然解耦有效,为什么不拆得更细?比如把路径再拆成“领域选择”和“知识点选择”,把深度再拆成“提示深度”和“重试深度”。我试过三级拆解,结论是:两级是收益和复杂度的最佳平衡点。
三级拆解带来的第一个问题是信用分配困难。当最终效果不好时,你很难判断是领域选错了、知识点选错了,还是深度给错了。两级结构下,路径级的反馈和深度级的反馈可以分别归因,调试路径时冻结深度策略,调试深度时冻结路径策略,变量控制非常干净。
第二个问题是动作空间碎片化。每多一级,联合动作空间就多一个维度,样本需求指数上升。两级结构下,路径空间和深度空间各自独立采样,样本效率远高于联合空间。
第三个问题是实时性。两级决策可以串行执行,第一级输出后第二级再计算,延迟可控。三级以上就需要更复杂的流水线,对在线系统不友好。
所以我的建议是:除非你的路径空间本身有天然的两层语义(比如“学科→章节”),否则从两级开始,够用且好调。
2.2 路径选择器的设计:规则、模型还是混合
路径选择器的输入是LearningTarget的当前状态向量,输出是PathAction。实现方式有三种主流选择,我分别说一下适用场景和坑。
纯规则方案:用if-else或者决策树,根据掌握度阈值直接映射到路径。优点是冷启动快、可解释、零训练成本。缺点是阈值难调,状态维度一多就爆炸。我早期用纯规则,掌握度低于0.3走基础路径,0.3到0.7走巩固路径,高于0.7走拔高路径。结果发现0.3和0.7这两个边界附近震荡严重,学生状态稍微波动就换路径,体验很差。后来加了滞回区间才缓解。
纯模型方案:用上下文老虎机或者策略网络,把状态映射到路径概率分布。优点是能处理高维状态、能在线学习。缺点是冷启动需要探索,早期可能推错路径。我试过用LinUCB做路径选择,效果不错,但需要设计好特征和奖励。
混合方案:规则做冷启动和兜底,模型做在线优化。这是我现在最推荐的。具体做法是:前N轮用规则保证基本体验,同时收集数据;当每条路径的样本数超过阈值后,切换到模型决策;模型置信度低时回退到规则。这样既避免了冷启动的糟糕体验,又保留了在线优化的空间。
2.3 深度调度器的设计:离散档位还是连续映射
深度调度器的输入同样是LearningTarget状态,有时还会拼接PathAction作为条件,输出ProcessingMode。这里的关键设计决策是:深度用离散档位还是连续值。
离散档位:比如1到5档,1是最浅(只给最终答案),5是最深(逐步提示加变式训练)。优点是实现简单、一致性检查容易、策略输出稳定。缺点是粒度粗,可能不够精细。我目前主力方案就是5档离散,实测够用。
连续映射:输出一个0到1的深度系数,再映射到具体处理参数。优点是精细,缺点是策略容易在连续空间里震荡,而且一致性检查复杂。我试过连续方案,发现深度系数在0.4到0.6之间来回跳,导致提示时有时无,体验反而差。后来改回离散档位,加了档位切换的滞回逻辑,稳定性大幅提升。
所以我的建议是:优先离散档位,档位数控制在3到7之间。太少不够用,太多策略难收敛。5档是一个经验上的甜点。
2.4 一致性检查的三种策略
两级解耦后,路径和深度是独立选的,必须有一致性检查来兜底。我总结了三类检查策略,按严格程度递增。
第一类:可用性检查。检查当前PathAction下,ProcessingMode是否在允许集合内。比如“拔高路径”不允许深度档位1(太浅),也不允许深度档位5(太难),只允许2到4。如果深度调度器输出了不允许的档位,就截断到最近的合法档位。这是最基本的检查,必须做。
第二类:状态一致性检查。检查路径和深度的组合是否与LearningTarget状态矛盾。比如掌握度已经0.9了,路径选了基础巩固,深度还选了5(最深提示),这明显不合理。检查逻辑是:如果掌握度高于路径的期望上限,且深度高于该路径的典型深度,就触发修正。修正方式可以是降深度,也可以是换路径,取决于你的业务优先级。
第三类:时序一致性检查。检查连续两轮决策之间是否发生了不合理的跳变。比如上一轮路径是拔高、深度是4,这一轮突然变成基础、深度是1,中间没有过渡状态。这种跳变即使每一轮单独看都合法,连起来看也是震荡。检查逻辑是:如果路径切换跨度大于阈值,且深度切换跨度也大于阈值,就强制其中一级保持上一轮的值,或者插入一个过渡档位。
我实际部署时,三类检查都上了。第一类用硬截断,第二类用软修正(降低深度而不是换路径),第三类用滞回窗口(连续N轮同向才允许大跳变)。这套组合拳下来,策略稳定性肉眼可见地提升。
3. 核心细节解析与实操要点
3.1 状态向量的构建:别把噪声当信号
两级决策都依赖LearningTarget的状态向量。这个向量的质量直接决定决策质量。我踩过的最大坑是:把太多原始行为日志直接塞进状态,导致噪声淹没信号。
状态向量应该包含三类信息:掌握度估计、近期表现趋势、交互成本指标。掌握度估计用贝叶斯知识追踪或者简单的指数平滑都能做。近期表现趋势用滑动窗口的正确率、响应时间变化率。交互成本指标包括已用提示次数、已重试次数、当前会话时长。
关键细节:趋势特征比绝对值特征更重要。比如掌握度0.6本身信息量有限,但“过去5轮掌握度从0.4升到0.6”这个趋势信息量很大。路径选择器应该更关注趋势,深度调度器可以兼顾绝对值和趋势。
另一个细节是特征归一化。不同知识点的掌握度分布可能不同,有的知识点普遍偏高,有的普遍偏低。如果不做归一化,路径选择器会偏向某些知识点。我的做法是按知识点维护历史均值方差,做在线标准化。
3.2 路径空间的剪枝:不是所有路径都值得选
路径空间如果太大,路径选择器的学习难度会急剧上升。我做过一个知识图谱推荐,路径空间有200多个节点,直接做路径选择效果很差。后来做了三层剪枝,效果明显改善。
第一层:先修约束剪枝。如果某个知识点的先修节点还没达到掌握度阈值,直接排除该路径。这是硬约束,不需要学习。
第二层:收益预估剪枝。用历史数据估计每条路径的期望收益,排除收益低于阈值的路径。收益可以用掌握度提升量除以交互成本来定义。
第三层:多样性剪枝。如果多条路径的收益相近,保留其中一条即可,避免路径选择器在相似选项间震荡。相似度可以用知识点嵌入的余弦相似度来衡量。
剪枝后路径空间从200多降到20左右,路径选择器的样本效率提升非常明显。而且剪枝逻辑本身可解释,业务方也能理解为什么某些路径不被推荐。
3.3 深度档位的语义定义:每一档到底做什么
深度档位不能只给一个数字,必须给每一档明确的语义定义,否则一致性检查和策略调试都无从下手。我用的5档定义如下,你可以根据自己场景调整。
| 档位 | 名称 | 提示策略 | 重试策略 | 变式训练 | 适用场景 |
|---|---|---|---|---|---|
| 1 | 直接答案 | 无提示,直接给答案 | 不允许重试 | 无 | 已掌握,快速确认 |
| 2 | 关键提示 | 给一个关键步骤提示 | 允许1次重试 | 无 | 接近掌握,轻微卡顿 |
| 3 | 分步引导 | 分步给提示,每步确认 | 允许2次重试 | 无 | 部分掌握,需要引导 |
| 4 | 完整解析 | 完整解析加示例 | 允许3次重试 | 1道变式 | 掌握度低,需要详细讲解 |
| 5 | 深度训练 | 完整解析加多道变式 | 不限重试 | 3道变式 | 未入门,需要系统训练 |
这个表看起来简单,但实际定义时花了很久。关键点是:每一档的提示策略、重试策略、变式训练三个维度必须同时定义,不能只定义提示深度。因为这三个维度是耦合的,只调提示不调重试,效果会打折。
3.4 两级之间的信息传递:条件化还是独立化
路径选择器和深度调度器之间要不要传递信息?我的答案是:深度调度器应该以PathAction为条件,但路径选择器不应该以ProcessingMode为条件。
原因很简单:路径选择发生在深度调度之前,路径选择器不可能知道深度调度器会输出什么。如果让路径选择器去预测深度,就又把两级耦合回去了。而深度调度器在路径确定之后运行,它知道当前路径是什么,应该利用这个信息。
具体实现上,深度调度器的输入向量 = 状态向量 + PathAction的独热编码。这样深度调度器可以学到“在拔高路径下,深度档位应该偏保守”这类条件策略。实测下来,条件化的深度调度器比独立化的版本,策略稳定性提升约30%。
3.5 奖励信号的设计:两级分别归因
两级解耦后,奖励信号也要分开设计。如果只给一个最终奖励,两级策略的信用分配会非常模糊。我的做法是设计两级奖励。
路径级奖励:衡量路径选择是否正确。定义方式:如果执行该路径后,LearningTarget的掌握度提升超过该路径的历史平均提升,给正奖励;低于平均,给负奖励。这个奖励只用于更新路径选择器。
深度级奖励:衡量深度调度是否合适。定义方式:如果当前深度档位下,学生一次通过率在合理区间(比如0.6到0.8),给正奖励;过高(太简单)或过低(太难),给负奖励。这个奖励只用于更新深度调度器。
两级奖励独立计算,独立更新。这样调试时可以看到“路径选对了但深度给错了”或者“深度给对了但路径选错了”的清晰归因。
4. 实操过程与核心环节实现
4.1 环境准备与数据管道搭建
先说一下我的实操环境。整个系统跑在Python 3.10上,核心依赖是numpy、pandas、scikit-learn,强化学习部分用了stable-baselines3的PPO实现。数据管道用了一个轻量的在线特征存储,每轮交互后更新状态向量。
数据管道的关键环节是状态快照。每一轮决策前,把当前LearningTarget的状态向量、上一轮的PathAction和ProcessingMode、上一轮的奖励,一起写入一个经验回放缓冲区。这个缓冲区同时供路径选择器和深度调度器采样,但采样时按决策级别过滤。
实操中容易忽略的一点是时间对齐。路径决策和深度决策虽然串行执行,但它们的奖励可能在不同时间到达。路径级奖励可能需要多轮后才能计算(因为掌握度提升需要时间),深度级奖励通常下一轮就能算。所以缓冲区要支持延迟奖励的写入,我用了一个简单的延迟队列,路径级奖励延迟3轮写入。
4.2 路径选择器的训练流程
路径选择器我用的是上下文老虎机加规则兜底的混合方案。训练流程分三个阶段。
阶段一:规则冷启动。前200轮用规则决策,规则逻辑是掌握度阈值加滞回区间。同时记录每轮的(状态,路径,奖励)三元组。
阶段二:离线预热。用阶段一收集的数据训练一个简单的逻辑回归或者浅层神经网络,输出路径概率分布。训练目标是最大化期望奖励。这个阶段不需要在线探索,纯离线训练。
阶段三:在线学习。切换到模型决策,但保留规则兜底。模型置信度低于阈值时回退到规则。在线学习用epsilon-greedy探索,epsilon从0.1线性衰减到0.01。每轮更新模型参数。
实测下来,阶段一大概需要200到500轮,取决于路径空间大小。阶段二离线训练很快,几分钟就能完成。阶段三在线学习大概1000轮后策略趋于稳定。
4.3 深度调度器的训练流程
深度调度器的训练和路径选择器类似,但有几个关键差异。
差异一:条件输入。深度调度器的输入包含PathAction的独热编码,所以训练数据要按路径分组。我试过不分组直接训练,效果差很多,因为不同路径下的最优深度策略差异很大。
差异二:奖励定义。深度级奖励是即时的,下一轮就能算。所以深度调度器可以用标准的在线强化学习流程,不需要延迟队列。
差异三:动作空间。深度档位是序数型的,不是纯离散的。这意味着档位1和档位2的差异,小于档位1和档位5的差异。我在训练时用了序数回归的损失函数,而不是普通的交叉熵。具体做法是把5档拆成4个二分类问题(是否大于1,是否大于2,是否大于3,是否大于4),然后组合成档位预测。这样训练出来的策略更平滑,档位切换更少。
4.4 一致性检查的代码实现
一致性检查我写成了一个独立的模块,在两级决策之后、执行之前调用。核心逻辑如下:
def consistency_check(state, path_action, processing_mode, last_path, last_mode): # 第一类:可用性检查 allowed_modes = PATH_MODE_MAP[path_action] if processing_mode not in allowed_modes: processing_mode = min(allowed_modes, key=lambda x: abs(x - processing_mode)) # 第二类:状态一致性检查 mastery = state['mastery'] if mastery > PATH_MASTERY_UPPER[path_action] and processing_mode > PATH_TYPICAL_MODE[path_action]: processing_mode = max(1, processing_mode - 1) # 第三类:时序一致性检查 if last_path is not None: path_jump = abs(PATH_INDEX[path_action] - PATH_INDEX[last_path]) mode_jump = abs(processing_mode - last_mode) if path_jump > PATH_JUMP_THRESHOLD and mode_jump > MODE_JUMP_THRESHOLD: # 保持上一轮深度,只允许路径切换 processing_mode = last_mode return processing_mode这段代码看起来简单,但每个阈值都是调出来的。PATH_JUMP_THRESHOLD我设的是2,MODE_JUMP_THRESHOLD设的是2。意思是路径跨了2级以上且深度跨了2级以上,才触发时序检查。阈值太小会过度干预,太大又起不到稳定作用。
4.5 策略稳定性的监控指标
上线后怎么知道策略稳不稳定?我用了三个监控指标。
指标一:路径切换频率。统计连续两轮路径不同的比例。健康值在10%到20%之间。太低说明策略太僵化,太高说明震荡。
指标二:深度切换频率。统计连续两轮深度档位不同的比例。健康值在15%到25%之间。深度切换可以比路径切换稍频繁,因为深度调整的代价较小。
指标三:一致性检查触发率。统计一致性检查修正了决策的比例。健康值在5%到15%之间。太低说明两级协调得很好,太高说明两级策略分歧大,需要重新训练。
这三个指标我接了一个简单的看板,每天看一次。如果某个指标连续三天超出健康区间,就触发告警,人工介入检查。
5. 常见问题与排查技巧实录
5.1 路径选择器震荡严重怎么办
这是最常见的问题。表现是路径在相邻轮次之间来回跳,学生体验很差。排查思路按优先级如下。
先查状态噪声。如果状态向量里的趋势特征波动大,路径选择器自然会跟着震荡。解决办法是给趋势特征加滑动平均,窗口大小3到5轮。我试过窗口从3调到5,震荡频率下降约40%。
再查奖励延迟。如果路径级奖励延迟太久,路径选择器拿到的反馈和实际决策脱节,也会震荡。解决办法是缩短延迟,或者用中间奖励做辅助。我把延迟从5轮缩到3轮后,震荡明显改善。
最后查探索率。如果epsilon太高,探索带来的随机切换会被误认为策略震荡。解决办法是降低epsilon,或者用衰减更快的策略。我把epsilon从0.1降到0.05后,切换频率从35%降到18%。
如果以上都查了还震荡,那就上滞回逻辑。连续N轮同向才允许切换,N取2或3。这是最后的兜底手段,会牺牲一点响应速度,但稳定性提升明显。
5.2 深度调度器总是选最深档位
这个问题也很典型。深度调度器倾向于选最深档位,因为深档位通常给正奖励的概率高(学生做对了嘛)。但这会导致过度提示,学生失去独立思考机会。
根因是奖励设计有问题。如果深度级奖励只看一次通过率,深档位确实占优。解决办法是在奖励里加入成本项。深度越深,成本越高。奖励 = 通过率收益 - 深度成本。深度成本可以定义为档位的线性函数,比如每深一档扣0.1。
我调整奖励后,深度分布从集中在4和5档,变成了以3档为中心的正态分布。这个分布更健康,既不过度提示,也不放任不管。
5.3 一致性检查触发率过高
触发率超过20%说明两级策略分歧太大。排查方向有两个。
方向一:路径和深度的条件关系没学好。深度调度器虽然以PathAction为条件,但如果训练数据里某些路径的样本太少,条件策略学不好。解决办法是给样本少的路径做数据增强,或者用路径嵌入做共享学习。
方向二:路径空间和深度空间的语义不匹配。比如路径空间是按知识点划分的,深度空间是按提示层级划分的,两者没有天然对应关系。解决办法是重新定义路径空间,让它和深度空间有语义关联。我把路径从“知识点”改成“掌握度区间”后,一致性检查触发率从25%降到8%。
5.4 冷启动阶段体验差
冷启动阶段规则兜底,但规则本身可能不合理。我遇到过规则阈值设得太死,导致前100轮体验很差,用户流失。
解决办法是规则也要在线微调。具体做法是:规则阈值不是固定的,而是根据前N轮的数据动态调整。比如掌握度阈值初始设0.3和0.7,每50轮根据实际分布重新计算分位数,把阈值调到33%和67%分位。这样规则能自适应数据分布,冷启动体验好很多。
5.5 常见问题速查表
| 问题现象 | 可能原因 | 排查优先级 | 解决办法 |
|---|---|---|---|
| 路径震荡 | 状态噪声大 | 高 | 趋势特征加滑动平均 |
| 路径震荡 | 奖励延迟久 | 中 | 缩短延迟或加中间奖励 |
| 路径震荡 | 探索率过高 | 低 | 降低epsilon |
| 深度偏深 | 奖励无成本项 | 高 | 奖励加入深度成本 |
| 深度偏深 | 训练数据偏差 | 中 | 检查各档位样本分布 |
| 一致性触发高 | 条件策略没学好 | 高 | 数据增强或共享学习 |
| 一致性触发高 | 语义不匹配 | 中 | 重新定义路径空间 |
| 冷启动差 | 规则阈值死板 | 高 | 阈值动态调整 |
| 冷启动差 | 兜底逻辑缺失 | 中 | 加规则兜底 |
5.6 几个我踩过的坑
第一个坑:路径空间和深度空间同时上线。我一开始两级一起上线,结果出问题时根本分不清是哪一级的问题。后来改成先上线路径级,深度级用固定档位,稳定后再上线深度级。变量控制非常重要。
第二个坑:忽略交互成本。早期奖励设计只看掌握度提升,不看交互成本。结果策略倾向于选深路径加深深度,掌握度确实提升了,但学生累得不行,留存率下降。后来把交互成本纳入奖励,策略变得克制很多。
第三个坑:一致性检查写得太复杂。我一开始写了一堆if-else,逻辑嵌套很深,调试时根本看不懂。后来重构成三个独立检查函数,每个函数只做一件事,可读性和可维护性大幅提升。
第四个坑:监控指标只看均值。均值稳定不代表分布稳定。我遇到过均值正常但方差很大的情况,说明策略在某些状态下震荡,只是被均值掩盖了。后来加了方差监控,才抓到这个问题。
6. 策略稳定性的长期维护与迭代
6.1 定期重训练与在线更新的平衡
两级策略上线后,不能一劳永逸。数据分布在变,学生群体在变,策略需要定期更新。我的做法是:在线更新为主,定期重训练为辅。
在线更新用增量学习,每天更新一次模型参数。定期重训练每两周一次,用全量数据重新训练,防止在线更新累积偏差。重训练时保留旧模型做A/B测试,新模型胜出才切换。
关键细节:重训练时不要清空经验回放缓冲区。旧数据虽然分布不同,但对策略稳定性有帮助。我试过清空缓冲区重训练,结果新策略在旧状态上表现很差,震荡加剧。保留缓冲区后,新旧策略过渡平滑很多。
6.2 策略版本管理与回滚机制
每次策略更新都要有版本号,并且支持快速回滚。我用的方案是:策略模型存到对象存储,版本号用时间戳加哈希。线上服务同时加载当前版本和上一版本,如果当前版本的关键指标(路径切换频率、深度切换频率、一致性触发率)在1小时内恶化超过阈值,自动回滚到上一版本。
这个机制救过我两次。一次是新模型上线后路径切换频率突然从15%跳到40%,自动回滚后避免了大规模体验恶化。另一次是深度调度器输出异常,一致性触发率飙升,也是自动回滚兜住的。
6.3 长期迭代的方向
两级解耦框架稳定后,迭代方向主要有三个。
方向一:路径空间的动态扩展。随着知识点增加,路径空间需要扩展。扩展时要注意保持路径嵌入的连续性,避免新路径和旧路径语义断裂。我的做法是新路径初始化时,用相似旧路径的嵌入做 warm start。
方向二:深度档位的自适应粒度。固定5档在某些场景下可能不够。我试过根据状态不确定性动态调整档位数,不确定性高时用更细的档位,不确定性低时用粗档位。效果不错,但实现复杂度高,还在优化中。
方向三:两级之间的双向信息流。目前是路径到深度的单向条件化。未来可以探索深度到路径的反馈,比如深度调度器发现某路径下深度总是给到最深,反馈给路径选择器,提示该路径可能太难。这个方向还在实验阶段。
6.4 一个实际案例的完整数据
最后分享一个实际案例的数据。场景是初中数学自适应练习,路径空间12条,深度空间5档,学生数约5000人,运行8周。
| 指标 | 第1周 | 第4周 | 第8周 |
|---|---|---|---|
| 路径切换频率 | 28% | 18% | 14% |
| 深度切换频率 | 35% | 24% | 19% |
| 一致性触发率 | 22% | 12% | 7% |
| 平均掌握度提升 | 0.08 | 0.15 | 0.19 |
| 平均交互成本 | 12.3 | 10.1 | 9.4 |
| 学生留存率 | 72% | 81% | 85% |
前两周是冷启动和在线学习阶段,指标波动大。第4周后策略趋于稳定,各项指标进入健康区间。第8周的数据说明两级解耦框架在真实场景下是有效的,而且随着数据积累,效果持续改善。
这个案例里最关键的一步是第3周做了一次全量重训练,把前两周的规则数据和模型数据合并训练,策略质量跳升。如果没有这次重训练,可能要到第6周才能达到类似效果。所以我的经验是:冷启动阶段结束后,尽快做一次全量重训练,把规则阶段的经验固化到模型里。