动态键值记忆网络解决知识追踪

Dynamic Key-Value Memory Networks for Knowledge Tracing 动态键值记忆网络文献 阅读详情


✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨

🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。

我是Srlua小谢,在这里我会分享我的知识和经验。🎥

希望在这里,我们能一起探索IT世界的奥妙,提升我们的技能。🔮

记得先点赞👍后阅读哦~ 👏👏

📘📚 所属专栏:人工智能、话题分享

欢迎访问我的主页:Srlua小谢 获取更多信息和资源。✨✨🌙🌙

​​

​​

目录

1. 论文概述

2. 论文方法

2.1 模型

2.2 具体流程

2.2.1 输入表示

2.2.2 概念追踪

2.2.3 掌握水平更新

2.2.4 预测输出

2.3 DKVMN优势

3. 实验部分

3.1 数据集

3.2 实验步骤

3.3 实验结果

4.核心代码


 本文所有资源均可在该地址处获取。

1. 论文概述

复现论文:Dynamic Key-Value Memory Networks for Knowledge Tracing(DKVMN)
知识追踪(KT)是追踪学生在一系列学习活动中知识状态演变的任务。其目的是个性化地指导学生的学习,帮助他们高效地掌握知识概念。然而,传统方法如贝叶斯知识追踪和深度知识追踪存在一些局限性,要么为预定义的概念单独建模,要么无法准确指出学生在哪些概念上表现出色或不熟悉。为解决这些问题,引入了一种新模型称为动态键值记忆网络(DKVMN)。DKVMN能够利用概念之间的关系,直接输出学生对每个概念的掌握水平。与标准的记忆增强神经网络不同,DKVMN具有一个静态矩阵(键),存储知识概念,另一个动态矩阵(值),存储并更新对应概念的掌握水平。实验结果表明,DKVMN在各种KT数据集上持续优于现有模型。此外,DKVMN能够自动发现练习中的潜在概念,通常需要人工注释,描述学生知识状态的变化。
这里来源于EduKTM的DKVMN方法,修改了出错的数据集。

2. 论文方法

2.1 模型

在DKVMN模型中,不同于MANN将所有的信息存储在单一矩阵中,DKVMN使用键值对来存储信息。具体地,模型将概念和对应的掌握水平存储在键矩阵和值矩阵中。在每个时间戳,DKVMN接收一个练习标签作为输入,并输出学生对该练习的正确答案的概率。随后,模型使用这个练习和响应的组合来更新值矩阵中相应概念的掌握水平。通过这种方式,DKVMN能够更有效地追踪学生对不同概念的掌握情况,从而提高了KT的效果。

2.2 具体流程

DKVMN模型主要由两个部分组成:键矩阵(Key Matrix)和值矩阵(Value Matrix)。键矩阵存储概念信息,而值矩阵存储对应概念的掌握水平。

2.2.1 输入表示

在每个时间戳,DKVMN接收一个练习标签作为输入,代表学生接收到的练习内容。

2.2.2 概念追踪

DKVMN使用注意力机制将输入练习标签与键矩阵中的概念进行关联,计算出与输入相关的键,并获取对应的值作为输出。

2.2.3 掌握水平更新

接着,DKVMN将输入练习和学生的响应组合起来,更新值矩阵中对应概念的掌握水平。

2.2.4 预测输出

最后,DKVMN根据更新后的值矩阵,预测学生在下一个时间戳能够正确回答每个练习的概率。

2.3 DKVMN优势

能够将概念和对应的掌握水平分别存储在不同的矩阵中,更好地组织信息。
在每个时间戳,DKVMN能够根据输入练习动态地更新概念的掌握水平,而不是简单地将新信息写入到固定的记忆位置。
DKVMN能够更好地区分不同类型的输入和预测,从而更准确地建模知识追踪任务。

3. 实验部分

3.1 数据集

