陳 晨,劉 娟,沈 恂,郭 城
(蚌埠學(xué)院計算機(jī)與信息工程學(xué)院,蚌埠 233030)
本校已開展C++慕課(MOOC)和網(wǎng)絡(luò)習(xí)題平臺作為教學(xué)輔助手段多年,新冠疫情更是讓慕課和網(wǎng)課迅速發(fā)展,成為2020 年后的主流教學(xué)方式。教學(xué)過程中發(fā)現(xiàn)的主要問題有:學(xué)生知識水平不一,缺乏課堂教學(xué)實(shí)時反饋,教師難以根據(jù)薄弱環(huán)節(jié)及時調(diào)整,學(xué)生不易發(fā)現(xiàn)自己的知識薄弱點(diǎn)并有針對性地進(jìn)行加強(qiáng)鞏固。因此,急需一種可以幫助學(xué)生迅速定位知識薄弱點(diǎn)的方法。針對此種情況,我們在C++課程教學(xué)中引入了一種基于自注意力深度知識追蹤和協(xié)同過濾的C++教學(xué)輔助方法,利用一種改進(jìn)后的自注意力深度知識追蹤算法SAINT-Lite 發(fā)現(xiàn)知識薄弱點(diǎn),再結(jié)合協(xié)同過濾(Collaborative Filtering,CF)進(jìn)行個性化習(xí)題。本文將這種方法稱為SAINT-Lite-CF。
知識追蹤(Knowledge Tracing)是一個時間序列問題,根據(jù)學(xué)生過去的習(xí)題作答情況,預(yù)測未來的答題正確率,反映學(xué)生對知識點(diǎn)的動態(tài)掌握情況。貝葉斯知識追蹤(Bayesian Knowl?edge Tracing,BKT)[1]是經(jīng)典的非深度知識追蹤方法。深度知識追蹤(Deep Knowledge Tracing,DKT)[2]開創(chuàng)了深度知識追蹤方法,主要結(jié)構(gòu)為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)和長短時記憶網(wǎng)絡(luò)(LSTM),隨后動態(tài)鍵值對記憶網(wǎng)絡(luò)(Dynamic Key-Value Memory Networks,DKVMN)[3]之類的改進(jìn)均基于RNN和LSTM。扇貝、英語流利說等大量網(wǎng)絡(luò)教學(xué)平臺廣泛應(yīng)用基于LSTM 的DKT算法進(jìn)行知識追蹤。DKT 的不足是需要海量數(shù)據(jù),RNN和LSTM依次處理時間序列數(shù)據(jù),訓(xùn)練時間長,難以應(yīng)用到高校專業(yè)課程這種小規(guī)模教學(xué)上。Transformer[4]提出自注意力機(jī)制,對小數(shù)據(jù)集也有很好的性能,Transformer 結(jié)構(gòu)實(shí)現(xiàn)了時間序列數(shù)據(jù)的并行處理,可以一次處理數(shù)十個甚至上百個時刻數(shù)據(jù),大大提高訓(xùn)練和執(zhí)行效率。SAKT(Self-Attention Knowledge Tracing)[5]是基于自注意力的第一篇知識追蹤論文,使用習(xí)題(Exercise)和答案(Result)成對組成的交互(Interaction)信息,隨后的SAINT(Separated Self-Attention Neural Knowledge Tracing)[6]和SAINT+[7]相對SAKT 的主要改進(jìn)是引入編碼器(Encoder)和解碼器(Decoder),習(xí)題和答案信息分別進(jìn)入編碼器和解碼器處理,實(shí)驗表明這種方式性能更佳。本文工作主要基于SAINT展開。
令習(xí)題庫總習(xí)題數(shù)為M,某學(xué)生從t1時刻到ti時刻做題序列定義為{I1,I2,I3,…,Ii},Ii為{Ei,Ri},其中:I 是Interaction(交互),表示在第i時刻學(xué)生的一次做題行為,E 是Exercise(習(xí)題),表示習(xí)題庫中一道習(xí)題;R 是Result(答案),表示對應(yīng)習(xí)題學(xué)生答案。知識追蹤的任務(wù)是根據(jù)t1到ti時刻序列預(yù)測ti+1時刻學(xué)生回答所有習(xí)題正確概率,表示為一個M維向量,每1 位取值區(qū)間為[0,1]。
相比DKT 論文中常用的Synthetic、ASSIST和STATICS 數(shù)據(jù)集,本文實(shí)際處理數(shù)據(jù)集規(guī)模較小,為避免模型過擬合和難以收斂,我們對SAINT 模型進(jìn)行裁剪,將其稱為SAINT-Lite。后續(xù)實(shí)驗和實(shí)踐證明,裁剪后的模型在處理小數(shù)據(jù)集時,可以獲得較好性能。本文提出方法的整體結(jié)構(gòu)見圖1。

