【传知代码】基于图神经网络的知识追踪方法(论文复现)

前言:本文将深入探讨基于图神经网络的知识追踪方法,旨在通过构建知识图谱来捕捉知识之间的复杂关联,并利用图神经网络强大的表示学习能力来建模学生的学习过程。我们将首先介绍图神经网络的基本原理和关键技术,然后详细阐述如何将其应用于知识追踪任务中,并探讨其中的挑战和解决方案。最后,我们将通过实验验证所提方法的有效性和优越性,以期为个性化学习的研究和实践提供新的思路和方向。

本文所涉及所有资源均在传知代码平台可获取

目录

概述

演示效果

核心代码

写在最后


概述

论文链接提出了一种基于图神经网络的知识追踪方法,称为基于图的知识追踪(GKT)。将知识结构构建为图,其中节点对应于概念,边对应于它们之间的关系,将知识追踪任务构建为图神经网络中的时间序列节点级分类问题。在两个开放数据集上的实证验证表明,方法可以更好地预测学生的表现,并且该模型比先前的方法具有更可解释的预测,其贡献如下:

1)展示了知识追踪可以重新构想为图神经网络的应用。
2)为了实现需要输入模型的图结构,在许多情况下并不明确的情况下,我们提出了各种方法,并使用实证验证进行了比较。
3)证明了所提出的方法比先前的方法更准确和可解释的预测。

下图是本文提出GKT的体系结构:

模型聚合了回答的概念及其相邻概念的隐藏状态和嵌入。这种聚合使用隐藏状态、表示正确和错误答案的输入向量 xt​,以及概念及其回答的嵌入矩阵Ex 和Ec 进行:

接下来,模型根据聚集的特征和知识图结构更新隐藏状态。这一步骤确保模型融合了当前概念及其在知识图中的相邻节点的信息:

最后,模型输出学生在下一时间步正确回答每个概念的预测概率:

演示效果

        使用了学生数学练习日志的两个开放数据集:ASSISTments 2009-2010“skill-builder”由在线教育服务ASSISTments1(以下称为“ASSISTments”)提供和Bridge to Algebra 2006-2007[19]用于KDDCup教育数据挖掘挑战赛(以下简称“KDDCup”)。两个数据集上的每一个习题均被赋予一个人预设知识概念标签。

        利用指定的条件对各数据集进行预处理。对ASSISTments来说,把同时作答的日志合并为一个整体,然后抽取出和命名概念标签有关的日志并最终抽取出和至少十次作答的概念标签有关。在KDDCup中,我们将问题与步骤的结合看作是答案,接着从与命名且非哑元的概念标签有关的日志中提取信息,最终从至少10次回答的概念标签中提取相关日志。鉴于标签的频繁出现,将多个回答日志整合为一组有助于避免不公正的高预测表现。排除未命名和虚拟概念标签能够去除噪音。利用每一个概念标签被答出的次数为日志设定一个阈值,从而保证足够多的日志被用于去除噪音。在使用上述条件对数据集进行预处理后,为ASSISTments数据集获得了62,955个日志,由1,000名学生和101项技能组成,并为KDDCup数据集获得了98,200条日志,由1,000名学生和211项技能组成:

处理数据集

进行训练

实验结果

核心代码

接下来这段核心代码是一个基于PyTorch实现的GKT(Graph Knowledge Tracing)模型的训练与评估过程。主要包括以下几个部分:

1)__init__方法:初始化GKT模型,包括传入知识点数量、图结构、隐藏层节点数等参数,并创建GKTNet模型实例。

2)train方法:用于模型训练,接收训练数据和测试数据(可选),并根据指定的epoch数、设备类型和学习率进行训练。在每个epoch内,遍历训练数据,将数据转移到指定设备上,然后通过GKT模型进行预测,计算损失函数并进行反向传播更新模型参数。如果提供了测试数据,还会调用eval方法进行模型评估。

3)eval方法:用于模型评估,接收测试数据和设备类型,并在评估过程中将数据转移到指定设备上,然后通过GKT模型进行预测,并计算AUC和准确率作为评估指标。

4)save和load方法:用于模型的保存和加载,分别将模型参数保存到文件中,以及从文件中加载模型参数。

