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

news2024/11/17 8:32:13

代码以及视频讲解

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

1.论文概述

论文链接提出了一种基于图神经网络的知识追踪方法,称为基于图的知识追踪(GKT)。将知识结构构建为图,其中节点对应于概念,边对应于它们之间的关系,将知识追踪任务构建为图神经网络中的时间序列节点级分类问题。在两个开放数据集上的实证验证表明,方法可以更好地预测学生的表现,并且该模型比先前的方法具有更可解释的预测。
贡献如下:
(1)展示了知识追踪可以重新构想为图神经网络的应用。
(2)为了实现需要输入模型的图结构,在许多情况下并不明确的情况下,我们提出了各种方法,并使用实证验证进行了比较。
(3)证明了所提出的方法比先前的方法更准确和可解释的预测。

2.论文方法

下面是本文提出GKT的体系结构。
在这里插入图片描述

2.1 聚合

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

2.2 更新

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

2.3 预测

最后,模型输出学生在下一时间步正确回答每个概念的预测概率
在这里插入图片描述

3. 实验

3.1 数据集

使用了学生数学练习日志的两个开放数据集:ASSISTments 2009-2010“skill-builder”由在线教育服务 ASSISTments1(以下称为“ASSISTments”)提供和 Bridge to Algebra 2006-2007 [19] 用于KDDCup 教育数据挖掘挑战赛(以下简称“KDDCup”)。在这两个数据集中,每个练习都分配了人类预定义的知识概念标签。
使用特定条件预处理每个数据集。对于ASSISTments,将同时回答的日志合二为一,随后提取与命名概念标签相关联的日志,最后提取与至少10次回答的概念标签相关联的日志。对于 KDDCup,将问题和步骤的组合视为一个答案,然后提取与命名且非哑元的概念标签相关联的日志,最后提取至少 10 次回答的概念标签相关联的日志。由于频繁同时出现的标签,将同时的回答日志组合成一组可以防止不公平的高预测性能。排除未命名或虚拟的概念标签可以消除噪音。用回答每个概念标签的次数对日志进行阈值处理,以确保有足够数量的日志来消除噪音。在使用上述条件对数据集进行预处理后,为 ASSISTments 数据集获得了 62, 955 个日志,由 1, 000 名学生和 101 项技能组成,并为 KDDCup 数据集获得了 98, 200 条日志,由 1, 000 名学生和 211 项技能组成。
在这里插入图片描述

3.2 实验步骤

Step1:处理数据集

在这里插入图片描述

Step2:进行训练

在这里插入图片描述

3.3 实验结果

在这里插入图片描述

4.核心代码

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 device
                question: 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 training
                predicted_response, _ = self.gkt_model(question, data, data_mask)

                loss = loss_function(predicted_response, pick_index, label, label_mask)

                # back propagation
                trainer.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 device
            question: 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 evaluating
            output, _ = 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)

源码下载

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

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

相关文章

Jupyter Notebook 更换主题

1、安装 Jupyter 主题 pip install jupyterthemes 2、更新 Jupyter 主题 (可选) pip install --upgrade jupyterthemes 3、查看可用的 Jupyter 主题 jt -l 4、更换 Jupyter 主题 选择你喜欢的主题后,可以使用以下命令来应用它。更换主题后…

个人健康管理小程序(源码+参考文档+定制)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

Python 潮流周刊#71:PyPI 应该摆脱掉它的赞助依赖

△△请给“Python猫”加星标 ,以免错过文章推送 本周刊由 Python猫 出品,精心筛选国内外的 250 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术&am…

如何安装和设置 Go 版本的 fabric AI 工作流框架?

痛点 今年 6 月份,我给你介绍了 fabric 这款 AI 工作流工具。 它包裹了大量的优秀提示词,可以处理各种你日常工作、学习和科研中的事务性工作。包括但不限于: 从视频当中提取要点撰写博客给研究评分…… 不少读者看过之后,大呼有用…

代码随想录Day 59|图论Part09,dijkstra(堆优化版)精讲、Bellman_ford算法精讲

提示:DDU,供自己复习使用。欢迎大家前来讨论~ 文章目录 图论part09dijkstra(堆优化版)精讲图的存储邻接矩阵邻接表 Bellman_ford 算法精讲模拟过程代码总结 图论part09 dijkstra(堆优化版)精讲 图的存储…

Windows安装启动apache httpd 2.4 web服务器

Windows安装启动apache httpd 2.4 web服务器 apache httpd主要用来处理静态网页内容以及如php。 (1)在 Apache VS17 binaries and modules download 下载apache: (2)下载解压到一个目录,如果目录是这样的…

WindowsTerminal中oh-my-posh样式的cmd、git-bash、cmder配置参数