圖1 SAINT-Lite-CF 主要結(jié)構(gòu)
總體結(jié)構(gòu)包括編碼器、解碼器和最后的全連接層。編碼器的輸出作為解碼器的輸入,解碼器的輸出作為線性層的輸入。
編碼器由一個習(xí)題嵌入層(Exercise Embed?ding Layer)和多個編碼器層組成,習(xí)題和位置信息經(jīng)過嵌入表示后分別生成d_model 維度向量,這些向量相加并輸入習(xí)題嵌入層。每個編碼器層由一個多頭注意力運(yùn)算模塊、點(diǎn)式前饋網(wǎng)絡(luò)(Point-wise Feed-Forward Networks)和層歸一化組成,且每層在其周圍有一個殘差連接。點(diǎn)式前饋網(wǎng)絡(luò)是全連接神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),目的是提高模型非線性能力。殘差連接用于避免深度網(wǎng)絡(luò)中梯度消失問題。
每個多頭注意力運(yùn)算模塊有三個輸入,分別是:Q(查詢,Query)、K(主鍵,Key)、V(數(shù)值,Value),其計算過程分成四個步驟:QKV線性層分拆成多頭,按照比例縮放的點(diǎn)積注意力多頭級聯(lián)(Concat),最后一層線性層。以上過程用公式表示為

其中Mask是上三角掩膜,F(xiàn)FN是點(diǎn)式前饋網(wǎng)絡(luò)。
解碼器由一個答案嵌入層(Result Embed?ding Layer)和多個解碼器層組成,答案和位置信息經(jīng)過嵌入表示后生成d_model維度向量,這些向量相加并輸入答案嵌入層。每個解碼器層由兩個多頭注意力運(yùn)算模塊、點(diǎn)式前饋網(wǎng)絡(luò)和層歸一化組成,第二層多頭注意力模塊的V和K接收編碼器輸出作為輸入,Q接收第一層多頭注意力模塊的輸出,每層在其周圍同樣有一個殘差連接。解碼器關(guān)注編碼器的輸出及其自身輸入(自注意力),來預(yù)測下一個時刻做題的正確概率。
嵌入表示后的習(xí)題矩陣分別作為Q、K、V輸入編碼器(各自權(quán)重不同),輸出O分別作為V、K(各自權(quán)重不同)輸入解碼器的第二層多頭自注意力模塊。嵌入表示后的答案矩陣分別作為另一套Q、K、V(各自權(quán)重不同)輸入解碼器。Q是解碼器第一層多頭自注意力模塊的輸出。編碼器過程用公式表示為

X在第一個編碼器層是習(xí)題嵌入層輸出,其余編碼器層是上一個編碼器層的輸出,Oenc是編碼器輸出,LayerNorm 是層歸一化。解碼器過程用公式表示為

