本篇博客对论文阐述自身的理解,并结合代码进行说明。

这是一篇知识追踪论文,现阶段的知识追踪一般分为两大类:一,静态知识追踪;二,动态知识追踪。本论文是前者,具体分类请见:

知识追踪/认知诊断常用模型总结 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/394073305

关于静态与动态,我的理解是模型在预测时的区别,静态知识追踪模型如IRT,其在进行预测时会一直保持学生i的知识掌握程度不变。但是动态知识追踪模型,在进行预测时,由于使用了RNN,学生的知识掌握程度是会随着做题序列改变的。

本文所涉及到的模型有:MIRT,IRT,DINA,MF。这些模型具体如下:(64条消息) 多维IRT模型的EM估计_xux636的博客-CSDN博客https://blog.csdn.net/xux636/article/details/90368210项目反应理论(IRT)详解 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/367628823DINA模型解析与实现_门前大桥下-CSDN博客_dina模型https://blog.csdn.net/orangesuan/article/details/85789903

一,摘要

认知诊断是智能教育中的一个基本问题,其目的是发现学生对特定知识概念的熟练程度。现有的方法通常是通过手工设计的函数(如logistic函数)来挖掘学生练习过程的线性交互,这不足以捕捉学生与练习之间的复杂关系。在本文中,我们提出了一个通用的神经认知诊断(NeuralCD)框架,该框架采用神经网络来学习复杂的运动交互,以获得准确和可解释的诊断结果。具体来说,我们将学生和练习投射到因子向量上,并利用多神经层来建模它们的交互作用,其中应用单调性假设以确保两个因子的可解释性。此外,我们提出了NeuralCDM的两种实现,通过细化每个练习所需的概念,即使用传统Q矩阵的NeuralCDM和改进的探索丰富文本内容的NeuralCDM+。在真实数据集上的大量实验结果显示了NeuralCD框架在准确性和可解释性方面的有效性。

简单地来说,结合学生与做题序列的预测函数总是人为给定的。如IRT中的

其中参数解见开头链接。本文提出的神经认知诊断,就是让神经网络去拟合这个未知的预测函数,然后只提供参数。

二,相关工作

以往的认知诊断模型具有高度可解释性,但是预测精度不高。神经网络预测精度高,但是可解释性不强。NeuralCD能够实现高准确率与解释性,即使用高解释性的参数,然后利用神经网络去拟合预测函数。

三,认知诊断模型

class Net(nn.Module):'''NeuralCDM'''def __init__(self, student_n, exer_n, knowledge_n):self.knowledge_dim = knowledge_nself.exer_n = exer_nself.emb_num = student_nself.stu_dim = self.knowledge_dimself.prednet_input_len = self.knowledge_dimself.prednet_len1, self.prednet_len2 = 512, 256  # changeablesuper(Net, self).__init__()# network structureself.student_emb = nn.Embedding(self.emb_num, self.stu_dim)self.k_difficulty = nn.Embedding(self.exer_n, self.knowledge_dim)self.e_discrimination = nn.Embedding(self.exer_n, 1)self.prednet_full1 = nn.Linear(self.prednet_input_len, self.prednet_len1)self.drop_1 = nn.Dropout(p=0.5)self.prednet_full2 = nn.Linear(self.prednet_len1, self.prednet_len2)self.drop_2 = nn.Dropout(p=0.5)self.prednet_full3 = nn.Linear(self.prednet_len2, 1)# initializationfor name, param in self.named_parameters():if 'weight' in name:nn.init.xavier_normal_(param)def forward(self, stu_id, exer_id, kn_emb):''':param stu_id: LongTensor:param exer_id: LongTensor:param kn_emb: FloatTensor, the knowledge relevancy vectors:return: FloatTensor, the probabilities of answering correctly'''# before prednetstu_emb = torch.sigmoid(self.student_emb(stu_id))k_difficulty = torch.sigmoid(self.k_difficulty(exer_id))e_discrimination = torch.sigmoid(self.e_discrimination(exer_id)) * 10# prednetinput_x = e_discrimination * (stu_emb - k_difficulty) * kn_embinput_x = self.drop_1(torch.sigmoid(self.prednet_full1(input_x)))input_x = self.drop_2(torch.sigmoid(self.prednet_full2(input_x)))output = torch.sigmoid(self.prednet_full3(input_x))return outputdef apply_clipper(self):clipper = NoneNegClipper()self.prednet_full1.apply(clipper)self.prednet_full2.apply(clipper)self.prednet_full3.apply(clipper)#在这里实现单调性约束,即调用apply()函数来对网络参数进行处理。def get_knowledge_status(self, stu_id):stat_emb = torch.sigmoid(self.student_emb(stu_id))return stat_emb.datadef get_exer_params(self, exer_id):k_difficulty = torch.sigmoid(self.k_difficulty(exer_id))e_discrimination = torch.sigmoid(self.e_discrimination(exer_id)) * 10return k_difficulty.data, e_discrimination.dataclass NoneNegClipper(object):def __init__(self):super(NoneNegClipper, self).__init__()def __call__(self, module):if hasattr(module, 'weight'):w = module.weight.dataa = torch.relu(torch.neg(w))w.add_(a)

