1. 前言

知识追踪(Knowledge Tracing,KT)的目标是根据学生过去的做题记录,估计学生当前的知识状态,并预测学生在下一道题上的作答表现。

传统的深度知识追踪模型通常把知识点作为建模对象。例如,只要两道题关联了相同的知识点,模型就可能把它们视为相似甚至等价的题目。

但在真实教学场景中,即使两道题关联相同的知识点,它们的难度、题型、表达方式和解题过程也可能完全不同。学生做完这些题后获得的知识增量也不一定相同。

QIKT,即 Question-centric Interpretable Knowledge Tracing,尝试解决两个问题:

  1. 如何在知识追踪中显式考虑具体题目的影响;

  2. 如何让深度知识追踪模型的预测结果具有一定的可解释性。

本文将从论文思想、数学结构和代码实现三个角度分析 QIKT。

2. QIKT 要解决什么问题

2.1 同质题目假设

许多知识追踪模型主要根据知识点建模。

假设题目 q1q_1q2q_2 都属于知识点 k1k_1 ,模型可能认为它们对学生知识状态的影响基本相同。

这种假设可以写成:

Nq1=Nq2q1q2N_{q_1}=N_{q_2} \Rightarrow q_1\approx q_2

其中 NqN_q 表示题目 qq 所关联的知识点集合。

但实际情况是:

  • 两道题可能难度不同;

  • 对知识点的考查深度不同;

  • 学生做对后的知识增量不同;

  • 学生在两道题上的表现也可能不同。

因此,QIKT 不仅使用知识点信息,还显式加入题目 ID 的表示。

2.2 深度学习模型缺乏可解释性

LSTM、Transformer 等模型可以获得较好的预测效果,但隐藏状态通常很难直接解释。

例如,模型输出学生下一题答对概率为 0.72,但很难回答:

  • 学生当前的知识掌握程度是多少?

  • 这道题本身对预测有什么影响?

  • 学生是因为掌握知识而答对,还是因为题目较简单?

  • 当前预测主要受到哪一部分信息影响?

QIKT 将预测过程拆分为三个分数:

αtβtζt+1\alpha_t \quad \beta_t \quad \zeta_{t+1}

分别表示:

  • αt\alpha_t :题目中心的知识获取分数;

  • βt\beta_t:一般知识状态分数;

  • ζt+1\zeta_{t+1}:面对下一道题时的问题解决分数。

3. QIKT 的整体结构

qikt.png

QIKT 主要由五个部分组成:

  1. Interaction Encoder

  2. Question-centric Knowledge Acquisition Module(KA)

  3. Question-agnostic Knowledge State Module(KS)

  4. Question-centric Problem Solving Module(PS)

  5. IRT-based Prediction Layer

4. 交互编码

QIKT 同时建立题目级交互表示和知识点级交互表示。

设:

  • qtq_t 为第 tt 个题目的嵌入;

  • kˉt\bar{k}_t 为该题关联知识点的平均嵌入;

  • rt0,1r_t\in{0,1} 为作答结果。

如果一道题关联多个知识点。QIKT 并不会为每个知识点分别建立一条交互记录,而是先将该题关联的所有知识点嵌入进行平均,得到题目的综合知识点表示。

设题目 qtq_t 关联的知识点集合为 NqtN_{q_t} ,第 jj 个知识点的嵌入为 kj\mathbf{k}_j ,则题目 qtq_t 的知识点表示为:

1NqtkjNqtkj\frac{1}{|N_{q_t}|} \sum_{\mathbf{k}_j\in N_{q_t}} \mathbf{k}_j

论文将其写成遍历全部知识点并使用指示函数筛选的形式:

1Kqtj=1mkjI(kjNqt)\frac{1}{|K_{q_t}|} \sum_{j=1}^{m} \mathbf{k}_j \mathbb{I}(\mathbf{k}_j\in N_{q_t})

4.1 题目级交互表示

题目和知识点首先拼接:

et=qtkˉte_t=q_t\oplus\bar{k}_t

然后根据回答结果放入不同通道。

当回答正确时: et=[et;0]e_t=[e_t;0]

当回答错误时: et=[0;et]e_t=[0;e_t]

这样可以让模型区分“在某道题上回答正确”和“在某道题上回答错误”。

4.2 知识点级交互表示

KS 模块不关注具体题目,只关注知识点和回答。

当回答正确时: ct=[ktˉ;0]c_t=[\bar{k_t};0]

当回答错误时: ct=[0;ktˉ]c_t=[0;\bar{k_t}]

