做知识追踪KT的同学应该都有同感一个学生连续做错两道同类题模型给出一个结论——“他对这个知识点的掌握度是0.73”。但0.73和0.71之间的差别到底意味着什么这个判断本身有多可信大多数时候没人知道。AAAI 2025 上这篇 UKTUncertainty-Aware Knowledge Tracing不确定性感知知识追踪讨论的就是这件事。它把学习状态建模从单点估计推向了一种带不确定性度量的分布估计相当于把“我觉得你会”升级成了“我觉得你会但可能有三成概率是我看走眼”。这个改动听起来不大实际上把训练方式、推理逻辑、教学应用全部带上了新轨道。过去我们反复优化的目标是让掌握度数字更准而 UKT 这一类思路是在回答一个更本质的问题什么时候模型对自己的判断不该那么自信。这篇文章我把自己的理解、对方法细节的拆解、以及在类似项目里踩过的坑一起放出来适合做自适应学习、智能辅导系统、教育数据挖掘的朋友读也适合正在做序列数据建模、想了解不确定性建模如何落地的人参考。我先把话说在前头知识追踪不是“预测下一题对错”这么简单它本质上是在用学生稀疏的答题记录重构一个看不见、摸不着的认知状态。单点估计只能告诉你“可能的状态值”却丢掉了大量关于“这个状态值有多可靠”的信息。UKT 正是从建模范式层面补上了这块拼图这也是我觉得它值得单独写一篇的原因。1. 知识追踪到底难在哪单点估计的先天缺陷1.1 从一道错题说起学习状态是怎么被推断的先给不熟悉这个领域的读者补个背景。知识追踪Knowledge TracingKT的核心任务是根据学生过往的答题序列推断他对每个知识点的掌握程度并预测他在下一道相关题目上的表现。注意这里“掌握程度”不是直接问出来的而是要从行为反推。早期方法像贝叶斯知识追踪BKT假设每个知识点有“已掌握”和“未掌握”两个隐状态用观测到的对错来不断更新状态概率。后来深度学习把这件事做的更“端到端”DKT 用 RNN 类结构读入答题序列在每一步输出一个向量向量中每个维度对应一个知识点的掌握概率DKVMN 则引入了记忆矩阵把“动态掌握状态”和“静态知识状态”分开维护。这类模型在公开数据集上的 AUC 一路涨看上去效果不错但问题也随之而来。一个典型的场景学生甲连续答对三道“一元一次方程”模型给的掌握度是 0.78学生乙在同一知识点上答对两道、做错一道模型给的掌握度可能也是 0.78。两个数字一样背后的信心完全不一样。甲的情况很稳定只能说明基础扎实乙呢他可能整体会但某个特定题型没接触过也可能是当天状态不好手滑了一道。传统模型只输出一个均值所有这些信息全部被压扁成了一个数字。这就是我常说的“点估计的尴尬”。模型不仅要知道状态是什么还应该知道自己对状态估计的把握有多大。这个把握程度和状态值本身一样重要。1.2 为什么传统模型的“上限”被单点输出卡住了单点输出不只是信息展示不完整它在训练和推理层面都埋了隐患。从训练目标看主流深度知识追踪模型基本都是拿“下一题答对概率”当监督信号用交叉熵或 MSE 这类损失函数。这意味着模型只需要把“答对概率”拟合好就够了没有任何机制要求它区分“我确定你会”和“我猜你会”。一个见过大量相似样本的模型和一个只在边缘数据上勉强拟合的模型只要输出的概率相同两个模型在损失函数眼里就是等价的。可到了推理阶段这种差异会直接影响应用决策。在做个性化出题时系统通常会对某个知识点设定阈值掌握度高于 0.8 就不出题低于 0.5 就补基础题。阈值判断是一种极端敏感的操作一个 0.81 和一个 0.79 的系统行为可能完全相反。如果模型根本没有置信度信息那这两个数字到底谁更可信不知道。再往深一层说单点输出也限制了模型对噪声的建模能力。学生答题本身是有随机性的一道题干有歧义、选项设置存在误导、学生疲劳或者考试焦虑都会造成“会但答错”或“蒙对”的情况。传统模型把这些噪声全部丢进隐变量里却无法在输出层显式表达“这条记录的噪声有多大”。结果就是模型对每一条历史记录的处理逻辑始终是全局统一的没法根据实际情况动态调整。从信息论角度理解单点输出相当于把预测分布强制压成了一个均值。均值是分布的一阶矩信息量非常有限。真实的学习状态应该是某种分布只是我们没直接观测到它。UKT 的思路就是把这个分布建模出来然后让模型在输出时同时给出均值和不确定性而不是只给一个孤零零的数字。下面这张表可以比较直观地说明传统深度知识追踪模型和 UKT 的差异对比维度传统深度 KT 模型DKT/DKVMN 等不确定性感知知识追踪UKT输出形式知识点掌握度的单点数值掌握度的分布均值 不确定性对答题噪声的处理隐式压缩进隐变量显式建模训练时动态区分高/低噪声样本训练目标预测下一题正确概率为主概率拟合 不确定性估计联合优化推理时的附加信息无每个预测附带置信区间能判断“不知道”与“不确定”教学干预支持需要额外规则做二次判断可以直接把不确定性作为干预信号对新知识的冷启动表现统一输出容易过度自信样本少的知识点倾向于输出高不确定性2. UKT 的核心创新不确定性从“附属品”到“一等公民”2.1 两类不确定性偶然不确定性与认知不确定性聊 UKT 之前我觉得有必要把“不确定性”这个概念拆开。机器学习里的不确定性一般分两类偶然不确定性Aleatoric Uncertainty和认知不确定性Epistemic Uncertainty。这个区分在知识追踪场景里尤其关键。偶然不确定性来自数据本身的随机性。打个比方判断一个学生“会不会做因式分解”模型不可能 100% 确定因为学生可能在考场上粗心、可能被选项误导、甚至可能看错数字。这类噪声即便数据再多也无法完全消除因为它就是人类行为本身的一部分。这不是坏事认清这种不可约减的噪声能避免模型对单个样本过度拟合。认知不确定性来自模型自身知识的不足。如果你只见过三个学生的做题记录你对“这届学生整体水平如何”的判断肯定充满不确定性当你见过三千个学生同样的判断就会稳得多。这种不确定性是可以通过增加数据、改进特征来降低的。有趣的是知识追踪同时包含这两类不确定性而且二者会纠缠。一道新知识点题目既有学生随机犯错带来的偶然不确定性又有模型从未见过足够样本、知识掌握不准带来的认知不确定性。传统模型把这两坨东西搅在一起通过增大训练集来硬压。UKT 想做的是让模型把这两种不确定性都显式地学出来——至少在输出层让模型学会表达“我因为见得太少所以不确定”而不是把所有不确定性一股脑归结为数据噪声。2.2 UKT 如何重构学习状态建模范式UKT 这个名字里的“不确定性感知”意味着建模过程中不确定性不是一个附加输出而是融进了整个学习状态的表示里。我理解的核心转变有三层。第一层是表示层面学习状态从“一个向量”变成“一个分布的参数”。换句话说模型内部不再只维护每个知识点的掌握度均值还维护对应的方差或置信度。有了这个方差知识状态就不再是一个点而是一团概率云。对于学习比较稳定的学生这团云很窄对于表现飘忽、记录稀疏的学生这团云自然就很宽。第二层是训练层面损失函数不能只惩罚“预测错了”还得惩罚“预测错了却还很自信”。这是 UKT 和传统模型在训练目标上最本质的差别。拟合一个分布而不是拟合一个均值意味着模型必须学会在证据不足时给出较大的不确定性否则损失函数会通过“错误但过度自信”的样本反向施压。这种训练方式对模型的整体校准性有明显帮助模型不再为了压低错误率而盲目输出激进概率。第三层是推理层面模型做出的每个预测都伴随一个可信区间。下游系统拿到的不再是孤立数字而是“这个学生在乘法分配律上的掌握度为 0.72不确定性 0.25可信区间大概在 0.47 到 0.92 之间”。这个区间信息能够直接驱动更精细的教学策略比如决定是否要让系统多测几道题来降低不确定性再决定是否推进到下一个知识点。从范式的角度看UKT 做的事情不是给某个模型打个补丁而是把“不确定性”这个概念从一个可有可无的附属品提到了建模目标的第一位。这也是标题里说“重构学习状态建模”的原因。3. 方法细节与复现视角UKT 关键环节初步拆解3.1 整体架构设计在经典序列模型上加一个“不确定性头”虽然我没有直接拿到 UKT 论文的全部源码但按这类模型的一般设计思路推断UKT 的主体架构应该是延续了深度学习知识追踪的序列建模框架然后在输出层上做了关键扩展。底层的编码器可以是 RNN 类结构也可以是 Transformer 类结构负责把答题序列编码成隐向量真正有差异的是模型头部的设计。传统模型的输出是一个 sigmoid或 softmax映射直接给出掌握度概率。UKT 的做法应当是输出一组分布参数通常是一对值均值 μ 和方差 σ²。均值对应掌握度的点估计方差对应不确定性的度量。由于方差存在非负约束输出层通常会经过 softplus 或者 exp 变换而不直接输出原始 logits。在具体实现上有一种常见路径是使用深度集成的近似思路训练多个子模型用子模型预测的均值来估计掌握度用子模型之间的离散程度来估计不确定性。另一种路径是在网络中加入变分推断层显式地把模型参数或隐变量建模成分布。两种路线各有优缺点深度集成实现简单、估计稳健但训练成本成倍增加变分方法参数更紧凑但训练不稳定、调参难度高。UKT 到底选哪条路线取决于它对效率和精度的权衡。以 AAAI 这类会议的口味我猜测作者会采用一个不太花哨但理论上更清晰的设计大概率是让模型直接预测分布参数并在损失函数里做不确定性加权。如果按工程视角来理解整个模型可以用下面这几块来大致描述输入嵌入层把知识点编号、答题结果、答题时间等特征映射为稠密向量序列编码器利用 RNN/GRU/Transformer 结构捕捉答题序列中的动态变化状态分布头输出当前学习状态的均值向量 μ_t 和方差向量 σ_t²预测解码器根据 μ_t 和知识点嵌入计算下一题答对的概率并将 σ_t² 传递给下游用于决策。这里的核心就是状态分布头。它让模型内部不再是“死板的单维状态”而是带噪声感知的状态表达。之前我在一个练手项目里试着实现过类似结构最大的感受是输出层设计不难难的是训练时如何让方差这个输出真正有意义而不是退化成摆设。后面我会专门讲这个坑。3.2 训练策略、损失函数与关键参数训练不确定性感知模型核心差异在损失函数。如果只看最终预测的对错模型仍然可以走“只拟合均值”的老路方差变成无意义的常数。要让方差活起来就得用负对数似然一类的目标让模型学会为置信度“买单”。假设模型对第 i 个样本给出预测均值 μ_i 和预测方差 σ_i²真实标签是 y_i比如答对为 1答错为 0在回归形式下高斯负对数似然损失长这样# 不确定性感知知识追踪训练循环伪代码示意 # 这里的输出是每个知识点的掌握度分布参数 model UKTEncoder(hidden_dim256, output_dimnum_skills) optimizer Adam(model.parameters(), lr1e-3) for batch in train_loader: seq, mask, label batch # 前向模型返回掌握度均值与不确定性 mean, log_var model(seq) # 方差必须为正这里用 softplus 保证数值稳定 sigma softplus(log_var) 1e-6 # 高斯负对数似然既惩罚均值偏差也惩罚“错得还自信” loss 0.5 * ((label - mean) ** 2 / sigma torch.log(sigma)) loss (loss * mask).sum() / mask.sum() optimizer.zero_grad() loss.backward() optimizer.step()上面这段伪代码里最关键的一行是loss 0.5 * ((label - mean) ** 2 / sigma torch.log(sigma))。仔细拆一下当模型预测错误且方差很小也就是“错得还很自信”时第一项的惩罚会非常大反过来如果模型预测错误但同行输出一个较大的方差惩罚就会被自动稀释。这就给了模型一个明确信号错误可以犯但你必须知道自己什么时候不该自信。分类任务里也可以做类似的处理把 sigmoid 输出改造为带置信度的分布输出比如用贝塔分布或直接用 Gaussian CDF 拟合。实践中我更推荐先做回归版本把“答对概率”当成连续变量拟合这样负对数似然的形式更直观调参也好定位问题。再补几个我实测下来比较重要的训练细节方差的输出初始化不要太极端。建议把 log_var 的偏置初始化成接近 0 的小值让模型一开始保持一个比较“谦虚”的状态再在训练中自行调整数据集样本量少时可以给不确定性部分加一点正则。完全不约束方差的话模型有概率学到“全部输出大方差”的捷径直接把损失压得很低但什么都没学到学习率建议设置在 1e-3 到 1e-4 区间太大的学习率容易让方差层震荡出现 NaN 是一回事更麻烦的是方差和均值两只头之间出现跷跷板式的训练不稳定。4. 应用场景与影响范围从论文走向系统4.1 自适应练习与试题推荐不确定性怎么用得漂亮我见过不少自适应学习系统出题策略基本都是“哪里掌握度低就出哪里”。这个逻辑听上去没毛病但实际效果很差因为掌握度低有两种情况一种是学生确实没学会均值低、不确定性也低另一种是系统还没收集够证据均值可能低、但不确定性很高。这两种情况需要的教学动作完全不同。对前者应该推送基础讲解和简单题目对后者更好的策略是先“测”而不是先“教”——继续出几道同知识点题目快速把不确定性降下来再判断要不要干预。UKT 这类模型正好提供了这种决策依据系统可以设置一个不确定性阈值当某个知识点的不确定性过高时进入“探索模式”优先出诊断性题目当不确定性收敛且均值较高时再进入“过关模式”进入下一主题。在更宏观的个性化学习路径规划里不确定性还能参与全局平衡。比如有 A、B 两个知识点A 的均值是 0.6、不确定性是 0.4B 的均值是 0.65、不确定性是 0.15。单看均值似乎应该优先学 B但考虑到不确定性A 其实更“不确定”可能恰恰说明系统对 A 的判断还太草率需要先补数据。这种决策逻辑只有不确定性感知模型才支持。4.2 可解释性与教学干预把“不确定”转化为教师信号一线老师是很反感“黑箱结论”的。你告诉老师“这个学生三角函数的掌握度是 0.72”老师会问他是不稳定、是没学过、还是粗心传统模型答不出来。UKT 的价值在于它能提供一个多一维的解释通道。实际操作中我见过一种很直观的可视化方式把每个知识点画成一个小方块颜色表示掌握度均值透明度或边框粗细表示不确定性。老师一眼就能看出“红色且发虚”的知识点是最需要关注的——因为学生不仅弱而且状态不稳定相比之下“红色但很实”的知识点可能是确定性的薄弱项适合直接安排补强练习。教学干预也因此更精准。我给团队的建议是不确定性本身就可以作为一个预警信号。当某个学生在某个知识点上连续多次预测不确定度过高系统就自动生成一条提醒让老师单独找学生聊一下看看是题目读不懂、概念混淆还是另有原因。这种“模型提示、人来确认”的模式我觉得是教育 AI 落地最稳妥的路径。4.3 评测方式与数据集的注意事项很多团队拿到一个新的知识追踪模型第一反应是刷 AUC。这没错但用在 UKT 这类模型上远远不够因为它的卖点不是预测概率更准而是预测带置信度。因此评测至少要分成两条线预测精度和不确定性质量。预测精度沿用常规指标AUC、ACC、RMSE重点看模型在测试集上的整体表现是否还和传统模型持平或更好。不确定性质量的指标相对新一些一个是负对数似然NLL直接衡量分布预测的好坏另一个是期望校准误差ECE把模型预测的置信区间和真实频率做对比看 95% 置信区间的实际覆盖率是不是真的在 95% 附近。如果模型声称不确定性很高但实际错误率并不高说明不确定性模块过度保守同样要扣分。数据集方面公开可用的教育数据集像 ASSISTments 和 EdNet 都是常见的基准但用的时候有几个坑。首先是数据集里的日志噪声学生有时刷题会中途退出、重做、看答案这些交互会对知识追踪模型产生污染做实验前要按交互完整性清洗。其次是训练集和测试集的划分方式随机按交互划分会让模型“看到”某个学生的部分历史再预测他的未来这会高估模型在冷启动场景下的表现更严格的做法是随机按学生划分确保测试集中的学生完全没出现在训练集里。这两种划分方式下UKT 的不确定性表现差异会非常大论文里一定要交代清楚。5. 踩坑笔记与实操建议5.1 训练时最容易被忽略的 3 个细节第一方差输出层的数值稳定性。我之前自己尝试实现类似结构时第一次跑训练直接 NaN。排查半天问题出在方差层用了纯线性输出网络在一个 batch 里输出了负方差损失函数里的对数项直接炸掉。后来改成softplus 1e-6才稳定下来。这个坑几乎每个做不确定性建模的人都会踩一遍所以代码里一定要在方差输出后面加一个小的 epsilon防止除零和对数崩溃。第二不确定性模块退化成“花瓶”。有几次训练完我发现不确定性头输出的数值几乎不随输入变化——模型学了半天方差变成了一个常数。原因是模型找到了一个很舒服的平衡点把方差设成合理范围的固定值然后靠调整均值来拟合训练数据。虽然 NLL 损失没有报错但不确定性并没有起到建模噪声的作用。我的解决办法是增加不确定性模块的网络容量同时在训练初期给方差输出加一点噪声扰动避免它一开始就滑入退化解。第三冷启动阶段的不确定性设置。新学生、新知识点在训练数据里出现次数极少模型在数据缺失时很容易神经质地打出高方差。但我见过相反的问题模型因为之前见过足够多同类学生即使某个具体学生的记录很少它也会习惯性地输出较低的不确定性造成“伪自信”。这个问题比较隐蔽需要用按学生划分的验证集专门测冷启动样本的不确定性表现如果平均方差显著低于期望就要考虑给输入序列增加一个“样本量”特征或者对不确定性输出做额外的样本量加权。提示不确定性感知模型的调试不能只看 loss 曲线还要定期抽查实际输出。把一批验证样本的“均值-方差”拿出来看如果出现大量“高置信但错误”的样本说明模型校准出了问题优先检查方差输出层的激活函数和初始化方式。5.2 模型输出“不确定”时怎么解读才不误导教学不确定性高这个信号离“学生不会”还有很长一段距离。最典型的例子是题目质量差导致的全局不确定性上升一道表述含糊、两个选项模棱两可的题目所有学生做的时候正确率都不稳定模型在这道题上的不确定性自然高。这种不确定性是问题本身的属性不是学生的问题。所以我在工程落地时习惯把两个不确定性的来源分开统计学生侧的不确定性同一学生在不同知识点上的平均不确定性和知识点测题侧的不确定性同一知识点下不同题目引发的模型不确定性。前者用于个性化干预后者用于题库质检两者千万别混着用。另一个容易踩的解读误区是把“不确定性低”等同于“掌握度一定对”。一个知识点只有两三条历史记录模型给出的不确定性未必高——如果这两三条记录全是做对的某些模型会因为证据一致而给出低不确定性。但三条记录在统计上根本不够这只是“小样本下的虚假稳定”。更稳妥的做法是同时设置一个“最小证据量门槛”样本量低于门槛时无论模型输出什么都先按高不确定性处理。在实际系统里我建议把不确定性阈值设计成可调参数而不是写死。低年级学生的做题噪声比高年级大数学主观题比选择题的噪声大同一个不确定性阈值不可能在全场景通用。上线后可以先用小流量跑一到两周收集教师标注与学生反馈用“高不确定性样本与教师认为需要干预样本的重合率”来反向校准阈值这种做法比任何离线指标都更接地气。我在实际项目里最深的体会是UKT 这类工作真正的价值不是把 AUC 刷高几个点而是把一个被行业长期忽视的信息维度重新摆上了桌面。过去我们拼命追求“预测得更准”却很少问“这个预测凭什么让人相信”。不确定性感知知识追踪最有启发的部分是让模型在关键节点学会说“我不知道”——这种能力在教育场景里恰恰比假装全知更值得信任。最后分享一个落地经验如果团队资源有限不一定非要完整复现 UKT 的全部设计。可以先在一个已有的知识追踪模型上做一个轻量改造在输出层加一个方差头用负对数似然损失替换原来的 MSE拿一个小规模数据集跑几轮观察不确定性输出是否合理。这一步投入不大但对团队理解“学习状态建模”能带来的体验升级帮助非常直接。等验证有收益了再考虑投入资源做完整的分布建模版本。
企业数字化 ERP 产品动态
相关推荐
OpenCV DNN图像着色:从原理到代码,快速实现老照片上色 简介:基于OpenCV 4及以上版本DNN模块,完整呈现深度学习图像自动着色的工程示例,面向具备编程基础、正在学习OpenCV与计算机视觉的开发者。项目演示了如何加载Caffe预训练模型,将灰度图转换为自然彩色图像,同时涉及卷积… · 2026/9/23 3:40:26
钢筋检测数据集实战:从VOC xml到YOLO txt的完整转换与训练指南 简介:这份资源是面向建筑行业智能化检测与计算机视觉学习者的YOLO钢筋检测数据集,适合从事目标检测训练、施工安全评估或相关课程实践的中高级开发者使用。压缩包共751个文件,包含250张jpg图像、250个xml标注和251个txt标签,整体约… · 2026/9/23 3:40:26
120套财务分析报告模板:从解压到落地的完整使用指南 拿到这份“120套财务分析报告模板.rar”的时候,我正被月底的一堆经营分析报表折磨得头疼。说实话,做财务分析这行久了,你会发现最耗心力的不是算数,而是每次都要从零搭框架:表头重排、指标口径重新核对、图表配色改来改… · 2026/9/23 3:40:19
气胸X光分割数据集实战:2000张像素级标注到模型训练与部署 简介:面向医学图像分割研究者和AI开发人员,本资源提供专门用于胸部X光气胸(Pneumothorax)语义分割的数据集,可支撑模型训练、验证与算法对比,适用于医学影像分析相关课题或竞赛。包内含超过2000张胸部X光图… · 2026/9/23 4:22:18
www.dy2018.com实战:从零到完整示例避坑全记录 www.dy2018.com实战:从零到完整示例避坑全记录 刚学完Python语法,是不是觉得手里有剑,却不知往哪里挥?很多人卡在“学会语法却不知怎么搭项目”这一步,代码能跑,但一上真实业务就崩。我翻遍CSDN、StackOverflow和… · 2026/9/23 4:22:18
从SSM到实战:二手交易平台的核心设计与并发安全 1. 这个项目到底在解决什么问题:需求拆解比写代码更重要做二手物品交易网站,听起来是个老掉牙的课题——凡是学Java Web的人,十有八九都做过或者见过类似的东西。但我盯上这个项目,恰恰是因为它“老”,老到很多人根本不… · 2026/9/23 4:22:18
Mac 本地部署 Qwen Coder 实战:AI 代码生成模型选型与避坑指南 “coder”这个词,圈外人听起来可能只是个职业标签,但在开发者社区里,它这几年已经被玩出了多重含义。它既可以是“写代码的人”,也可以是那台帮你写代码的“AI 工具”,甚至在某些数据文本分析的场景里,它还… · 2026/9/23 4:22:18
聊斋IP游戏化设计复盘:从世界观到妖鬼系统的东方志怪实践 聊斋这两个字,放在游戏圈里,天然就带着一股区别于西式奇幻的邪性劲儿。别人做恶魔、做亡灵,我们做的是狐仙、画皮、聂小倩、婴宁,这些东西从蒲松龄笔下出来的时候,就不是单纯的恐怖符号,而是带着人情味的妖… · 2026/9/23 4:22:18
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29