阅读论文:Leveraging Pedagogical Theories to Understand Student Learning
Process with Graph-based Reasonable Knowledge Tracing
ps:代码逻辑最后一点还没理顺,明天继续
4.2 Knowledge Memory & Knowledge Tracing
代码研究:
一般经验值:
k_hop = 1~2
(默认值 1)适用于大多数知识追踪任务。k_hop > 3
可能会导致模型难以优化,但适用于知识点间关系复杂的情况。
选择
k_hop
需要权衡:
- 太小(1)→ 只能学习局部信息,捕捉不到远程知识关系。
- 太大(>3)→ 可能导致信息过度传播,使所有知识点变得相似,影响模型效果。
1. 部分代码拆解(一)
learn_kernel_para = F.softplus(lk_tilde) * self.args.alpha # [NK, KH]
lk_tilde
:- 之前通过
k_hop
传播,整合了知识点的关联、前置、后续信息。 - 它的形状
[NK, KH]
,表示NK
个知识点在KH
维隐藏空间的表示。
- 之前通过
F.softplus(lk_tilde)
:Softplus(x) = log(1 + e^x)
- 这是平滑版的 ReLU,确保
learn_kernel_para
非负。 - 作用:
- 当 x→−∞x \to -\inftyx→−∞,Softplus 逼近 0(防止负数影响计算)。
- 当 x→+∞x \to +\inftyx→+∞,Softplus 逼近 xxx(近似线性增长)。
self.args.alpha
:alpha
是超参数,控制学习核参数的影响范围。- 调节学习速率,防止
learn_kernel_para
过大或过小,影响梯度更新。
2. learn_kernel_para
的作用
learn_kernel_para
作为学习能力参数,决定:
- 学生在不同知识点上的学习速率(较大值表示容易学会,较小值表示难以掌握)。
- 如何在时间维度上影响知识状态的更新,即影响后续
h
(知识状态)的变化。
在 forward()
过程中,它用于调整:
learn_exp = (-(learn_count[:, :, None].float() + 1) * delta_time * learn_kernel_para).exp()
learn_kernel_para
越大,学习速率越快,知识状态更新更快。learn_kernel_para
越小,学习速率越慢,知识掌握变化较小。
3. 为什么要用 Softplus
?
- 保证非负性
learn_kernel_para
不能是负数,否则会影响学习状态更新计算。Softplus(x)
始终是正数,防止lk_tilde
可能的负值影响学习计算。
- 平滑版 ReLU,防止梯度消失
- 由于
softplus(x) ≈ x
在大值时近似线性,在小值时不会变成 0,因此可以避免梯度消失问题。
- 由于
4. 直观理解
如果你是一个学生:
learn_kernel_para
表示你的学习能力:learn_kernel_para
大 → 你对该知识点的学习速度快(容易掌握)。learn_kernel_para
小 → 你对该知识点的学习速度慢(难以掌握)。
softplus(lk_tilde)
确保:
- 学习能力
learn_kernel_para
始终为正数,避免错误学习率。 - 通过
alpha
控制学习速率,防止学习能力过大或过小。
5. 结论
✅ 计算学习核参数,决定知识点的学习速度。
✅ Softplus 确保非负,避免负学习率问题。
✅ 乘以 alpha
进行缩放,防止数值过大或过小。
✅ 影响后续知识状态 h
的更新,使得知识点的掌握程度符合学习规律。
训练代码记录:
/home/edurs/anaconda3/bin/conda run -n ma12 --no-capture-output python /home/edurs/GRKT_new/Training.py
Training start...
Evaluation before training: AUC: 0.5757, ACC: 0.6029,
train_loss: 0.6036, AUC: 0.7184, ACC: 0.6976, * 0.7079
train_loss: 0.5705, AUC: 0.7471, ACC: 0.7121, * 0.7294
train_loss: 0.5488, AUC: 0.7656, ACC: 0.7259, * 0.7455
train_loss: 0.5316, AUC: 0.7744, ACC: 0.7319, * 0.7529
train_loss: 0.5191, AUC: 0.7818, ACC: 0.7379, * 0.7595
train_loss: 0.5105, AUC: 0.7843, ACC: 0.7396, * 0.7616
train_loss: 0.5022, AUC: 0.7843, ACC: 0.7396, * 0.7616
train_loss: 0.4948, AUC: 0.7858, ACC: 0.7401, * 0.7626
train_loss: 0.4881, AUC: 0.7855, ACC: 0.7381,
train_loss: 0.4831, AUC: 0.7849, ACC: 0.7402,
train_loss: 0.4775, AUC: 0.7837, ACC: 0.7390,
train_loss: 0.4729, AUC: 0.7841, ACC: 0.7373,
train_loss: 0.4661, AUC: 0.7826, ACC: 0.7386,
train_loss: 0.4608, AUC: 0.7807, ACC: 0.7379,
train_loss: 0.4557, AUC: 0.7794, ACC: 0.7354,
train_loss: 0.4520, AUC: 0.7774, ACC: 0.7359,
train_loss: 0.4476, AUC: 0.7764, ACC: 0.7324,
train_loss: 0.4460, AUC: 0.7749, ACC: 0.7349,
train_loss: 0.4399, AUC: 0.7706, ACC: 0.7327,
train_loss: 0.4387, AUC: 0.7706, ACC: 0.7302,
train_loss: 0.4358, AUC: 0.7681, ACC: 0.7286,
train_loss: 0.4308, AUC: 0.7690, ACC: 0.7300,
train_loss: 0.4282, AUC: 0.7669, ACC: 0.7259,
train_loss: 0.4251, AUC: 0.7659, ACC: 0.7285,
train_loss: 0.4241, AUC: 0.7656, ACC: 0.7261,
train_loss: 0.4236, AUC: 0.7634, ACC: 0.7231,
train_loss: 0.4208, AUC: 0.7635, ACC: 0.7261,
train_loss: 0.4226, AUC: 0.7642, ACC: 0.7273,
Training stopped.
valid: AUC: 0.7858, ACC: 0.7401,
test: AUC: 0.7881, ACC: 0.7376,
Evaluation before training: AUC: 0.5366, ACC: 0.5602,
train_loss: 0.6052, AUC: 0.7198, ACC: 0.6977, * 0.7087
train_loss: 0.5703, AUC: 0.7487, ACC: 0.7145, * 0.7314
train_loss: 0.5475, AUC: 0.7666, ACC: 0.7266, * 0.7463
train_loss: 0.5308, AUC: 0.7754, ACC: 0.7328, * 0.7538
train_loss: 0.5185, AUC: 0.7804, ACC: 0.7347, * 0.7572
train_loss: 0.5090, AUC: 0.7832, ACC: 0.7374, * 0.7599
train_loss: 0.5016, AUC: 0.7833, ACC: 0.7372,
train_loss: 0.4947, AUC: 0.7855, ACC: 0.7408, * 0.7628
train_loss: 0.4885, AUC: 0.7844, ACC: 0.7375,
train_loss: 0.4822, AUC: 0.7842, ACC: 0.7397,
train_loss: 0.4761, AUC: 0.7830, ACC: 0.7383,
train_loss: 0.4693, AUC: 0.7820, ACC: 0.7365,
train_loss: 0.4657, AUC: 0.7815, ACC: 0.7354,
train_loss: 0.4616, AUC: 0.7800, ACC: 0.7357,
train_loss: 0.4558, AUC: 0.7780, ACC: 0.7346,
train_loss: 0.4526, AUC: 0.7779, ACC: 0.7337,
train_loss: 0.4470, AUC: 0.7760, ACC: 0.7338,
train_loss: 0.4444, AUC: 0.7722, ACC: 0.7310,
train_loss: 0.4405, AUC: 0.7709, ACC: 0.7313,
train_loss: 0.4380, AUC: 0.7722, ACC: 0.7290,
train_loss: 0.4349, AUC: 0.7713, ACC: 0.7283,
train_loss: 0.4299, AUC: 0.7679, ACC: 0.7293,
train_loss: 0.4296, AUC: 0.7678, ACC: 0.7266,
train_loss: 0.4280, AUC: 0.7672, ACC: 0.7281,
train_loss: 0.4243, AUC: 0.7671, ACC: 0.7291,
train_loss: 0.4211, AUC: 0.7678, ACC: 0.7275,
train_loss: 0.4169, AUC: 0.7625, ACC: 0.7234,
train_loss: 0.4130, AUC: 0.7620, ACC: 0.7232,
Training stopped.
valid: AUC: 0.7855, ACC: 0.7408,
test: AUC: 0.7833, ACC: 0.7349,
Evaluation before training: AUC: 0.5521, ACC: 0.5002,
train_loss: 0.6095, AUC: 0.7193, ACC: 0.7016, * 0.7104
train_loss: 0.5721, AUC: 0.7458, ACC: 0.7158, * 0.7307
train_loss: 0.5501, AUC: 0.7644, ACC: 0.7284, * 0.7462
train_loss: 0.5339, AUC: 0.7746, ACC: 0.7325, * 0.7533
train_loss: 0.5218, AUC: 0.7804, ACC: 0.7388, * 0.7593
train_loss: 0.5121, AUC: 0.7826, ACC: 0.7404, * 0.7612
train_loss: 0.5046, AUC: 0.7839, ACC: 0.7417, * 0.7625
train_loss: 0.4974, AUC: 0.7840, ACC: 0.7407,
train_loss: 0.4908, AUC: 0.7857, ACC: 0.7433, * 0.7642
train_loss: 0.4847, AUC: 0.7846, ACC: 0.7412,
train_loss: 0.4796, AUC: 0.7831, ACC: 0.7383,
train_loss: 0.4739, AUC: 0.7832, ACC: 0.7390,
train_loss: 0.4689, AUC: 0.7799, ACC: 0.7381,
train_loss: 0.4647, AUC: 0.7810, ACC: 0.7382,
train_loss: 0.4595, AUC: 0.7800, ACC: 0.7358,
train_loss: 0.4555, AUC: 0.7751, ACC: 0.7348,
train_loss: 0.4504, AUC: 0.7745, ACC: 0.7323,
train_loss: 0.4462, AUC: 0.7725, ACC: 0.7313,
train_loss: 0.4417, AUC: 0.7738, ACC: 0.7307,
train_loss: 0.4392, AUC: 0.7714, ACC: 0.7304,
train_loss: 0.4345, AUC: 0.7686, ACC: 0.7302,
train_loss: 0.4325, AUC: 0.7668, ACC: 0.7277,
train_loss: 0.4290, AUC: 0.7670, ACC: 0.7250,
train_loss: 0.4246, AUC: 0.7689, ACC: 0.7300,
train_loss: 0.4245, AUC: 0.7686, ACC: 0.7294,
train_loss: 0.4236, AUC: 0.7614, ACC: 0.7202,
train_loss: 0.4191, AUC: 0.7616, ACC: 0.7248,
train_loss: 0.4169, AUC: 0.7586, ACC: 0.7238,
train_loss: 0.4185, AUC: 0.7566, ACC: 0.7239,
Training stopped.
valid: AUC: 0.7857, ACC: 0.7433,
test: AUC: 0.7898, ACC: 0.7377,
Evaluation before training: AUC: 0.5531, ACC: 0.4871,
train_loss: 0.6087, AUC: 0.7160, ACC: 0.6958, * 0.7058
train_loss: 0.5707, AUC: 0.7437, ACC: 0.7116, * 0.7275
train_loss: 0.5492, AUC: 0.7626, ACC: 0.7252, * 0.7436
train_loss: 0.5327, AUC: 0.7743, ACC: 0.7335, * 0.7536
train_loss: 0.5202, AUC: 0.7794, ACC: 0.7379, * 0.7584
train_loss: 0.5098, AUC: 0.7832, ACC: 0.7376, * 0.7601
train_loss: 0.5018, AUC: 0.7849, ACC: 0.7421, * 0.7632
train_loss: 0.4944, AUC: 0.7850, ACC: 0.7387,
train_loss: 0.4873, AUC: 0.7852, ACC: 0.7406,
train_loss: 0.4814, AUC: 0.7839, ACC: 0.7390,
train_loss: 0.4760, AUC: 0.7811, ACC: 0.7369,
train_loss: 0.4698, AUC: 0.7809, ACC: 0.7356,
train_loss: 0.4633, AUC: 0.7786, ACC: 0.7362,
train_loss: 0.4585, AUC: 0.7761, ACC: 0.7322,
train_loss: 0.4527, AUC: 0.7716, ACC: 0.7324,
train_loss: 0.4491, AUC: 0.7728, ACC: 0.7310,
train_loss: 0.4448, AUC: 0.7711, ACC: 0.7314,
train_loss: 0.4418, AUC: 0.7675, ACC: 0.7279,
train_loss: 0.4386, AUC: 0.7657, ACC: 0.7287,
train_loss: 0.4351, AUC: 0.7661, ACC: 0.7277,
train_loss: 0.4299, AUC: 0.7676, ACC: 0.7285,
train_loss: 0.4267, AUC: 0.7639, ACC: 0.7256,
train_loss: 0.4275, AUC: 0.7627, ACC: 0.7255,
train_loss: 0.4257, AUC: 0.7621, ACC: 0.7242,
train_loss: 0.4228, AUC: 0.7605, ACC: 0.7230,
train_loss: 0.4185, AUC: 0.7584, ACC: 0.7213,
train_loss: 0.4204, AUC: 0.7558, ACC: 0.7217,
Training stopped.
valid: AUC: 0.7849, ACC: 0.7421,
test: AUC: 0.7846, ACC: 0.7337,
Evaluation before training: AUC: 0.5620, ACC: 0.5893,
train_loss: 0.6024, AUC: 0.7216, ACC: 0.6950, * 0.7081
train_loss: 0.5709, AUC: 0.7468, ACC: 0.7105, * 0.7284
train_loss: 0.5480, AUC: 0.7672, ACC: 0.7211, * 0.7438
train_loss: 0.5309, AUC: 0.7777, ACC: 0.7293, * 0.7531
train_loss: 0.5190, AUC: 0.7827, ACC: 0.7327, * 0.7573
train_loss: 0.5088, AUC: 0.7850, ACC: 0.7351, * 0.7597
train_loss: 0.5013, AUC: 0.7860, ACC: 0.7350, * 0.7600
train_loss: 0.4950, AUC: 0.7885, ACC: 0.7351, * 0.7614
train_loss: 0.4875, AUC: 0.7873, ACC: 0.7363,
train_loss: 0.4816, AUC: 0.7864, ACC: 0.7344,
train_loss: 0.4755, AUC: 0.7879, ACC: 0.7366, * 0.7618
train_loss: 0.4702, AUC: 0.7847, ACC: 0.7331,
train_loss: 0.4658, AUC: 0.7847, ACC: 0.7327,
train_loss: 0.4599, AUC: 0.7841, ACC: 0.7325,
train_loss: 0.4559, AUC: 0.7840, ACC: 0.7328,
train_loss: 0.4513, AUC: 0.7830, ACC: 0.7312,
train_loss: 0.4479, AUC: 0.7793, ACC: 0.7301,
train_loss: 0.4456, AUC: 0.7804, ACC: 0.7310,
train_loss: 0.4404, AUC: 0.7781, ACC: 0.7285,
train_loss: 0.4398, AUC: 0.7785, ACC: 0.7280,
train_loss: 0.4377, AUC: 0.7758, ACC: 0.7285,
train_loss: 0.4323, AUC: 0.7776, ACC: 0.7260,
train_loss: 0.4294, AUC: 0.7728, ACC: 0.7283,
train_loss: 0.4264, AUC: 0.7763, ACC: 0.7278,
train_loss: 0.4243, AUC: 0.7720, ACC: 0.7260,
train_loss: 0.4242, AUC: 0.7744, ACC: 0.7267,
train_loss: 0.4271, AUC: 0.7748, ACC: 0.7263,
train_loss: 0.4237, AUC: 0.7718, ACC: 0.7247,
train_loss: 0.4210, AUC: 0.7713, ACC: 0.7267,
train_loss: 0.4149, AUC: 0.7706, ACC: 0.7250,
train_loss: 0.4127, AUC: 0.7695, ACC: 0.7239,
Training stopped.
valid: AUC: 0.7879, ACC: 0.7366,
test: AUC: 0.7851, ACC: 0.7369,
Test result of all the experiments.
AUC:
0.7881
0.7833
0.7898
0.7846
0.7851
ACC:
0.7376
0.7349
0.7377
0.7337
0.7369
Average results:
valid: AUC: 0.7860, ACC: 0.7406,
test: AUC: 0.7862, ACC: 0.7362,
Process finished with exit code 0