5. Question-centric Knowledge Acquisition Module

KA 模块用于描述:

学生在完成某一道具体题目后,获得了怎样的知识变化。

QIKT 的 KA 模块同时考虑:

  • 当前题目的题目表示;

  • 当前题目关联的知识点表示;

  • 学生在当前题目上的作答结果;

  • 学生之前的题目级知识状态。

其目标是学习一种对具体题目敏感的知识状态表示。

其输入包含:

  • 具体题目 qtq_t

  • 题目关联知识点 ktˉ\bar{k_t }

  • 学生的回答结果 rtr_t

通过之前的交互编码,使得对于同一道题,正确和错误也会形成不同的交互表示 ete_t

5.1 LSTM 更新题目级知识状态

KA 模块使用一个 LSTM 对学生的题目级知识状态进行更新。

at=LSTMKA(et,at1)a_t=LSTM_{KA}(e_t,a_{t-1})

其中 ata_t 是学生在第 tt 次交互后的题目级知识状态。

论文展开写出了 LSTM 的门控计算过程:

输入门:

it=σ(W1et+U1at1+b1)\mathbf{i}_t=\sigma \left( \mathbf{W}_1\mathbf{e}_t+ \mathbf{U}_1\mathbf{a}_{t-1}+ \mathbf{b}_1 \right)

遗忘门:

ft=σ(W2et+U2at1+b2)\mathbf{f}_t=\sigma \left( \mathbf{W}_2\mathbf{e}_t+ \mathbf{U}_2\mathbf{a}_{t-1}+ \mathbf{b}_2 \right)

输出门:

ot=σ(W3et+U3at1+b3)\mathbf{o}_t=\sigma \left( \mathbf{W}_3\mathbf{e}_t+ \mathbf{U}_3\mathbf{a}_{t-1}+ \mathbf{b}_3 \right)

记忆单元:

ct=σ(W4et+U4at1+b4)\mathbf{c}_t=\sigma \left( \mathbf{W}_4\mathbf{e}_t+ \mathbf{U}_4\mathbf{a}_{t-1}+ \mathbf{b}_4 \right)
at=ottanh(ct)\mathbf{a}_t=\mathbf{o}_t\odot\tanh({c_t})

ata_t 汇总了学生到当前时刻为止的题目交互历史,并且保留了具体题目带来的差异。

由于 ata_t 只是一个高维隐藏向量,不能直接解释为学生的知识掌握度。论文还需要通过一个知识获取网络,将其转换为标量分数 αt\alpha_t

5.2 计算知识获取分数

论文使用两层非线性变换,将题目级状态 ata_t 投影到题目空间:

hta=ReLU(W1aat+b1a)h^a_t=\operatorname{ReLU} \left( \mathbf{W}_1^a\mathbf{a}_t+\mathbf{b}_1^a \right)
zta=ReLU(W2ahta+b2a)z^a_t=\operatorname{ReLU} \left( \mathbf{W}_2^a\mathbf{h}_t^a + \mathbf{b}_2^a \right)

其中:

atRdW1aRd×dW2aRn×d\mathbf{a}_t\in\mathbb{R}^{d} \quad \mathbf{W}_1^a\in\mathbb{R}^{d\times d} \quad \mathbf{W}_2^a\in\mathbb{R}^{n\times d}

dd是隐藏状态维度,nn 是题库中的题目总数,因此: ztaRn\mathbf{z}_t^a\in\mathbb{R}^{n}

也就是说,模型将学生当前的题目级认知状态映射到一个nn 维题目空间,每一维对应题库中的一道题。

随后,模型使用可学习权重 wa\mathbf{w}^a 对各题目维度进行加权:

uta=waztau^a_t=\mathbf{w}^a \odot \mathbf{z}_t^a

最后通过 Sum Pooling,将所有题目维度相加:

αt=S-Pool(uta)\alpha_t=\operatorname{S\text{-}Pool} \left(\mathbf{u}_t^a \right)

最终得到的: αt\alpha_t 是一个标量。

它表示学生在完成前 tt 次题目交互后,模型估计出的题目中心知识获取分数。

6. Question-agnostic Knowledge State Module

6.1 为什么需要 KS 模块

KA 模块同时使用题目、知识点和作答结果,因此能够捕获不同题目带来的细粒度认知变化。

但是,在真实答题过程中,学生可能出现两类特殊情况:

  • Guess:学生并未真正掌握知识,但通过猜测回答正确;

  • Slip:学生已经掌握知识,但因为粗心等原因回答错误。