X在第一個解碼器層是答案嵌入層輸出,其余解碼器層是上一個解碼器層的輸出,Odec是解碼器輸出。解碼器的最后輸出經(jīng)過一個全連接層,采用Sigmod 激活函數(shù),輸出每個知識點(diǎn)掌握情況,并映射回所有習(xí)題正確概率。
令共有I個學(xué)生,習(xí)題庫共M個習(xí)題,N個知識點(diǎn),習(xí)題同知識點(diǎn)是多對多關(guān)系,Km表示第m個習(xí)題對應(yīng)的N位一維知識點(diǎn)向量,每位取0 或1,K為所有習(xí)題對應(yīng)知識點(diǎn)的M×N矩陣。SAINT-Lite 輸入時只使用主要知識點(diǎn)ID,輸出N維向量SKi,表示第i個學(xué)生所有知識點(diǎn)掌握情況,以主要知識點(diǎn)ID 預(yù)測結(jié)果表示習(xí)題ID 預(yù)測結(jié)果,將N維向量映射回M維,令其為SEi,所有學(xué)生向量組成I×M的答題正確概率矩陣SE。用答題正確概率矩陣點(diǎn)乘所有習(xí)題對應(yīng)知識點(diǎn)矩陣,即SE×K,歸一化后得到所有學(xué)生知識水平矩陣Y。令Yi表示第i個學(xué)生的知識水平向量,Yij表示第i個學(xué)生對第j個知識點(diǎn)的掌握情況,則KPj為第j個知識點(diǎn)均值:

所有KPj組成N維知識水平均值向量(KP1,KP2,KP3,…,KPN),對KPj小于閾值(本文取0.5)的知識點(diǎn)向教師進(jìn)行教學(xué)預(yù)警,表明此知識點(diǎn)是共性的薄弱環(huán)節(jié),教師應(yīng)進(jìn)行集中復(fù)習(xí)講解,對特定學(xué)生KPj過低的知識點(diǎn)向該學(xué)生提示重新學(xué)習(xí)課程。
獲得學(xué)生答題正確概率矩陣后,使用協(xié)同過濾來進(jìn)行個性化習(xí)題推薦。協(xié)同過濾目前廣泛應(yīng)用于電子商務(wù)網(wǎng)站的商品推薦,其本質(zhì)思想是找到與當(dāng)前目標(biāo)類似的目標(biāo)群體,即找到水平接近的學(xué)生近鄰集合,預(yù)測學(xué)生對沒有做過習(xí)題的得分水平。令全體學(xué)生答題正確概率矩陣為U,Ui表示第i行,為第i個學(xué)生的答題正確概率向量,則Uj為第j個學(xué)生的答題正確概率向量,遍歷所有行,以余弦相似度判斷Ui和Uj相似度:

得分大于一定閾值(本文取0.9)的作為相似學(xué)生。根據(jù)馬驍睿等[8]提出的方法計算第i個學(xué)生的習(xí)題得分向量為

average(NUi)表示同第i個學(xué)生相似學(xué)生答題正確概率向量的平均值,p取值0 到1,用于調(diào)節(jié)相似學(xué)生對于習(xí)題得分向量的影響力,p為1時,習(xí)題得分向量完全退化為答題正確概率向量。向?qū)W生推薦預(yù)測得分在某個區(qū)間的習(xí)題,對于預(yù)測得分過低甚至為0 的習(xí)題和學(xué)習(xí)內(nèi)容,本文認(rèn)為這樣的內(nèi)容學(xué)生完全沒有掌握,應(yīng)重新學(xué)習(xí)而不是直接做題。
使用兩個公開數(shù)據(jù)集ASSISTments 2009(以下簡稱ASSIST)、STATICS 2011(以下簡稱STATICS)和一個本文數(shù)據(jù)集來驗證習(xí)題。ASSIST 收集自ASSISTments 教育平臺2009 年數(shù)據(jù),為高中數(shù)學(xué)題,對應(yīng)124個知識點(diǎn),包含了4217 名學(xué)生共525535 次答題記錄。STATICS 收集自大學(xué)工程力學(xué)課程,對應(yīng)1223 個知識點(diǎn),包含了333 個學(xué)生共189927 條答題記錄。本文數(shù)據(jù)集來自本校已使用多年的C++網(wǎng)絡(luò)習(xí)題平臺,共1374 道習(xí)題,對應(yīng)173 個C++知識點(diǎn),采集自2018 年和2019 年不同專業(yè)532 人共32843條答題記錄。為使ASSIST、STATICS 數(shù)據(jù)規(guī)模同本文數(shù)據(jù)集接近,從ASSIST、STATICS中分別抽取一段時間內(nèi)數(shù)據(jù),處理后所有數(shù)據(jù)集具體信息見表1。數(shù)據(jù)分布上,ASSIST 更接近本文數(shù)據(jù)集,將其稱為稀疏數(shù)據(jù)集,將STATICS稱為稠密數(shù)據(jù)集。