C:\Users\root\Documents\WindowsPowerShell中写如下内容 Import-Module posh-git # 引入 posh-git Import-Module oh-my-posh # 引入 oh-my-posh Import-Module -Name Terminal-Icons # 引入文件图标库 Import-Module PSReadLine # 历史命令联想 # 设置主题 Set-PoshPrompt …

MQTT.fx 1.7.1使用说明篇(OneNET-MQTT-API调试)

(代码完美实现)stm32 新版 onenet mqtt物联网(保姆级教程) (代码完美实现)stm32 新版 onenet mqtt物联网(保姆级教程)https://blog.csdn.net/Wang2869902214/article/details/142501323 MQTT.fx 1.7.1使用教程 下载地址 MQ…

DualGS:高效人体体积视频渲染技术,实现复杂4D数字人表演的实时播放引言

随着虚拟现实(VR)和增强现实(AR)技术的发展,对高质量、低延迟的人体体积视频的需求日益增长。传统的视频压缩和渲染方法在处理复杂的4D人体动作时往往面临性能瓶颈。为了解决这一问题,研究人员开发了一种名为DualGS的新型高效人体体积视频渲染技术。本文将详细介绍DualGS…

54K55LyB5p2l5a6i5pyN57O757uf token硬编码漏洞

0x01 产品描述: 54K55LyB5p2l5a6i5pyN57O757uf是独立源码部署的客服系统,支持接入到小程序、公众号、网站、APP。私有化源码部署,数据可控,稳定可靠。可自定义版权、logo。支持网页、微信公众号、小程序、App等任何程序对接 0x02…

JDK1.8安装配置教程(图文结合,最简洁易懂)

分为两大步骤:安装JDK、配置环境变量 (环境变量是什么?) 一、安装JDK 1、双击运行安装程序 2、点击【下一步】 3.点击【公共JRE】,选择【此功能将不可用】,点击【下一步】 4.安装完成,点击【关闭】 二、配置…

完全二叉树的递归创建思路及代码

文章目录 🍊自我介绍🍊创建思路图形完全二叉树的结论设计图例 🍊创建代码编写bitree.cbitree.hmain.c 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞关注评论收藏(一键四连)哦~ &#x1f34…

使用 Git 帮助文档

聊聊如何更好地查阅官方文档。 ‍ git help 学习某个工具&#xff0c;官方文档是少不了的&#xff0c;也是最权威的。我们可以使用 git help 来查看帮助&#xff0c;该命令会列举出常用的命令和介绍&#xff1a; > git help usage: git [--version] [--help] [-C <pa…

ComfyUI | 好用的人体 衣服分割工具-③-Layer Style | 超多实用功能 | 强烈推荐

这里为大家分享检测人体的脸部、五官、头发、手臂、腿、脚&#xff0c;上衣、裤子、背景的插件&#xff0c;能够生成出对应的蒙版mask&#xff0c;接入到ComfyUI中&#xff0c;用于后续处理&#xff0c;如局部重绘&#xff0c;换背景等。 &#xff08;需要相关插件的同学可自…

后端Java-SpringBoot整合MyBatisPlus步骤(超详细)

1.新建项目。 2.点击完上一步的next之后&#xff0c;选择pom.xml文件中的依赖。 3.点击pom文件进行项目初始化。 按照下面的俩步骤刷新一下maven &#xff0c;让文件生效 4.新建一个application.yml文件 5. 新建一个数据库mp&#xff0c;在数据库中新建一张user表 6.连接数据…

Java: 数据类型与变量和运算符

目录 一 .字面常量 二.数据类型 三.变量 1.语法格式 2.整型变量 (1).整型变量 (2). 长整型变量 (3).短整型变量 (4).字节型变量 3.浮点型变量 (1).双精度浮点型 (2).单精度浮点型 4.字符型变量 5.布尔型变量 四.类型转换 1.自动类型转换(隐式) 2.强制类型转换(…

螺钉生产线缺陷检测系统源码分享

螺钉生产线缺陷检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

JNI实现Java调用C++函数

1. 测试环境 操作系统&#xff1a;win10JDK版本&#xff1a;JDK11 安装教程gcc版本&#xff1a;8.1.0 2. 声明native方法 // HelloJNI.java public class HelloJNI {// 输出Hello JNI from CPP. private native static void sayHello();// 实现两个整数相加private native s…

UE4_Niagara基础实例—2、使用自定义模块

功能实现&#xff1a;用音频来触发粒子特效。 效果&#xff1a; 根据音量调节粒子大小 分析&#xff1a;我们想通过音量来控制Curl Noise Forc强度e的strength参数&#xff0c;但经过搜索会发现既没有这个参数&#xff0c;也没有这个模块&#xff0c;那么只能自定义这个模块。…