如果模型只依赖 KA 模块,那么某一次偶然的正确或错误可能使题目级状态发生较大变化,从而导致模型对单次交互过于敏感。

因此,QIKT 增加了 KS 模块作为补充,用于学习更加稳定、更加一般化的知识状态。

KA 与 KS 的侧重点可以概括为:

模块

关注的信息

建模目标

KA

题目、知识点、作答结果

具体题目带来的知识获取变化

KS

知识点、作答结果

知识点层面的总体掌握状态

6.2 使用 LSTM 更新一般知识状态

论文使用另一个独立的 LSTM 更新学生的知识状态。

设学生在时刻 t1t-1 的一般知识状态为 gt1\mathbf g_{t-1} ,当前知识点级交互表示为 ct\mathbf c_t ,则:

LSTMKS(ct,gt1)\operatorname{LSTM}_{KS} \left(\mathbf c_t,\mathbf g_{t-1} \right)

其中: gtRd\mathbf g_t\in\mathbb R^d 表示学生完成第 tt 次交互后的一般知识状态。

论文正文没有再次完整展开 KS-LSTM 的门控公式,因为它与 KA 模块中的 LSTM 更新过程基本相同。二者的主要区别不是 LSTM 结构,而是输入信息不同。

因此:

  • αt\mathbf \alpha_{t} 是题目敏感的状态;

  • gt\mathbf g_{t} 是题目无关的一般知识状态。

6.3 将知识状态投影到知识点空间

LSTM 得到的 gt\mathbf g_{t} 是一个隐藏向量,还不能直接解释为知识掌握分数。

论文首先对其进行两层非线性变换:

htg=ReLU(W1ggt+b1g)h_t^g=\operatorname{ReLU} \left( \mathbf W_1^g\mathbf g_t+\mathbf b_1^g \right)

然后映射到知识点空间:

ztg=ReLU(W2ghtg+b2g)z_t^g=\operatorname{ReLU} \left( \mathbf W_2^g\mathbf h_t^g+\mathbf b_2^g \right)

论文给出的参数维度为: W1gRd×dW2gRm×d\mathbf W_1^g\in\mathbb R^{d\times d} \quad \mathbf W_2^g\in\mathbb R^{m\times d}

其中:

  • dd 是 LSTM 隐藏状态维度;

  • mm 是题库中的知识点总数。

因此: ztgRm\mathbf z_t^g\in\mathbb R^m 这意味着模型将学生的隐藏状态投影到了知识点空间:

[zt,1g zt,2g  zt,mg]\begin{bmatrix} z_{t,1}^g\ z_{t,2}^g\ \vdots\ z_{t,m}^g \end{bmatrix}

每一维对应一个知识点方向上的状态响应。

6.5 计算知识掌握分数

模型使用可学习向量 wg\mathbf w^g 对知识点空间中的不同维度进行加权:wgztg\mathbf w^g\odot\mathbf z_t^g

其中: wgRm\mathbf w^g\in\mathbb R^m ,符号 \odot 表示逐元素乘法。

最后,通过 Sum Pooling 对所有知识点维度求和:

S-Pool(utg)\operatorname{S\text{-}Pool} \left( \mathbf u_t^g \right)

因此,论文中的完整公式为:

βt=S-Pool(wgReLU(W2gReLU(W1ggt+b1g)+b2g)) \beta_t=\operatorname{S\text{-}Pool} \left( \mathbf w^g\odot \operatorname{ReLU} \left( \mathbf W_2^g \operatorname{ReLU} \left( \mathbf W_1^g\mathbf g_t+\mathbf b_1^g \right) +\mathbf b_2^g \right) \right)

最终得到: βtR\beta_t\in\mathbb R 即一个标量形式的知识掌握分数。

7. Question-centric Problem Solving Module

7.1 为什么需要 PS 模块

学生能否正确回答一道题,不仅取决于是否掌握相关知识点,还与题目本身有关。

即使两道题考查相同的知识点,它们仍然可能具有不同的:

  • 题目难度;

  • 区分度;

  • 表达形式;

  • 解题步骤;

  • 对知识综合运用能力的要求。

因此,“掌握某个知识点”并不意味着学生一定能正确回答所有与该知识点相关的题目。

KS 模块主要回答:

学生当前对相关知识掌握得怎么样?

而 PS 模块进一步回答:

面对下一道具体题目,学生能否将已经掌握的知识应用出来?

因此,PS 模块同时考虑学生当前知识状态和下一道题的具体信息。

7.2 构造下一题的问题解决表示