Assistment数据集是一个用于教育领域的常用数据集,用于研究和评估教育技术和学习分析模型。该数据集由来自辅助学习(Assistments)在线学习平台的真实学生交互数据组成。这些数据包括以下内容:
学生回答情况: 记录了学生对在线练习题的回答情况,包括每个学生的回答内容、回答是否正确等信息。
练习题元数据: 包括了每个练习的相关信息,如题目内容、难度级别、知识点标签等,这些元数据有助于对练习题进行分类和分析。
学生个人信息: 包括了学生的个人信息,如年级、性别等,这些信息可以用于分析不同群体在学习中的表现和特点。
学习过程相关信息: 还包括了其他与学习过程相关的信息,如学生在学习过程中的行为模式、学习轨迹等,有助于理解学生学习行为和习惯。
Assistment数据集为研究人员和教育从业者提供了丰富的真实数据资源,可以用于开发和评估各种教育技术和学习分析模型,帮助理解学生的学习过程、优化教学策略,并提高学习效

果。

3.2 实验步骤

step1:创建虚拟环境


step2:安装pytorch


step3:配置环境


step4:下载数据集


step5:训练

3.3 实验结果

4.核心代码

# start
class DKVMN(KTM):
    def __init__(self, n_question, batch_size, key_embedding_dim, value_embedding_dim,
                 memory_size, key_memory_state_dim, value_memory_state_dim, final_fc_dim, student_num=None):
        super(DKVMN, self).__init__()
        self.batch_size = batch_size
        self.n_question = n_question
        self.model = Net(n_question, batch_size, key_embedding_dim, value_embedding_dim,
                         memory_size, key_memory_state_dim, value_memory_state_dim, final_fc_dim, student_num)

    def train_epoch(self, epoch, model, params, optimizer, q_data, qa_data):
        N = int(math.floor(len(q_data) / params['batch_size']))

        pred_list = []
        target_list = []
        epoch_loss = 0

        model.train()

        for idx in tqdm(range(N), "Epoch %s" % epoch):
            q_one_seq = q_data[idx * params['batch_size']:(idx + 1) * params['batch_size'], :]
            qa_batch_seq = qa_data[idx * params['batch_size']:(idx + 1) * params['batch_size'], :]
            target = qa_data[idx * params['batch_size']:(idx + 1) * params['batch_size'], :]

            target = (target - 1) / params['n_question']
            target = np.floor(target)
            input_q = torch.LongTensor(q_one_seq).to(device)
            input_qa = torch.LongTensor(qa_batch_seq).to(device)
            target = torch.FloatTensor(target).to(device)
            target_to_1d = torch.chunk(target, params['batch_size'], 0)
            target_1d = torch.cat([target_to_1d[i] for i in range(params['batch_size'])], 1)
            target_1d = target_1d.permute(1, 0)

            model.zero_grad()
            loss, filtered_pred, filtered_target = model.forward(input_q, input_qa, target_1d)
            loss.backward()
            nn.utils.clip_grad_norm_(model.parameters(), params['maxgradnorm'])
            optimizer.step()
            epoch_loss += loss.item()

            right_target = np.asarray(filtered_target.data.tolist())
            right_pred = np.asarray(filtered_pred.data.tolist())
            pred_list.append(right_pred)
            target_list.append(right_target)

        all_pred = np.concatenate(pred_list, axis=0)
        all_target = np.concatenate(target_list, axis=0)
        auc = metrics.roc_auc_score(all_target, all_pred)
        all_pred[all_pred >= 0.5] = 1.0
        all_pred[all_pred < 0.5] = 0.0
        accuracy = metrics.accuracy_score(all_target, all_pred)

        return epoch_loss / N, accuracy, auc

    def train(self, params, train_data, test_data=None):
        q_data, qa_data = train_data

        model = self.model
        model.init_embeddings()
        model.init_params()
        optimizer = torch.optim.Adam(params=model.parameters(), lr=params['lr'], betas=(0.9, 0.9))

        model.to(device)

        all_valid_loss = {}
        all_valid_accuracy = {}
        all_valid_auc = {}
        best_valid_auc = 0

        for idx in range(params['max_iter']):
            train_loss, train_accuracy, train_auc = self.train_epoch(idx, model, params, optimizer, q_data, qa_data)
            print('Epoch %d/%d, loss : %3.5f, auc : %3.5f, accuracy : %3.5f' %
                  (idx + 1, params['max_iter'], train_loss, train_auc, train_accuracy))
            if test_data is not None:
                valid_loss, valid_accuracy, valid_auc = self.eval(params, test_data)
                all_valid_loss[idx + 1] = valid_loss
                all_valid_accuracy[idx + 1] = valid_accuracy
                all_valid_auc[idx + 1] = valid_auc
                # output the epoch with the best validation auc
                if valid_auc > best_valid_auc:
                    print('valid auc improve: %3.4f to %3.4f' % (best_valid_auc, valid_auc))
                    best_valid_auc = valid_auc

        # Plotting the training loss
        plt.plot(all_train_loss, label='Training Loss')
        plt.xlabel('Epochs')
        plt.ylabel('Loss')
        plt.title('Training Loss')
        plt.legend()
        plt.show()

    def eval(self, params, data):
        q_data, qa_data = data
        model = self.model
        N = int(math.floor(len(q_data) / params['batch_size']))

        pred_list = []
        target_list = []
        epoch_loss = 0
        model.eval()

        for idx in tqdm(range(N), "Evaluating"):

            q_one_seq = q_data[idx * params['batch_size']:(idx + 1) * params['batch_size'], :]
            qa_batch_seq = qa_data[idx * params['batch_size']:(idx + 1) * params['batch_size'], :]
            target = qa_data[idx * params['batch_size']:(idx + 1) * params['batch_size'], :]

            target = (target - 1) / params['n_question']
            target = np.floor(target)

            input_q = torch.LongTensor(q_one_seq).to(device)
            input_qa = torch.LongTensor(qa_batch_seq).to(device)
            target = torch.FloatTensor(target).to(device)

            target_to_1d = torch.chunk(target, params['batch_size'], 0)
            target_1d = torch.cat([target_to_1d[i] for i in range(params['batch_size'])], 1)
            target_1d = target_1d.permute(1, 0)

            loss, filtered_pred, filtered_target = model.forward(input_q, input_qa, target_1d)

            right_target = np.asarray(filtered_target.data.tolist())
            right_pred = np.asarray(filtered_pred.data.tolist())
            pred_list.append(right_pred)
            target_list.append(right_target)
            epoch_loss += loss.item()

        all_pred = np.concatenate(pred_list, axis=0)
        all_target = np.concatenate(target_list, axis=0)

        auc = metrics.roc_auc_score(all_target, all_pred)
        all_pred[all_pred >= 0.5] = 1.0
        all_pred[all_pred < 0.5] = 0.0
        accuracy = metrics.accuracy_score(all_target, all_pred)
        print('valid auc : %3.5f, valid accuracy : %3.5f' % (auc, accuracy))

        return epoch_loss / N, accuracy, auc

    def save(self, filepath):
        torch.save(self.model.state_dict(), filepath)
        logging.info("save parameters to %s" % filepath)

    def load(self, filepath):
        self.model.load_state_dict(torch.load(filepath))
        logging.info("load parameters from %s" % filepath)

