APP下载

基于联合神经网络模型的学生编程题目理解

2022-05-11杨佳诺张丽萍闫盛

关键词:编程题目知识点

杨佳诺,张丽萍,闫盛

(内蒙古师范大学 计算机科学技术学院,内蒙古 呼和浩特 010022)

在计算机教育认知领域通过机器理解编程题目是一个重要的研究方向,过程包括自然语言处理中的多种核心技术[1]。在求解编程问题时,若学习者无法将算法内容与实际题目相结合,则无法建立解题的编程思维,不能编写代码解决问题。而在初学者面对编程题目时,尚未形成系统的编程思维,不具备分析题目的基本能力。因此,将机器理解编程题目方法应用于解题过程中,将对编程学习者提供很大的帮助。目前,使用计算机理解自然语言的研究已经比较成熟,但是与自然语言不同,学生编程题目具有较强的抽象性、复杂性特点,专业术语较多,因此对学生编程题目理解是一种对基础知识、逻辑思维的综合考察,根据题目文本材料,分析文本内容,抽象编程算法,提取求解编程题目所需的知识点信息和算法信息,帮助初学者提供解决编程问题的关键步骤,完成对编程题目理解的过程[2]。这将对计算机编程教育提供指导性帮助,对于促进编程课程的实践过程有着重要的现实意义。

1 相关研究

目前,自然语言处理对文本理解已有了成熟的解决办法。包括针对四、六级听力文本阅读理解,通过抽取材料片段、问题、选项的语义信息并给出正确答案[3];针对航班订票信息语料提取用户意图,通过分词、训练数据得到用户的出发地与目的地等信息[4];针对问答系统中用户提出的问题,通过分析用户数据,结合用户历史问题,对用户产生指导性作用[5]。本文旨在对编程题目进行理解,在编程练习过程中,当学习者求解问题时,对题目的正确理解是编程训练的关键步骤。如何通过智能化的方式帮助学习者理解编程题目、抽取关键信息是学生正确解题的关键。

文本理解系统中的关键信息抽取模块多采用对文本提取部分关键词并重新组合,形成新的可以由计算机识别的语句的方法[6],但是该方法并没有对文本深层语义进行提取,不能准确理解文本。基于用户问题主题模型的方法[7],虽然避免了语义歧义性,对文本的深层语义进行提取,但是该方法针对的是特征主题的数据,并不适用于具有上下文的数据。此外,传统的机器学习方法将提取关键信息这一过程通过分类的方法解决[8],虽然最终结果在人类行为数据集上精度有一定提升,但随着不同领域数据集的变化,需要重新设计特征并进行参数的学习,因此该方法不具备可行性。这些方法简单易行,虽耗时耗力,不适于大数据时代,但为后续文本理解研究的发展奠定了基础。

随着深度学习的发展,使用构造深度神经网络来提取文本中关键信息的方法被提出。该方法不需考虑特定的句法要求,将文本分词后的每一个单词对应的词向量作为输入,设计特征工程从输入中自动提取特征[9],所提取的特征可用于文本预测或者分类过程[10]。该方法主要分为以下三类:基本单神经网络模型[3,11]、扩展神经网络模型[12]和组合神经网络模型[13]。本文基于传统深度学习方法提出了一种基于BiLSTM+CNN+CRF 联合模型的学生基础编程题目理解方法。主要对编程题目文本特点建模,充分学习编程题目文本语句,减弱编程题目文本的抽象性;通过神经网络模型与相应算法提取文本深层语义,解决编程题目文本含义单一问题。研究结果以期对编程学习者提供帮助。

2 基于联合模型的编程题目理解

由于学生编程题目文本具有特殊性,本文对编程题目理解过程进行建模,如图1 所示。一方面,考虑到理解编程题目后所得信息大多为动词、名词,因此,需对编程题目文本进行词性标注;另一方面,编程题目一般较为抽象,准确提取关键信息需提取文本特征。

2.1 问题描述