设学生完成前 tt 次交互后,KS 模块得到的一般知识状态为: gtRd\mathbf g_t\in\mathbb R^d

下一道题为 qt+1q_{t+1} ,其题目嵌入为: qt+1Rd\mathbf q_{t+1}\in\mathbb R^d

下一道题关联的知识点平均嵌入为: kˉt+1Rd\bar{\mathbf k}_{t+1}\in\mathbb R^d

PS 模块将这三个向量拼接:

gtqt+1kˉt+1\mathbf g_t \oplus \mathbf q_{t+1} \oplus \bar{\mathbf k}_{t+1}

由于三个向量的维度都是 dd ,因此: pt+1R3d\mathbf p_{t+1}\in\mathbb R^{3d}

7.3 计算知识应用分数

得到 pt+1\mathbf p_{t+1} 后,论文使用两层全连接网络提取问题解决特征:

ht+1p,1=ReLU(W1ppt+1+b1p)h_{t+1}^{p,1}=\operatorname{ReLU} \left( \mathbf W_1^p\mathbf p_{t+1}+ \mathbf b_1^p \right)

然后进行第二次非线性变换:

ht+1p,2=ReLU(W2pht+1p,1+b2p)h_{t+1}^{p,2}=\operatorname{ReLU} \left( \mathbf W_2^p\mathbf h_{t+1}^{p,1}+ \mathbf b_2^p \right)

最后使用一个线性层将高维表示压缩成标量:

wpht+1p,2+bp\mathbf w^p \mathbf h_{t+1}^{p,2}+b^p

将三步合并后,论文公式为:

ζt+1=wpReLU(W2pReLU(W1ppt+1+b1p)+b2p)+bp\zeta_{t+1}=\mathbf w^p\cdot \operatorname{ReLU} \left(\mathbf W_2^p\cdot \operatorname{ReLU} \left(\mathbf W_1^p\mathbf p_{t+1}+\mathbf b_1^p \right)+ \mathbf b_2^p \right)+b^p

其中:

[W1p,W2pR3d×3d][b1p,b2pR3d][wpR1×3d][bpR][ \mathbf W_1^p,\mathbf W_2^p \in \mathbb R^{3d\times3d} ] [ \mathbf b_1^p,\mathbf b_2^p \in \mathbb R^{3d} ] [ \mathbf w^p\in\mathbb R^{1\times3d} ] [ b^p\in\mathbb R ]

最终得到: ζt+1R\zeta_{t+1}\in\mathbb R

也就是说, ζt+1\zeta_{t+1} 是一个标量。

论文将 ζt+1\zeta_{t+1} 称为学生在题目 qt+1q_{t+1} 上的知识应用分数。

它反映的是:

在学生当前知识状态下,面对下一道具体题目时,将已有知识应用到该题上的倾向。

8. Interpretable Prediction Layer

前面的三个模块分别得到三个分数:

  • αt\alpha_t :KA 模块输出的题目中心知识获取分数;

  • βt\beta_t :KS 模块输出的一般知识掌握分数;

  • ζt+1\zeta_{t+1} :PS 模块输出的下一题知识应用分数。

QIKT 不再使用一个复杂的神经网络将三个分数进行融合,而是采用一种基于 IRT 思想的简单加法形式:

r^t+1=σ(αt+βt+ζt+1)\hat r_{t+1}=\sigma \left( \alpha_t+\beta_t+\zeta_{t+1} \right)

其中:

  • r^t+1\hat r_{t+1} 表示学生回答下一道题 qt+1q_{t+1} 正确的预测概率;

8.1 三个分数分别表示什么

直观地说,模型预测学生能否回答正确时,同时考虑:

  1. 学生通过过去的具体题目获得了多少知识;

  2. 学生当前总体掌握了多少知识;

  3. 学生是否能将已有知识应用到下一道具体题目中。

当三个分数的和较大时: r^t+11\hat r_{t+1}\rightarrow1 表示模型认为学生更可能回答正确。

当三个分数的和较小时: r^t+10\hat r_{t+1}\rightarrow0 表示模型认为学生更可能回答错误。

8.2 为什么说这一层具有可解释性

普通深度知识追踪模型通常直接执行:σ(MLP(ht))\sigma \left( MLP(\mathbf h_t) \right)

最终预测由一个高维隐藏状态经过复杂网络得到,很难说明预测结果具体受哪些认知因素影响。

QIKT 可以在分析某一次预测时,可以分别观察:σ(αt),σ(βt),σ(ζt+1) \sigma(\alpha_t),\qquad \sigma(\beta_t),\qquad \sigma(\zeta_{t+1})