表1 所有數(shù)據(jù)集信息
訓(xùn)練在i7 CPU、16 G 內(nèi)存、GTX 2060 顯卡的機(jī)器上進(jìn)行,使用PyTorch 框架實(shí)現(xiàn),使用Adam 優(yōu)化器,學(xué)習(xí)率0.001,迭代次數(shù)100 次。數(shù)據(jù)集根據(jù)學(xué)生按照8∶2 的比例分為訓(xùn)練集和測試集。
本文數(shù)據(jù)集中包括以下幾項特征:練習(xí)題ID,對應(yīng)的一個主要知識點(diǎn)ID,對應(yīng)的多個附屬知識點(diǎn)ID,學(xué)生答題結(jié)果。習(xí)題的特征包括習(xí)題對應(yīng)的主要知識點(diǎn)ID、位置信息。答案的特征包括回答正確與否(取值0 或1)、位置信息。先預(yù)處理數(shù)據(jù)集,得到每個學(xué)生對應(yīng)答題序列,此時只使用主要知識點(diǎn)ID,將此序列轉(zhuǎn)換為知識點(diǎn)獨(dú)熱(one-hot)編碼和答案獨(dú)熱編碼。模型一次并行處理windows_size 個時刻數(shù)據(jù),舍棄所有做題數(shù)目不超過windows_size 的學(xué)生數(shù)據(jù),超過windows_size 的分拆后分批處理,分拆后不足window_size部分舍棄。
所有特征各自嵌入表示降為d_model維,再求和。由于習(xí)題和答案位置一一對應(yīng),兩者共享同樣的位置編碼。位置編碼用于保留因并行處理丟失的序列信息,即學(xué)生做題先后順序,反映學(xué)生知識技能動態(tài)掌握程度。
答案的輸入比習(xí)題的輸入推遲一個時刻,即在一次訓(xùn)練迭代中,編碼器輸入window_size個時刻的習(xí)題信息,解碼器輸入只有win?dow_size-1 個時刻的答案信息,最后輸出win?dow_size個r_,使用上三角掩膜避免模型在使用習(xí)題信息預(yù)測t時刻答題正確概率時參考t時刻之后的答案信息。訓(xùn)練時候使用最小化二分類交叉熵?fù)p(Binary Cross Entropy Loss)作為損失函數(shù),計算輸出和標(biāo)簽的誤差并執(zhí)行反向傳播,優(yōu)化模型參數(shù)。推理時只關(guān)注最后時刻輸出的r_。
超參數(shù)n是解碼器/編碼器層堆疊數(shù)(多頭自注意力模塊重復(fù)次數(shù)),SAINT 取4,分別設(shè)置n為2 和4 進(jìn)行消融測試。深度知識追蹤一般使用準(zhǔn)確率(Accuracy,ACC)和受試者工作特性(ROC)曲線下面積(Area Under the Curve,AUC),ACC為正確預(yù)測結(jié)果占全部結(jié)果的百分比,AUC被定義為ROC 曲線與下坐標(biāo)軸圍成的面積,兩個指標(biāo)均是越高,說明模型性能越好,具體計算方法見SAINT/SAINT+論文。結(jié)果見表2及圖2。