​​

智慧教育经典ML模型---DKVMN模型工作机制 智慧教育研究领域经典模型 阅读详情

相关推荐

基于图神经网络的知识追踪Graph-based Knowledge Tracing: Modeling Student Proficiency Using Graph Neural Network

Graph-based Knowledge Tracing: Modeling Student Proficiency Using Graph Neural Network 基于图形的知识跟踪:基于图神经网络的学生能力建模 首次将GNN应用于知识追踪,提出了一种基于GNN的知识跟踪方法,即基于图的知识跟踪。将知识结构转换为一个图,使我们能够将知识跟踪任务转化为GNN中的时间序列节点级分类问题。由于知识图结构在大多数情况下并没有显式地提供,所以我们提出了图结构的各种实现。对两个开放数据集的实证检验表明,我

sereasuesue的博客 6046

DKVMN学习

DKVMN、DKVMN-BORUTA、SKVMN、Deep-IRT

m0_48148247的博客 2877

可解释知识追踪(整理更新)

微观角度的可解释性,一个深度学习模型的可解释性是其内 在的固有性质,指模型的决策在多大程度上可以被人类预测和理解。模型的可解释性越强,代表模 型的行为对人类越透明,模型的不确定性也就越低;反之模型的可解释性越弱,模型做出预测的机 制就不能被人类所理解,它的不可控性也越大主动解释 和事后解释两大类:主动解释为模型在做出预测的过程中可以同时生成相应的解释,如注意力显著 性在网络前向传播时即可生成,自我可解释的网络会设计一些可解释单元。事后解释为在模型做出 决策之后,通过一些算法来有效地揭示模型做出预测的原因。

