【传知代码】基于图神经网络的知识追踪方法(论文复现)
前言:本文将深入探讨基于图神经网络的知识追踪方法,旨在通过构建知识图谱来捕捉知识之间的复杂关联,并利用图神经网络强大的表示学习能力来建模学生的学习过程。我们将首先介绍图神经网络的基本原理和关键技术,然后详细阐述如何将其应用于知识追踪任务中,并探讨其中的挑战和解决方案。最后,我们将通过实验验证所提方法的有效性和优越性,以期为个性化学习的研究和实践提供新的思路和方向。
本文所涉及所有资源均在传知代码平台可获取
目录
概述
演示效果
核心代码
写在最后
概述
论文链接提出了一种基于图神经网络的知识追踪方法,称为基于图的知识追踪(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作为深度学习框架,并提供了模型的保存和加载功能。
写在最后
虽然我们已经取得了一些初步的研究成果,但基于图神经网络的知识追踪方法仍然面临着许多挑战和机遇。首先,随着教育数据的不断增长和复杂化,如何构建更加高效、准确的知识图谱成为了一个亟待解决的问题。其次,如何结合学生的学习行为和历史数据,进一步优化图神经网络的模型结构和学习算法,提高知识追踪的精度和效率,也是我们需要深入研究的课题。
然而,正是这些挑战激发了我们对基于图神经网络的知识追踪方法的浓厚兴趣。我们相信,随着技术的不断进步和研究的深入,我们将能够克服这些挑战,并开发出更加先进、实用的知识追踪系统。这些系统不仅能够为教师提供更加精准的教学建议,帮助学生实现更高效的学习,还能够为教育资源的优化配置和个性化教育的推广提供有力支持。
详细复现过程的项目源码、数据和预训练好的模型可从该文章下方附件获取。
【传知科技】关注有礼 公众号、抖音号、视频号
相关文章:

【传知代码】基于图神经网络的知识追踪方法(论文复现)
前言:本文将深入探讨基于图神经网络的知识追踪方法,旨在通过构建知识图谱来捕捉知识之间的复杂关联,并利用图神经网络强大的表示学习能力来建模学生的学习过程。我们将首先介绍图神经网络的基本原理和关键技术,然后详细阐述如何将…...
Vue与React、Angular的比较
Vue、React和Angular是前端开发中三个流行的JavaScript框架,它们各自具有不同的特点、优势和适用场景。以下是对这三个框架的比较: 1. 基本概念 Vue:Vue是一套用于构建用户界面的渐进式框架,其核心库专注于视图层,易…...
LINQ(二) —— 流式语句
总目录 C# 语法总目录 LINQ 二 —— 流式语句 1.1 序列相关部分运算符1.2 查询相关部分运算符 1.1 序列相关部分运算符 Take 运算符:Take 是拿出序列的几个数 Skip 运算符:Skip 是跳过序列的前几个数 Reverse 运算符:Reverse 是将序列反转 …...
怎么查看MySQL服务的最大连接,已经使用的连接数?怎么配置最大连接数?
要查看和配置MySQL服务的最大连接数以及已经使用的最大连接数,可以使用以下SQL语句和步骤: 查看MySQL服务的最大连接数和已经使用的最大连接数 查看当前最大连接数: SHOW VARIABLES LIKE max_connections;查看已经使用的最大连接数ÿ…...

微信小程序毕业设计-跑腿系统项目开发实战(附源码+演示视频+LW)
大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…...

stm32通过esp8266连接阿里云平台代码讲解
连接服务器 首先,按照一定的规则,获取连接阿里服务器所需要的ClientID(客户端D)、Username(用户名)、Passward(密码),ServerIP(域名),ServerPort(…...

突发!某大厂机房掉电,MySQL数据库无法启动,紧急恢复过程...
作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验, Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复, 安装迁移,性能优化、故障…...

SpringCloudAlibaba:6.2RocketMQ的普通消息的使用
简介 普通消息也叫并发消息,是发送效率最高,使用最多的一种 依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSch…...

vue+echart :点击趋势图中的某一点或是柱状图,出现弹窗,并传输数据
样式 在趋势图中点击某一个柱状图,出现下面的弹窗 代码实现 主要是在趋势图页面代码中,在初始化趋势图的设置中,添加对趋势图监听的点击方法 drawChart() {const chartData this.chartData;let option {};if (!chartData.xData?.len…...

2024年上半年软考什么时候查成绩?附查询流程
考试一旦结束,并不意味着与考试相关的事情也就结束了。2024年上半年信息系统项目管理师等软考考试结束后,我们还需要关注考后和证书相关的事情,比如成绩查询、证书领取等等。 2024年上半年软考成绩查询 查询时间:预计在2024年7月…...

css3实现0.5px边框
效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>css3实现0.5px边框</title><s…...

U-Net网络
U-Net网络 一、基本架构 各个箭头的解释: conv 3 * 3, ReLU:表示通过一个3 * 3的卷积层,并且该层自动附带一个非线性激活层(ReLu)copy and crop:表示进行裁剪然后再进行拼接(在channel的维度上…...

不拍视频,不直播怎么在视频号卖货赚钱?开一个它就好了!
大家好,我是电商糖果 视频号这两年看着抖音卖货的热度越来越高,也想挤进电商圈。 于是它模仿抖音推出了自己的电商平台——视频号小店。 只要商家入驻视频号小店,就可以在视频号售卖商品。 具体怎么操作呢,需要拍视频…...

【vue-5】双向数据绑定v-model及修饰符
单向数据绑定:当数据发生改变时,视图会自动更新,但当用户手动更改input的值,数据不会自动更新; 双向数据绑定:当数据发生改变时,视图会自动更新,但当用户手动更改input的值…...

[STM32-HAL库]AS608-指纹识别模块-STM32CUBEMX开发-HAL库开发系列-主控STM32F103C8T6
目录 一、前言 二、详细步骤 1.光学指纹模块 2.配置STM32CUBEMX 3.程序设计 3.1 输出重定向 3.2 导入AS608库 3.3 更改端口宏定义 3.4 添加中断处理部分 3.5 初始化AS608 3.6 函数总览 3.7 录入指纹 3.8 验证指纹 3.9 删除指纹 3.10 清空指纹库 三、总结及资源 一、前言 …...

【java程序设计期末复习】chapter4 类和对象
类和对象 编程语言的几个发展阶段 (1)面向机器语言 计算机处理信息的早期语言是所谓的机器语言,使用机器语言进行程序设计需要面向机器来编写代码,即需要针对不同的机器编写诸如0101 1100这样的指令序列。 (2&#x…...

ios:Command PhaseScriptExecution failed with a nonzero exit code
问题 使用 xcode 跑项目真机调试的时候,一直报错 Command PhaseScriptExecution failed with a nonzero exit code。 解决 最终靠以下方法解决 删除Podfile.lock文件删除Pods文件删除.xcworkspace文件Pod installCommandShiftK 清理一下缓存 亲测有效...

《拯救大学生课设不挂科第四期之蓝桥杯是什么?我是否要参加蓝桥杯?选择何种语言?如何科学备赛?方法思维教程》【官方笔记】
背景: 有些同学在大一或者大二可能会被老师建议参加蓝桥杯,本视频和文章主要是以一个过来人的身份来给与大家一些思路。 比如蓝桥杯是什么?我是否要参加蓝桥杯?参加蓝桥杯该选择何种语言?如何科学备赛?等…...

数据挖掘案例-航空公司客户价值分析
文章目录 1. 案例背景2. 分析方法与过程2.1 分析流程步骤2.2 分析过程1. 数据探索分析2. 描述性统计分析3. 分布分析1.客户基本信息分布分析2. 客户乘机信息分布分析3. 客户积分信息分布分析 4. 相关性分析 3. 数据预处理3.1 数据清洗3.2 属性约束3. 3 数据转换 4. 模型构建4. …...

决策树与机器学习实战【代码为主】
文章目录 🛴🛴引言🛴🛴决策树使用案例🛴🛴numpy库生成模拟数据案例🛴🛴决策树回归问题🛴🛴决策树多分类问题 🛴🛴引言 决策树是一种经…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
Windows 下端口占用排查与释放全攻略
Windows 下端口占用排查与释放全攻略 在开发和运维过程中,经常会遇到端口被占用的问题(如 8080、3306 等常用端口)。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口,帮助你高效解决此类问题。 一、准…...

Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...