当编程学习者求解编程问题时,需要理解题目本身的意图,即该题目需要学习者“怎么做”才能保证解题过程的正确。因此,计算机需实现人脑理解编程题目的过程,得出人脑思考编程题目后的结果,且要保证结果的正确性。对编程题目理解的示例见表1。

由表1 可知,对编程题目进行理解后,所得关键信息中,算法关键词一般为动词,知识点关键词一般为名词,但算法关键词更为抽象,需进一步分析编程题目文本的语义信息,提取语义特征。

表1 关键信息提取示例Tab.1 Example of extracting key information

基于上述分析对编程题目理解过程建模,在对数据预处理等操作后,分别对题目数据进行词性标注和语义特征提取,在获取到相应操作结果后,解码获取求解问题的关键信息。

2.2 词性标注

词性标注是将词性含义与上下文内容结合对文本数据中的单词进行标记处理的过程。本文使用双向长短期记忆模型(BiLSTM)对编程题目进行词性标注,其过程包括设计规则、模型设计与模型的训练。

人在思考问题之前,大脑中会存放有关该问题的相关知识,这是大脑对信息的持久性作用。传统的神经网络并不能实现这一特性,而循环神经网络(RNN)解决了这个难题,RNN 通过之前保存的信息并绑定到当前任务,决定当前的输出。但由于RNN 在训练过程中无法解决编程题目文本中的“长期依赖”问题[14],而LSTM 模型通过输入门、遗忘门、输出门成功解决这一问题[15]。BiLSTM 单元可通过前向、后向分别获取输入序列的上、下文信息。在学生编程题目理解任务中,BiLSTM 模型使当前状态的输入门、输出门、遗忘门都与前一状态、后一状态息息相关(如“if”“number”“not”“get rid”等),从而保证学习效果的准确性更高。此外,BiLSTM 不仅可以捕获到相近位置的信息,也可以捕获到较远位置的信息。在决定当前状态信息时,影响因素更多,学习结果精确度更高。本文使用BiLSTM 模型为理解学生编程题目文本提供了便利的条件,不仅削弱了编程题目文本的结构性,而且有更精确的词性标注结果。

2.3 特征提取

特征提取是从文本数据中抽象出可以代表该文本的数据,具有简介性、抽象性。本文特征提取使用卷积神经网络(CNN),其过程包括文本扫描、提取特征和筛选特征。传统的特征提取方法是机器学习,但是该方法不能很好地结合编程题目的结构特征,而且对文本的深层语义理解不足。目前,CNN 网络在自然语言理解任务中已经非常成熟[16]。提取特征过程如图2所示,将每个单词向量化后,通过过滤器对编程题目进行扫描,固定设置每个过滤器中有n个单词。在过滤时,通过设计卷积层完成特征提取,在选择局部特征时采用Relu 激活函数与最大池化方式,最后形成一个固定长度的全局特征向量,完成对编程题目的特征提取过程。

图2 特征提取结构Fig.2 Structure of feature extraction

2.4 全句解码

全句解码是从模型处理过的众多向量化数据中提取最为可靠的数据的过程。本文使用条件随机场(CRF)[17]实现解码,其过程包括单词标签与语义特征拼接、计算权重得分与搜索最优路径。CRF 是用来从所有向量化数据中选择符合要求条件数据的概率性模型。通过充分考虑所标注单词词性间的线性关系,将全局最优序列输出,实现编程题目的解码过程。相比于其他解码模型,CRF 不再单独识别每个标签,而是通过局部特征的线性加权组合,使用指数模型表示标签序列的联合概率完成联合建模解码标签序列。在对编程题目向量化数据解码的过程中,给定文本序列X={X1,X2,…,Xn},其中n表示字符序号,Xi是第i个单词的向量。通过BiLSTM 词性标注与CNN 特征提取后,得到预测标签序列y={y1,y2,…,yn},Y(u)表示x的所有可能预测标签序列的集合。其预测标签序列集Y(x)与给定文本序列x之间的条件概率见公式(1),其中W、b分别是权值向量与偏移量。