class GKT(KTM):def __init__(self, ku_num, graph, hidden_num, net_params: dict = None, loss_params=None):super(GKT, self).__init__()self.gkt_model = GKTNet(ku_num,graph,hidden_num,**(net_params if net_params is not None else {}))# self.gkt_model = GKTNet(ku_num, graph, hidden_num)self.loss_params = loss_params if loss_params is not None else {}def train(self, train_data, test_data=None, *, epoch: int, device="cpu", lr=0.001) -> ...:loss_function = SLMLoss(**self.loss_params)trainer = torch.optim.Adam(self.gkt_model.parameters(), lr)for e in range(epoch):losses = []for (question, data, data_mask, label, pick_index, label_mask) in tqdm(train_data, "Epoch %s" % e):# convert to devicequestion: torch.Tensor = question.to(device)data: torch.Tensor = data.to(device)data_mask: torch.Tensor = data_mask.to(device)label: torch.Tensor = label.to(device)pick_index: torch.Tensor = pick_index.to(device)label_mask: torch.Tensor = label_mask.to(device)# real trainingpredicted_response, _ = self.gkt_model(question, data, data_mask)loss = loss_function(predicted_response, pick_index, label, label_mask)# back propagationtrainer.zero_grad()loss.backward()trainer.step()losses.append(loss.mean().item())print("[Epoch %d] SLMoss: %.6f" % (e, float(np.mean(losses))))if test_data is not None:auc, accuracy = self.eval(test_data)print("[Epoch %d] auc: %.6f, accuracy: %.6f" % (e, auc, accuracy))def eval(self, test_data, device="cpu") -> tuple:self.gkt_model.eval()y_true = []y_pred = []for (question, data, data_mask, label, pick_index, label_mask) in tqdm(test_data, "evaluating"):# convert to devicequestion: torch.Tensor = question.to(device)data: torch.Tensor = data.to(device)data_mask: torch.Tensor = data_mask.to(device)label: torch.Tensor = label.to(device)pick_index: torch.Tensor = pick_index.to(device)label_mask: torch.Tensor = label_mask.to(device)# real evaluatingoutput, _ = self.gkt_model(question, data, data_mask)output = output[:, :-1]output = pick(output, pick_index.to(output.device))pred = tensor2list(output)label = tensor2list(label)for i, length in enumerate(label_mask.numpy().tolist()):length = int(length)y_true.extend(label[i][:length])y_pred.extend(pred[i][:length])self.gkt_model.train()return roc_auc_score(y_true, y_pred), accuracy_score(y_true, np.array(y_pred) >= 0.5)def save(self, filepath) -> ...:torch.save(self.gkt_model.state_dict(), filepath)logging.info("save parameters to %s" % filepath)def load(self, filepath):self.gkt_model.load_state_dict(torch.load(filepath))logging.info("load parameters from %s" % filepath)

整体而言,这段代码实现了一个GKT模型的训练与评估流程,采用了PyTorch作为深度学习框架,并提供了模型的保存和加载功能。

写在最后

        虽然我们已经取得了一些初步的研究成果,但基于图神经网络的知识追踪方法仍然面临着许多挑战和机遇。首先,随着教育数据的不断增长和复杂化,如何构建更加高效、准确的知识图谱成为了一个亟待解决的问题。其次,如何结合学生的学习行为和历史数据,进一步优化图神经网络的模型结构和学习算法,提高知识追踪的精度和效率,也是我们需要深入研究的课题。

        然而,正是这些挑战激发了我们对基于图神经网络的知识追踪方法的浓厚兴趣。我们相信,随着技术的不断进步和研究的深入,我们将能够克服这些挑战,并开发出更加先进、实用的知识追踪系统。这些系统不仅能够为教师提供更加精准的教学建议,帮助学生实现更高效的学习,还能够为教育资源的优化配置和个性化教育的推广提供有力支持。

详细复现过程的项目源码、数据和预训练好的模型可从该文章下方附件获取。

【传知科技】关注有礼     公众号、抖音号、视频号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/16583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

现代前端工程化实践:Git、Husky、Commitlint与PNPM的协同作战

引言 Git Husky 与 Commitlint 是两个在 Git 工作流程中非常实用的工具,它们可以帮助团队维护代码质量和提交规范。Husky 是一个 Git 钩子管理器,允许你在仓库级别方便地配置钩子脚本;而 Commitlint 则是用来规范 Git 提交信息的工具&#x…

edge浏览器的网页复制

一些网页往往禁止复制粘贴,本文方法如下: 网址最前面加上 read: (此方法适用于Microsoft Edge 浏览器)在此网站网址前加上read:进入阅读器模式即可

跨境电商投放Facebook广告推广攻略!

在出海浪潮中,跨境电商已经成为企业连接不同市场、拓展国际业务的重要途径。Facebook,作为全球最大的社交平台之一,拥有超过20亿的活跃用户,为跨境卖家提供了一个无与伦比的营销舞台。有效利用Facebook广告,不仅能帮助…