sereasuesue的博客 2564

DKVMN知识追踪描述

由于在线学习课程的兴起,学习者在课程学习过程中有很多习题练习的记录,利用这些记录,知识追踪(Knowledge Tracing)希望通过对学习者过往练习的结果分析其当前对一些概念的掌握程度。知识追踪任务可以形式化为一个有监督的序列学习问题:即给定学习者过去的练习记录 X = {x1, x2,…,xt-1},预测学习者对一个新的练习回答正确的概率,即:p(rt=1|qt,X)。典型的知识追踪方法有:...

算法探索之路 4287

【论文解读|SIGIR2021】HGKT : Introducing Hierarchical Exercise Graph for Knowledge Tracing 引入层次练习图的知识追踪

文章目录摘要 摘要 知识追踪是预测学习者知识掌握情况的一种方法,在计算机辅助教育系统中起着重要的作用。近年来,许多深度学习模型被应用于处理KT任务,取得了很好的效果。然而,限制仍然存在。现有的方法大多将练习记录简化为知识序列,不能充分挖掘练习中存在的丰富信息。现有的知识追踪诊断结果由于忽略了练习之间的先验关系而缺乏说服力。为了解决上述问题,我们提出了层次图知识跟踪模型HGKT,以探索练习之间潜在的层次关系。具体地说,我们引入问题模式的概念来构建一个层次练习图,可以模拟练习学习的依赖关系。此外,我们采用两种.

qq_36291847的博客 1997

Kaggle教育数据竞赛:从知识追踪到个性化学习路径推荐

知识追踪是教育数据挖掘的核心技术,它通过建模学生动态的知识掌握状态,为个性化学习提供基础。其原理通常基于序列模型,如循环神经网络或Transformer,处理学生与学习内容的交互序列,预测未来表现并诊断学习困难。这项技术的价值在于将传统的经验式教学转化为数据驱动的精准干预,从而提升学习效率与效果。在实际应用中,它被广泛用于构建自适应学习系统、智能辅导工具以及学习分析平台。本文聚焦的Kaggle百万美金竞赛,正是要求参赛者构建融合了知识状态追踪与序列推荐能力的算法模型,以解决教育中的核心挑战——如何实现规模化

weixin_38168081的博客 383

知识追踪-Dynamic Key-Value Memory Networks for Knowledge Tracing

1. 本文研究内容 问题:如何在KT中个性化练习顺序,来帮助学生有效的学习知识概念? 解决方案:引入动态键值记忆网络模型(DKVMN) ,它可以利用基本概念之间的联系,直接输出学生对每个概念的掌握水平。 具体:DKVMN模型有一个静态矩阵Key,用于存储知识概念;有一个动态矩阵value,用于学生对相关概念的掌握水平。 2.经典模型 2.1 BKT 在BKT中,一个学生的知识状态sts_tst​由不同的概念状态{stis_t^isti​}组成,并且BKT对每个概念状态独立建模。BKT假设概念状态stis_t