CRF 的训练过程使用最大条件似然估计为函数代价,公式为

在预测过程中,为了输出条件概率最大的序列,调节参数(W,b) 使得L(W,b) 最大化。因此,搜索具有最大条件概率的标签序列y*,获取全局最优序列,完成对编程题目的解码过程。公式为

2.5 模型训练

本文针对BiLSTM+CNN+CRF 联合模型的参数学习采用梯度下降算法(Adam)[18]。在模型训练过程中,选取矩阵形式的交叉熵损失函数来对比本文模型与编程题目数据集的拟合效果,公式为

模型训练前需要进行初始化操作,主要包括各部分模型参数的定义、联合模型中间参数的定义、优化方法定义以及损失函数定义等,由于每道编程题目文本之间无关联,本文使用单句训练的方法,训练步骤(1)梯度值与隐藏层参数的初始化:在模型训练之前,将梯度值置为零,并对隐藏层参数使用随机初始化方式赋值;(2)预测编程题目中的算法:通过使用自定义规则,为部分编程题目标注其中可能包含的算法与知识点;(3)误差的计算与反向传播:使用交叉熵损失函数计算出预测值与真实值间的误差,再将误差反向传递到联合模型中的每一层中,完成梯度的更新;(4)计算模型下一次训练的梯度值:使用优化器更新联合神经网络模型中的权重值,使梯度值更新至每一个神经网络权重矩阵。

3 实验设计及结果分析

3.1 数据集