MySQL导入SQL脚本---超详细介绍

1.新建xxx数据库,字符集选对。 2.在mysql安装目录下cmd进入小黑窗 3.执行mysql -uroot -p123456 --default-character-setutf8命令 4.use xxx; 5.source xxx.sql 执行完上面的命令等待结束就可以了 需要注意的是--default-character-setutf8,要不然可…

如何选择一款开放式耳机?六大独家选购技巧超详细汇总!

​喜欢户外活动的朋友们,你们都是懂得享受生活的达人吧!想象一下,在户外活动时,如果能有一副既适合场景又提供超棒音乐体验的耳机,那该多完美啊!这时候,开放式耳机就闪亮登场了!它的…

RocketMQ实战教程之常见概念和模型

RocketMQ实战教程之常见概念和模型 常见概念与模型 官方文档: https://rocketmq.apache.org/zh/docs/introduction/02concepts 1 常见概念[重点] 消息(Message) 消息是 Apache RocketMQ 中的最小数据传输单元。生产者将业务数据的负载和拓展属性包装成消息发送…

JavaWeb-JS

目录 学习重点 什么是 JavaScript? Web标准 JS的引入方式 JS的基本语法 JS的函数 JS的对象 JS事件监听 学习重点 js 引入方式 js 基础语法 js 函数 js 对象 js 事件监听 什么是 JavaScript? Web标准 Web 标准也称为网页标准 ,由一系列的标准组成&#xff0…

七年之痒!一个 PHP 程序员职业生涯的自述

大家好,我是码农先森。 今年刚好是我毕业的第七个年头,在婚姻感情当中都有一种「七年之痒」的说法,这次我把这个词「七年之痒」用一次在我的职业生涯复盘上。七年前我从告别校园,踏入互联网编程行业,七年后我依旧在编…

FFmpeg之转码

文章目录 概述transcode小结 概述 上一篇说了主要的流程,也就是ffmpeg_parse_options的流程,如下图: 红色箭头的流程说的差不多了,接下来看看绿色框框,也就是transcode的流程。 transcode 还是先给出我画的流程图&…

如何利用InputStream类实现文件读取与处理?

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…

K8S中Prometheus+Grafana监控

1.介绍 phometheus:当前一套非常流行的开源监控和报警系统。 运行原理:通过HTTP协议周期性抓取被监控组件的状态。输出被监控组件信息的HTTP接口称为exporter。 常用组件大部分都有exporter可以直接使用,比如haproxy,nginx,Mysql,Linux系统信…

C++质数的那些事(判断指数、区间筛质数、互质等等)

质数的定义:若一个正整数除了1和它自身之外不能被任何自然数整除,则该数称为质数,也叫素数。否则为合数。 质数的性质:质数的分布较为稀疏,对于一个足够大的数S,不超过S的质数大约有个,也就是说…

有趣的css - 水波纹按钮

大家好,我是 Just,这里是「设计师工作日常」,今天分享的是一个好看有质感的水波纹按钮。 最新文章通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样式页面渲染效果 整体效果 &a…

【Spring Cloud】远程调用

目录 Spring Cloud Netflix Feign简介前言Feign是什么OpenFeign组件和Spring Cloud OpenFeignOpenFeign组件Spring Cloud OpenFeign OpenFeign-微服务接口调用需求说明1. 启动Eureka Server服务2.创建两个项目,将其注册到Eureka Server3.在服务提供者中添加业务处理…

【UE Websocket】“WebSocket Server”插件使用记录

1. 在商城中下载“WebSocket Server”插件 该插件具有如下节点,基本可以满足WebSocket服务端的所有需求 2. 如果想创建一个基本的服务端,我们可以新建一个actor蓝图,添加如下节点 3. UE运行后,我们可以使用在线的websocket测试助手…

RuntimeError: CUDA out of memory. Tried to allocate 1.77 GiB?如何解决

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

开源与闭源AI模型的对决:数据隐私、商业应用与社区参与

引言 在人工智能(AI)领域,模型的发展路径主要分为“开源”和“闭源”两条。这两种模型在数据隐私保护、商业应用以及社区参与与合作方面各有优劣,是创业公司、技术巨头和开发者们必须仔细权衡的重要选择。那么,面对这些…

6、python开发环境-PyCharm

下载完成之后双击进行安装 找到安装好的解释器程序

ZeroTier+Nomachine远程

目录 前述:一、Zero二、Nomachine 前述: 需要远程控制时,服务端与客户端都必须下载这两个软件!远程主机(被控制的主机)和远程客户端(控制主机的用户)都必须具有网络连接,…