表2 超參數(shù)n的不同取值對ACC和AUC的影響

圖2 超參數(shù)n的不同取值對ACC和AUC的影響
n為4 時,在STATICS 上AUC和ACC均升高,表現(xiàn)變好,ASSIST 和本文數(shù)據(jù)集上AUC和ACC均降低,表現(xiàn)變差。n為2 時,在STATICS上表現(xiàn)變差,ASSIST和本文數(shù)據(jù)集上表現(xiàn)變好。本文認(rèn)為n為4 更適合STATICS 類的稠密數(shù)據(jù)集,n為2更適合ASSIST和本文數(shù)據(jù)集類的稀疏數(shù)據(jù)集。本文系統(tǒng)實(shí)際應(yīng)用中n取2。
超參數(shù)d_model是每個編碼器層或解碼器層輸入或輸出的維數(shù),SAINT 取256 和512,分別設(shè)置d_model 為64、128 和256 進(jìn)行消融測試。結(jié)果見表3及圖3。

表3 超參數(shù)d_model的不同取值對ACC和AUC的影響

圖3 超參數(shù)d_model的不同取值對ACC和AUC的影響
縱向比較,隨著d_model 取值增大,在STATICS 上ACC和AUC均升高。在ASSIST和本文數(shù)據(jù)集上,當(dāng)d_model 是64 或128 時,ACC和AUC 差別不大,甚至在d_model 為256 時,ACC和AUC 均出現(xiàn)下降。橫向比較,d_model 為256或128 時,在STATICS 上ACC和AUC均升高,表現(xiàn)變好;ASSIST 和本文數(shù)據(jù)集上ACC和AUC均降低,表現(xiàn)變差。d_model為64在STATICS上表現(xiàn)變差,ASSIST 和本文數(shù)據(jù)集上表現(xiàn)變好。我們認(rèn)為d_model 為64 即可處理ASSIST 和本文數(shù)據(jù)集類的稀疏數(shù)據(jù)集,更高的取值適合STATICS 類的稠密數(shù)據(jù)集。本文系統(tǒng)實(shí)際應(yīng)用中d_model取64。
超參數(shù)window_size 表示模型一次處理幾個時刻的數(shù)據(jù),本文取100。超參數(shù)h表示多頭注意力機(jī)制頭(head)數(shù),SAINT 中取8,本文取2,即64 維(d_model 維)的QKV 被拆分成32 維進(jìn)行注意力計算。訓(xùn)練時的超參數(shù)batch_size,表示模型在一個時刻處理幾批數(shù)據(jù),本文取16。所有超參數(shù)最終取值見表4。

表4 所有超參數(shù)及取值
本實(shí)驗使用Paper with code 網(wǎng)站上開源的DKT、SAKT 和SAINT 在PyTorch 下實(shí) 現(xiàn),將三種數(shù)據(jù)集在四種模型上重新訓(xùn)練測試。評測指標(biāo)為ACC、AUC和RMSE(Root Mean Squared Er?ror)。RMSE被定義為預(yù)測值與真實(shí)值的均方根誤差,其值越低,說明模型性能越好。結(jié)果見表5及圖4。

圖4 DKT、SAKT、SAINT和SAINT-Lite在ACC、AUC、RMSE上的得分對比