为验证本方法的有效性,设计BiLSTM+CNN+CRF 模型,在预处理后的英文编程题目数据集上进行实验,通过算法优化、模型性能等指标来评估。由于目前还没有公认度较高的编程题目语料,本文从OJ(online judge)、PTA(https://pintia.cn/)等平台爬取大约10 000 道编程题目为初始数据,经过去除停用词、空格、空行、无效数据等预处理操作,得到符合要求编程题目8 000 余条数据。其中,训练集约7 000 条,测试集约1 000 条。该数据集所包含10 种不同的算法和100 种不同的知识点内容,不同算法所含数据量见表2,由于知识点内容较多,不再列出对应表格。

表2 算法语料规模Tab.2 Algorithmic corpus

3.2 评价指标

实验结果使用自然语言处理技术中常用的评价指标,即准确率(P)、召回率(R)和F1 测度值。

3.3 实验结果与分析

为获取更好的模型参数,从训练集中抽取10% 的数据作为验证集。当模型在验证集上测试获得的准确率最大化时,该参数则为最优参数。将模型参数修改为最优参数后,再次使用训练集训练模型,从测试集上预测(关键信息)算法与知识点的准确率、召回率和F1 值,重复训练10 次后,获得三个评估指标的均值。之后再设计LSTM 模型、BiLSTM 模型、BiLSTM+CRF 模型、BiLSTM+CNN 模型与本文模型进行对比,结果见表3。

表3 各模型实验结果Tab.3 Experimental results of different mode %

(1)独立模型实验结果:实验②比实验①的预测结果在精确率上有大幅度提升。在分析LSTM 模型中的错误序列后发现,LSTM 识别错误的主要原因在于识别信息的部分丢失。其主要原因在于LSTM虽然解决了“长依赖”问题,但是仅实现从前向后的扫描,无法编码从后向前的信息,导致部分关键信息无法与前面的词匹配,而BiLSTM 弥补了这一缺陷,其所带有的双向机制可以充分学习文本的前后信息,保证信息的完整性。

(2)其他联合模型实验结果:实验③相比于实验②在三项指标上有小幅提高。原因在于CRF 充分利用单词之间的关系,输出全局最优序列,BiLSTM+CRF 模型先获取单词间词性关系,完成词性标注后利用CRF 得到预测序列,挖掘文本语义信息,得到更精确结果。在实验②中,分析预测错误的结果后发现,BiLSTM 解码过程是将每一个序列单独计算,忽略了单词之间的关系,而CRF 模型则充分考虑相邻标签之间的关系,这保证该模型能够更为准确地识别关键信息。与BiLSTM+CRF 相对比,BiLSTM+CNN 模型在最终结果的获取上有小部分提升。这是因为BiLSTM+CRF 模型中,通过人工的方法提取特征,而人工提取特征的过程耗时耗力且含有较高的主观性,因此,特征提取结果不能对机器学习的过程提供较好的价值,导致对题目理解的准确性较低,而BiLSTM+CNN 模型使用CNN 网络提取特征,对于相对重要的信息层层递进,更高效获取特征信息。本文提出的模型与BiLSTM+CRF、BiLSTM+CNN 相比在三项指标上有大幅度提高,其结果表明CNN 能有效抽取文本的局部特征,CRF 能充分考虑相邻标签间关系进行解码,提升模型的识别效果。

通过将BiLSTM+CNN+CRF 联合模型与上述实验对比,结果显示编程题目理解任务的准确率、召回率、F1 值相比其他实验取得较好的结果。说明本文联合模型很好地融合了BiLSTM 模型、CNN 模型和CRF 模型各自的优势,在编程题目理解任务中取得很好的效果。

3.4 优化算法对比分析

由于联合模型存在规模大、结构复杂、数据形式较多等问题,在完成题目理解后,通过分析联合模型特点以及数据形式对联合模型进行优化,模型优化的主要工作在于模型内部参数的界定。在对神经网络模型进行训练并产生结果时,模型内容的参数有着至关重要的作用。如用来计算测试集中目标值的真实值与预测值之间的偏差程度、对部分数据所赋予的权重值等,这些参数决定了输出结果的准确性,由这些参数构造出的函数为损失函数。因此,使用各种优化策略来更新计算模型和影响模型输出的参数、计算出损失函数的最优值必不可少的。

本文通过前期调研,分别使用随机梯度下降算法(SDG)、动量、Adagrad 方法、Adadelta 方法、RMSprop方法、Adamax 方法、Adam 方法对联合模型进行优化对比,结果见表4。

表4 优化算法结果对比Tab.4 Comparison of optimization algorithm results %

根据上述实验结果可以发现,在联合模型中,使用Adam 算法可以取得准确率最优结果。对其结果分析,SDG 算法在每次执行时对每个训练样本都进行一次更新,但是对偏差程度更新时,频繁更新将导致损失函数波动较大,无法稳定收敛;Momentum 方法通过减弱无关方向的震荡并优化相关方法的训练解决了SDG 中无法收敛的问题,但Momentum 方法无法分辨训练过程达到最优值的时刻;Adagrad 方法通过调整模型学习率参数来达到最优解,它对稀疏数据大幅度更新、对稠密数据小幅度更新,因此,Adagrad 方法对稀疏数据有更好的效果;RMSprop 方法对梯度计算了微分平方加权平均数进一步优化了损失函数摆动较大的问题。以上两类优化方法中,一类通过积累物理动量使损失函数达到最优值,另一类通过缩小收敛速度获取最优值,Adam结合了上述两类优化特点,提出新的优化方法;Adamax 方法是Adam 的变体,它提供了学习率的上限范围,但是在本文中,Adamax 方法无法将上限范围确定于合适的区域,使得损失函数的收敛程度并不乐观。因此,使用Adam 方法在本文模型中将取得更好的结果。

3.5 实验结果差异分析

在提取的编程题目关键词中,为了初学者能够更好地掌握编程知识,将编程题目关键信息分为知识点关键词与算法关键词。分析不同关键词结果,见表5。提取不同信息的准确率相差较大,使用本模型在提取编程题目中知识点信息的准确率较高,而在提取编程题目中的算法信息时结果较低。导致这一结果的原因可以分为以下两方面。

表5 提取不同信息结果对比Tab.5 Comparison of different information extraction results%

(1)提取关键信息不同 在提取编程题目中关键信息时,知识点信息是基于编程题目文本的基础上提取,所需提取内容已包含于待处理的文本中,仅需要做进一步的识别、提取即可。因此,最大概率提高词性标注的正确率,则可保证提取知识点关键词的正确率,所以提取知识点信息的准确率较高。算法信息的提取则基于模型训练过程,通过神经网络学习编程题目文本,这不仅要求实验模型的适应性,而且需要大量的训练集对模型训练。从编程题目文本中抽象出解题过程所需要的算法,这一过程是在文本的基础上依赖于神经网络的学习过程,对模型有较高的要求,因此在本文训练集较少的情况下对于抽象性较高的编程题目无法较准确提取算法信息。

(2)数据集性质不同 与其他模型相比较,本文模型提取知识点信息的准确率较高(表5)。究其原因,其他模型处理自然语言与本文所处理的编程题目数据集有本质的不同,本文针对学生编程题目数据特点,提出联合模型对文本进行理解,学生编程题目数据特点见表6。

表6 不同语料特点Tab.6 Characteristics of different corpus

3.6 题目难度与题目理解准确率相关性分析

通过本文实验可以实现对学生编程题目的理解,获取求解编程问题的关键信息,但编程题目间存在着不同难度级别的划分,为了界定本文实验模型所使用的范围,进一步分析不同难度的编程题目与题目理解准确率的相关性。在数据获取阶段,提取了编程题目的难度级别,将该题目与级别绑定后进行实验。

通过分析实验结果发现,编程题目理解的准确率不会随着题目难度的变化呈单一变化。究其原因,题目难度的级别划分不仅考虑了题目描述的抽象性,而且综合考虑了知识点、算法与实际题目情境的结合应用,1 级编程题目可能通过生活举例描述算法过程,但这对编程题目的理解并不友好,因此对于此类编程题目理解准确率较低,而1 级编程题目中部分题目描述简单,将取得较高的准确率。对于较难的编程题目,如4、5 级类型,它们不仅描述更抽象,而且使用不同算法、知识点的综合应用较强,本文模型对其理解能力较弱。本实验模型更适用于2、3 级编程题目,由于此类题目在于考查学生对算法、知识点的应用,在题目表述方面抽象程度较弱,对理解过程友好。

4 结语

本文借鉴自然语言处理领域的深度神经网络模型,提出基于BiLSTM+CNN+CRF 的联合模型用于学生编程题目的理解。其中,BiLSTM 用于将编程题目文本基于已有记忆生成带有学习信息的向量;同时,使用CNN 中的卷积核和最大池化操作提取特征,组成全局特征来表示预测关键信息序列标签;最后将携带学习信息的向量与预测序列标签拼接输入到CRF 层搜索全局最优路径解码。该方法聚焦于文本语义建模,通过深度学习提取特征,省去大量繁琐的人工特征过程,充分分析编程题目语义,消除文本的结构化形式;使用双向结构进行词性标注,将编程题目文本前后关联,缩小文本的抽象性。最后在学生编程题目数据集上进行实验,测试集中达到91.9% 的准确率、87.43% 的召回率与89.60% 的F1 值,三项指标值相比于其他自然语言处理模型都有一定的提高。实验结果表明对编程题目理解时,本文方法比其他联合模型、单一模型具有更好的效果。

基于以上结果,研究不足和下一步工作如下:在数据集方面,由于目前本文的数据集仍然较少,这导致对模型的训练准确度不高,并且数据集仅在英文编程题目上做出处理,数据集形式单一;在模型效果方面,本文的特征提取过程较简单,所提特征精确度仍需提高。因此,未来工作中将继续扩充数据集,将训练模型达到更高的精确度;并且考虑将Attention 机制加入当前联合模型的特征提取部分中,再进一步调整参数、优化,完成模型契合,提高编程题目理解的准确率。

猜你喜欢

编程题目知识点
一张图知识点
一张图知识点
第四页 知识点 歼轰-7A
编程,是一种态度
元征X-431实测:奔驰发动机编程
编程小能手
唐朝“高考”的诗歌题目
纺织机上诞生的编程
关于题目的要求
本期练习类题目参考答案及提示