# initialize question representations of the factor interaction subspace
question_embedding_matrix = tf.Variable(tf.random_normal([question_num, embed_dim], 0.0, 0.01), name='item_embeddings')
# initialize question representations of the factor subspace
question_bias_matrix = tf.Variable(tf.random_normal([question_num, embed_dim], 0.0, 0.01), name='item_bias')# embeded question
question_embed = tf.nn.embedding_lookup(question_embedding_matrix, tf_question)  # [bs, embed_dim]
question_bias = tf.nn.embedding_lookup(question_bias_matrix, tf_question)  # [bs, embed_dim]# calculate the difficulty of question embeddings ------------------------------
question_diff_embeddings = tf.reshape(tf.layers.dense(question_embed, units=1), [-1])
question_diff_bias = tf.reshape(tf.layers.dense(question_bias, units=1), [-1])# squared loss of question difficulty-level
mse_emb_diff = tf.reduce_mean(tf.square(question_diff_embeddings - tf_diff))
mse_bias_diff = tf.reduce_mean(tf.square(question_diff_bias - tf_diff))

可以看到,作者在factor与factor interaction部分都分别进行了问题向量的训练question\_embe,question\_bias

2,

四,实验

这里解释一下AVG与STD,AVG是指每位学生对于每个知识点的平均做题数目,STD是指若学生A优于学生B,则学生A回答对某一题的概率比学生B大的情况做统计。即证明数据集ASSIST的合理性 ,因为MATH是考试情况下收集的数据集,很严谨。但是ASSIST并不是考试收集的数据集,所以需要使用STD参数来证明这个数据集也具有合理性,符合人的常识。