表5 SAINT-Lite同DKT、SAKT和SAINT的對比
在ACC和AUC這兩個評測指標(biāo)上,SAINTLite 在ASSIST 和本文數(shù)據(jù)集下表現(xiàn)比DKT 和SAKT 要好,比SAINT 略差,但在STATICS 下表現(xiàn)較差,僅比DKT 稍好,比同樣使用自注意力機(jī)制的SAKT 和SAINT 均差。在RMSE 這個指標(biāo)上,SAINT-Lite 在ASSIST 和本文數(shù)據(jù)集下表現(xiàn)最好,在STATICS 下表現(xiàn)同樣較差,僅比DKT稍好。我們認(rèn)為這是由于STATICS 知識點(diǎn)較多,簡化模型結(jié)構(gòu)使得系統(tǒng)不能很好擬合這種復(fù)雜數(shù)據(jù),但是對于小數(shù)據(jù)集,裁剪后的結(jié)構(gòu)也可以獲得較好的性能,其結(jié)果是可信的,可以用于教學(xué)預(yù)警和后續(xù)的習(xí)題推薦。
一些論文或者系統(tǒng)使用答題正確率來衡量推薦習(xí)題質(zhì)量,本文認(rèn)為這不符合實(shí)際,極端情況下推薦最簡單的習(xí)題必然都是正確的。本文通過判斷答題正確率是否符合期望來驗證習(xí)題推薦效果,將習(xí)題推薦難度平均分為五個區(qū)間,使用三個測試集中每個學(xué)生的200次答題記錄推薦50 題,并計算推薦習(xí)題的實(shí)際答題正確率,結(jié)果見表6。

表6 不同難度區(qū)間推薦習(xí)題的實(shí)際答題正確率
表6數(shù)據(jù)表明,基于STATICS訓(xùn)練模型的習(xí)題推薦有部分實(shí)際正確率未落在對應(yīng)區(qū)間內(nèi),再次說明本文使用的解碼器/編碼器堆疊層數(shù)2不能很好擬合STATICS 這種知識點(diǎn)較多的復(fù)雜數(shù)據(jù),而基于ASSIST 和本文數(shù)據(jù)集訓(xùn)練模型的習(xí)題推薦所有實(shí)際正確率都落在對應(yīng)區(qū)間內(nèi),表明實(shí)際應(yīng)用中SAINT-Lite-CF 的推薦結(jié)果是可信的。
本校C++一學(xué)期共16 周課程,從第2 周開始,除共同課后作業(yè)外,向每個學(xué)生進(jìn)行個性化習(xí)題推薦,推薦區(qū)間為[0.6,0.8)。統(tǒng)計全體學(xué)生每周所有習(xí)題的平均正確率,結(jié)果見圖5。

圖5 全體學(xué)生16周內(nèi)所有習(xí)題的平均正確率
橫軸為周次,縱軸為平均正確率,圖中出現(xiàn)兩次較明顯的平均正確率下降,分別是第2周和第8 周,原因是第1 周主要復(fù)習(xí)C 語言內(nèi)容,第2 周開始教學(xué)C++新內(nèi)容,第8 周和第9 周開始教學(xué)繼承和多態(tài)。這兩周均有大量重點(diǎn)難點(diǎn)內(nèi)容,學(xué)生初期掌握不好,通過個性化習(xí)題推薦和教學(xué)預(yù)警后教師針對薄弱知識點(diǎn)的補(bǔ)強(qiáng),提升了學(xué)生的平均正確率,其效果反映在預(yù)測和多次真實(shí)考試中,最后的期終考試也取得了師生滿意的成績。
本文提出的SAINT-Lite-CF 方法在C++教學(xué)實(shí)踐中起到了很好的輔助作用,幫助學(xué)生和教師快速定位薄弱知識點(diǎn),進(jìn)行教學(xué)預(yù)警和個性化習(xí)題推薦。受平臺限制,SAINT-Lite 使用的特征沒有考慮時間對知識遺忘的影響,后續(xù)可以改進(jìn)本校C++網(wǎng)絡(luò)習(xí)題平臺,收集學(xué)生做題相關(guān)的時間信息用于訓(xùn)練,提高模型對學(xué)生知識水平的擬合和表達(dá)能力。本文方法應(yīng)用協(xié)同過濾較簡單,后續(xù)可以考慮更復(fù)雜的個性化習(xí)題推薦算法。本文使用2018 年和2019 年積累的數(shù)據(jù)來預(yù)測2020 年,后續(xù)會擴(kuò)充數(shù)據(jù)集,繼續(xù)輔助C++教學(xué)。