从而判断最终预测更可能受到哪一部分因素的影响。

例如:

  • βt\beta_t 较高,说明学生总体知识状态较好;

  • ζt+1\zeta_{t+1} 较低,说明学生虽然掌握相关知识,但可能难以应用到当前题目;

  • αt\alpha_t 较低,说明题目级交互历史所体现出的知识获取效果较弱。

需要注意的是,这三个分数是模型学习得到的潜在认知分数,并不是可以直接观测到的真实心理测量值。

8.3 为什么最终层不加入可学习参数

论文特别说明,最终预测函数中不加入额外的可学习参数。

也就是说,论文没有使用:

σ(wααt+wββt+wζζt+1+b)\sigma \left( w_\alpha\alpha_t+ w_\beta\beta_t+ w_\zeta\zeta_{t+1}+b \right)

而是直接使用:

σ(αt+βt+ζt+1)\sigma \left( \alpha_t+\beta_t+\zeta_{t+1} \right)

这样做的原因是,如果再加入可学习权重和复杂非线性变换,最终预测虽然可能更加灵活,但三个内部得分的含义会变得更加难以分析。

采用直接相加的方式,可以让预测结构保持简单。

因此,这里更准确的说法是:

QIKT 使用了基于 IRT 思想的加性预测形式,而不是完整复现传统 IRT 中的所有参数。

9. Optimization of QIKT

9.1 最终预测损失

QIKT 首先使用二元交叉熵损失监督最终预测结果。

设真实作答结果为: ri0,1r_i\in{0,1}

模型预测学生答对的概率为: r^i[0,1]\hat r_i\in[0,1]

则 IRT 预测层的损失为: i(rilogr^i+(1ri)log(1r^i))\sum_i \left(r_i\log\hat r_i + (1-r_i)\log(1-\hat r_i)\right)

当学生实际回答正确,即 ri=1r_i=1时: Li=logr^i\mathcal L_i=-\log\hat r_i

模型预测的正确概率越接近 1,损失越小。

当学生实际回答错误,即ri=0r_i=0时: Li=log(1r^i)\mathcal L_i=-\log(1-\hat r_i)

模型预测的正确概率越接近 0,损失越小。

9.2 为什么还需要辅助损失

如果模型只监督最终结果:σ(αt+βt+ζt+1)\sigma \left( \alpha_t+\beta_t+\zeta_{t+1} \right)

那么只需要保证三个分数的和能够正确预测即可。

三者相加仍然可以得到合理结果,但单独观察每一个分数时,其判别能力可能不够稳定。

因此,论文不仅监督最终预测,还要求三个内部得分分别具有一定的预测能力。

对于任意内部得分 ziz_i,定义辅助损失:i(rilogσ(zi)+(1ri)log(1σ(zi)))\sum_i \left(r_i\log\sigma(z_i) + (1-r_i)\log \left( 1-\sigma(z_i) \right)\right)

其中 zz 可以分别取: α,β,ζ\alpha,\qquad\beta,\qquad\zeta

因此,三个辅助损失分别为:L(α)L(β)L(ζ)\mathcal L_*(\alpha) \quad \mathcal L_*(\beta) \quad \mathcal L_*(\zeta)

这些损失分别要求:

  • KA 分数能够区分正确和错误;

  • KS 分数能够区分正确和错误;

  • PS 分数能够区分正确和错误。

9.3 QIKT 的完整损失函数

最终优化目标为:

LIRT+λ(L(α)+L(β)+L(ζ))\mathcal L_{\mathrm{IRT}} + \lambda \left( \mathcal L_*\left(\alpha\right) + \mathcal L_*\left(\beta\right) + \mathcal L_*\left(\zeta\right) \right)

其中:

  • LIRT\mathcal L_{\mathrm{IRT}} 监督最终预测概率;

  • L(α)\mathcal L_*(\alpha) 监督知识获取分数;

  • L(β)\mathcal L_*(\beta) 监督知识掌握分数;

  • L(ζ)\mathcal L_*(\zeta) 监督知识应用分数;

  • λ\lambda 是用于控制辅助损失强度的超参数。

λ=0\lambda=0 时: L=LIRT\mathcal L=\mathcal L_{\mathrm{IRT}} 模型只优化最终预测结果,不直接约束三个内部得分。

λ\lambda 较大时,模型会更重视三个模块各自的判别能力,但如果设置过大,也可能削弱最终联合预测的优化效果。