AAAI-2020 Neural Cognitive Diagnosis for Intelligent Education Systems相关推荐

  1. 【论文解读 | AAAI2020】NeuralCD:Neural Cognitive Diagnosis for Intelligent Education Systems

    文章目录 摘要 1 引言 2 相关工作 3 神经认知诊断 3.2 神经认知诊断框架 5 结论 摘要 认知诊断是智能教育的一个基本问题,其目的是发现学生对特定知识概念的熟练程度.现有的方法通常通过手工设 ...

  2. 【AAAI 2020】全部接受论文列表(二)

    来源:AINLPer微信公众号(点击了解一下吧) 编辑: ShuYini 校稿: ShuYini 时间: 2020-01-22 最近武汉肺炎形势严峻,请小伙伴们带好口罩,做好防护,大家新年快乐~    ...

  3. 【AAAI 2020】全部接受论文列表(四)

    来源:AINLPer微信公众号(点击了解一下吧) 编辑: ShuYini 校稿: ShuYini 时间: 2020-01-22 最近武汉肺炎形势严峻,请小伙伴们带好口罩,做好防护,大家新年快乐~    ...

  4. 必看!52篇深度强化学习收录论文汇总 | AAAI 2020

    所有参与投票的 CSDN 用户都参加抽奖活动 群内公布奖项,还有更多福利赠送 来源 | 深度强化学习实验室(ID:Deep-RL) 作者 | DeepRL AAAI 2020 共收到的有效论文投稿超过 ...

  5. 报名即将关闭丨AAAI 2020论文预讲会

    AAAI 2020 论文预讲会,来啦! 30多位论文作者,来自五湖四海,齐聚北大.预会议内容方向包括:翻译对话与生成.文本分析与内容挖掘.知识理解与NLP应用.自然语言中的机器学习等,此外还有两场特邀 ...

  6. 【AAAI 2020】全部接受论文列表(三)

    来源:AINLPer微信公众号(点击了解一下吧) 编辑: ShuYini 校稿: ShuYini 时间: 2020-01-22 最近武汉肺炎形势严峻,请小伙伴们带好口罩,做好防护,大家新年快乐~    ...

  7. AAAI 2020 | 时间可以是二维的吗?基于二维时间图的视频内容片段检测

    作者 | 彭厚文.傅建龙 来源 | 微软研究院AI头条 编者按:当时间从一维走向二维,时序信息处理问题中一种全新的建模思路由此产生.根据这种新思路及其产生的二维时间图概念,微软亚洲研究院提出一种新的解 ...

  8. 时间可以是二维的?基于二维时间图的视频内容片段检测 | AAAI 2020

    作者 | 彭厚文.傅建龙 来源 | 微软研究院AI头条(ID: MSRAsia) 编者按:当时间从一维走向二维,时序信息处理问题中一种全新的建模思路由此产生.根据这种新思路及其产生的二维时间图概念,微 ...

  9. AAAI 2020 | MaskGEC:通过动态掩蔽改善语法纠错

    作者 | 涂心琪 审稿 | 李梓盟 今天给大家介绍北京大学计算语言学教育部重点实验室的Zewei Zhao和Houfeng Wang在AAAI 2020发表的文章"MaskGEC: Impr ...

最新文章

  1. Serverless 如何在阿里巴巴实现规模化落地?
  2. TCP端口状态 LISTENING、ESTABLISHED、TIME_WAIT及CLOSE_WAIT详解,以及三次握手,滑动窗口
  3. 配置JDK时环境变量path和JAVA_HOME的作用
  4. oracle分歧处理,ORACLE 过程中容错处理
  5. java windows so文件_windows下编译使用NDK,调用SO文件 | 学步园
  6. java post 多文件报头_Spring MVC-------文件上传,单文件,多文件,文件下载
  7. python 核心编程_【02】Python核心编程 (全)
  8. mysql库存自动更新_秒杀库存需不需要实时更新到mysql?
  9. android 模拟gps坐标,android中模拟器中实现GPS坐标改变
  10. 昨天买的电动车今天上牌了
  11. 征服者蒙面侠c380更新升级_8月15日更新公告
  12. 玉米迷宫,Meteor Shower S,单词接龙
  13. 阿里百度腾讯等34家企业获年度互联网经济大奖
  14. 重磅!上海出落户新政:双一流应届硕士可直接落户!
  15. Openpose Windows10环境并且是3系显卡+ Unity 环境部署
  16. 【模拟IC】时钟馈通效应减小及仿真验证
  17. springcloudalibaba项目的搭建
  18. Python 数据结构 之 线性表 的链式存储结构
  19. C语言基础篇02:单链表实现学生成绩管理系统
  20. linux下的SNMP设置(snmp get/set/trap)

热门文章

  1. 浮动带来的问题以及清除浮动的几种方式
  2. Linux用户、组管理
  3. C语言数组讲解(1)一维数组的创建和初始化。
  4. 185-186 抽象类+接口案例/运动员和教练
  5. Java面试八股文界的“六边形战士”22年最强,不接受反驳!
  6. 解决wps VBA安装的问题
  7. sql语句-create table XXX select 和 insert into XXX select 语句的使用
  8. SQL Server 方言类型映射问题
  9. 数据库读写分离的理解
  10. PCIE Hot Plug 一般流程