CZYruobing的博客 2902

Dynamic Key-Value Memory Networks for knowledge Tracing

Dynamic Key-Value Memory Networks for knowledge Tracing Memory-Augmented Neural Networks MANN\text{MANN}MANN是一种用于多种NLP任务的网络结构,例如问答系统,自然语言翻译、单样本学习。 典型的模型包括两部分:存储信息的记忆矩阵和和外界进行读写交换的控制器。读写操作通过attention\te...

Pengwill's Blog 1632

DCL记忆上次输入值lisp_知识追踪场景下的动态key-value记忆网络

知识追踪(KT)是一项用于跟踪学生在参与一系列学习活动时对一个或多个概念的不断变化的知识状态的任务。KT的一个重要目的是个性化练习序列,以帮助学生有效地学习知识概念。但是,贝叶斯知识追踪和深度知识追踪等现有方法要么单独为每个预定义概念建立知识状态,要么无法精确确定学生擅长或不熟悉的概念。为解决上述问题,本文提出了动态键值记忆网络(DKVMN),可以利用基础概念之间的关系,直接输出学生对每个概念的掌...

weixin_39779975的博客 460

DKVMN-KAPS:融合知识吸收与解题能力的个性化知识追踪模型详解

知识追踪(Knowledge Tracing)是教育技术领域的核心任务,旨在通过分析学生的历史答题序列,动态评估其知识掌握状态,并预测未来表现。其基本原理在于将学生的学习过程建模为隐马尔可夫过程或序列模型,通过捕捉知识状态的演变来实现个性化评估。该技术的核心价值在于能够为自适应学习系统提供精准的学情诊断,从而支撑个性化习题推荐和路径规划。在实际应用中,传统的知识追踪模型往往将学生视为同质个体,忽略了关键的个体能力差异,导致预测偏差。针对此问题,DKVMN-KAPS模型在经典动态键值记忆网络(DKVMN)的基

weixin_30952479的博客 348

动态键值记忆网络解决知识追踪(论文复现)

动态键值记忆网络解决知识追踪(论文复现)

wei_shuo的博客 772

知识追踪之动态键值对记忆网络 Dynamic Key-Value Memory Networks for Knowledge Tracing

文章目录简介动态键值对记忆网络DKVMN原理图详细介绍 简介 本文分三个部分介绍: 动态键值对记忆网络的详细介绍以及如何将记忆增强神经网络(MANN)引入到知识追踪领域。 DKVMN模型是如何进行追踪知识以及自动发现相似的练习题。 DKVMN的优势以及不足。 针对DKVMN的问题,我们如何改进它,如何提出自己的观点,如何发表创新性的论文(例如,DKVMN不能自动发现练习题之间的依赖关系)。 最后...

算法探索之路 1万+

15、医疗诊断推理与知识追踪的智能系统设计

本文探讨了智能系统在医疗诊断推理和知识追踪领域的应用与设计。在医疗诊断推理方面,研究利用CResME系统分析医疗专业人员的过程数据,揭示了疾病脚本对诊断性能的影响;在知识追踪方面,研究将项目反应理论(IRT)融入深度神经网络,提高了模型的可解释性。文章还总结了两项研究的整体价值,并提出了未来研究方向,包括多模态数据的探索、模型性能与可解释性的平衡以及多通道数据的利用,旨在推动智能系统在医疗和教育领域的应用发展。

x1y2z的博客 94

EduKTM:知识追踪模型的宝库

EduKTM:知识追踪模型的宝库 项目介绍 在智能教育服务中,知识追踪(Knowledge Tracing, KT)是一项至关重要的任务,旨在实时监控学生知识状态的变化。随着教育科技的快速发展,越来越多的研究者投入到知识追踪领域的研究中,并取得了显著的进展。然而,由于不同研究者使用不同的编程语言和深度学习框架,且代码组织不够系统,导致模型的复现变得困难。 为了解决这一问题,我们推出了EduKTM,...

