深度知识追踪的研究(deep knowledge tracing)

本文概览了2019年知识追踪领域的新兴算法,包括基于深度学习的End-to-End Deep Knowledge Tracing、运用因子分解机的Knowledge Tracing Machines以及优化版的Dynamic Key-Value Memory Networks for Knowledge Tracing,探讨了它们在教育挖掘领域的应用潜力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

v

2019年一些新的知识追踪算法不完全整理" 教育挖掘 tag: 知识追踪

  • content {:toc} 面临实习转正,需要接触到知识追踪方面的学习(毕竟是自适应学习的第一步),网上资料挺少。GitHub代码极少,相较于发展火热的推荐,违约预测,cv,nlp,教育挖掘模型实在不多,GitHub代码非常少,所以除了传统IRT,BKT,DKT之外,特意看了看比较新的知识追踪paper,期望他们的落地实现。

1.End-to-End Deep Knowledge Tracing by Learning Binary Question Embedding

这篇Paper其实是ICLR 2018被拒的文章,不过审理由集中在,“卧槽你写个啥,啥也没写明白,虽然思路很优秀,但你这篇幅也太短了吧,图3是个什么”。其实这个paper还是有很多亮点,主要是他的一些思想和我本人的一些幻想不谋而合,即我们通常基于习题标记的知识点label这个粒度作为输入输出,那我们何不干脆一点,直接用question id 这个最小的特征粒度作为输出,通过embedding,传入我们的rnn。

![/styles/images/new dk/Q-Embedding Model.jpg]({{ '/styles/images/new dk/Q-Embedding Model.jpg' | prepend: site.baseurl }})

当然随之改变的还有损失函数,除了和DKT类似的最后一层 DKT’s objective function :Lp,我们需要以下的损失函数来使得我们的网络来学习embedding 矩阵:Ls和Lr

![/styles/images/new dkfunction1.png]({{ '/styles/images/new dk/function1.png' | prepend: site.baseurl }})

![/styles/images/new dk/function2.jpg]({{ '/styles/images/new dk/function2.jpg' | prepend: site.baseurl }})

δ˜(qt+1) 是在t+1时刻哪些回答了哪些习题的one-hot编码,$$ y_t $$是预测每个习题回答正确的可能性,; $$ a_{t+1} $$是t+1时刻是否回答正确的向量,l是交叉损失熵 。 对于lr和ls,x't是通过类似于从vt到yt转译,从前一半ut转译而来的重组向量,Lr的作用是让我们的网络学习到,学生做题的表现情况,取决于抽象知识点的掌握程度。而lr则是稀疏正则化,使得预测结果压缩在0-1之间。(很奇怪且复杂的损失函数)。 最后合成如下:

![/styles/images/new dk/function3.png]({{ '/styles/images/new dk/function3.png' | prepend: site.baseurl }})

2.Knowledge Tracing Machines: Factorization Machines for Knowledge Tracing

这篇paper已被AAAI 2019 收录,运用了类似CTR预估中的FM因子分解机,利用特征之间的组合特性,预测习题是否被正确做出,FM分解机应该大家都不会陌生,其实文章的中心在于如何构造特征。 User,items,skills,是id类feature的one-hot(skills是向量),分别是用户id,习题id,习题对应知识点id向量,Wins和Fails变量的设置是核心所在,想要理解需要费一些功夫,简单来说,分别表示做对和做错某题对应知识点的计数器,但仅在该时刻习题知识点与历史做题记录共同的知识点上进行累加,具体可以见https://medium.com/@jordancoil/knowledge-tracing-machines-factorization-machines-for-knowledge-tracing-a-summary-62e3b4965133 一文的详细讲解,本人太懒,想要表达完全需要费些功夫,带过就好。

![/styles/images/fm/feature.png]({{ '/styles/images/fm/feature.png' | prepend: site.baseurl }})

这样一来,知识追踪就从RNN序列模型,简化成了普通的机器学习01分类模型,模型复杂度降低,值得注意的是,既然模型原理已经向CTr预估或者推荐系统靠近,需要强大的实时计算能力才能应付增加的user和item,技术实现难度反而提高,但相应准确性也提高。

当然,你也可以引入外部特征来优化模型,如学生班级,学校,性别等。同时作者也有一篇paper《Deep Factorization Machines for Knowledge Tracing》提出用Deep FM构建知识追踪模型,所以感觉其他领域模型的不断发展,会促进教育挖掘领域的进步。

论文链接: https://arxiv.org/pdf/1811.03388.pdf https://arxiv.org/pdf/1805.00356.pdf

3. Dynamic Key-Value Memory Networks for Knowledge Tracing

没怎么认真看,好像是对DKT网络结构的优化,粗看结构图,改变较大。

论文链接:https://arxiv.org/abs/1611.08108

### 关于深度知识追踪Deep Knowledge Tracing)的代码实现 #### 使用 TensorFlow 实现 Deep Knowledge Tracing 的简单例子 下面是一个基于 LSTM 架构来实现深度知识追踪的例子。此模型旨在预测学生是否会正确回答下一个问题。 ```python import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense, Embedding def build_dkt_model(vocab_size, embedding_dim=50, lstm_units=100): model = Sequential() # 添加嵌入层,将输入转换成密集向量表示 model.add(Embedding(input_dim=vocab_size, output_dim=embedding_dim)) # 添加LSTM层处理序列数据 model.add(LSTM(lstm_units, return_sequences=True)) # 输出层采用sigmoid激活函数,输出每个技能掌握的概率 model.add(Dense(1, activation='sigmoid')) # 编译模型 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) return model ``` 为了训练上述 DKT 模型,需要准备适当格式的数据集[^1]: - 输入应为一系列先前尝试过的问题及其结果(正确/错误),编码为整数值。 - 对于每一个时间步长 t,目标标签 y_t 表示学生在时刻 t 是否能正确解答该题目。 考虑到实际应用中的复杂情况,可能还需要加入更多特性如问题难度、学习者特征等作为额外输入维度以提高性能。 #### 数据预处理部分 假设有一个 pandas DataFrame `df` ,其中包含两列:'problem_id' 和 'correctness'(0 或 1),代表每次答题记录。可以按照如下方式构建适合喂给 Keras/LSTM 的张量形式: ```python import numpy as np import pandas as pd # 假设 df 是已经加载好的DataFrame对象 sequence_length = 20 # 设定固定长度的历史窗口大小 data_x = [] data_y = [] for user_id in df['user_id'].unique(): user_data = df[df['user_id'] == user_id][['problem_id', 'correctness']] for i in range(len(user_data)-sequence_length): seq = user_data.iloc[i:i+sequence_length]['problem_id'].values.tolist() + \ user_data.iloc[i:i+sequence_length]['correctness'].values.tolist() data_x.append(seq) next_correct = int(user_data.iloc[i+sequence_length]['correctness']) # 获取下一次答题的结果 data_y.append([next_correct]) # 转换成numpy数组并调整形状 X_train = np.array(data_x).reshape(-1, sequence_length*2) y_train = np.array(data_y) vocab_size = max(X_train.max(), X_train.min()) + 2 # 计算词汇表尺寸 (+2是为了留出空间给padding和未知token) ``` 这里需要注意的是,在真实场景中通常会遇到不同用户具有不同的历史答题次数;因此,一般情况下我们会先填充或截断这些序列使得它们达到相同的长度以便批量处理。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值