gitblog_00810的博客 1210

深度知识追踪GIKT原理与个性化习题推荐实战解析

知识追踪(Knowledge Tracing)是智能教育领域的核心技术,通过分析学生历史答题行为动态建模其知识掌握状态。早期模型如贝叶斯知识追踪和DKT将知识点视为独立变量,限制了学习状态传播的准确性。图神经网络(GNN)的出现为建模知识点间关联提供了新思路。基于图交互的知识追踪方法(GIKT)利用知识图谱将题目、知识点与答题交互统一建模,每次作答后借由图结构向相关知识点传播掌握状态,显著提升预测可解释性。该方法适用于在线学习平台的个性化习题推荐场景,可结合推荐策略实现查漏补缺,帮助学习者高效提升。从数据构

weixin_33046983的博客 147

【YOLOv7-环境搭建】PyTorch安装后输出版本显示No module named ‘Torch’的解决方法

【YOLOv7-环境搭建】PyTorch安装后输出版本显示No module named ‘Torch’的解决方法:①检查PyCharm导入的环境是否错误②添加Torch包

qq_59942266的博客 4970

探索学习之旅:PyTorch版知识追踪集合项目解析

探索学习之旅:PyTorch版知识追踪集合项目解析 在教育科技的前沿阵地,对学生的知识掌握情况进行有效追踪是一项至关重要的任务。今天,我们为您介绍一个基于PyTorch的强大工具——《知识追踪集合》,它汇聚了当前最先进的一系列算法,为理解学生的学习旅程提供了前所未有的视角。 项目介绍 这个开源项目是一个综合性的知识追踪算法库,涵盖了包括深度知识追踪(DKT)、DKT+、动态键值记忆网络DKVMN、...

gitblog_00404的博客 417

安装matlab_Matlab+yalmip+cplex安装教程及算例

数学建模/科研学习推荐学习软件:Matlab+yalmip+cplex安装教程及算例其实绝大多数本科生都是在用Matlab和LINGO求解优化问题,Matlab可以求解一般优化问题,但是当优化问题规模比较大或者在应对一些非线性问题时候,Matlab会出现求解时间长,求解效率低,甚至难以求解等问题。Matlab+yalmip+cplex是Matlab通过调用商业软件cplex求解,求解时间短,这里简...

weixin_28939637的博客 5005

技术深度解析:pyKT-toolkit——知识追踪领域的模型动物园与基准测试框架

在教育技术领域,知识追踪(Knowledge Tracing)是预测学生学习状态的核心技术,但长期以来面临着模型实现碎片化、实验基准不统一、复现困难等挑战。pyKT-toolkit作为知识追踪领域的"一站式"解决方案,通过模块化架构和标准化接口,为研究人员提供了30+种深度学习模型的统一实现框架。本文将深入剖析pyKT-toolkit如何通过精心设计的架构解决知识追踪领域的三大技术挑战:模型多样性

gitblog_00336的博客 1106

Brim与ZUI协同安装指南:从下载到流量分析实战

本文提供Brim与ZUI协同安装与实战指南,详细讲解从下载、环境变量配置到流量分析的全流程。通过将PCAP文件转换为ZNG格式,结合直观的Zed查询语言,这套组合能极大提升大型网络数据包的分析效率,是网络安全与运维人员进行高效流量分析的利器。

metal的博客 458

机器人C++开源库The Robotics Library (RL)使用手册(三)

进入VS工程,我们先看看这些功能函数及其依赖库的分布关系:rl命名空间下,主要有八大模块。搞定VS后将逐个拆解。

qq_34839823的博客 1736
上一篇: 自监督行为识别-时空线索解耦
下一篇: BEVFormer详细复现方案
Srlua小谢
Srlua小谢 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域
博客等级 码龄4年 8963粉丝 332原创
评论 17
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值